你好呀 !

在第 4 部分中,我们使用 GitLab 和 Terraform 部署了 Scaleway 基础设施。

在最后一部分中,我们将使用 ArgoCD 和 Gitlab 部署一个简单的应用程序。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--_3rMZkg4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/xfvehcav80tiswl9kcog.jpg)

计划

  • 使用 Gitlab 和 Google Cloud Build 构建和发布我们的 Docker 映像。

  • 使用 Gitlab 和 ArgoCD 配置和部署我们的 Docker 镜像到 Kubernetes。

Docker 镜像

正如part 2中提到的,我们需要在每个 git 标签之后构建 docker 镜像。发布新的 docker 镜像后,我们使用 Kustomize 编辑 Kubernetes 清单,并从app-repo管道触发 env repo 管道。

该机制在demo-app回购管道中进行了描述:

.gitlab-ci.yaml

stages:
  - publish

publish docker image:
  stage: publish
  image: 
    name: eu.gcr.io/${GCP_PROJECT_ID}/tools
  script: 
    - eval $(ssh-agent -s)
    - echo "$GITLAB_SSH_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - ssh -T git@gitlab.com

    - git config --global user.name "${GITLAB_USER_NAME}"
    - git config --global user.email "${GITLAB_USER_EMAIL}"
    - git config --global push.followTags true

    - IMAGE_TAG=$CI_COMMIT_TAG-$CI_COMMIT_SHORT_SHA
    - cd src
    - gcloud config set project ${GCP_PROJECT_ID}
    - gcloud builds submit . --tag=eu.gcr.io/${GCP_PROJECT_ID}/demo:$IMAGE_TAG --project ${GCP_PROJECT_ID} --gcs-log-dir=gs://${GCP_PROJECT_ID}_cloudbuild/logs
    - git clone "git@gitlab.com:stack-labs/internal/sandbox/chabanerefes/meetup/demo-env.git"
    - cd demo-env/envs/dev
    - kustomize edit set image eu.gcr.io/${GCP_PROJECT_ID}/demo:$IMAGE_TAG
    - cd ../..
    - git add .
    - 'git commit -m "ci: update image to $IMAGE_TAG"'
    - git tag -a -m "New release available - $CI_COMMIT_TAG" $CI_COMMIT_TAG
    - git push -o ci.skip
  tags:
    - k8s-dev-runner
  only:
    refs:
      - tags
    changes:
      - src/**/*

进入全屏模式 退出全屏模式

与此项目共享之前创建的特定跑步者k8s-dev-runner。您将需要 Gitlab 中的Maintainer权限。

现在您可以使用以下 Gitlab CI/CD 变量运行 Gitlab 管道:

GCP_PROJECT_ID=$GCP_PROJECT_ID

进入全屏模式 退出全屏模式

部署

demo-env存储库中,我们有 Kubernetes 清单。每次编辑 docker 镜像版本并创建 git 标签时,都会执行 Gitlab 管道。

以下文件描述了要部署的 Kubernetes 清单:

基础/演示部署.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
  labels:
    app: demo
spec:
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - image: eu.gcr.io/<GCP_PROJECT_ID>/demo:v0.1.0
        name: demo
        ports:
        - containerPort: 8080

进入全屏模式 退出全屏模式

基础/演示-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: demo
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: demo

进入全屏模式 退出全屏模式

基础/kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

# Adds namespace to all resources.
namespace: app-dev
resources:
- demo-deployment.yaml
- demo-svc.yaml

进入全屏模式 退出全屏模式

envs/dev/kustomization.yaml

namespace: app-dev
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base

进入全屏模式 退出全屏模式

ArgoCD 应用程序也在一个 yaml 文件中定义:

envs/dev/application.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: app-demo-dev
  namespace: argocd
spec:
  project: demo-dev
  source:
    repoURL: <GIT_REPOSITORY_URL>
    targetRevision: HEAD
    path: envs/dev
  destination:
    server: <SW_KAPSULE_CLUSTER_URL>
    namespace: app-dev
  syncPolicy:
    automated:
      prune: true

进入全屏模式 退出全屏模式

在 gitlab 管道中,我们有两个阶段initdeploy

  • 第一阶段在ArgoCD中添加Kapsule集群,并在Kubernetes中初始化开发环境。

  • 第二阶段在 ArgoCD 中创建和配置应用程序。

  • 我为 ArgoCD 上的手动同步添加了第三阶段。

envs/dev/application.yaml

stages:
  - init
  - deploy
  - sync

# Get Scaleway credentials from Vault
before_script:
    - export VAULT_TOKEN="$(gcloud secrets versions access latest --secret=vault-token --project ${GCP_PROJECT_ID})"
    - export SCW_SECRET_KEY="$(vault kv get -field=key scaleway/project/${SW_PROJECT_NAME}/credentials/secret)"
    - export AROGOCD_TOKEN="$(gcloud secrets versions access latest --secret=argocd-token --project ${GCP_PROJECT_ID})"

