【问题标题】:How to define image name in Kubernetes manifest deployment.yml file dynamically or with variables?如何在 Kubernetes 清单 deployment.yml 文件中动态或使用变量定义图像名称?
【发布时间】:2021-08-23 06:59:27
【问题描述】:

我有 deplyonment.yml 文件,如下所示:

apiVersion : apps/v1
kind: Deployment
metadata:
  name: worker
spec:
  progressDeadlineSeconds: 3600
  replicas: 1
  selector:
    matchLabels:
      app: worker
  template:
    metadata:
      labels:
        app: worker
    spec:
      containers:
        - name: worker         
          image: $(RegistryName)/$(RepositoryName):$(Build.BuildNumber)
          imagePullPolicy: Always 

但我无法使用 $(RegistryName) 和 $(RepositoryName),因为我什至不知道如何初始化它并在此处分配值。

如果我指定如下内容

image: XXXX..azurecr.io/werepo:$(Build.BuildNumber)

它适用于直接的静态和精确名称。但我不想硬核注册表和存储库名称。

有没有办法动态替换它?就像我在任务中传递这些的方式一样

  - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              kubernetesServiceConnection: 'XXXX-connection'
              namespace: 'XXXX-namespace'
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml 
              containers: |
                $(Registry)/$(webRepository):$(Build.BuildNumber) 

【问题讨论】:

    标签: docker kubernetes azure-devops azure-pipelines azure-container-registry


    【解决方案1】:

    你可以这样做

    deployment.yaml

    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
      name: test-image
      labels:
        app: test-image
    spec:
      selector:
        matchLabels:
          app: test-image
          tier: frontend
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: test-image
            tier: frontend
        spec:
          containers:
          - image: TEST_IMAGE_NAME
            name: test-image
            ports:
            - containerPort: 8080
              name: http
            - containerPort: 443
              name: https
    

    在 CI 步骤中或在 ubuntu 中运行 sed 命令,如

    steps:
    - id: 'set test core image in yamls'
      name: 'ubuntu'
      args: ['bash','-c','sed -i "s,TEST_IMAGE_NAME,gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA," deployment.yaml']
    

    以上将解决您的问题。

    上面的命令只需查找并替换 TEST_IMAGE_NAME 为创建 docker 图像 URI 的变量。

    选项:2 自定义

    如果你想通过定制来做到这一点

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    resources:
    - service.yaml
    - deployment.yaml
    namespace: default
    commonLabels:
      app: myapp
    images:
    - name: myapp
      newName: registry.gitlab.com/jkpl/kustomize-demo
      newTag: IMAGE_TAG
    

    sh 文件

    #!/usr/bin/env bash
    set -euo pipefail
    
    # Set the image tag if not set
    if [ -z "${IMAGE_TAG:-}" ]; then
        IMAGE_TAG=$(git rev-parse HEAD)
    fi
    
    sed "s/IMAGE_TAG/${IMAGE_TAG}/g" k8s-base/kustomization.template.sed.yaml > location/kustomization.yaml
    

    演示github:https://gitlab.com/jkpl/kustomize-demo

    【讨论】:

    • 好的,所以这主要只能通过替换规则来完成!所以也许我可以用它来替换工件中的值 - 任务:qetza.replacetokens.replacetokens-task.replacetokens@3
    • 是的,您可以根据需要使用变量并用 sed 命令简单地替换它
    • 感谢您的想法。解决了这个... - 任务:qetza.replacetokens.replacetokens-task.replacetokens@3 displayName: 'TOKEN IMAGE REPLACEMENT' 输入:targetFiles: '**/deployment.yml' tokenPrefix: '#{' tokenSuffix: '}#'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多