一、安装 Nginx Ingress Controller
# 1. 创建 ingress-nginx 命名空间(独立部署,避免冲突)kubectl create namespace ingress-nginx# 2. 添加 Helm 仓库并更新helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxhelm repo update# 3. 安装适配 k8s v1.23 的控制器(使用阿里云镜像,避免拉取失败)helm install nginx-ingress ingress-nginx/ingress-nginx \--namespace ingress-nginx \--set controller.image.repository=registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller \--set controller.image.tag=v1.5.1 \--set controller.nodeSelector."kubernetes\.io/os"=linux \--set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \--set controller.service.type=NodePort \--set 'controller.service.ports.http={nodePort:30080,port:80}' \--set 'controller.service.ports.https={nodePort:30443,port:443}' \--set controller.admissionWebhooks.enabled=false # 关闭准入钩子,简化部署#如果安装不成功,参照下面的内容
# 1. 创建工作目录mkdir -p /root/k8s-yaml/ingress-nginx && cd /root/k8s-yaml/ingress-nginx# 2. 下载指定版本的 Chart 包(适配 k8s v1.23)helm pull ingress-nginx/ingress-nginx --version 4.4.2 # 4.4.2 版本与 v1.5.1 控制器匹配# 3. 解压 Chart 包tar -zxvf ingress-nginx-4.4.2.tgz && cd ingress-nginx
修改内容
controller:image:# 改为阿里云镜像(避免拉取失败,适配你的环境)registry: registry.cn-hangzhou.aliyuncs.comimage: google_containers/nginx-ingress-controllertag: "v1.5.1"digest: "" # 清空 digest,避免与阿里云镜像冲突digestChroot: "" # 同上pullPolicy: IfNotPresent# 关闭准入控制(简化部署,避免之前的配置冲突)admissionWebhooks:enabled: falsecontroller:service:enabled: trueappProtocol: true# clusterIP: ""externalIPs: []loadBalancerIP: ""loadBalancerSourceRanges: []enableHttp: trueenableHttps: true# externalTrafficPolicy: ""# sessionAffinity: ""# healthCheckNodePort: 0ipFamilyPolicy: "SingleStack"ipFamilies:- IPv4ports:http: 80https: 443targetPorts:http: httphttps: https# 核心修改1:服务类型从 LoadBalancer 改为 NodePorttype: NodePort# 核心修改2:指定节点端口(与你的规划一致)nodePorts:http: "30080" # HTTP 外部访问端口https: "30443" # HTTPS 外部访问端口tcp: {}udp: {}internal:enabled: falseannotations: {}# loadBalancerIP: ""loadBalancerSourceRanges: []# externalTrafficPolicy: ""# 节点选择器(保持默认,适配 Linux 节点)nodeSelector:kubernetes.io/os: linuxdefaultBackend:# 禁用默认后端(无需额外默认 404 服务,简化部署)enabled: false# 其余配置保持你原文件的默认值,无需修改rbac:create: truescope: falseserviceAccount:create: truename: ""automountServiceAccountToken: trueimagePullSecrets: []tcp: {}udp: {}portNamePrefix: ""dhParam:
修改说明(仅 3 处核心改动)
-
镜像配置:将默认的 registry.k8s.io改为阿里云镜像仓库,避免海外镜像拉取超时,同时清空digest确保镜像匹配。 -
服务配置:将 service.type从LoadBalancer改为NodePort,并指定nodePorts为 30080(HTTP)、30443(HTTPS),适配你的集群网络。 -
关闭准入钩子:将 admissionWebhooks.enabled改为false,避免复杂的证书配置和之前的部署报错。
使用修改后的 values.yaml 安装 Ingress Controller
# 确保当前目录在解压后的 ingress-nginx Chart 目录下cd /root/k8s-yaml/ingress-nginx/ingress-nginx# 安装(指定修改后的 values.yaml,命名空间 ingress-nginx)helm install nginx-ingress . \--namespace ingress-nginx \-f values.yaml # 若修改后的文件仍叫 values.yaml,可省略 -f 参数(默认读取)
二、验证 Ingress Controller 部署
# 1. 查看 Pod 状态(确保 Running)kubectl get pods -n ingress-nginx# 2. 查看 Service 状态(确保 NodePort 30080/30443 已分配)kubectl get svc -n ingress-nginx#示例[root@k8s-master ingress-nginx]# kubectl get pods -n ingress-nginxNAME READY STATUS RESTARTS AGEnginx-ingress-ingress-nginx-controller-f5664cdf7-9tckg 1/1 Running 0 13m[root@k8s-master ingress-nginx]# kubectl get svc -n ingress-nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-ingress-ingress-nginx-controller NodePort 10.97.89.179 <none> 80:32500/TCP,443:30596/TCP 13m
Ingress Controller 已经成功切换为 NodePort 类型并正常运行,只是端口还是自动分配的(32500/30596),没生效我们指定的 30080/30443。 补丁:
# 补丁文件(指定固定 nodePort)cat <<EOF > nodeport-patch.yamlspec:ports:- name: httpnodePort: 30080port: 80protocol: TCPtargetPort: http- name: httpsnodePort: 30443port: 443protocol: TCPtargetPort: httpstype: NodePortEOF# 应用补丁kubectl patch svc nginx-ingress-ingress-nginx-controller -n ingress-nginx --patch-file nodeport-patch.yaml#验证[root@k8s-master ingress-nginx]# kubectl get svc -n ingress-nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-ingress-ingress-nginx-controller NodePort 10.97.89.179 <none> 80:30080/TCP,443:30443/TCP 15m
更改Ingress类型
方案一:直接修改 values.yaml 重新部署(推荐,配置持久化)
如果想保留 Helm 部署的可维护性,直接修改之前的 values.yaml,替换原有的 controller.service 配置,重新升级部署:
1. 编辑 values.yaml(核心修改部分)
找到 controller.service 节点,替换为以下内容(根据你的环境选一种):
场景 A:有负载均衡器(云环境 / 物理负载均衡器)→ 用 LoadBalancer 类型
controller:# 原配置:hostNetwork: falsehostNetwork: true # 改为 true,启用宿主机网络controller:service:enabled: trueappProtocol: truetype: LoadBalancer # 改为 LoadBalancer,自动映射 80/443 端口ports:http: 80 # 物理机/负载均衡器暴露 80 端口https: 443 # 物理机/负载均衡器暴露 443 端口targetPorts:http: httphttps: https# 删掉原有的 nodePorts 配置(LoadBalancer 不需要)nodePorts: {}# 其他配置(镜像、nodeSelector 等)保持不变
场景 B:单节点 / 无负载均衡器 → 用 ClusterIP + hostNetwork
controller:# 原配置:hostNetwork: falsehostNetwork: true # 改为 true,启用宿主机网络controller:# 新增 hostNetwork 配置,让 Pod 直接用宿主机 80/443 端口hostNetwork: trueservice:enabled: trueappProtocol: truetype: ClusterIP # 改为 ClusterIP,无需 NodePortports:http: 80https: 443targetPorts:http: httphttps: httpsnodePorts: {} # 清空 nodePorts# 其他配置保持不变
2. 应用修改(Helm 升级部署)
# 进入 Chart 目录(你的解压目录)cd /root/k8s-yaml/ingress-nginx/ingress-nginx# 执行 Helm 升级,应用新的 values.yamlhelm upgrade nginx-ingress . -n ingress-nginx -f values.yaml
3. 验证配置
# 查看 Service 类型和端口(LoadBalancer 会显示 EXTERNAL-IP,ClusterIP 无外部端口)kubectl get svc -n ingress-nginx# 查看 Pod 是否启用 hostNetwork(场景 B 需验证)kubectl describe pod -n ingress-nginx nginx-ingress-ingress-nginx-controller-f5664cdf7-9tckg | grep "HostNetwork"
方案二:用补丁快速修改(无需编辑文件,适合临时调整)
如果不想改 values.yaml,直接用 kubectl patch 修改现有资源,快速生效:
场景 A:切换为 LoadBalancer 类型(有负载均衡器)
# 创建补丁文件cat <<EOF > service-patch.yamlspec:type: LoadBalancerports:- name: httpport: 80protocol: TCPtargetPort: http- name: httpsport: 443protocol: TCPtargetPort: https# 删掉 NodePort 相关配置nodePorts: {}EOF# 应用补丁kubectl patch svc nginx-ingress-ingress-nginx-controller -n ingress-nginx --patch-file service-patch.yaml
场景 B:切换为 ClusterIP + hostNetwork(无负载均衡器)
# 1. 补丁修改 Deployment,启用 hostNetworkcat <<EOF > deployment-patch.yamlspec:template:spec:hostNetwork: trueEOFkubectl patch deployment nginx-ingress-ingress-nginx-controller -n ingress-nginx --patch-file deployment-patch.yaml# 2. 补丁修改 Service 为 ClusterIPcat <<EOF > service-patch.yamlspec:type: ClusterIPports:- name: httpport: 80protocol: TCPtargetPort: http- name: httpsport: 443protocol: TCPtargetPort: httpsnodePorts: {}EOFkubectl patch svc nginx-ingress-ingress-nginx-controller -n ingress-nginx --patch-file service-patch.yaml
最后验证与域名配置
-
确认 Ingress 控制器状态:
kubectl get pods -n ingress-nginx -
-
-
-
-
配置域名解析:在本地
hosts文件或 DNS 服务器中,添加域名映射(IP 为集群节点 IP 或负载均衡器 IP):192.168.x.x harbor.example.com192.168.x.x notary.harbor.example.c -
-
-
-

