k8s 中使用 nginx 作为 ingress controller

nginx ingress controller

nginx ingress controller

ingress 是 kubernetes 提供的一种反向代理机制,用以将集群内部的服务通过指定的域名或者端口暴露出来,从而达到统一流量入口的作用。使用 ingress 的前提是集群中要有一个 ingress controller 来监控和更新后端 service pod 的变化。

部署方式

值得注意的是,以下两种部署方式都是在非裸金属服务器中部署

helm 部署

如果你会使用 helm 管理工具,可以通过 helm 使用以下命令来一键部署 nginx ingress controller:

1
2
3
helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace

kubectl 部署

除了 helm 部署之外,nginx 还提供了 kubectl 的部署方式,同样也是非常简单:

1
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml

添加 external-ip

由于 nginx ingress controller 的 service 在部署时没有通过 LoadBalance 的方式,而是通过 NodePort 的方式应用。因此,服务部署完成后,需要通过手动添加 external 的方式让 nginx ingress controller 正常工作。

example

  • 获取节点 ip
1
2
3
4
5
6
$ kubectl get nodes

NAME     STATUS   ROLES    EXTERNAL-IP
host-1   Ready    master   203.0.113.1
host-2   Ready    node     203.0.113.2
host-3   Ready    node     203.0.113.3
  • 查看 nginx ingress controller 的 service,会发现一个类型为 NodePort 的服务
1
2
3
4
5
$ kubectl get svc -n nginx-ingress

NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP                                              PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.110.2.228    192.168.3.93,192.168.0.163,192.168.0.139,192.168.0.137   80:31116/TCP,443:32217/TCP   22h
ingress-nginx-controller-admission   ClusterIP   10.104.108.32   <none>                                                   443/TCP                      22h
  • 编辑该服务,将节点的 external-ip 加入
1
2
3
4
5
spec:
  externalIPs:
  - 203.0.113.1
  - 203.0.113.2
  - 203.0.113.3
  • 至此,nginx ingress controller 就部署完成了。

使用方式

基础使用

nginx ingress controller 部署完成后使用方式非常简单,在 spec 下添加 ingreeClassName: nginx 即可。详细解释,可以通过kubectl explain ingress.spec.ingressClassName查看。要注意的是,kubernetes 1.19 之后的版本也仅支持这种方式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  creationTimestamp: "2020-04-07T09:28:50Z"
  generation: 8
  labels:
    app: gocd
    chart: gocd-1.27.0
    component: server
    heritage: Tiller
    release: gocd
  name: gocd-server
  namespace: cd
  resourceVersion: "163526"
  uid: 30f1bb4xxxxxx-xx-xx-xx
spec:
  ingressClassName: nginx
  rules:
  - host: gocd.tt
    http:
      paths:
      - backend:
          service:
            name: gocd-server
            port:
              number: 8153
        pathType: ImplementationSpecific
status:
  loadBalancer:
    ingress:
    - ip: 192.168.0.xxx

Reference

相关内容参考了:here

Built with Hugo
Theme Stack designed by Jimmy