最新資訊
科技趨勢

雲端整合專家,提供全方位雲端顧問服務

科技趨勢

Gitlab CI串接Google Container Registry(GCR)

這次要藉由gitlab ci達到build出來的docker image存放上GCR(Google Container Registry)

設定docker GCR認證

Step 1. 建立一個Service account

建立一個Service account,權限設為。因為上傳docker image會是bucket的方式儲存,所以需要有Storage權限。(有時需要等待一下讓權限生效)

  • Storage Admin

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] .

# asia.gcr.io/barry-test-123/quickstart-image

目前共提供四種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]
# 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

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