快速开始

最近更新时间:2024-09-14 16:10:21

我的收藏
注意:
ingress-nginx 是一个由社区维护的开源项目。本文内容仅供参考,不提供官方支持。如在使用过程中遇到问题,建议查阅 ingress-nginx 社区 的最新官方文档以获取帮助。

概述

Nginx Ingress Controller 是基于高性能 NGINX 反向代理实现的 Kubernetes Ingress 控制器,也是最常用的开源 Ingress 实现。本文介绍如何在 TKE 环境中自建 Nginx Ingress Controller,主要使用 helm 进行安装,提供一些 values.yaml 配置指引。

前提条件

创建了 TKE 集群。
安装了 helm
配置了 TKE 集群的 kubeconfig,且有权限操作 TKE 集群。详情请参见 连接集群

使用 helm 安装

添加 helm repo:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
说明:
如果 Helm 命令所在的机器无法连接到 GitHub,将添加失败,您可以参考 常见问题:连不上 GitHub 导致安装失败 来解决此问题。
查看默认配置:
helm show values ingress-nginx/ingress-nginx
Nginx Ingress 依赖的镜像在 registry.k8s.io 这个 registry 下,国内网络环境无法拉取,可替换为 docker hub 中的 mirror 镜像。
准备 values.yaml
controller: # 以下配置将依赖镜像替换为了 docker hub 上的 mirror 镜像以保证在国内环境能正常拉取
image:
registry: docker.io
image: k8smirror/ingress-nginx-controller
admissionWebhooks:
patch:
image:
registry: docker.io
image: k8smirror/ingress-nginx-kube-webhook-certgen
defaultBackend:
image:
registry: docker.io
image: k8smirror/defaultbackend-amd64
opentelemetry:
image:
registry: docker.io
image: k8smirror/ingress-nginx-opentelemetry
说明:
配置中的 mirror 镜像均使用 image-porter 长期自动同步,可放心安装和升级。
安装:
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \\
--namespace ingress-nginx --create-namespace \\
-f values.yaml
说明:
后续如果需要修改 values 配置,或者升级版本,都可以通过执行这个命令来更新 Nginx Ingress Controller。
查看流量入口(CLB VIP 或域名):
$ kubectl get services -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer xxx.xx.xxx.xxx xxx.xx.xx.xxx 80:30683/TCP,443:32111/TCP 53s
ingress-nginx-controller-admission ClusterIP xxx.xx.xxx.xxx <none> 443/TCP 53s
说明:
LoadBalancer 类型 Service 的 EXTERNAL-IP 就是 CLB 的 VIP 或域名,可以配置 DNS 解析。如果是 VIP,则配 A 记录;如果是 CLB 域名,则配置 CNAME 记录。

常见问题

连不上 GitHub 导致安装失败如何处理?

问题描述

ingress-nginx 的 Helm chart 仓库地址在 GitHub。如果 Helm 命令所在的环境无法连接到 GitHub,就无法下载 chart 包,helm repo add 操作也会失败。

解决方案

如果遇到这个问题,您可以在能连上 GitHub 的机器上下载 chart 包,然后拷贝到 Helm 命令所在机器上。详细步骤如下:
1. 下载 chart 包,代码示例如下:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm fetch ingress-nginx/ingress-nginx
说明:
如果需要下载指定版本的 chart,可以给 fetch 子命令添加 --version 参数,例如:
helm fetch ingress-nginx/ingress-nginx --version 4.7.5
2. 查看下载的 chart 包:
$ ls
ingress-nginx-4.11.2.tgz
3. 将下载的 chart 包拷贝到 Helm 命令所在的机器上,安装命令将 chart 名称替换成压缩包文件路径即可:
helm upgrade --install ingress-nginx ingress-nginx-4.11.2.tgz \\
--namespace ingress-nginx --create-namespace \\
-f values.yaml

版本与升级

Nginx Ingress 的版本需要与 Kubernetes 集群版本能够兼容,可参考官方 Supported Versions table 确认当前集群版本能否支持最新的 nginx ingress,如果不支持,安装的时候需指定 chart 版本。
例如当前的 TKE 集群版本是 1.24,chart 版本最高只能到 4.7.*,通过以下命令检查有哪些可用版本:
$ helm search repo ingress-nginx/ingress-nginx --versions | grep 4.7.
ingress-nginx/ingress-nginx 4.7.5 1.8.5 Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx 4.7.3 1.8.4 Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx 4.7.2 1.8.2 Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx 4.7.1 1.8.1 Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx 4.7.0 1.8.0 Ingress controller for Kubernetes using NGINX a...
可以看到 4.7.* 版本最高是 4.7.5,安装的时候需加上版本号:
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \\
--version 4.7.5 \\
--namespace ingress-nginx --create-namespace \\
-f values.yaml
注意:
TKE 集群升级前,先检查当前 Nginx Ingress 版本能否兼容升级后的集群版本,如果不能兼容,先升级 Nginx Ingress(用上面的命令指定 chart 版本号)。

使用 Ingress

Nginx Ingress 实现了 Kubernetes 的 Ingress API 定义的标准能力,Ingress 的基础用法请参见 Kubernetes 官方文档
必须指定 ingressClassName 为 Nginx Ingress 实例所使用的 IngressClass(默认为 nginx):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
除此之外,Nginx Ingress 还有很多其它特有的功能,通过 Ingress 注解来扩展 Ingress 的功能,请参见 Nginx Ingress Annotations

更多自定义

如果需要对 Nginx Ingress 进行更多的自定义,可参考以下文档,根据自己需求合并 values.yaml 配置,values.yaml 完整配置示例 提供了合并后的 values.yaml 完整配置示例。
另外您也可以将 values.yaml 拆成多个文件维护,执行安装或更新命令时,用多个 -f 参数指定多个配置文件即可:
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \\
--namespace ingress-nginx --create-namespace \\
-f image-values.yaml \\
-f prom-values.yaml \\
-f logrotate-values.yaml \\
-f autoscaling-values.yaml