Ingress-nginx Deployment (Helm)
ingress-nginx 三种常用的部署模式
Deployment+LoadBalancer模式的service
用Deployment部署ingress-controller,创建一个type为LoadBalancer的service关联这组pod。大部分公有云,都会为LoadBalancer的service自动创建一个负载均衡器,通常还绑定了公网地址。只要把域名解析指向改地址,就实现了集群服务的对外暴露。
Deployment+NodePort模式的service
用Deployment模式部署ingress-controller,然后创建对应的ingress svc,type为NodePort。ingress会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口(可以设置固定端口),一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。
NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定的影响。
DaemonSet+HostNetwork(+nodeSelector)
用DaemonSet 结合nodeSelector来部署ingress-controller到特定的Node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/443端口就能访问服务。该方式整个请求链路最简单,性能相对nodeport模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod;比较适合大并发的生产环境使用。
ingress-nginx 部署
下载
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
pull ingress-nginx/ingress-nginx --version 4.10.0
tar -zxvf ingress-nginx-4.10.0.tgz
cd ingress-nginx
修改 values.yaml
# 修改镜像
sed -i 's@registry: registry.k8s.io@registry: registry.cn-hangzhou.aliyuncs.com@' values.yaml
sed -i 's@image: ingress-nginx/controller@image: google_containers/nginx-ingress-controller@' values.yaml
sed -i 's@image: ingress-nginx/kube-webhook-certgen@image: google_containers/kube-webhook-certgen@' values.yaml
# 修改 hostNetwork 的值为 true
sed -i 's@hostNetwork: false@hostNetwork: true@' values.yaml
# 修改 dnsPolicy 的值为 ClusterFirstWithHostNet
sed -i 's@dnsPolicy: ClusterFirst@dnsPolicy: ClusterFirstWithHostNet@' values.yaml
# 修改 kind 为:DaemonSet
sed -i 's@kind: Deployment@kind: DaemonSet@' values.yaml
# 修改 tag版本,k8s只支持1.6
sed -i 's@tag: "v1.10.0"@tag: "v1.6.4"@' values.yaml
# 将 service 中的 type 由 LoadBalancer 修改为 ClusterIP,如果服务器是云平台才用 LoadBalancer
sed -i 's@type: LoadBalancer@type: ClusterIP@' values.yaml
# 注释 nginx-ingress-controller、kube-webhook-certgen 的 digest
# nodeSelector 添加标签: ingress: "true",用于部署 ingress-controller 到指定节点
nodeSelector:
kubernetes.io/os: linux
ingress: "true"
# 修改 admissionWebhooks.enabled 为 false
enabled: false
安装
kubectl create namespace ingress-nginx
# 添加标签: ingress: "true",用于部署 ingress-controller 到指定节点
kubectl label node szzb-bg-dev-etl-9 ingress=true
# Chart.yaml 上级目录下执行
helm install ingress-nginx -n ingress-nginx ./ingress-nginx
# helm uninstall ingress-nginx -n ingress-nginx
The ingress-nginx controller has been installed.
Get the application URL by running these commands:
export POD_NAME="$(kubectl get pods --namespace ingress-nginx --selector app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/component=controller --output jsonpath="{.items[0].metadata.name}")"
kubectl port-forward --namespace ingress-nginx "${POD_NAME}" 8080:80
echo "Visit http://127.0.0.1:8080 to access your application."