已有k8s v1.33.6集群,在无网环境离线安装ingress。
一,安装nertctl(所有k8s节点安装)
wget https://github.com/containerd/nerdctl/releases/download/v2.3.4/nerdctl-2.3.4-linux-amd64.tar.gz tar -zxvf nerdctl-2.3.4-linux-amd64.tar.gz mv nerdctl /usr/local/bin/ chmod +x /usr/local/bin/nerdctl nerdctl version
二,联网机器准备离线资源(有网环境执行)
1,下载官方 YAML(k8s v1.33.6的最佳使用ingress v1.13.6)
wget -O ingress-1.13.6.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.13.6/deploy/static/provider/baremetal/deploy.yaml
2,获取全部依赖镜像、导出离线 tar 包
打开ingress-1.13.6.yaml,搜索【registry.k8s.io】内容,检查看看ingress-nginx-controller与kube-webhook-cert.gen用的什么版本,根据对应的版本下载镜像。


3,拉取镜像
可以使用sealos 或 nerdctl拉取镜像:
两种方式:
1)拉取原生镜像
sealos pull registry.k8s.io/ingress-nginx/controller:v1.13.6 sealos pull registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.6
2)使用m.daocloud.io代理拉取镜像,然后改tag名字
sealos pull m.daocloud.io/registry.k8s.io/ingress-nginx/controller:v1.13.6 sealos pull m.daocloud.io/registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.6
修改tag
sealos tag m.daocloud.io/registry.k8s.io/ingress-nginx/controller:v1.13.6 registry.k8s.io/ingress-nginx/controller:v1.13.6 sealos tag m.daocloud.io/registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.6 registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.6
4,批量打包镜像
-m:批是打包镜像,加这个参数必须加 --format docker-archive
sealos save -m --format docker-archive -o ingress-images-v1.13.6.tar \ registry.k8s.io/ingress-nginx/controller:v1.13.6 \ registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.6
5,将导出的tar文件拷贝到k8s集群的所有节点(master + worker)
将以下文件传到所有 K8s 节点(master+worker)同一目录:
ingress-images-v1.13.6.tar
scp ./ingress-images-v1.13.6.tar root@k8s-worker-01:/data/offline-install-ingress
scp ./ingress-images-v1.13.6.tar root@k8s-worker-02:/data/offline-install-ingress
6,从离线文件导入ingress镜像到containerd容器(k8s所有节点执行)
导入到k8s.io命名空间:
nerdctl --address=/run/containerd/containerd.sock --namespace k8s.io load -i /data/offline-install-ingress/ingress-images-v1.13.6.tar # 重载镜像库索引 nerdctl --address=/run/containerd/containerd.sock --namespace k8s.io images prune --reset-index
7,检查所有节点的镜像是否导入成功
nerdctl --address=/run/containerd/containerd.sock --namespace k8s.io images | grep ingress-nginx

如果没有两行说明镜像导入失败。
三,卸载老版本ingress
如果已要存有老版本ingress,先卸载老板版
# 强制清空finalizer,彻底删除ingress-nginx命名空间
kubectl get ns ingress-nginx -o json | jq '.spec.finalizers=[]' | kubectl replace -f -
kubectl delete ns ingress-nginx --force --grace-period=0
# 清理准入webhook残留
kubectl delete validatingwebhookconfiguration ingress-nginx-admission 2>/dev/null
kubectl delete mutatingwebhookconfiguration ingress-nginx-admission 2>/dev/null
# 清理CRD残留
kubectl get crd | grep ingress-nginx | awk '{print $1}' | xargs kubectl delete crd 2>/dev/null
# 清理IngressClass
kubectl delete ingressclass nginx 2>/dev/null
四,通过yaml离线部署Ingress
1,移除镜像 sha256 摘要(离线必改,否则校验失败)
sed -i 's/@sha256:[0-9a-f]*//g' ingress-1.13.6.yaml
2,全局设置镜像拉取策略为 Never(强制使用本地镜像,不联网拉取)
# 在所有container下添加 imagePullPolicy: Never sed -i '/image: registry.k8s.io/a \ imagePullPolicy: Never' ingress-1.13.6.yaml
3,修改 Service 为固定 NodePort,80=30080, 443=30443
(个人习惯NodePort 的http使用30080,https使用 30443)
sed -i 's/type: LoadBalancer/type: NodePort\n ports:\n - name: http\n port: 80\n targetPort: http\n nodePort: 30080\n - name: https\n port: 443\n targetPort: https\n nodePort: 30443/' ingress-1.13.6.yaml
4,部署
kubectl apply -f ingress-1.13.6.yaml
5,先删除校验勾子,不删除创建不了ingress
kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission --ignore-not-found
如果不删除校验勾子,部署ingress规则会报如下错误:
Error from server (InternalError): error when creating "dotnet-demo-v1-ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": no endpoints available for service "ingress-nginx-controller-admission"
6,验证安装
# 查看命名空间Pod kubectl get pods -n ingress-nginx # 查看service端口 kubectl get svc -n ingress-nginx # 第二种查看service端口 kubectl get svc ingress-nginx-controller -n ingress-nginx # 查看ingress控制器就绪状态 kubectl get ingressclasses
五,【修改ingress控制器对外端口】
1,先切换编辑器避免报错
kubectl edit svc ingress-nginx-controller -n ingress-nginx
2,找到 spec.ports 区域,示例默认配置:
spec:clusterIP: 10.96.3.243clusterIPs:- 10.96.3.243externalTrafficPolicy: ClusterinternalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- appProtocol: httpname: httpnodePort: 30080 #修改为你要对外的端口port: 80 #service内部端口protocol: TCPtargetPort: http- appProtocol: httpsname: httpsnodePort: 30443 #修改为你要对外的端口port: 443 #service内部端口
现在ingress对外暴露的端口是 30080 和 30443。
如果要修改Ingress使用80端口访问,参照 https://www.cnblogs.com/yyee/p/21913914 修改。
