部署ingress-nginx-controller
基于 Nginx 的 Ingress Controller 有两种,
一种是 k8s 社区提供的 ingress-nginx,就是本文的部署方案
另一种是 Nginx 社区提供的nginx-ingress
部署
下载部署文件
ingress-nginx的官方地址是
https://github.com/kubernetes/ingress-nginx

我的k8s是1.25版本的,决定部署1.9.3的ingress-nginx
下载deploy文件
1 | wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.3/deploy/static/provider/cloud/deploy.yaml |
查看该yaml文件,找到需要的镜像是
1 | registry.k8s.io/ingress-nginx/controller:v1.9.3 |
我已经转发传到了dockerhub
分别修改镜像地址
1 | anjia0532/google-containers.ingress-nginx.controller:v1.9.3 |
修改deployment为hostnetwork
1 | hostNetwork: true |
监听主机的80端口
然后apply该文件即可
1 | kubectl apply -f deploy.yaml |
分析该yaml文件,创建的资源如下
- 创建一个 Namespce,名为 ingress-nginx,下面的所有资源都在该命名空间下
- 创建一个 ServiceAccount,名为ingress-nginx
- 再创建一个 ServiceAccount,名为ingress-nginx-admission
- 创建一个 Role,名为 ingress-nginx
- 再创建一个 Role,名为 ingress-nginx-admission。有secrets的相关权限
- 创建一个 ClusterRole,名为 ingress-nginx
- 再创建一个 ClusterRole,名为 ingress-nginx-admission
- 创建一个 RoleBinding,名称为 ingress-nginx,将Role ingress-nginx,与ServiceAccount ingress-nginx相绑定。即第2步和第4步
- 再创建一个RoleBinding,ingress-nginx-admission。绑定3和5
- 创建一个ClusterRoleBinding,ingress-nginx。绑定6和2
- 再创建一个ClusterRoleBinding,ingress-nginx-admission。绑定7和3
- 创建一个 ConfigMap,名为ingress-nginx-controller
- 创建一个 Service ,名称为 ingress-nginx-controller,类型是nodeport。对外暴露80和443端口, 对应协议分别是 http和https
- 创建一个 Service ,名称为 ingress-nginx-controller-admission,类型为CusterIP,对外暴露443 ,协议https
- 创建一个 Deployment,名称为 ingress-nginx-controller
- 创建一个job,ingress-nginx-admission-create。
- 创建一个 Job,名称为 ingress-nginx-admission-patch
- 创建一个IngressClass。名为nginx
- 创建一个NetworkPolicy。名为ingress-nginx-admission
- 创建一个 ValidatingWebhookConfiguration,名称为 ingress-nginx-admission
测试
部署一个tomcat的serveice
1 | apiVersion: v1 |
部署一个ingress用于转发
1 | apiVersion: networking.k8s.io/v1 |
本地电脑上改一下host
1 | 要ingress-controller启动的那台node的ip test.xxx.com |

改进
现在所有的流量都走ingress-controller的pod所在的那台服务器,存在单点风险。
应该每个node节点部署一个ingress-controller。然后流量进行负载均衡。
修改deploy文件
我的测试集群只有两个node节点
1 | replicas: 2 |
进行pod反亲和,使两个pod分别部署到两个node上
1 | affinity: |
这样在前面可以加一个kong或者其他的负载均衡器来代理一下。
贴一下最后完成的deploy.yaml