背景信息
Nginx Ingress Controller因其开源特性和广泛应用而受到业界的青睐。在处理大型集群环境时,用户往往希望在同一集群内部署多个Nginx Ingress Controller实例,以便对不同流量进行有效管理。例如,某些服务可能需要通过公共网络对外提供服务,而另一些服务则仅供内部使用,不允许通过互联网访问。为了适应这种需求,可以通过设置两组独立的Nginx Ingress Controller,并分别与不同的ELB实例绑定,从而实现流量的精确控制和隔离。这种方法不仅提升了服务的安全性,还增强了流量管理的灵活性。
前提条件
已创建Kubernetes集群
已创建ELB实例,具体操作请参考创建负载均衡
部署新的Nginx Ingress Controller
在开通Kubernetes集群的时候,您可以选择为集群安装Ingress Controller组件,并为Ingress Controller绑定公网ELB实例。您可以通过以下步骤在Kubernetes集群再部署一套完全独立的Nginx Ingress Controller服务。
获取Nginx Ingress Controller模板包
前往社区模板发布页面,选择合适版本的HelmChart包并下载,本文以ingress-nginx-4.7.5.tgz为例。
上传模板包
登录云容器引擎控制台,进入“模板市场”,点击“我的模板”->“上传模板”。然后选择命名空间,点击“上传文件”,选择要上传的模板包,点击提交。
发布模板实例
上传完模板包之后,在“我的模板”中选择刚上传的模板(ingress-nginx),然后选择版本(4.7.5),然后点击发布。
填写“实例名称”,选择“集群名称”和“命名空间”。
在发布yaml文本中导入以下配置,根据说明填写相关参数(参数说明见下表“YAML参数说明”),其他未指定的参数会使用默认配置。controller: image: registry: "registry-vpc-crs-xxx.cnsp-internal.ctyun.cn" #容器镜像仓库地址,请根据集群所在区域进行替换 image: "library/nginx-ingress-controller" tag: "v1.1.2" #Nginx Ingress Controller镜像版本 digest: "" ingressClassResource: name: ingressdemo #同一个集群中不同套Nginx Ingress Controller名称必须唯一,且不能设置为nginx-ingress-controller或elb controllerValue: "k8s.io/nginx-ingress-demo" #同一个集群中不同套Nginx Ingress Controller的监听标识必须唯一,且不能设置为k8s.io/ingress-nginx ingressClass: ingressdemo #同一个集群中不同套Nginx Ingress Controller名称必须唯一,且不能设置为nginx-ingress-controller或elb service: annotations: service.beta.kubernetes.io/ctyun-loadbalancer-id: lb-fhqivj5xjm #ELB实例ID admissionWebhooks: # 关闭webhook验证开关 enabled: false patch: enabled: false resources: # 设定Nginx Ingress Controller的资源限制,可根据需要自行决定 requests: cpu: 500m memory: 512Mi
点击“确认”,之后可以在“模板实例”页面查看实例安装情况。
YAML参数说明
参数 | 描述 |
---|---|
controller.image.registry | 容器镜像仓库地址,如registry-vpc-crs-huabei1.cnsp-internal.ctyun.cn。 |
controller.image.image | Nginx Ingress Controller镜像名称。 |
controller.image.tag | Nginx Ingress Controller镜像版本,一般与集群插件Nginx Ingress Controller的版本一致即可,也可自定义。 |
controller.ingressClassResource.name | Nginx Ingress Controller对应的IngressClass名称。 注意 同一个集群中不同套Nginx Ingress Controller名称必须唯一,且不能设置为nginx-ingress-controller或elb。 |
controller.ingressClassResource.controllerValue | Nginx Ingress Controller对应的Controller Class。 注意 同一个集群中不同套Nginx Ingress Controller的监听标识必须唯一,且不能设置为k8s.io/ingress-nginx。 |
controller.ingressClass | Nginx Ingress Controller对应的IngressClass名称,需与controller.ingressClassResource.name一致。 |
controller.service.annotations | 配置Nginx Ingress Controller通过LoadBalancer Service暴露到ELB,其中可通过注解service.beta.kubernetes.io/ctyun-loadbalancer-id指定已有ELB实例,更多注解配置请参考通过Annotation配置负载均衡类型的服务。 |
controller.resources.requests.cpu | Nginx Ingress Controller的CPU资源限制,可根据需要自行决定。 |
controller.resources.requests.memory | Nginx Ingress Controller的内存资源限制,可根据需要自行决定。 |
访问验证
创建一个nginx工作负载
进入集群,在菜单栏选中“工作负载”->“无状态”,然后点击“创建Deployment”按钮,如下示例创建nginx工作负载。创建Ingress,通过新部署的Nginx Ingress Controller提供网络访问
在菜单栏选中“网络”->“路由”,然后点击“新增YAML”,填写以下内容,然后点击“保存”。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx namespace: ingress-demo annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: ingressdemo #新创建的Nginx Ingress Controller的ingressClass rules: - host: nginx.demo.com #访问的Host地址 http: paths: - path: / pathType: Prefix backend: service: name: nginx #目标服务nginx port: number: 80 #目标服务nginx端口
通过新部署的Nginx Ingress Controller来访问该应用
在菜单栏选中“网络”->“服务”,找到新部署的Nginx Ingress Controller对应的服务,如下图:
其中集群外地址为Nginx Ingress Controller对应的ELB地址,通过该地址访问应用,可以看到返回正确的nginx页面。通过集群的Ingress Controller组件来访问该应用
找到Ingress Controller组件对应的服务,如下图:
通过其对应的ELB地址访问nginx应用,可以看到返回404错误。
常见使用问题
问题现象 | 解决方案 |
---|---|
安装模板报错:IngressClass.networking.k8s.io "nginx-ingress-xxx" is invalid: spec.controller: Invalid value: "nginx-ingress-xxx": must be a domain-prefixed path (such as "acme.io/foo")。 | YAML配置中填写的controller.ingressClassResource.controllerValue不对,值需要以域名为前缀,如k8s.io/ingress-nginx-demo。 |
创建Ingress路由后,Ingress同时被模板部署的Nginx Ingress Controller和集群插件Nginx Ingress Controller识别并生效。 | 检查安装模板后生成的IngressClass资源,确认spec.controller的值是否为k8s.io/ingress-nginx,如果是,需重装模板实例,为controller.ingressClassResource.controllerValue指定不同于“k8s.io/ingress-nginx”的值。 |