這次要藉由gitlab ci達到build出來的docker image存放上GCR(Google Container Registry)
設定docker GCR認證
Step 1. 建立一個Service account
建立一個Service account,權限設為。因為上傳docker image會是bucket的方式儲存,所以需要有Storage權限。(有時需要等待一下讓權限生效)
Step 2. 新增json key
在新增Service account新增一個key並指定type為json。這時候會下載一個json檔案回電腦。
Step 3. activate-service-account
使用該json檔案獲得Service account的權限,就可以在GCR上push, pull。
gcloud auth activate-service-account --key-file key.json
Step 4.設定credential helper
修改docker config, 將 [gcloud](https://cloud.google.com/sdk/gcloud/reference)
註冊成 Docker credential helper
gcloud auth configure-docker --quiet
Step 5. Build docker image
image的tag必須參照GCR格式
docker build -t [HOSTNAME]/[PROJECT-ID]/[IMAGE] -f [DOCKERFILE_PATH] .
目前共提供四種hostname,以下為hostname列表
gcr.io
Stores images in data centers in the United States
asia.gcr.io
Stores images in data centers in Asia
eu.gcr.io
Stores images in data centers within member states of the European Union
us.gcr.io
Stores images in data centers in the United States
Step 6. push docker image
docker push [HOSTNAME]/[PROJECT-ID]/[IMAGE]
在這樣的設定下,也可以直接進行pull
k8s與GCR整合
Step 1. 新增secret
最後我們要讓k8s能夠pull上傳到GCR上的image,就必須要把前面下載的key file也新增到k8s中。
kubectl create secret docker-registry gcr-json-key \
--docker-server=asia.gcr.io \
--docker-username=_json_key \
--docker-password="$(cat $GCP_SERVICE_ACCOUNT)" \
--docker-email=Develop@gaia.net
Step 2. 修改deployment yaml
此時還要在deployment裡面指定imagepullsecret
spec:
...
template:
...
spec:
imagePullSecrets:
- name: gcr-json-key
Step 3. 修改.gitlab-ci.yml
gitlab-ci yml的寫法其實有很多種,這邊提供給大家一個範本參考。但沒有絕對怎麼樣是對是錯。
stages:
- build
- deploy
variables:
HOST: asia.gcr.io
GCP_PROJECT: barry-test-123
DOCKER_IMAGE_TAG: $HOST/$GCP_PROJECT/$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
build:
stage: build
image: google/cloud-sdk:alpine
services:
- name: docker:19.03.12-dind
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
before_script:
- gcloud auth activate-service-account --key-file $GCP_SERVICE_ACCOUNT
- gcloud auth configure-docker --quiet
script:
- docker build -t $DOCKER_IMAGE_TAG .
- docker push $DOCKER_IMAGE_TAG
deploy:
stage: deploy
variables:
APP_NAME: kustomize
ENV: production
environment:
name: $ENV
image: line/kubectl-kustomize:1.22.4-4.4.1
script:
- sed -i s~replace_me~$DOCKER_IMAGE_TAG~g base/deployment.yaml
- kubectl delete --ignore-not-found=true secret gcr-json-key
- kubectl create secret docker-registry gcr-json-key --docker-server=asia.gcr.io --docker-username=_json_key --docker-password="$(cat $GCP_SERVICE_ACCOUNT)" --docker-email=Develop@gaia.net
- kustomize build overlays/$ENV | kubectl apply -f -
- sleep 120
only:
- gcp
- GCP_SERVICE_ACCOUNT: 為gitlab中的file variables
Step 4. 確認成功上傳image到GCR
最後我們來跑一次gitlab ci,跑完後就可以看到docker image有被正確的push到GCR囉~
Step 5. 確認k8s deployment
而在k8s上,可以看到deployment也有被正確開啟
$ kubectl get deployment -n kustomize-test-77-production
NAME READY UP-TO-DATE AVAILABLE AGE
production-the-deployment 3/3 3 3 2m50s
這次要藉由gitlab ci達到build出來的docker image存放上GCR(Google Container Registry)
設定docker GCR認證
Step 1. 建立一個Service account
建立一個Service account,權限設為。因為上傳docker image會是bucket的方式儲存,所以需要有Storage權限。(有時需要等待一下讓權限生效)
Step 2. 新增json key
在新增Service account新增一個key並指定type為json。這時候會下載一個json檔案回電腦。
Step 3. activate-service-account
使用該json檔案獲得Service account的權限,就可以在GCR上push, pull。
Step 4.設定credential helper
修改docker config, 將
[gcloud](https://cloud.google.com/sdk/gcloud/reference)
註冊成 Docker credential helperStep 5. Build docker image
image的tag必須參照GCR格式
docker build -t [HOSTNAME]/[PROJECT-ID]/[IMAGE] -f [DOCKERFILE_PATH] . # asia.gcr.io/barry-test-123/quickstart-image
目前共提供四種hostname,以下為hostname列表
gcr.io
Stores images in data centers in the United Statesasia.gcr.io
Stores images in data centers in Asiaeu.gcr.io
Stores images in data centers within member states of the European Unionus.gcr.io
Stores images in data centers in the United StatesStep 6. push docker image
docker push [HOSTNAME]/[PROJECT-ID]/[IMAGE] # docker push asia.gcr.io/barry-test-123/quickstart-image
在這樣的設定下,也可以直接進行pull
k8s與GCR整合
Step 1. 新增secret
最後我們要讓k8s能夠pull上傳到GCR上的image,就必須要把前面下載的key file也新增到k8s中。
kubectl create secret docker-registry gcr-json-key \ --docker-server=asia.gcr.io \ --docker-username=_json_key \ --docker-password="$(cat $GCP_SERVICE_ACCOUNT)" \ --docker-email=Develop@gaia.net
Step 2. 修改deployment yaml
此時還要在deployment裡面指定imagepullsecret
Step 3. 修改.gitlab-ci.yml
gitlab-ci yml的寫法其實有很多種,這邊提供給大家一個範本參考。但沒有絕對怎麼樣是對是錯。
Step 4. 確認成功上傳image到GCR
最後我們來跑一次gitlab ci,跑完後就可以看到docker image有被正確的push到GCR囉~
Step 5. 確認k8s deployment
而在k8s上,可以看到deployment也有被正確開啟