Kubernetes가 이미지를 다시 가져 오도록하려면 어떻게해야합니까?


175

GKE의 Kubernetes에 다음 복제 컨트롤러가 있습니다.

apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 2
  selector:
    app: myapp
    deployment: initial
  template:
    metadata:
      labels:
        app: myapp
        deployment: initial
    spec:
      containers:
      - name: myapp
        image: myregistry.com/myapp:5c3dda6b
        ports:
        - containerPort: 80
      imagePullPolicy: Always
      imagePullSecrets:
        - name: myregistry.com-registry-key

이제 내가 말하면

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b

롤링 업데이트가 수행되지만 다시 가져 오지 않습니다. 왜?


13
같은 태그로 다른 이미지를주었습니다. 다른 태그를 지정해야하는 경우 imagePullPolicy필드에 아무 의미가 없습니다 .
— Torsten Bronger 2015 년

4
특정 태그를 사용하고 싶지만 최신 버전을 사용하고 싶습니다.
— Torsten Bronger

3
@TorstenBronger 저는 이것이 Kubernetes / Docker 이론의 획기적인 변화라고 생각합니다. 두 개의 다른 시간에 image : tag (최신 제품 제외)를 가져와 두 개의 다른 이미지를 얻을 수 있다는 생각은 문제가 될 것입니다. 태그는 버전 번호와 유사합니다. 이미지가 변경 될 때 항상 태그를 변경하는 것이 좋습니다.
— duct_tape_coder

2
때에 따라 다르지. API가 매우 안정적인 소프트웨어가 있지만 보안 업데이트가 있습니다. 그런 다음 명시 적으로 말할 필요없이 최신 버전을 원합니다.
— Torsten Bronger

1
@TorstenBronger 사용 latest과 관련하여 하지 마십시오. Latest는 최신 태그로 최근 이미지를 가져옵니다. 원하는 것은 SemVer 범위입니다. 예를 들어 ~ 1.2.3. 그러면> = 1.2.3과 <1.3.0 사이의 태그가있는 이미지를 가져옵니다. 이미지 공급 업체가 SemVer를 따르는 한 (그리고 이것이 중요한 부분 임) 이전의 주요 변경 사항이 (의도적으로) 추가되지 않았고 새로운 기능이 추가되지 않았다는 것을 알고 있습니다 (보안 문제 일 수 있음). latest생산 시스템에서는 절대로 사용하지 마십시오 .
— David J Eddy

답변:


161

Kubernetes는 다음 중 하나에 해당하는 경우 포드 생성시 가져옵니다 (updates -images doc 참조 ).

  • 태그가 지정된 이미지 사용 :latest
  • imagePullPolicy: Always 지정됨

항상 당기고 싶을 때 좋습니다. 그러나 필요 에 따라 수행하려면 어떻게해야합니까? 예를 들어 사용하고 some-public-image:latest싶지만 요청할 때 수동으로 만 최신 버전을 가져 오려는 경우입니다. 현재 다음을 수행 할 수 있습니다.

  • 설정 imagePullPolicy에 IfNotPresent나 Never와 풀 사전 : 최신 캐시되도록 각 클러스터 노드에 풀 수동으로 이미지를, 다음을 수행 kubectl rolling-update또는 포드를 다시 시작 유사 (추한 쉽게 깨지지 해킹!)
  • 일시적으로 변경 imagePullPolicy, 수행 kubectl apply, 포드 다시 시작 (예 :) kubectl rolling-update, 되돌리기 imagePullPolicy, 다시 실행 kubectl apply(추한!)
  • some-public-image:latest개인 저장소로 가져 와서 푸시 하고 kubectl rolling-update(무거운!)

온 디맨드 풀에 대한 좋은 솔루션이 없습니다. 변경되면 의견을 보내주십시오. 이 답변을 업데이트하겠습니다.


