k8s集群中運行docker registry鏡像倉庫實踐
- docker registry 相對于 harbor 來說,安全性會更低有點,不過對于一些內(nèi)網(wǎng)場景(不需要和公網(wǎng)有互通)來說,其實 docker registry 更輕量化一些
- 本文僅作學習參考,至于實際的選擇,還是以各自實際需求和場景為準
編寫 Dockerfile
- 為了讓 docker registry 支持認證登錄,需要安裝 htpasswd 命令
- 為了方便后期維護 docker registry,增加鏡像刪除的功能
config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
# 增加這里的 delete 和 enabled
## 啟用 registry 鏡像刪除的功能
delete:
enabled: true
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
Dockerfile
FROM registry:2
RUN rm -f /etc/docker/registry/config.yml && \
apk add apache2-utils && \
apk cache clean
ADD ./config.yml /etc/docker/registry/
- 構(gòu)建鏡像(需要構(gòu)建成什么樣的鏡像名字,可以自己定義)
docker build -t registry:2_auth .
編寫 k8s yaml 文件
- 以靜態(tài) pod 的方式來部署,這里就直接使用
kind: Pod,而不是其他的控制集 - 不同 k8s 版本,
apiVersion版本可能會不一樣,可以使用kubectl explain pod.apiVersion命令查看pod這個kind的apiVersion
---
apiVersion: v1
kind: Pod
metadata:
# pod 名稱前綴
name: docker-registry
# 指定 namespace
namespace: kube-system
spec:
# 使用主機網(wǎng)絡模式
hostNetwork: true
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
- key: "CriticalAddonsOnly"
operator: "Exists"
- key: "node.alpha.kubernetes.io/notReady"
operator: "Exists"
initContainers:
# 這里注意修改成自己 build 的鏡像名稱
- image: registry:2_auth
# docker 容器的名字
name: docker-registry-init
imagePullPolicy: IfNotPresent
# 配置用戶名和密碼
command:
- sh
- "-c"
- "htpasswd -Bbn admin adminpasswd > /auth/htpasswd"
volumeMounts:
- mountPath: /auth
name: docker-registry-auth
containers:
# 這里注意修改成自己 build 的鏡像名稱
- image: registry:2_auth
# docker 容器的名字
name: registry
imagePullPolicy: IfNotPresent
# 資源限制以自己的實際需求為準
resources:
limits:
cpu: 3000m
memory: 3000Mi
env:
# registry 訪問的端口,靜態(tài) pod 會暴露出來對應的端口
- name: REGISTRY_HTTP_ADDR
value: ":35000"
# registry 存儲路徑
- name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
value: /var/lib/registry
# 以 htpasswd 的方式認證
- name: REGISTRY_AUTH
value: htpasswd
# 注冊認證
- name: REGISTRY_AUTH_HTPASSWD_REALM
value: Registry
# 認證文件路徑
- name: REGISTRY_AUTH_HTPASSWD_PATH
value: /auth/htpasswd
volumeMounts:
- mountPath: /var/lib/registry
name: docker-registry-storage
- mountPath: /auth
name: docker-registry-auth
volumes:
# 將 registry 存儲路徑持久化到本地,path 指定的路徑可以自己修改
- name: docker-registry-storage
hostPath:
path: /data/k8s-data/registry-data
type: Directory
# 認證文件的持久化訪問為 emptyDir,每次重啟都會重新生成
- name: docker-registry-auth
emptyDir: {}
kubelet 配置靜態(tài) pod 路徑
- kubeadm 部署的,默認就配置了靜態(tài) pod 的存放路徑,可以不進行下面的操作
- 二進制部署的,一般沒有配置靜態(tài) pod 的存放路徑,需要 kubelet 增加
--pod-manifest-path指定路徑(提前創(chuàng)建好路徑),然后重啟 kubelet
--pod-manifest-path=/etc/kubernetes/manifests
啟動靜態(tài) pod
創(chuàng)建持久化路徑,這里的路徑要和 yaml 文件里面的 volumes 下面的 docker-registry-storage 指定的 path 一致
mkdir -p /data/k8s-data/registry-data
將 yaml 文件放到上面 kubelet 配置的靜態(tài) pod 路徑下,然后等 pod 啟動(如果想快點,可以直接重啟 kubelet 組件)
查看 pod 是否創(chuàng)建成功
kubectl get pod -n kube-system | grep registry
靜態(tài) pod 會以 yaml 文件里面的 name 加上當前節(jié)點 ip 作為 pod 的名稱
docker-registry-172.72.0.95 1/1 Running 0 33s
docker 配置增加 registry 地址
vim /etc/docker/daemon.json
注意 json 語法格式
如果重啟 docker 失敗,日志有如下輸出,表示 daemon.json 文件的格式有錯誤,注意最后是否需要加上逗號
unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character '"' after object key:value pair
# 增加下面的信息 "insecure-registries": ["ip:端口"]
拿我的舉個例子
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["172.72.0.95:35000"],
"exec-opts": ["native.cgroupdriver=systemd"],
"data-root": "/approot/data/crt-data",
"log-driver": "json-file",
"log-opts": {
"max-size": "200m",
"max-file": "5"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
重啟 docker 服務
systemctl restart docker
驗證 docker registry 倉庫
登錄 docker registry 倉庫,這里的用戶名,密碼以及登錄的 ip 和端口都需要以自己的為準
docker login -u admin -p adminpasswd 172.72.0.95:35000
登錄成功后,就會返回對應的 success 了
WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
修改鏡像 tag,然后嘗試上傳鏡像
docker tag registry:2_auth 172.72.0.95:35000/registry:2_auth
推送鏡像到 docker registry
docker push 172.72.0.95:35000/registry:2_auth
返回類似如下的信息,說明推送成功了,可以去其他節(jié)點使用 docker login 登錄(也需要 docker 配置文件加上 docker registry 的地址),然后直接 docker pull <倉庫地址>:<倉庫端口>/registry:2_auth
The push refers to repository [172.72.0.95:35000/registry] f586723f1e87: Pushed b14c705d6378: Pushed 6e5160500bc7: Pushed 744dbed40ffa: Pushed f8dc4f9c98a6: Pushed 4984fbd72df1: Pushed bb01bd7e32b5: Pushed 2_auth: digest: sha256:3b215dad8c5b7704b0b84a3ee46971314b8db9e65fb82a62204cf8497587377a size: 1781
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用k8tz解決pod內(nèi)的時區(qū)問題(坑的解決)
時區(qū)的不一致,會帶來很多困擾。即使代碼與時區(qū)無關(guān),但容器日志與系統(tǒng)日志時間相關(guān)聯(lián)排查問題也會讓人頭疼,這篇文章主要介紹了使用k8tz優(yōu)雅的解決pod內(nèi)的時區(qū)問題,需要的朋友可以參考下2022-10-10
Rainbond上部署API?Gateway?Kong及環(huán)境配置教程
這篇文章主要為大家介紹了Rainbond上部署API?Gateway?Kong及環(huán)境配置教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04
k8s如何使用NFS作為StorageClass提供動態(tài)存儲
本文主要介紹了k8s中的StorageClass,包括其定義、引入的原因、實現(xiàn)方式、定義方法以及回收策略對數(shù)據(jù)的影響等,首先,StorageClass是在K8s集群中創(chuàng)建用于動態(tài)PV的管理,可以鏈接至不同的后端存儲,對存儲的請求可以指向StorageClass2024-09-09
Kubernetes集群中Calico網(wǎng)絡插件報錯問題分析及解決過程
Kubernetes集群中Calico網(wǎng)絡插件報錯(如FailedCreatePodSandBox)通常由配置錯誤、RBAC權(quán)限缺失或組件故障導致,解決方法包括重啟Calico組件、驗證配置和權(quán)限,定期監(jiān)控與維護以確保網(wǎng)絡正常運行2025-10-10

