본문 바로가기

개발하자

쿠버네티스 배포에서 동적/가변 이미지 태그를 사용하는 방법?

반응형

쿠버네티스 배포에서 동적/가변 이미지 태그를 사용하는 방법?

Kustomize를 사용하는 프로젝트에서 기본 파일은 다음과 같습니다:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:IMAGE_TAG # <------------------------------
        ports:
        - containerPort: 80

그런 다음 배포할 이미지의 버전으로 교체합니다.

텍스트 yaml 파일을 사용하여 편집하는 것보다 더 정교한 방법이 있습니까?




태그를 사용하거나 사용하지 않고 배포를 그대로 유지할 수 있습니다:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

사용자 지정 파일에서 다음을 수행합니다:

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

resources:
  - deployment.yaml

images:
  - name: nginx
    newTag: MYNEWTAG

이렇게 하면 사용자 지정 파일에 포함된 모든 리소스의 모든 nginx 이미지의 태그가 교체됩니다. 여러 버전의 nginx를 실행해야 하는 경우 배포의 이미지 이름을 자리 표시자로 바꿀 수 있으며 변환기에 다른 항목이 있습니다.




를 사용할 수 있으며, 각 태그의 파일을 편집할 필요가 가능합니다. 이 기능은 버전 제어 파일을 변경하지 않고 이미지 태그를 변경해야 할 경우 유용합니다.

이 목적을 위해서는 표준이 충분하다. 요약하면 환경 변수에서 데이터를 채운 a를 사용합니다. 그런 다음 이 ConfigMap 데이터를 참조하여 관련 이미지 태그를 추가합니다.

예제를 계속 사용하면 다음과 같은 파일을 같은 폴더에 저장할 수 있습니다:

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

# Generate a ConfigMap based on the environment variables in the file `.env`.
configMapGenerator:
  - name: my-config-map
    envs:
      - .env

replacements:
  - source:
      # Replace any matches by the value of environment variable `MY_IMAGE_TAG`.
      kind: ConfigMap
      name: my-config-map
      fieldPath: data.MY_IMAGE_TAG
    targets:
      - select:
          # In each Deployment resource …
          kind: Deployment
        fieldPaths:
          # … match the image of container `nginx` …
          - spec.template.spec.containers.[name=nginx].image
        options:
          # … but replace only the second part (image tag) when split by ":".
          delimiter: ":"
          index: 1

resources:
  - deployment.yaml

동일한 폴더에 환경 변수 이름만 있는 파일이 필요합니다(참고: 이름만 있고 값이 할당되지 않음):

MY_IMAGE_TAG

이제 로컬 환경에서 등을 실행할 때 이미지 태그로 통합됩니다.

데모:

MY_IMAGE_TAG=foobar kubectl kustomize .

이렇게 하면 생성된 이미지 태그가 인쇄되고 원하는 대로 인쇄됩니다:

# …
spec:
  # …
  template:
    # …
    spec:
      containers:
        - image: nginx:foobar
          name: nginx
          ports:
            - containerPort: 80

대안

에서 다음 사항을 유의하십시오:

로컬 환경 변수 모집단 기능은 일부만 사용하는 것이 좋습니다. 패치가 있는 오버레이가 유지보수성이 더 높은 경우가 많습니다. 환경에서 값을 설정하는 것은 git SHA와 같이 쉽게 예측할 수 없을 때 유용할 수 있다.

단순히 여러 파일 간에 이미지 태그를 공유하려는 경우에는 이미를 참조하십시오.




@evolutics의 답변은 아마도 그것을 하는 "적절한" 방법일 것이지만 모든 배포에 이미지 태그만 사용자 정의하는 경우 $IMAGE_TAG 변수를 넣고 명령을 사용하는 것을 고려해 볼 수 있다.

예:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:$IMAGE_TAG
        ports:
        - containerPort: 80
IMAGE_TAG=my_image_tag envsubst '${IMAGE_TAG}' < deployment.yaml > final_deployment.yaml



CLI를 선호하는 사람들을 위한 편리한 해결책이 있다.

이미지 변환을 파일에 동적으로 추가할 수 있습니다. 전화번호부를 확인하고 전화하세요

kustomize edit set image nginx:your_new_tag

그러면 에 다음과 같은 변화가 발생합니다:

images:
- name: nginx
  newTag: your_new_tag

내가 이 솔루션을 시도했을 때 직면했던 유일한 문제는 독립 실행형으로만 작동할 수 있었지만 사용할 수 없었다는 것이다. 나에게 적합한 현재 버전은 다음과 같다


반응형