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싶지만 요청할 때 수동으로 만 최신 버전을 가져 오려는 경우입니다. 현재 다음을 수행 할 수 있습니다.

  • 설정 imagePullPolicyIfNotPresentNever풀 사전 : 최신 캐시되도록 각 클러스터 노드에 풀 수동으로 이미지를, 다음을 수행 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.