快速开始
概述
Nginx Ingress Controller 是基于高性能 NGINX 反向代理实现的 Kubernetes Ingress 控制器,也是最常用的开源 Ingress 实现。本文介绍如何在 TKE 环境中自建 Nginx Ingress Controller,主要使用 helm 进行安装,提供一些 values.yaml
配置指引。
前提条件
使用 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 172.16.145.161 162.14.91.101 80:30683/TCP,443:32111/TCP 53s
ingress-nginx-controller-admission ClusterIP 172.16.166.237 <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
操作也会失败。
如果遇到这个问题,可以将 chart 先在能连上 GitHub 的机器上下载下来,然后拷贝到 helm 命令所在机器上。
下载方法:
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
查看下载的 chart 包:
$ ls
ingress-nginx-4.11.2.tgz
将这个压缩包拷贝到 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 \
--namespace ingress-nginx --create-namespace \
--version 4.7.5 \
-f values.yaml
TKE 集群升级前,先检查当前 Nginx Ingress 版本能否兼容升级后的集群版本,如果不能兼容,先升级 Nginx Ingress(用上面的命令指定 chart 版本号)。
使用 Ingress
Nginx Ingress 实现了 Kubernetes 的 Ingress API 定义的标准能力,Ingress 的基础用法可参考 Kubernetes 官方文档。
创建 Ingress 时必须指定 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
拆成多个文件维护,执行安装或更新命令时,用多个 -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