Nginx Ingress 功能强大且性能极高,有多种部署方式。本文将介绍 Nginx Ingress 在腾讯云容器服务(Tencent Kubernetes Engine,TKE)上 Deployment + LB、Daemonset + HostNetwork + LB 和 Deployment + LB 直通 Pod 三种部署方案及其部署方法。
Nginx Ingress 是 Kubernetes Ingress 的一种实现。它通过 watch Kubernetes 集群的 Ingress 资源,将 Ingress 规则转换成 Nginx 的配置,让 Nginx 进行7层的流量转发。如下图所示:
Nginx Ingress 有以下两种实现方式,本文重点对 Kubernetes 开源社区的实现进行介绍:
对 Nginx Ingress 在 TKE 上部署的三种方案进行比较,本文向您提出以下选型建议:
在 TKE 上部署 Nginx Ingress 最简单的方式是将 Nginx Ingress Controller 以 Deployment 的方式部署,并且为其创建 LoadBalancer 类型的 Service(自动创建负载均衡 CLB 或绑定已有 CLB),使 CLB 接收外部流量,再转发到 Nginx Ingress 内部。如下图所示:
当前 TKE 上 LoadBalancer 类型的 Service 默认实现是基于 NodePort:CLB 会绑定各节点的 NodePort 作为后端 RS(Real Server),将流量转发到节点的 NodePort,节点再通过 Iptables 或 IPVS 将请求路由到 Service 对应的后端 Pod(即 Nginx Ingress Controller 的 Pod)。后续如有节点的增删,CLB 也会自动更新节点 NodePort 的绑定。
执行以下命令安装 Nginx Ingress:
kubectl create ns nginx-ingress
kubectl apply -f https://raw.githubusercontent.com/TencentCloudContainerTeam/manifest/master/nginx-ingress/nginx-ingress-deployment.yaml -n nginx-ingress
在方案1中,流量会经过一层 NodePort,会多一层转发。因此存在以下问题:
在方案2中,提出以下解决方法:
让 Nginx Ingress 使用 hostNetwork,CLB 直接绑节点 IP + 端口(80,443),不用经过 NodePort。由于使用 hostNetwork,Nginx Ingress 的 pod 就不能被调度到同一节点,为避免端口监听冲突,可提前选取部分节点作为边缘节点,专门用于部署 Nginx Ingress,并为这些节点打上 label,然后 Nginx Ingress 以 DaemonSet 方式部署在这些节点上。架构如下图所示:
如需安装 Nginx Ingress,请执行以下步骤:
kubectl label node 10.0.0.3 nginx-ingress=true
kubectl create ns nginx-ingress
kubectl apply -f https://raw.githubusercontent.com/TencentCloudContainerTeam/manifest/master/nginx-ingress/nginx-ingress-daemonset-hostnetwork.yaml -n nginx-ingress
在方案3中,提出以下解决方法:
kubectl create ns nginx-ingress
kubectl apply -f https://raw.githubusercontent.com/TencentCloudContainerTeam/manifest/master/nginx-ingress/nginx-ingress-deployment-eni.yaml -n nginx-ingress
方案2:Daemonset + HostNetwork + LB 是手动管理 CLB,在自行创建 CLB 时可以选择用公网或内网。方案1:Deployment + LB 和 方案3:Deployment + LB 直通 Pod 默认创建公网 CLB。
如果要用内网,可以重新部署 YAML,给 nginx-ingress-controller 中的 Service 添加 key,例如 service.kubernetes.io/qcloud-loadbalancer-internal-subnetid
,value 为内网 CLB 创建的子网 id 的 annotation。请参考以下代码:
apiVersion: v1
kind: Service
metadata:
annotations:
service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxxx # value 替换为集群所在 vpc 的其中一个子网 id
labels:
app: nginx-ingress
component: controller
name: nginx-ingress-controller
方案1:Deployment + LB 和 方案3:Deployment + LB 直通 Pod 默认自动创建新的 CLB,Ingress 的流量入口地址取决于新创建 CLB 的 IP 地址。如果业务对入口地址有依赖,可以让 Nginx Ingress 绑定已有的 CLB。
操作方法为重新部署 YAML,给 nginx-ingress-controller 中的 Service 添加 key,例如 service.kubernetes.io/tke-existed-lbid
,value 为 CLB ID 的 annotation。请参考以下代码:
apiVersion: v1
kind: Service
metadata:
annotations:
service.kubernetes.io/tke-existed-lbid: lb-6swtxxxx # value 替换为 CLB 的 ID
labels:
app: nginx-ingress
component: controller
name: nginx-ingress-controller
腾讯云账号有标准账户和传统账户两种类型:
注意:
您可参考文档 区分腾讯云账户类型 来区分自己账号的类型。
当您在 TKE 上自行部署 Nginx Ingress,需使用 Nginx Ingress 管理 Ingress 时,在容器服务控制台上无法创建 Ingress 时,可通过 YAML 的方式来创建 Ingress 并且需要给每个 Ingress 都指定 Ingress Class 的 annotation。请参考以下代码:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: nginx # 这里是重点
spec:
rules:
- host: *
http:
paths:
- path: /
backend:
serviceName: nginx-v1
servicePort: 80
通过 如何创建 Ingress 安装的 Nginx Ingress,已经暴露了 metrics 端口,可以被 Prometheus 采集。如果集群内安装了 prometheus-operator,可以使用 ServiceMonitor 来采集 Nginx Ingress 的监控数据。请参考以下代码:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: nginx-ingress-controller
namespace: nginx-ingress
labels:
app: nginx-ingress
component: controller
spec:
endpoints:
- port: metrics
interval: 10s
namespaceSelector:
matchNames:
- nginx-ingress
selector:
matchLabels:
app: nginx-ingress
component: controller
原生 Prometheus 配置请参考以下代码:
- job_name: nginx-ingress
scrape_interval: 5s
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- nginx-ingress
relabel_configs:
- action: keep
source_labels:
- __meta_kubernetes_service_label_app
- __meta_kubernetes_service_label_component
regex: nginx-ingress;controller
- action: keep
source_labels:
- __meta_kubernetes_endpoint_port_name
regex: metrics
采集监控数据后,可为 grafana 配置 Nginx Ingress 社区提供的面板,并展示数据。
实际操作中,直接复制 json 导入 grafana,即可导入面板。其中,nginx.json
是展示 Nginx Ingress 各种常规监控的面板。如下图所示:request-handling-performance.json
是展示 Nginx Ingress 性能方面的监控面板。如下图所示:
本页内容是否解决了您的问题?