使用 ArgoCD 和 Gitlab CI 部署 Kubernetes 应用程序
你好呀 !
在第 4 部分中,我们使用 GitLab 和 Terraform 部署了 Scaleway 基础设施。
在最后一部分中,我们将使用 ArgoCD 和 Gitlab 部署一个简单的应用程序。
[](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 管道中,我们有两个阶段init
和deploy
。
-
第一阶段在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。
如果您有任何问题或反馈,请随时发表评论。
否则,我希望我已经帮助您回答了一些关于在欧洲云和美国云领导者之间构建多云的难题。
对了,不吝分享给同行😊
谢谢阅读!
更多推荐
所有评论(0)