init sw k8s project 🔬:
  stage: init
  when: manual
  image:
    name: eu.gcr.io/${GCP_PROJECT_ID}/tools
  script:
    # Connect to GCP GKE DevOps Cluster
    - gcloud container clusters get-credentials gke-cluster-devops --zone europe-west1-b --project ${GCP_PROJECT_ID}
    # Connect to scaleway
    - scw init secret-key=$SCW_SECRET_KEY
    # Get kubeconfig from sw kapsule cluster
    - scw k8s kubeconfig get $(scw k8s cluster list | grep kapsule-cluster-dev-demo | awk '{ print $1 }') region=fr-par > kapsule_config
    # Register kapsule cluster on Argocd
    - export KUBECONFIG=~/.kube/config:$(pwd)/kapsule_config
    - argocd cluster add admin@kapsuleclusterdevdemo --name kapsule-cluster-dev-demo --kubeconfig kapsule_config --auth-token=${AROGOCD_TOKEN} --server ${ARGOCD_ADDR} --grpc-web 
    # Create namespace on kapsule cluster
    - kubectl config use-context admin@kapsuleclusterdevdemo
    - kubectl create namespace app-dev || echo 'namespace app-dev already exists'
    # To access GCR service, create the json key file and associate it with the service account
    - gcloud iam service-accounts keys create sw-gcr-auth-ro.json --iam-account=sw-gcr-auth-ro@${GCP_PROJECT_ID}.iam.gserviceaccount.com
    - export GCR_SECRET_NAME=gcp-gcr-auth-ro
    - |
      kubectl create secret docker-registry $GCR_SECRET_NAME -n app-dev \
      --docker-server=https://eu.gcr.io \
      --docker-username=_json_key \
      --docker-email=ci@<MY_COMPANY>.com \
      --docker-password="$(cat sw-gcr-auth-ro.json)" || echo 'secret $GCR_SECRET_NAME already exists'
    - |
      kubectl patch serviceaccount default -n app-dev \
      -p "{\"imagePullSecrets\": [{\"name\": \"$GCR_SECRET_NAME\"}]}"
  tags:
    - k8s-dev-runner
  only:
    - master 

deploy sw k8s project 🚀:
  stage: deploy
  when: manual
  image:
    name: eu.gcr.io/${GCP_PROJECT_ID}/tools
  script:
    # Connect to scaleway
    - scw init secret-key=$SCW_SECRET_KEY
    # Get sw kapsule cluster url
    - export SW_KAPSULE_CLUSTER_URL=$(scw k8s cluster get $(scw k8s cluster list | grep kapsule-cluster-dev-demo | awk '{ print $1 }') | grep ClusterURL | awk '{ print $2 }' | tr -d '\r')
    - cd envs/dev
    - sed -i "s,<SW_KAPSULE_CLUSTER_URL>,$SW_KAPSULE_CLUSTER_URL,g;s,<GIT_REPOSITORY_URL>,$CI_PROJECT_URL.git,g" application.yaml
    # Connecto to gcp gke devops cluster
    - gcloud container clusters get-credentials gke-cluster-devops --zone europe-west1-b --project ${GCP_PROJECT_ID}
    # Create ArgoCD project
    - argocd proj create demo-dev -d $SW_KAPSULE_CLUSTER_URL,app-dev -s $CI_PROJECT_URL.git --auth-token=${AROGOCD_TOKEN} --server ${ARGOCD_ADDR} --grpc-web 
    # Create ArgoCD application
    - kubectl apply -n argocd -f application.yaml
  tags:
    - k8s-dev-runner
  only:
    - master

sync dev 🔨:
  stage: sync
  when: manual
  image:
    name: eu.gcr.io/${GCP_PROJECT_ID}/tools
  script:
    - argocd app sync app-demo-dev
  tags:
    - k8s-dev-runner
  only:
    - master

进入全屏模式 退出全屏模式

与此项目共享之前创建的特定跑步者k8s-dev-runner。您将需要 Gitlab 中的Maintainer权限。

现在您可以使用以下 Gitlab CI/CD 变量运行 Gitlab 管道:

GCP_PROJECT_ID=$GCP_PROJECT_ID
SW_PROJECT_NAME=$SW_PROJECT_NAME
ARGOCD_ADDR=$ARGOCD_ADDR
VAULT_ADDR=$VAULT_ADDR
ENV=dev

进入全屏模式 退出全屏模式

而已!

最后的话

源代码可在 Gitlab上找到。

该演示也可在 Youtube 上观看(但在 🇫🇷),网址为32:12。

如果您有任何问题或反馈,请随时发表评论。

否则,我希望我已经帮助您回答了一些关于在欧洲云和美国云领导者之间构建多云的难题。

对了,不吝分享给同行😊

谢谢阅读!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