利用阿里云免費(fèi)鏡像倉(cāng)庫(kù),實(shí)現(xiàn)微服務(wù)的K8s部署
今天的內(nèi)容給大家介紹下如何利用阿里云提供的免費(fèi)私人容器鏡像服務(wù),來(lái)實(shí)現(xiàn)對(duì)個(gè)人項(xiàng)目容器鏡像的管理,以及通過(guò)k8s集群來(lái)發(fā)布阿里云私人容器鏡像服務(wù)中管理的服務(wù)。本文適合個(gè)人及創(chuàng)業(yè)團(tuán)隊(duì)學(xué)習(xí)/使用基于容器、鏡像倉(cāng)庫(kù)、k8s等云原生技術(shù)時(shí)的參考。
創(chuàng)建阿里云個(gè)人版容器鏡像實(shí)例
一般來(lái)說(shuō)大型企業(yè)都會(huì)自己搭建內(nèi)部私有鏡像倉(cāng)庫(kù)(例如Harbor),但對(duì)于小公司來(lái)說(shuō)也可以直接使用云服務(wù)提供的容器鏡像服務(wù)。接下來(lái)以阿里云免費(fèi)提供的個(gè)人版容器鏡像服務(wù),演示容器鏡像服務(wù)的具體使用。步驟如下:
(1)、登錄阿里云,點(diǎn)擊->控制臺(tái)->找到“容器鏡像服務(wù)”,如下圖所示:
如果入口比較難找,可以直接在阿里云搜索框搜索“容器鏡像服務(wù)”。阿里云提供收費(fèi)的企業(yè)版實(shí)例,也提供限制使用的個(gè)人版實(shí)例。這里選擇個(gè)人版實(shí)例。
(2)、創(chuàng)建成功后,設(shè)置鏡像倉(cāng)庫(kù)登陸密碼。如下圖所示:
提示:
設(shè)置一個(gè)自己能記住的密碼,例如我這里設(shè)置的是“wudimanong”。
(3)密碼設(shè)置成功后,點(diǎn)擊“創(chuàng)建鏡像倉(cāng)庫(kù)”,最終效果如下圖所示:
選擇本地倉(cāng)庫(kù),后面通過(guò)本地構(gòu)建直接將Docker鏡像推送至阿里云私有鏡像倉(cāng)庫(kù)。
之后就可以根據(jù)提示登錄該阿里云鏡像倉(cāng)庫(kù),并向其中Push鏡像了。
配置k8s集群與鏡像倉(cāng)庫(kù)的連接
創(chuàng)建私有鏡像倉(cāng)庫(kù)之后,為了安全設(shè)置了用戶名及密碼,如果k8s集群需要從鏡像倉(cāng)庫(kù)拉取鏡像,則每次都需要登陸是很麻煩的,所以可以進(jìn)行相關(guān)設(shè)置。
Kubernetes 集群使用 docker-registry 類型的 Secret 來(lái)通過(guò)容器倉(cāng)庫(kù)的身份驗(yàn)證,進(jìn)而提取私有映像。
創(chuàng)建Secret,命名為 regcred:
- # kubectl create secret docker-registry regcred --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=jqadmin --docker-password=wudimanong
- secret/regcred created
提示:
上述賬號(hào)密碼為你自己創(chuàng)建鏡像倉(cāng)庫(kù)時(shí)設(shè)置的。
打包Docker鏡像
打包Docker鏡像需要編寫(xiě)Dockerfile文件,可以參考相關(guān)資料。這里我寫(xiě)了一個(gè)Java項(xiàng)目可以參考,通過(guò)工程構(gòu)建就能直接將Docker鏡像打包。
項(xiàng)目地址(GitHub):
https://github.com/manongwudi/springboot-k8s-demo
下載項(xiàng)目后本地可以編譯構(gòu)建,完成后打包的本地鏡像如下圖所示:
將鏡像上傳至阿里云私有鏡像倉(cāng)庫(kù)
接下來(lái)演示登錄阿里云私有鏡像倉(cāng)庫(kù),并將本地構(gòu)建的Docker容器鏡像上傳。步驟如下:
(1)本地登陸阿里云鏡像倉(cāng)庫(kù)(本地需要安裝Docker環(huán)境),命令如下:
- $ docker login --username=jqadmin registry.cn-hangzhou.aliyuncs.com
- Password:
- Login Succeeded
提示:
賬號(hào)密碼為創(chuàng)建阿里云倉(cāng)庫(kù)時(shí)設(shè)置的
(2)將前面構(gòu)建的Docker鏡像上傳至阿里云私有倉(cāng)庫(kù)。命令如下:
- $ docker push registry.cn-hangzhou.aliyuncs.com/wudimanong/springboot-k8s-demo:latest
- The push refers to repository [registry.cn-hangzhou.aliyuncs.com/wudimanong/springboot-k8s-demo]
- 500e5779c8d2: Pushed
- 925523484e00: Pushed
- 344fb4b275b7: Pushed
- bcf2f368fe23: Pushed
- latest: digest: sha256:ba3930f5374ed4cfd2c39cb590c3f772c89cd73abe7bd321838fd453d11309fe size: 1159
(3)此時(shí)回到阿里云倉(cāng)庫(kù)的界面,就能看到上傳的鏡像了,如下圖所示:
將阿里云鏡像倉(cāng)庫(kù)的鏡像發(fā)布至k8s集群
接下來(lái)演示,如何將已經(jīng)上傳阿里云私有鏡像倉(cāng)庫(kù)的服務(wù)發(fā)布至k8s集群,這里需要在k8s發(fā)布文件中進(jìn)行一些配置。具體如下:
(1)創(chuàng)建發(fā)布文件。
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: springboot-k8s-demo
- spec:
- selector:
- matchLabels:
- app: springboot-k8s-demo
- replicas: 1
- #設(shè)置滾動(dòng)升級(jí)策略
- #Kubernetes在等待設(shè)置的時(shí)間后才開(kāi)始進(jìn)行升級(jí),例如5s
- minReadySeconds: 5
- strategy:
- type: RollingUpdate
- rollingUpdate:
- #在升級(jí)過(guò)程中最多可以比原先設(shè)置多出的Pod數(shù)量
- maxSurge: 1
- #在升級(jí)過(guò)程中Deployment控制器最多可以刪除多少個(gè)舊Pod,主要用于提供緩沖時(shí)間
- maxUnavailable: 1
- template:
- metadata:
- labels:
- app: springboot-k8s-demo
- spec:
- #設(shè)置的阿里云私有鏡像倉(cāng)庫(kù)登陸信息的secret(對(duì)應(yīng)2.1.2的設(shè)置)
- imagePullSecrets:
- - name: regcred
- containers:
- - name: springboot-k8s-demo
- image: registry.cn-hangzhou.aliyuncs.com/wudimanong/springboot-k8s-demo:latest
- env:
- - name: SERVER_PORT
- value: "8080"
- - name: SPRING_PROFILES_ACTIVE
- value: test
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: springboot-k8s-demo
- labels:
- svc: springboot-k8s-demo
- spec:
- selector:
- app: springboot-k8s-demo
- ports:
- - name: http
- #Service在集群中暴露的端口(用于Kubernetes服務(wù)間的訪問(wèn))
- port: 8080
- #Pod上的端口(與制作容器時(shí)暴露的端口一致,在微服務(wù)工程代碼中指定的端口)
- targetPort: 8080
- #K8s集群外部訪問(wèn)的端口(外部機(jī)器訪問(wèn))
- nodePort: 30002
- type: NodePort
標(biāo)紅的部分,就是設(shè)置k8s對(duì)阿里云容器鏡像倉(cāng)庫(kù)的連接——使用存儲(chǔ)在"secret"資源中的鏡像倉(cāng)庫(kù)的賬號(hào)及密碼。
(2)執(zhí)行發(fā)布命令。
- # kubectl apply -f springboot-k8s-demo.yaml
- deployment.apps/springboot-k8s-demo created
- service/springboot-k8s-demo created
(3)查看并測(cè)試應(yīng)用部署是否成功。
- # kubectl get po -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- springboot-k8s-demo-7f7f8db4cc-hd8j2 1/1 Running 0 41s 10.201.17.147 k8s-node <none> <none>
- test-ds-nginx-qdj6n 1/1 Running 0 80m 10.201.17.143 k8s-node <none> <none>
可以看到,部署的Java應(yīng)用已經(jīng)成功啟動(dòng)。接下來(lái)模擬調(diào)用下該服務(wù)的測(cè)試接口:
- # curl 10.201.17.147:8080/devops/test
- 自動(dòng)化發(fā)布示范工程測(cè)試接口返回->OK!
可以成功訪問(wèn),說(shuō)明應(yīng)用部署成功!