大数跨境
0
0

k8s 使用helm部署Ingress-Nginx

k8s 使用helm部署Ingress-Nginx SRE云原生
2025-11-27
1


一、安装 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.com    image: google_containers/nginx-ingress-controller    tag: "v1.5.1"    digest: ""  # 清空 digest,避免与阿里云镜像冲突    digestChroot: ""  # 同上    pullPolicy: IfNotPresent
  # 关闭准入控制(简化部署,避免之前的配置冲突)  admissionWebhooks:    enabled: false
controller:  service:    enabled: true    appProtocol: true    # clusterIP: ""    externalIPs: []    loadBalancerIP: ""    loadBalancerSourceRanges: []    enableHttp: true    enableHttps: true    # externalTrafficPolicy: ""    # sessionAffinity: ""    # healthCheckNodePort: 0    ipFamilyPolicy: "SingleStack"    ipFamilies:      - IPv4    ports:      http: 80      https: 443    targetPorts:      http: http      https: https    # 核心修改1:服务类型从 LoadBalancer 改为 NodePort    type: NodePort    # 核心修改2:指定节点端口(与你的规划一致)    nodePorts:      http: "30080"  # HTTP 外部访问端口      https: "30443" # HTTPS 外部访问端口      tcp: {}      udp: {}    internal:      enabled: false      annotations: {}      # loadBalancerIP: ""      loadBalancerSourceRanges: []      # externalTrafficPolicy: ""
  # 节点选择器(保持默认,适配 Linux 节点)  nodeSelector:    kubernetes.io/os: linux
defaultBackend:  # 禁用默认后端(无需额外默认 404 服务,简化部署)  enabled: false
# 其余配置保持你原文件的默认值,无需修改rbac:  create: true  scope: false
serviceAccount:  create: true  name: ""  automountServiceAccountToken: true
imagePullSecrets: []tcp: {}udp: {}portNamePrefix: ""dhParam:

修改说明(仅 3 处核心改动)

  1. 镜像配置:将默认的 registry.k8s.io 改为阿里云镜像仓库,避免海外镜像拉取超时,同时清空 digest 确保镜像匹配。
  2. 服务配置:将 service.type 从 LoadBalancer 改为 NodePort,并指定 nodePorts 为 30080(HTTP)、30443(HTTPS),适配你的集群网络。
  3. 关闭准入钩子:将 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: http    nodePort: 30080    port: 80    protocol: TCP    targetPort: http  - name: https    nodePort: 30443    port: 443    protocol: TCP    targetPort: https  type: 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: false  hostNetwork: true  # 改为 true,启用宿主机网络

controller:  service:    enabled: true    appProtocol: true    type: LoadBalancer  # 改为 LoadBalancer,自动映射 80/443 端口    ports:      http: 80  # 物理机/负载均衡器暴露 80 端口      https: 443  # 物理机/负载均衡器暴露 443 端口    targetPorts:      http: http      https: https    # 删掉原有的 nodePorts 配置(LoadBalancer 不需要)    nodePorts: {}  # 其他配置(镜像、nodeSelector 等)保持不变
场景 B:单节点 / 无负载均衡器 → 用 ClusterIP + hostNetwork
controller:  # 原配置:hostNetwork: false  hostNetwork: true  # 改为 true,启用宿主机网络

controller:  # 新增 hostNetwork 配置,让 Pod 直接用宿主机 80/443 端口  hostNetwork: true  service:    enabled: true    appProtocol: true    type: ClusterIP  # 改为 ClusterIP,无需 NodePort    ports:      http: 80      https: 443    targetPorts:      http: http      https: https    nodePorts: {}  # 清空 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: LoadBalancer  ports:  - name: http    port: 80    protocol: TCP    targetPort: http  - name: https    port: 443    protocol: TCP    targetPort: 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: ClusterIP  ports:  - name: http    port: 80    protocol: TCP    targetPort: http  - name: https    port: 443    protocol: TCP    targetPort: https  nodePorts: {}EOFkubectl patch svc nginx-ingress-ingress-nginx-controller -n ingress-nginx --patch-file service-patch.yaml

最后验证与域名配置

  1. 确认 Ingress 控制器状态:

    # Pod 重启后(场景 B 会重启),确保 Runningkubectl get pods -n ingress-nginx




  2. 配置域名解析:在本地 hosts 文件或 DNS 服务器中,添加域名映射(IP 为集群节点 IP 或负载均衡器 IP):

    192.168.x.x  harbor.example.com192.168.x.x  notary.harbor.example.c




【声明】内容源于网络
0
0
SRE云原生
专注于分享运维、Devops、网络安全以及SRE云原生相关知识,内容包括但不限于自动化运维、云架构、云监控、云安全、AI、AWS以及攻防渗透等。内容多以原创为主,旨在于编写高质量文章。
内容 35
粉丝 0
SRE云原生 专注于分享运维、Devops、网络安全以及SRE云原生相关知识,内容包括但不限于自动化运维、云架构、云监控、云安全、AI、AWS以及攻防渗透等。内容多以原创为主,旨在于编写高质量文章。
总阅读22
粉丝0
内容35