당신이 사용하는 경우는 Kubernetes는 포드 생성에 끌어 말 :latest- 무엇에 대해 patchING? 또한 항상 최신 / 최신 이미지를 가져 옵니까? 하지 :( 나를 위해 작동하는 것 같다
— pkyeck

패치가 Pod 재생성을 강제하는지 여부에 따라 다릅니다. 그렇지 않을 가능성이 크면 다시 당기지 않을 것입니다. Pod를 수동으로 종료하거나 고유 한 태그를 지정하고 업데이트 된 태그로 패치 할 수 있습니다.
— Wernight

이것은 다른 질문에 대한 답변입니다. 나는 다시 잡아 당기기 를 요구 했다.
— Torsten Bronger

이로 인해 GCR에서 새로운 풀을 강제 할 수있었습니다. :latest새 이미지를 가리키는 태그 가 있었고 kubectl rolling-update에서 포드를 업데이트했습니다.
— Randy L

감사. Pull & Push 접근 방식에 갔다. bash 스크립트로 최대한 자동화했지만 동의했지만 무겁습니다. :)
— arcseldon

84

하나는 imagePullPolicy사양 데이터 내부가 아닌 컨테이너 데이터 내부에서 그룹화해야 합니다. 그러나 나는 이상하다고 생각하기 때문에 이것에 대해 문제 를 제기 했습니다. 게다가 오류 메시지가 없습니다.

따라서이 사양 스 니펫이 작동합니다.

spec:
  containers:
  - name: myapp
    image: myregistry.com/myapp:5c3dda6b
    ports:
    - containerPort: 80
    imagePullPolicy: Always
  imagePullSecrets:
    - name: myregistry.com-registry-key

3
imagePullPolicy(또는 태깅 :latest)은 항상 당기고 싶을 때 좋지만 필요에 따라 당기는 문제를 해결하지는 못합니다.
— Wernight

1
예, 질문에 명시된대로 항상 당기고 싶습니다 .
— Torsten Bronger

1
imagePullPolicy: Always컨테이너 정의 내에서 사용하면 최신 버전이 레지스트리로 푸시 될 때마다 kubernetes태그가 지정된 이미지를 가져 :latest오게됩니다.
— pkaramol

1
@pkaramol No.는 imagePullPolicy: Always단순히 Kubernetes에게 항상 레지스트리에서 이미지를 가져 오도록 지시합니다. image속성 별로 구성되는 이미지 입니다. 로 구성 image: your-image:latest하면 항상 태그가 있는 your-image이미지를 가져옵니다 latest.
— Gajus dec.

나는 여기서 cronjob과 같은 문제를 겪었습니다. "latest"태그는 무시되었고 작업 사양을 always pull 정책으로 설정하기 만하면 k8s가 다음 실행 (= 컨테이너 생성)을 위해 이미지를 다시로드하게되었습니다. 모든 문서에서 동일하게 취급하고 있음에도 불구하고이 두 옵션간에 뭔가 다른 것처럼 보입니다.
— Roman Gruber

29

개발 중 내 해킹은 배포 매니페스트를 변경하여 최신 태그를 추가하고 항상 그렇게 당기는 것입니다.

image: etoews/my-image:latest
imagePullPolicy: Always

그런 다음 수동으로 포드를 삭제합니다.

kubectl delete pod my-app-3498980157-2zxhd

배포이기 때문에 Kubernetes는 자동으로 포드를 다시 만들고 최신 이미지를 가져옵니다.


"배포"개체의 "원하는 상태"전제를 활용하는 것을 좋아합니다 ... 제안 해 주셔서 감사합니다!
— Marcello de Sales

3
서비스 장애와 다운 타임이 허용되는 경우에만 전략이 실행 가능하다는 점은 주목할 가치가 있습니다. 개발을 위해서는 합리적으로 보이지만 프로덕션 배포에는이 전략을 절대로 적용하지 않습니다.
— digitaldreamer

Everett이 제안한대로 배포를 편집하고 imagePullPolicy를 always로 변경하고 포드를 삭제하는 것으로 충분했습니다. 하지만 이것은 개발 환경입니다. kubernetes.io/docs/concepts/containers/images
— Jos Roberto Almaraz

21

이를 직접 수행 할 수있는 새로운 명령이있을 것입니다.

