首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ArgoCD -在创建新映像之后需要做什么

ArgoCD -在创建新映像之后需要做什么
EN

Stack Overflow用户
提问于 2022-09-06 04:57:04
回答 3查看 1.7K关注 0票数 -1

我已经通过ArgoCD成功地部署了应用程序,并且可以通过它的入口url访问它。

应用程序使用带有最新标记的图像名称,如

代码语言:javascript
运行
复制
image: <private_registry>/app_1_service:latest

我还管理标记latest中相同的其他标记,例如image:<commit_id> or image:<1.0.xxx>

现在,开发人员将更新代码,在提交更改之后,gitlab管道自动运行并构建一个新的映像,并覆盖使用其他标记标记latest并将其推送到专用码头注册表。

那么,ArgoCD的下一步是什么呢?

如何知道应用程序被更改,需要重新部署,image:latest需要再次拉出?

EN

回答 3

Stack Overflow用户

发布于 2022-09-06 05:23:32

ArgoCD支持两种类型的应用程序同步策略:

  1. 手册:用户将登录到仪表板并更新图像/图表版本。
  2. 自动: ArgoCD将在固定的时间间隔(例如3分钟)轮询容器注册表,并根据模式检查新图像的/图表版本是否可用。您可以使用regex指定图像模式。Argo将比较当前版本和新版本。

下面是一个自动从J蛙工件注册中心部署helm的示例:

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2022-09-06 06:08:35

您可以使用ArgoCD图像更新器

但是在使用映像更新程序之前,需要安装并设置适当的权限。

代码语言:javascript
运行
复制
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发布的工作示例

代码语言:javascript
运行
复制
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,或者只是一个最新的,那么删除以下内容

代码语言:javascript
运行
复制
  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]+$'

如果一切都配置正确,图像更新程序运行良好,那么您应该能够看到日志、图像更新程序日志,如下所示

代码语言:javascript
运行
复制
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'
票数 1
EN

Stack Overflow用户

发布于 2022-09-06 06:23:22

如果您使用的是最新标签,最简单的方法是

  • 将k8s yaml imagePullPolicy设置为Always
  • gitlab-ci.yml中添加以下步骤,通过调用argocd api重新启动应用程序
代码语言:javascript
运行
复制
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值文件。

代码语言:javascript
运行
复制
image:
  tag: "stg-v0.0.1"

将此文件添加到argocd应用程序配置中

修改gitlab-ci.yml,用新的图像标记构建映像,并将图像标记提交给stg-image-tag.yaml

  • 我在图像标签中使用$CI_PIPELINE_IID作为版本号。
  • 我有每个env的分支名称。
代码语言:javascript
运行
复制
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分钟刷新一次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73616877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档