日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kubernetes通过containerd访问registry的30443端口

發布時間:2025/3/21 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kubernetes通过containerd访问registry的30443端口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

由于Kubernetes默認情況下只開放30000-32767這些端口,但是docker-registry在部署在Kubernetes中的時候conrainerd訪問就會出現端口不匹配的問題,主要原因是containerd默認情況下HTTPS方式的訪問端口為443,但是按照Kubernetes默認的設置,docker-registry在部署的時候對外暴露的端口在30000-32767之間,因此要么修改Kubernetes默認的端口開啟443端口,要么讓containerd在訪問HTTPS的默認端口為30000-32767之間。

解決方案

一. 修改Kubernetes默認端口范圍

#解決方法為修改apiserver的啟動參數 vim /etc/kubernetes/manifests/kube-apiserver.yaml # 添加如下配置 - --service-node-port-range=1-65535

上述配置為將默認端口都開放,但是這種解決方案存在安全性問題,因此不推薦使用。

二. 修改containerd源碼使得HTTPS默認端口為指定值

1. 在Kubernetes中部署docker registry的時候向外暴露的端口設置為30443(也可以設置其他值)

部署過程看我另外一篇文章:https://blog.csdn.net/weixin_38299404/article/details/117136499

docker-registry.yaml

apiVersion: apps/v1 kind: Deployment metadata:name: docker-registrynamespace: default spec:selector:matchLabels:app: docker-registryspec:nodeSelector:kubernetes.io/hostname: master1containers:- name: docker-registryimage: docker.io/library/registry:2.7.1imagePullPolicy: IfNotPresentports:- containerPort: 8443env:- name: REGISTRY_HTTP_ADDRvalue: "0.0.0.0:8443"- name: REGISTRY_HTTP_TLS_CERTIFICATEvalue: "/certs/Yuan.crt"- name: REGISTRY_HTTP_TLS_KEYvalue: "/certs/Yuan.key"- name: REGISTRY_AUTHvalue: "htpasswd"- name: REGISTRY_AUTH_HTPASSWD_PATHvalue: "/auth/htpasswd"- name: REGISTRY_AUTH_HTPASSWD_REALMvalue: "Registry Realm"volumeMounts:- name: reg-datamountPath: /vat/lib/registry- name: reg-authmountPath: /auth- name: reg-certsmountPath: /certsvolumes:- name: reg-datahostPath:path: /home/docker-registry/images- name: reg-authhostPath:path: /home/docker-registry/auth- name: reg-certshostPath:path: /home/docker-registry/certs --- apiVersion: v1 kind: Service metadata:name: docker-registrynamespace: default spec:type: NodePortports:- port: 8443targetPort: 8443nodePort: 30443protocol: TCPselector:app: docker-registry # 部署 $ kubectl apply -f docker-registry.yaml # 查看Pod $ kubectl get po # 查看svc,這里就可以看到docker registry對外暴露的端口號為30443 $ kubectl get svc

2. 嘗試拉取鏡像

通過命令:

# 修改containerd的配置文件中的端口號 $ vim /etc/containerd/config.toml endpoint = ["https://10.131.82.53:30443"] # 可以拉取到鏡像的命令 ctictl pull Yuan.com/nginx:v1 --creds Yuan:Abcd123456 ctr i pull Yuan.com:30443/nginx:v1 --user Yuan:Abcd123456 # 不能拉取鏡像的命令 ctictl pull Yuan.com:30443/nginx:v1 --creds Yuan:Abcd123456 ctr i pull Yuan.com/nginx:v1 --user Yuan:Abcd123456

通過yaml部署文件

pod-pull-test.yaml

apiVersion: v1 kind: Pod metadata:name: pod-pull-test spec:nodeSelector:kubernetes.io/hostname: master1containers:- name: pod-pull-testimage: Yuan.com/nginx:v1imagePullPolicy: Always

部署測試

$ kubectl apply -f pod-pull-test.yaml $ kubectl describe po pull-pod failed to do request: Head "https://Yuan.com:443/v2/nginx:v1" # 通過以上輸出信息可以看出containerd在拉取鏡像的時候還是走的443端口,因此拉取鏡像失敗 # 同時可以推斷出來Kubernetes在拉取鏡像的時候的命令與`ctr i pull Yuan.com/nginx:v1 --user Yuan:Abcd123456`效果類似

修改yaml文件再次拉取

pod-pull-test.yaml

apiVersion: v1 kind: Pod metadata:name: pod-pull-test spec:nodeSelector:kubernetes.io/hostname: master1containers:- name: pod-pull-testimage: Yuan.com:30443/nginx:v1imagePullPolicy: Always

部署測試

$ kubectl apply -f pod-pull-test.yaml $ kubectl describe po pull-pod failed to do request: Head "https://Yuan.com:443/v2/nginx:v1" x509: certificate signed by unknown authority # 通過以上輸出信息可以看出containerd在拉取鏡像的時候走的還是443端口 # 同時還報了證書簽名的問題導致鏡像拉取失敗

3.修改containerd源碼HTTPS默認端口號

# 在containerd源碼目錄下面執行如下命令 $ grep -rwnI "443" # 找到于Kubernetes的相關的代碼,路徑如下 containerd/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/adr.go:16: https: 443 # 將這一行修改為30443后編譯部署containerd

4.修改證書信息

cd certs# 生成2048位的私鑰,也可以生成4096位的,看自己需求openssl genrsa -out Yuan.key 2048# 生成證書請求文件openssl req -new -key Yuan.key -subj "/CN=Yuan.com" -out Yuan.csr# 將DNS地址寫入一個文件,為了解決上述所說的那個問題echo subjectAltName = DNS:Yuan.com>extfile.cnf# 將IP地址寫入一個文件,為了解決上述所說的那個問題echo subjectAltName = IP:10.131.82.54>>extfile.cnf# 這里的ca我就使用了集群自帶的,在/etc/kubernetes/pki/下openssl x509 -req -in Yuan.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out Yuan.crt -days 5000 # 查看證書信息openssl x509 -in Yuan.crt -noout -text# 將生存的證書信息追加到系統的證書管理文件后cat Yuan.crt >> /etc/pki/tls/certs/ca-bundle.crt

上述IP地址修改為你部署docker registry機器的IP地址

修改yaml文件再次拉取

pod-pull-test.yaml

apiVersion: v1 kind: Pod metadata:name: pod-pull-test spec:nodeSelector:kubernetes.io/hostname: master1containers:- name: pod-pull-testimage: Yuan.com/nginx:v1imagePullPolicy: Always

部署測試

$ kubectl apply -f pod-pull-test.yaml $ kubectl get po # 通過上面的命令就可以看到pod成功拉起了

總結

為了符合Kubernetes的端口要求并且可以通過containerd成功部署業務鏡像就必須要修改containerd的HTTPS默認端口號,在生成docker reigstry證書的時候需要將IP信息和DNS信息寫入才能成功拉取到鏡像,這樣修改完的好處是不用修改Kubernetes的相關默認配置,在私有倉庫拉取鏡像的時候不用指定docker registry服務的端口號。

總結

以上是生活随笔為你收集整理的Kubernetes通过containerd访问registry的30443端口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。