kubectl rollout restart배포의 롤링 다시 시작을 수행 하는 새 명령을 만듭니다 .

풀 요청 당함 합병했다. 버전 1.15( changelog )의 일부가됩니다.



1
예, 이것은 1.15의 새로운 kubernetes 버전에서 업데이트를 트리거하는 가장 좋은 방법입니다.
— Dolphin

20

인기 해결 방법은 더미 주석 (또는 라벨)와 배포를 패치하는 것입니다 :

kubectl patch deployment <name> -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

배포 가 이러한 요구 사항을 충족 한다고 가정하면 K8이 새 이미지를 가져와 재배포하게됩니다.


2
예, 여기에 주석을 사용합니다.
— Torsten Bronger

무슨 주석?
— Jeryl Cook 2019-04-05

1
또 다른 정교한 솔루션은 두 가지의 조합입니다. 주석을 추가하고 설정 ImagePullPolicy으로 항상 . 주석 좋아 deployment.kubernetes.io/revision: "v-someversion"하고 kubernetes.io/change-cause: the reason불변의 구축을 향한 매우 도움이되고 머리가 될 수 있습니다.
— chandan

8

이제 --image기존 컨테이너 이미지와 동일한 인수를 사용하여 지속적 업데이트를 실행할 때 --image-pull-policy. 다음 명령은 이미지가 컨테이너 이미지와 동일 할 때 강제로 이미지를 가져와야합니다.

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always


Kubernetes 1.18부터이 기능은 다음과 같이 제거되었습니다. v1-18.docs.kubernetes.io/docs/setup/release/notes/#kubectl
— S.Spieker

6
# Linux

kubectl patch deployment <name> -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

# windows

kubectl patch deployment <name> -p (-join("{\""spec\"":{\""template\"":{\""metadata\"":{\""annotations\"":{\""date\"":\""" , $(Get-Date -Format o).replace(':','-').replace('+','_') , "\""}}}}}"))

5

이제 정책 kubectl rollout restart deploy YOUR-DEPLOYMENT과 결합 된 명령 imagePullPolicy: Always을 사용하면 최신 버전의 이미지로 모든 포드를 다시 시작할 수 있습니다.



3

롤링 업데이트 명령은 이미지 인수가 주어지면 이미지가 현재 복제 컨트롤러에있는 것과 다르다고 가정합니다 .


이것은 이미지 태그 (일명)가 달라야 함을 의미합니까?
— 스텐 Bronger

예, --image플래그 를 전달하면 이미지 이름이 달라야합니다 .
— Robert Bailey

1
내 대답이 말했듯이 이미지 이름이 동일하면 작동합니다. 단순히 imagePullPolicy가 잘못된 위치에 있었기 때문입니다. 내 방어를 위해 k8s 1.0 문서는이 측면에서 오류가 있습니다.
— Torsten Bronger 2015 년

문서가 동작과 일치하지 않을 때 좋아해야합니다. : /
— Robert Bailey

1
그 URL도 구식입니다.
— Dan Tenenbaum

3
  1. 전략을 다음과 같이 지정하십시오.
  strategy: 
    type: Recreate
    rollingUpdate: null
  1. 각 배포에 대해 다른 주석이 있는지 확인하십시오. Helm은 다음과 같이합니다.
  template:
    metadata:
      labels:
        app.kubernetes.io/name: AppName
        app.kubernetes.io/instance: ReleaseName
      annotations:
        rollme: {{ randAlphaNum 5 | quote }}
  1. 이미지 가져 오기 정책 지정-항상
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: Always

1

이미지 가져 오기 정책은 항상 새 포드가 생성 될 때마다 이미지를 가져 오는 데 도움이됩니다 (복제본 크기 조정 또는 포드 다이 및 새 포드 생성과 같은 경우).

그러나 현재 실행중인 포드의 이미지를 업데이트하려면 배포가 가장 좋은 방법입니다. (주로 포드에 영구 볼륨이 연결되어있을 때) 문제없이 완벽하게 업데이트 할 수 있습니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.