一、安装helm
wget https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz
tar -xvf helm-v3.8.0-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/
chmod 755 /usr/local/bin/helm
# 验证
helm version
# helm安装ingress-nginx
# 添加repo
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo list
# 列出所有版本
helm search repo ingress-nginx -l
# 查看版本对应关系
https://github.com/kubernetes/ingress-nginx
# 下载对应版本
helm pull ingress-nginx/ingress-nginx --version 4.0.18
# 解压
tar -xvf ingress-nginx-4.0.18.tgz
# 修改配置
# controller配置段修改
cd ingress-nginx
vim values.yaml
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true
# 增加额外nodeSelector,指定节点部署
nodeSelector:
kubernetes.io/os: linux
ingress: "true"
type: ClusterIP
kind: DaemonSet
# 创建namespace
kubectl create ns ingress-nginx
# 对应节点打标签
kubectl label nodes k8s-node01 ingress="true"
kubectl label nodes k8s-node02 ingress="true"
# 安装
helm install ingress-nginx -n ingress-nginx .
# 补充
# 官方文档地址:https://kubernetes.github.io/ingress-nginx/
# 卸载
helm uninstall ingress-nginx -n ingress-nginx
# 部署以及暴露方式
# DaemonSet+HostNetwork+nodeSelector
# 用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。比较适合大并发的生产环境使用。
# ingress暴露k8s dashbaord
# 创建https秘钥对
kubectl create secret tls test-secret --cert=www.test.com.crt --key=www.test.com.key -n kubernetes-dashboard
# ingress 配置
cat > dashboard-ingress.yaml << EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kubernetes-dashboard-ingress
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
ingressClassName: nginx
tls:
- hosts:
- k8s.test.com
secretName: test-secret
rules:
- host: k8s.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kubernetes-dashboard
port:
number: 443
EOF
# 创建ingress,注意namespace
kubectl create -f dashboard-ingress.yaml -n kubernetes-dashboard
# 测试
# 访问https://k8s.test.com
# 获取访问token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')