Kubernetes--部署Ingress控制器(Nginx)
Ingress控制器自身是运行于Pod中的容器应用,一般是Nginx或Envoy一类的具有代理及负载均衡功能的守护进程,它监视着来自于API Server的Ingress对象状态,并以其规则生成相应的应用程序专有格式的配置文件并通过重载或重启守护进程而使新配置生效。
例如,对于Nginx来说,Ingress规则需要转换为Nginx的配置信息。简单来说,Ingress控制器其实就是托关于Kubernetes系统之上的用于实现在应用层发布服务的Pod资源,它将跟踪Ingress资源并实时生成配置规则。那么,同样运行为Pod资源的Ingress控制器进程又该如何接入外部的请求呢?常用的方式有下面两种。
-
以Deployment控制器管理Ingress控制器的Pod资源,并通过NodePort或LoadBalancer类型的Service对象为其接入集群外部的请求流量,这就意味着,定义一个Ingress控制器时,必须在其前端定义一个专用的Service资源。
-
借助于DaemonSet控制器,将Ingress控制器的Pod资源各自以单一实例的方式运行于集群的所有或部分工作节点之上,并配置这类Pod对象以hostPort或hostNetwork的方式在当前节点接入外部流量。
以ingress-nginx项目为例,部署Ingress Nginx控制器的配置文件被切割存放在了多个不同的文件中,并集中存储于其源码deploy子目录下,同事,为了方便用户部署,它还将所需的资源全部集成为一个配置文件mandatory.yaml:
~]$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
因为需要下载相关的镜像文件,因此前面部署过程中的Pod资源的创建需要等待一段时间才能完成,具体时长要取决于网络的可用状况。。可使用如下命令持续监控创建过程,待其状态为 “ running ” 之后即可表示正常运行:
~]$ kubectl get pods -n ingress-nginx --watch NAME READY STATUS RESTARTS AGE nginx-ingress-controller-54b86f8f7b-jqvh4 1/1 Running 0 4m50s
线的配置清单中采用了基于Deployment控制器部署Ingress Nginx的昂是,因此接入外部流量还需要手动为其创建相关的NodePort或LoadBalancer类型的Service资源对象。
下面的配置清单中对类型定义了NodePort,并明确指定了易记的端口和IP地址,以方便用户使用:
apiVersion: v1 kind: Service metadata: name: nginx-ingress-controller namespace: ingress-nginx spec: type: NodePort clusterIP: 10.99.99.99 ports: - port: 80 name: http nodePort: 30080 - port: 443 name: https nodePort: 30443 selector: app.kubernetes.io/name: ingress-nginx
]$ kubectl apply -f nginx-ingress-service.yaml
提示:如果集群运行支持LBaaS的IaaS云环境,则可以将其类型指定为LoadBalancer,这样直接就有了可用的external-LB。
确认Service对象nginx-ingress-controller的状态没有问题后即可于集群外部对其发起访问测试,目标URL为http://:30443,确认可接收到响应报文后即表示Ingress Nginx部署完成。不过,本示例中尚且缺少一个可用的外部负载均衡器,因此,访问测试时暂时还只能使用http://:进行。