本文介绍如何在容器服务集群中同时部署多套独立的 Nginx Ingress Controller,对外提供不同的服务访问。
容器服务支持在集群中同时部署多套独立的 Nginx Ingress Controller 服务,各服务之间互不影响,允许您基于实际业务需求或场景,对外提供不同的服务访问。例如:
容器服务通过应用模板提供名为 ingress-nginx 的 Nginx Ingress Controller。
参数 | 说明 |
---|---|
基本信息 | |
名称 | 设置应用名称,同一个命名空间里名称必须唯一。 |
项目 | 【邀测·申请试用】选择需要部署应用的项目。默认选择 default(默认项目)。更多项目相关操作和说明,请参见 项目管理。 |
集群 | 选择需要部署应用的目标集群。 |
命名空间 | 选择目标集群下的命名空间。 |
编排模板 | |
Chart 来源 | 选择应用的 Chart 来源。默认来源为 应用模板,不可配置。 |
Chart | 选择应用的 Chart 版本。 |
配置方式 | 选择应用的配置方法。每个应用模板的 单击 图标,编辑 values.yaml 文件。编辑完成后单击 确定。说明
|
注意
已部署的 nginx-ingress 应用,若删除其关联的工作负载、服务等资源,但未删除 Webhook 时,会对该 nginx-ingress 应用所在集群中创建路由规则(Ingress)的操作产生影响。更多说明,请参见 FAQ。
在集群中部署独立的 Nginx Ingress Controller 服务后,可以使用 Nginx Ingress Controller 暴露内部的服务。本小节以一个 nginx 应用为例,为您介绍如何使用独立的 Nginx Ingress Controller 暴露后端服务并验证结果。
创建应用和服务的 YAML 文件。示例文件service-demo.yaml
代码如下:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx # 应用名称 namespace: doc-ns spec: replicas: 1 # 应用副本数 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx # 容器名称 image: nginx:latest # 容器镜像地址和版本 ports: - containerPort: 80 # 容器开放的端口号 --- apiVersion: v1 kind: Service metadata: name: service-demo # 服务的名称 namespace: doc-ns spec: selector: app: nginx # 通过标签选择器将服务与后端的容器组(Pod)绑定 ports: - name: rule protocol: TCP port: 80 targetPort: 80 type: NodePort
kubectl apply -f service-demo.yaml
spec.ingressClassName
字段中使用名称指定自定义的 Nginx Ingress Controller。示例文件ingress-demo.yaml
代码如下:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-demo # ingress 的名称 namespace: doc-ns # ingress 所在的命名空间 spec: ingressClassName: user-ingress-nginx # 自定义的 Nginx Ingress Controller 名称 rules: - host: example.com # 外部访问的域名 http: paths: - pathType: Prefix path: / backend: service: name: service-demo # ingress 后端对接的服务名称 port: number: 80 # ingress 对接服务的端口号
说明
自定义 Nginx Ingress Controller 的名称命名规则为名称-nginx
,例如在本例中,部署时配置的名称为user-ingress
,则对应的自定义 Nginx Ingress Controller 的名称为user-ingress-nginx
。
kubectl apply -f ingress-demo.yaml
预期输出为:kubectl -n kube-system get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.xxx.xxx.221 180.xxx.xxx.114 80:30234/TCP,443:30644/TCP 1d
-n doc-ns
指定自定义 Nginx Ingress Controller 所在的命名空间。预期输出为:kubectl -n doc-ns get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE user-ingress-ingress-nginx-controller LoadBalancer 10.xxx.xxx.52 180.xxx.xxx.55 80:32697/TCP,443:31180/TCP 5m51s
kubectl -n doc-ns get ingress
预期输出为:
NAME CLASS HOSTS ADDRESS PORTS AGE ingress-demo user-ingress-nginx example.com 180.xxx.xxx.55 80 56s
404
,即无法访问到后端服务。curl -H "Host: example.com" http://180.xxx.xxx.114
预期输出为:curl -H "Host: example.com" http://180.xxx.xxx.55
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
从上面的测试结果可以发现,不同 Nginx Ingress Controller 暴露的服务彼此完全独立,各服务之间互不影响。您可以为不同业务配置各自独立的 Nginx Ingress Controller 服务,实现多业务路由规则分离、公网和私网业务分离等场景需求。
当您在集群中部署 Nginx Ingress Controller 后,可以使用集群的可观测能力,对 Nginx Ingress Controller 实例进行监控和运维。详情请参见 自定义 Nginx Ingress Controller 观测最佳实践。
userConfig
字段的主要参数说明,如下表所示。
参数 | 默认值 | 描述 |
---|---|---|
networkModel | 与所在集群的容器网络模型保持一致 | 集群的容器网络模型(CNI),取值:
|
ResourceNamePreEnable | true | 是否为 Nginx Ingress 资源自动增加前缀,取值:
|
deployNodeType | Node | 部署 Nginx Ingress 的节点类型,取值:
|
公网配置 | ||
PublicNetwork.Isp | "BGP" | 负载均衡实例绑定 EIP 的线路类型。包括:BGP、SingleLine_BGP、Static_BGP、Fusion_BGP、ChinaMobile、ChinaTelecom、ChinaUnicom、ChinaMobile_Value、ChinaUnicom_Value 和 ChinaTelecom_Value。详细参数解释,请参见 EIP 产品文档。 注意
|
PublicNetwork.BandWidth | 10 | 负载均衡实例绑定 EIP 的带宽上限,单位为 Mbps。
|
PublicNetwork.IpFamily | "ipv4" | 负载均衡实例的 IP 地址类型。当前仅支持 ipv4。 |
PublicNetwork.BillingType | 3 | 负载均衡实例绑定 EIP 的计费类型,取值:
|
PublicNetwork.SubnetId | 无 | (可选)负载均衡实例所属子网,为负载均衡实例提供私网部署环境,分配私网 IP 地址。 |
PublicNetwork.BandwidthPackageId | 无 | (可选)负载均衡实例绑定 EIP 的共享带宽包 ID。 说明 共享带宽包是一种支持复用和共享带宽的云资源。将单个地域内多个公网 IP 或 IPv6 公网带宽添加到一个共享带宽包实例中,共享一条带宽,可以帮助您降低公网带宽的使用成本。详情请参见 什么是共享带宽包。 |
PublicNetwork.MasterZoneID | 无 | 负载均衡实例的主可用区 ID。
说明 负载均衡在各地域支持的可用区情况以及可用区 ID,请参见 地域与可用区。 |
PublicNetwork.SlaveZoneID | 无 | 负载均衡实例的备可用区 ID。
|
PublicNetwork.ModifyProtection | 无 | 负载均衡实例的删除保护功能,取值:
|
PublicNetwork.LoadBalancerBillingType | 2 | 负载均衡实例的计费类型。取值:
注意
|
PublicNetwork.LoadBalancerSpec | "small_1" | 负载均衡实例的规格类型。取值:
注意
|
PublicNetwork.SyncField | 无 | 更新
|
私网配置 | ||
PrivateNetwork.SubnetId | 无 | 负载均衡实例所属子网,为负载均衡实例提供私网部署环境,分配私网 IP 地址。 注意 使用私网访问网络时,必须配置该参数。 |
PrivateNetwork.IpFamily | "ipv4" | 负载均衡实例的 IP 地址类型。当前仅支持 ipv4。 |
PrivateNetwork.MasterZoneID | 无 | 负载均衡实例的主可用区 ID。
说明 负载均衡在各地域支持的可用区情况以及可用区 ID,请参见 地域与可用区。 |
PrivateNetwork.SlaveZoneID | 无 | 负载均衡实例的备可用区 ID。
|
PrivateNetwork.ModifyProtection | 无 | 负载均衡实例的删除保护功能,取值:
|
PrivateNetwork.LoadBalancerBillingType | 2 | 负载均衡实例的计费类型。取值:
注意
|
PrivateNetwork.LoadBalancerSpec | "small_1" | 负载均衡实例的规格类型。取值:
注意
|
PrivateNetwork.SyncField | 无 | 更新
|
Controller
字段的主要参数说明,如下表所示。
参数 | 默认值 | 描述 |
---|---|---|
ingressClassResource.name | nginx | 设置 Ingress Controller 对应的 IngressClass 的名称。 注意
|
ingressClassResource.controllerValue | "k8s.io/ingress-nginx" | 设置 Ingress Controller 对应的 Controller Class。 注意 同一个集群中不同套 Ingress Controller 创建的 Controller Class 名称必须唯一,且不能设置为 |
replicaCount | 1 | 设置该 Ingress Controller Pod 的副本数。 |
controller.resources.requests.cpu | 100m | 设置该 Ingress Controller Pod 的 CPU 请求(CPU Request)。单位为核。若使用毫核为单位,则格式为:CPU 请求+m ,例如100m 表示 CPU 资源请求为 100 毫核。 |
resources.requests.memory | 90Mi | 设置该 Ingress Controller Pod 的内存请求(Memory Request)。单位为 MiB 或 GiB,格式为:内存请求+单位 ,例如90Mi 表示内存资源请求为 90 MiB;2Gi 表示内存资源请求为 2 GiB。 |
electionID | ingress-controller-leader | 选择宿主机时使用的 ID,用于更新 Ingress 端点状态。 注意 若通过 应用中心 部署多套 Nginx Ingress Controller 至同一命名空间下,需要将 electionID 设置为不同的值,避免选主冲突。 |
部署参数(Deployment/Daemonset)的说明,如下表所示。
参数 | 默认值 | 描述 |
---|---|---|
hostNetwork | false | 将 Nginx Ingress Controller 部署至 Deployment/Daemonset 时的主要参数。详细的参数说明,请参见 Kubernetes 官方文档。 |
NodeSelector.kubernetes.io | linux | |
namespace | 与应用所在命名空间保持一致 | |
tolerations | [] | |
resources.requests.cpu | 100m | |
resources.requests.memory | 90Mi | |
name | controller |