我已经通过ArgoCD成功地部署了应用程序,并且可以通过它的入口url访问它。
应用程序使用带有最新标记的图像名称,如
image: <private_registry>/app_1_service:latest
我还管理标记latest
中相同的其他标记,例如image:<commit_id> or image:<1.0.xxx>
现在,开发人员将更新代码,在提交更改之后,gitlab管道自动运行并构建一个新的映像,并覆盖使用其他标记标记latest
并将其推送到专用码头注册表。
那么,ArgoCD的下一步是什么呢?
如何知道应用程序被更改,需要重新部署,image:latest
需要再次拉出?
发布于 2022-09-06 05:23:32
ArgoCD支持两种类型的应用程序同步策略:
下面是一个自动从J蛙工件注册中心部署helm的示例:
project: default
source:
repoURL: 'https://abc.jfrog.io/artifactory/helm'
targetRevision: '*.*.*' # set your regex pattern here
helm:
parameters:
- name: image.tag
env: dev
chart: frontend-chart
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
automated: {} # enables auto syncing
发布于 2022-09-06 06:08:35
您可以使用ArgoCD图像更新器
但是在使用映像更新程序之前,需要安装并设置适当的权限。
helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd-image-updater argo/argocd-image-updater
一旦映像更新程序启动并运行,就需要在Argocd应用程序中设置几个注释,作为不同策略的更新工作人员。
semver -考虑到语义版本控制约束更新图像的最新版本最新的更新到注册表中最近构建的图像 摘要-使用标记的SHA摘要更新到给定版本的最新版本(标记) name -按字母顺序排列标记,并更新到基数最高的标记。
latest
策略在某些正则表达式和digest
下进行标记非常棒,更适合于测试环境。
您也可以从gitlab中提取私人图像。
下面是helm发布的工作示例
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
annotations:
argocd-image-updater.argoproj.io/image-alias.allow-tags: 'regexp:^1.3.0-SNAPSHOT.[0-9]+$'
argocd-image-updater.argoproj.io/image-alias.force-update: 'true'
argocd-image-updater.argoproj.io/image-alias.pull-secret: 'pullsecret:develop-namespace/develop-app-gitlab-secrets'
argocd-image-updater.argoproj.io/image-alias.update-strategy: latest
argocd-image-updater.argoproj.io/image-list: >-
image-alias=registry.gitlab.com/myorg/my-test-image
finalizers:
- resources-finalizer.argocd.argoproj.io
labels:
app.kubernetes.io/instance: develop-platform
name: develop-app
namespace: argocd
spec:
destination:
namespace: develop-app
server: 'https://kubernetes.default.svc'
project: develop-app-west6-b
source:
helm:
releaseName: develop-app
valueFiles:
- develop-platform/values.yaml
path: helm-chart/helm-chart
repoURL: 'https://gitlab.com/my-org/develop-app.git'
targetRevision: staging
syncPolicy:
automated:
prune: true
selfHeal: true
如果您需要digest
,或者只是一个最新的,那么删除以下内容
argocd-image-updater.argoproj.io/image-alias.allow-tags: 'regexp:^1.3.0-SNAPSHOT.[0-9]+$'
这是基于regex的工作。所以在你的例子中,<1.0.xxx>
可以是'regexp:^1.0.[0-9]+$'
如果一切都配置正确,图像更新程序运行良好,那么您应该能够看到日志、图像更新程序日志,如下所示
time="2022-04-27T15:18:36Z" level=info msg="Successfully updated image 'registry.gitlab.com/test-image:0.3.0-SNAPSHOT.115' to 'registry.gitlab.com/test-image:0.3.0-SNAPSHOT.118'
发布于 2022-09-06 06:23:22
如果您使用的是最新标签,最简单的方法是
imagePullPolicy
设置为Always
gitlab-ci.yml
中添加以下步骤,通过调用argocd api重新启动应用程序argocd-restart:
image: argoproj/argocd
stage: deploy
variables:
GIT_STRATEGY: none
ARGOCD_SERVER: "192.111.111.111:30000"
# gitlab admin panel variable
# ARGOCD_USERNAME: "admin"
# ARGOCD_PASSWORD: "XXXXXX"
before_script:
- echo "ARGOCD_SERVER:$ARGOCD_SERVER"
- echo "ARGOCD_APP_NAME:$ARGOCD_APP_NAME"
- echo "ARGOCD_USERNAME:$ARGOCD_USERNAME"
script:
- argocd login "${ARGOCD_SERVER}" --insecure --username "${ARGOCD_USERNAME}" --password "${ARGOCD_PASSWORD}"
- argocd app actions run "$ARGOCD_APP_NAME" restart --kind Deployment |& tee response.txt
- cat response.txt
# if response.txt have content, exit with error, empty response means success
- if [ -s response.txt ]; then exit 1; fi
only:
- master
- dev
argocd cli doc:跑/跑
以上解决方案不适合生产,因为
imagePullPolicy: Always
意味着k8s总是需要连接注册表。所以为了刺激和刺激,我就这么做。仅为图像标记(如stg-image-tag.yaml
)创建helm值文件。
image:
tag: "stg-v0.0.1"
将此文件添加到argocd应用程序配置中
修改gitlab-ci.yml,用新的图像标记构建映像,并将图像标记提交给stg-image-tag.yaml
docker-build:
image: docker
stage: build
variables:
# REGISTRY_SERVER: 192.168.111.111
# REGISTRY_USER: xxx
# REGISTRY_PASSWORD: xxx
before_script:
- IMAGE_TAG="$CI_COMMIT_REF_SLUG-v0.0.$CI_PIPELINE_IID"
script:
- docker login -u "$REGISTRY_USER" -p "$REGISTRY_PASSWORD" $REGISTRY_SERVER
- docker build .
-t "$NEW_IMAGE_REPO:latest"
-t "$NEW_IMAGE_REPO:$IMAGE_TAG"
- docker push "$NEW_IMAGE_REPO" --all-tags
- echo IMAGE_TAG=$IMAGE_TAG >> IMAGE_TAG.env
- cat IMAGE_TAG.env
artifacts:
reports:
# add IMAGE_TAG to other jobs as env var
dotenv: IMAGE_TAG.env
expire_in: "86400" # 1 day
commit-image-tag:
image: curlimages/curl
stage: deploy
needs:
- job: docker-build
artifacts: true
variables:
GIT_STRATEGY: none
GITLAB_PROJECT_ID: "111"
GITLAB_PROJECT_TOKEN: "xxxxxxxxxxx"
before_script:
- echo "IMAGE_TAG:$IMAGE_TAG"
script:
- |
cat <<EOF > body.txt
{
"branch":"master",
"commit_message":"update image tag ${IMAGE_TAG}",
"actions":[
{
"action":"update",
"file_path":"helm-charts/${CI_COMMIT_REF_SLUG}-image-tag.yaml",
"content":"image:\n tag: $IMAGE_TAG"
}
]
}
EOF
- |
cat <<EOF > header.txt
Authorization: Bearer ${GITLAB_PROJECT_TOKEN}
Content-Type: application/json
EOF
- curl --insecure "${CI_SERVER_URL}/api/v4/projects/${GITLAB_PROJECT_ID}/repository/commits"
-i --output response.txt
--header @header.txt --data @body.txt
--silent --write-out "%{response_code}" > response_code.txt
- cat response.txt
# error if response code is not 201
- if [ "$(cat response_code.txt)" != "201" ]; then exit 1; fi
only:
- stg
- prod
然后设置一个web钩子,这样argocd将立即刷新图像标记。否则将每3分钟刷新一次。
https://stackoverflow.com/questions/73616877
复制相似问题