在 Kubernetes 集群中,Ingress 是授权入站连接到达集群服务的规则集合,为您提供七层负载均衡能力,您可以通过 Ingress 配置提供外部可访问的 URL、负载均衡、SSL、基于名称的虚拟主机等。作为集群流量接入层,Ingress 的高可靠性显得尤为重要,本文探讨如何部署一套高性能高可靠的 Ingress 接入层。
前提条件
高可靠部署架构
高可靠性首先要解决的就是单点故障问题,一般常用的是采用多副本部署的方式,在 Kubernetes 集群中部署高可靠 Ingress 接入层同样采用多节点部署架构,同时由于 Ingress 作为集群流量接入口,建议采用独占 Ingress 节点的方式,以避免业务应用与 Ingress 服务发生资源争抢。
如上述部署架构图,由多个独占 Ingress 实例组成统一接入层承载集群入口流量,同时可依据后端业务流量水平扩缩容 Ingress 节点。当然如果您前期的集群规模并不大,也可以采用将 Ingress 服务与业务应用混部的方式,但建议进行资源限制和隔离。
高可靠Ingress接入层部署说明
- Ingress SLB:Ingress 接入层前端 SLB 实例
- Ingress Node:部署 Ingress Pod 的集群节点
- Ingress Pod:Ingress 服务实例
这三者之间依据标签node-role.kubernetes.io/ingress=true进行关联:
- Ingress SLB 后端只会挂载打标node-role.kubernetes.io/ingress=true的集群 Node。
- Ingress Pod 只会被部署到打标node-role.kubernetes.io/ingress=true的集群 Node。
步骤1 给 Ingress Node 添加标签
- 登录 容器服务控制台。
- 在 Kubernetes 菜单下,单击左侧导航栏中的 集群 > 节点,进入节点列表页面。
- 选择所需的集群,查看其下的节点,查看 worker 节点的实例 ID,最后在页面右上角单击 标签管理。
- 进入标签管理页面,勾选 worker 节点,单击 添加标签,为 worker 节点添加 node-role.kubernetes.io/ingress:true 标签,最后单击 确定。
在标签管理页面,您可看到 worker 节点已经成功添加该标签。
您也可登录 Master 节点,通过执行 kubectl label no nodeID node-role.kubernetes.io/ingress=true 为 worker 节点快速添加标签。
步骤2 创建 Ingress 服务
- 登录 容器服务控制台。
- 在 Kubernetes 菜单下,单击左侧导航栏中的应用 > 部署,进入部署列表页面。
- 选择所需的集群和 kube-system 命名空间,找到 nginx-ingress-controller 组件,然后单击右侧的 删除,并在弹出框中进行确定。
集群初始化时默认部署了一个Ingress Controller,请参考 ingress-nginx。需要先删除该 Ingress Controller 组件,再部署一套新的高可靠 Ingress Controller 接入层。
然后单击右上角的使用模板部署。
选择所需的集群,以及 kube-system 命名空间,选择样例模板或自定义,然后单击创建。
本例中,通过 DaemonSet 方式将其重新部署到目标 Ingress Node 上,当然您也可以采用 Deployment 配合亲和性方式来部署。# nginx ingress pods apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: nginx-ingress-controller labels: app: ingress-nginx namespace: kube-system spec: template: metadata: labels: app: ingress-nginx spec: nodeSelector:node-role.kubernetes.io/ingress: "true" ##通过标签选择器将 pod 部署到对应的节点上 serviceAccount: admin containers: - name: nginx-ingress-controller image: registry.cn-hangzhou.aliyuncs.com/acs/aliyun-ingress-controller:aliyun-nginx-0.9.0-beta.19.2 args: - /nginx-ingress-controller - --default-backend-service=$(POD_NAMESPACE)/default-http-backend - --configmap=$(POD_NAMESPACE)/nginx-configuration - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services - --udp-services-configmap=$(POD_NAMESPACE)/udp-services - --annotations-prefix=nginx.ingress.kubernetes.io - --publish-service=$(POD_NAMESPACE)/nginx-ingress-lb - --v=2 env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace ports: - name: http containerPort: 80 - name: https containerPort: 443 livenessProbe: failureThreshold: 3 httpGet: path: /healthz port: 10254 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 readinessProbe: failureThreshold: 3 httpGet: path: /healthz port: 10254 scheme: HTTP periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1- 部署成功后,单击 Kubernetes 控制台,进入 Kubernetes Dashboard。选择 Kube-system 命名空间,单击左侧导航栏中的守护进程集,查看 nginx-ingress-controller。
- 单击左侧导航栏中的容器组,您可查看 nginx-ingress-controller 的两个容器组。
步骤3 更新 Ingress SLB 服务
- 登录 容器服务控制台。
- 在 Kubernetes 菜单下,单击左侧导航栏中的应用 > 服务,进入服务列表页面。
- 选择所需的集群和 Kube-system 命名空间,找到 nginx-ingress-lb 服务,单击右侧的更新。集群初始化时默认部署了一个 Ingress LoadBalancer Service,具体部署说明请参考 ingress-nginx,您需要更新 Ingress LoadBalancer Service,以自动识别挂载打标的 Ingress Node
- 在弹出的对话框中,添加一条注释。service.beta.kubernetes.io/alicloud-loadbalancer-backend-label: "node-role.kubernetes.io/ingress=true",然后单击确定,完成更新。您也可登录集群 Master 节点,执行 kubectl apply -f https://acs-k8s-ingress.oss-cn-hangzhou.aliyuncs.com/nginx-ingress-slb-service.yml命令更新 nginx-ingress-lb 服务。
至此,若干 Ingress 实例的高可靠接入层部署完成,可有效应对单点故障和业务流量的挑战,您还可通过打标的方式快速扩容 Ingress 接入层。
https://help.aliyun.com/document_detail/71840.html