k8s 結合docker搭建私有倉庫


准備了兩台虛擬機

環境安裝參考 https://www.cnblogs.com/spll/p/10033316.html

安裝好之后需要搭建自己的私有docker倉庫,以后拉取、推送鏡像就走自己的倉庫。

以下操作在master上面操作

1.先拉取倉庫鏡像

docker pull registry

2.創建一個文件夾用來放用戶名密碼,然后在新創建一個賬戶

mkdir /var/auth
docker run --entrypoint htpasswd registry:latest -Bbn lijinlong 123456 >/var/auth/htpasswd
cat /var/auth/htpasswd

3.Registry服務默認會將上傳的鏡像保存在容器的/var/lib/registry,我們將主機的/opt/registry目錄掛載到該目錄,即可實現將鏡像保存到主機的/opt/registry目錄了。然后將宿主機的/var/auth目錄掛載到鏡像的/auth目錄下,然后指定這個目錄下的htpasswd文件來進行認證

docker run -d -v /opt/registry:/var/lib/registry -v /var/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd  -p 5000:5000 --restart=always --name registry registry:latest

參數解析:

-p 5000:5000,指定registry的端口是5000並映射成主機的5000端口。
-v /opt/registry:/var/lib/registry,將本地的/opt/registry掛載到鏡像默認存儲路徑 /var/lib/registry。

-v /var/auth:/auth 將第二步生成auth文件夾掛在到鏡像auth目錄

-e REGISTRY_AUTH=htpasswd, -e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm,這兩個參數組合啟動基本身份驗證。
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd,指定使用的密碼認證文件是/auth/htpasswd。(注意,使用的是容器里面的路徑,前面我們已經將/var/auth掛在到/auth)

如果有https證書,可以加上以下參數:
-v /usr/local/nginx/conf/cert:/certs,如果有https認證,將宿主機保存的認證文件掛到容器里。
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.pem,-e REGISTRY_HTTP_TLS_KEY=/certs/server.key 指定https證書和key。

–restart=always,重啟方式為always。
–name registry,指定容器名稱。
registry,鏡像名稱。

4.登陸

 

 5.接下來就是push鏡像到倉庫,然后其他node拉取鏡像並運行。

1 #給鏡像打標簽
2 docker tag web1image 192.168.183.130:5000/dotnetcoretest3 #推送鏡像
4 docker push 192.168.183.130:5000/dotnetcoretest5 #查看鏡像
6 ls /opt/registry/docker/registry/v2/repositories/
7 curl -u lijinlong:123456 192.168.183.130:5000/v2/_catalog
8 #拉取鏡像
9 docker pull 192.168.183.130:5000/dotnetcoretest:latest

出現http: server gave HTTP response to HTTPS client錯誤(node節點也需要加入)

vim /etc/docker/daemon.json
#加入信任名單
{
  "registry-mirrors": ["https://registry.docker-cn.com"],
  "insecure-registries":["192.168.183.130:5000"]
}

出現認證未通過的問題

檢查登陸docker倉庫的ip是否和推送的一致,我這里push使用的是ip,如果用本機127.0.0.1是不行的,需要先在192.168.183.128登陸docker倉庫

6.接下來就是kubernetes使用我們搭建的私有倉庫了。

首先,在我們使用的namespace創建一個secrets用於保存我們登陸倉庫使用的用戶名和密碼(注意namespace要和你應用程序使用的namespace一致)

kubectl create secret docker-registry registry-secret-name --docker-server=192.168.183.130:5000 --docker-username=lijinlong --docker-password=123456 -n aspnetcore

創建成功后,使用以下命令查看

kubectl get secrets -n aspnetcore

 

 也可以在我們之前搭建的dashboard查看

 

 

7.接下來就是在我們的yaml文件里面使用(注意標紅的)

apiVersion: apps/v1
kind: Deployment # 定義Kubernetes資源的類型為Deployment
metadata:
  name: demo-webtest-deployment # 定義資源的名稱
  namespace: aspnetcore #命名空間
  labels:
    app: demo-webtest-deployment
spec:  # 定義資源的狀態。
  replicas: 2 # 定義我們想運行多少個Pod,在這里我們希望運行2個
  selector:
    matchLabels: # 定義該部署匹配哪些Pod
      app: demo-webtest
  minReadySeconds: 5 # 可選,指定Pod可以變成可用狀態的最小秒數,默認是0
  strategy: # 指定更新版本時,部署使用的策略
    type: RollingUpdate # 策略類型,使用RollingUpdate可以保證部署期間服務不間斷
    rollingUpdate:
      maxUnavailable: 1 # 部署時最大允許停止的Pod數量(與replicas相比)
      maxSurge: 1 # 部署時最大允許創建的Pod數量(與replicas相比)
  template: # 用來指定Pod的模板,與Pod的定義類似
    metadata:
      labels: # 根據模板創建的Pod會被貼上該標簽,與上面的matchLabels對應
        app: demo-webtest
    spec:
      imagePullSecrets: #指定訪問倉庫使用的密碼 - name: registry-secret-name
      containers:
        - name: webtest
          image: 192.168.183.130:5000/dotnetcoretest #鏡像修改為自己的私有倉庫地址
          imagePullPolicy: IfNotPresent # 默認是IfNotPresent,如果設置成Always,則每一次部署都會重新拉取容器映像(否則,如果本地存在指定的鏡像版本,就不會再去拉取)
          ports:
            - containerPort: 80

---
apiVersion: v1
kind: Service # 定義Kubernetes資源的類型為Service
metadata:
  name: demo-webtest-service # 定義資源的名稱
  namespace: aspnetcore #命名空間
spec:
  selector: # 指定對應的Pod
    app: demo-webtest # 指定Pod的標簽為demo-webtest
  ports:
  - protocol: TCP # 協議類型
    port: 80 # 指定Service訪問的端口
    targetPort: 80 # 指定Service轉發請求的端口
    nodePort: 30100
  type: NodePort # 指定Service的類型,在這里使用NodePort來對外訪問

 

 8.成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM