ingress-nginx的安装使用
开源的 Ingress Controller 的实现使用量最大的莫过于 Ingress Nginx 了,可作为反向代理将外部流量导入集群内部,将 Kubernetes 内部的 Service 暴露给外部,在 Ingress 对象中通过域名匹配 Service,这样就可以直接通过域名访问到集群内部的服务了。
实际 Ingress Nginx 有两种实现:
第一种是 Kubernetes 开源社区的实现,第二种是 Nginx 官方的实现,我们通常用的是 Kubernetes 社区的实现,这也是本文所关注的重点。
安装
我们这里通过Helm
来简化 nginx-ingress 的安装,所以确保 Helm 能够正常使用。由于部署ingress-nginx 所在的节点需要能够访问外网,这样域名可以解析到这些节点上直接使用,需要让 nginx-ingress 绑定节点的 80 和 443 端口。
如果你的K8S集群是自己部署的,可以选择能够外网访问的边缘节点,ingress-nginx通过 DasemonSet 和 hostPort 来进行部署,并通过 nodeSelector 来筛选有外网 IP 的边缘节点。
如果你的K8S集群是在云厂商购买的,可以直接部署,ingress-controller可以通过LoadBalancer提供外网访问服务。
这里我采用的云厂商的K8S集群,部署ingress-nginx的详细文档可以参考:https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx
1)添加Helm Repo:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
2)安装ingress-nginx chart:
kubectl create namespace ingress
helm install ingress-nginx ingress-nginx/ingress-nginx -n ingress --version 3.9.0
3)你也可以新建custom.yaml文件来覆盖 nginx-ingress Chart 包的一些默认参数:
controller:
image:
repository: docker.io/amuguelove/ingress-nginx
tag: "v0.41.0"
digest:
pullPolicy: IfNotPresent
extraArgs:
enable-ssl-passthrough: "true"
config:
server-tokens: "false"
这时你可以使用如何命令:
helm update --install -f custom.yaml ingress-nginx ingress-nginx/ingress-nginx -n ingress --version 3.9.0
4)安装完成后可以通过下面的命令查看 ingress-ingress 的 Pod 使用运行成功:
$ helm list -n ingress
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx ingress 7 2020-12-31 18:13:13.216027 +0800 CST deployed ingress-nginx-3.9.0 0.41.0
$ kubectl get pods -n ingress
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-565bcc4954-nls96 1/1 Running 0 141m
安装过程中需要用到k8s.gcr.io/ingress-nginx/controller
的镜像,大家可以先本地翻墙pull 下来后重新打上 tag,推送到Dockerhub。也可以使用我打包的,镜像地址如下:docker.io/amuguelove/ingress-nginx
使用
上面的 ingress-ingress 安装成功后,添加 kubernetes.io/ingress.class: nginx
注解到 Ingress资源。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-nginx
annotations:
kubernetes.io/ingress.class: nginx # 重点
spec:
rules:
- host: nginx.qcloud.com
http:
paths:
- backend:
serviceName: my-nginx
servicePort: 80
path: /
注意我们在 Ingress 资源对象中添加了一个 annotations:kubernetes.io/ingress.class: "nginx"
,这就是指定让这个 Ingress 通过 ingress-nginx 来处理。
若域名是自己随便定义的,可以在本地/etc/hosts
中添加对应的隐射也可以,然后就可以通过域名进行访问了。
除此之外,我们还可以利用cert-manager
来进行 HTTPS 自动化,可以参考之前写的文章。
参考资料
Ingress Nginx Chart: https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx
Ingress Nginx Github: https://github.com/kubernetes/ingress-nginx