ingress-controller 高可用部署 ¶
核心原则是确保:
- 多个 Ingress Controller 实例分布在不同节点。
- 配置统一且自动同步。
- 有健康检查机制和故障转移能力。
- 可监控、可扩展。
使用 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