跳转至

ingress-controller 高可用部署

核心原则是确保:

  1. 多个 Ingress Controller 实例分布在不同节点。
  2. 配置统一且自动同步。
  3. 有健康检查机制和故障转移能力。
  4. 可监控、可扩展。

使用 DaemonSet 资源部署 ingress-controller 高可用,会在每个 node 节点做亲和性(master不部署)。

主机软、硬件配置说明

主机名 IP 地址 规格 软件
k8s-w1 10.10.100.40 2C / 4G / 1024GB ingress-controller
k8s-w2 10.10.100.50 2C / 4G / 1024GB ingress-controller
k8s-w3 10.10.100.60 2C / 4G / 1024GB ingress-controller

部署 ingress-controller

获取 ingress 的编排文件

curl -k https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml  -o deploy.yaml

ingress高可用配置修改

1. 给部署ingress-controller的节点打标签

不建议将Ingress服务部署到master节点上,选择worker节点添加标签。

kubectl label node k8s-w1 k8s-w2 k8s-w3 ingresscontroller=true && kubectl get nodes --show-labels

2. 修改Deployment为DaemonSet

kind: DaemonSet

3. 启用hostNetwork网络,并指定运行节点

# 将 Ingress Controller 的 80/443 端口直接绑定到节点主机,外部可通过 **节点 IP:80/443** 直接访问服务,无需通过 NodePort 中转。
hostNetwork: True
      nodeSelector:
        kubernetes.io/os: linux
        ingresscontroller: 'true' # nodeSelector 指定之前添加 ingresscontroller=true 标签的node

4. 修改 updateStrategy 字段

  updateStrategy:
    type: RollingUpdate  # 支持 OnDelete 或 RollingUpdate
    rollingUpdate:
      maxUnavailable: 1

5. 修改镜像地址

替换规则

  • 上述命令会直接修改原文件,请确保提前备份

  • 使用正则表达式匹配原始镜像 URL 及哈希值部分

  • 将匹配内容替换为阿里云镜像仓库的地址
# 修正的替换命令(精确匹配行首缩进)
sed -i 's|^ \+image: registry.k8s.io/ingress-nginx/controller:v1.12.2@sha256:.*|        image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.12.2|g' deploy.yaml
sed -i 's|^ \+image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.3@sha256:.*|        image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.5.3|g' deploy.yaml

验证修改结果

grep -r 'image:' deploy.yaml

image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.12.2
image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.5.3
image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.5.3

部署nginx-ingress

kubectl apply -f deploy.yaml

查看效果

kubectl get all -n ingress-nginx

NAME                                       READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-ckksv   0/1     Completed   0          129m
pod/ingress-nginx-admission-patch-vm7xz    0/1     Completed   0          129m
pod/ingress-nginx-controller-rdbjv         1/1     Running     0          129m
pod/ingress-nginx-controller-rql74         1/1     Running     0          129m
pod/ingress-nginx-controller-sj6m8         1/1     Running     0          129m

NAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.233.22.71    <none>        80:31914/TCP,443:31786/TCP   131m
service/ingress-nginx-controller-admission   ClusterIP   10.233.13.215   <none>        443/TCP                      131m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                   AGE
daemonset.apps/ingress-nginx-controller   3         3         3       3            3           ingresscontroller=true,kubernetes.io/os=linux   129m

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           3s         129m
job.batch/ingress-nginx-admission-patch    1/1           3s         129m