ubantu24,k8s v1.33.6,离线部署ingress v1.13.6

📅 2026/7/26 20:48:29 👁️ 阅读次数 📝 编程学习
ubantu24,k8s v1.33.6,离线部署ingress v1.13.6

已有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用的什么版本,根据对应的版本下载镜像。

image

 

image

  

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

 

image

 如果没有两行说明镜像导入失败。

 

三,卸载老版本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 修改。