准備了兩台虛擬機
環境安裝參考 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.成功