IT박스

Kubernetes를 배포하여 이미지를 업데이트하는 방법

itboxs 2020. 10. 10. 09:48
반응형

Kubernetes를 배포하여 이미지를 업데이트하는 방법


다음과 같은 사용자 지정 도커 이미지를 사용하여 단일 포드로 배포했습니다.

containers:
  - name: mycontainer
    image: myimage:latest

개발 중에 새로운 최신 버전을 푸시하고 배포를 업데이트하고 싶습니다. 태그 / 버전을 명시 적으로 정의하고 각 빌드에 대해 증가시키지 않고는 방법을 찾을 수 없습니다.

kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1

유예 기간 (예 : 컨테이너 시작 시간 및 이미지 크기에 따라 30 초 이상)으로 포드를 구성하고 "imagePullPolicy: "Always". 그리고 kubectl delete pod pod_name. 새 컨테이너가 생성되고 최신 이미지가 자동으로 다운로드 된 다음 이전 컨테이너가 종료됩니다.

예:

spec:
  terminationGracePeriodSeconds: 30
  containers:
  - name: my_container
    image: my_image:latest
    imagePullPolicy: "Always"

현재 자동화 된 빌드 및 이미지 태그 지정을 위해 Jenkins를 사용하고 있으며 다음과 같이 보입니다.

kubectl --user="kube-user" --server="https://kubemaster.example.com"  --token=$ACCESS_TOKEN set image deployment/my-deployment mycontainer=myimage:"$BUILD_NUMBER-$SHORT_GIT_COMMIT"

또 다른 트릭은 처음에 다음을 실행하는 것입니다.

kubectl set image deployment/my-deployment mycontainer=myimage:latest

그리고:

kubectl set image deployment/my-deployment mycontainer=myimage

실제로 롤링 업데이트를 트리거하지만 imagePullPolicy: "Always"설정 했는지 확인하십시오 .

최신 정보:

이미지 이름을 변경할 필요가없는 또 다른 트릭은 .NET과 같은 롤링 업데이트를 트리거 할 필드의 값을 변경하는 것 terminationGracePeriodSeconds입니다. 이 사용 할 수있는 kubectl edit deployment your_deployment하거나 kubectl apply -f your_deployment.yaml또는이 같은 패치를 사용하여 :

kubectl patch deployment your_deployment -p \
  '{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}'

항상 숫자 값을 변경했는지 확인하십시오.


업데이트 2019-06-24

1.15버전 이있는 경우 @Jodiug 주석을 기반으로 kubectl rollout restart deployment/demo명령을 사용할 수 있습니다 .

문제에 대해 자세히 알아보십시오.

https://github.com/kubernetes/kubernetes/issues/13488


kubernetes GitHub 프로젝트에서이 주제에 대한 흥미로운 토론이 있습니다. 문제보기 : https://github.com/kubernetes/kubernetes/issues/33664

거기에 설명 된 솔루션에서 두 가지 중 하나를 제안합니다.

먼저

1. 배포 준비

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: registry.example.com/apps/demo:master
        imagePullPolicy: Always
        env:
        - name: FOR_GODS_SAKE_PLEASE_REDEPLOY
          value: 'THIS_STRING_IS_REPLACED_DURING_BUILD'

2. 배포

sed -ie "s/THIS_STRING_IS_REPLACED_DURING_BUILD/$(date)/g" deployment.yml
kubectl apply -f deployment.yml

두 번째 (하나의 라이너) :

kubectl patch deployment web -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"

물론 imagePullPolicy: Always두 경우 모두 필수입니다.


k8s는 모든 배포에 대해 다른 이미지 태그를 제공 할 것으로 예상하는 것 같습니다. 내 기본 전략은 CI 시스템이 도커 이미지를 생성하고 푸시하여 빌드 번호로 태그를 지정하는 것입니다 xpmatteo/foobar:456.

로컬 개발의 경우 다음과 같이 스크립트 또는 메이크 파일을 사용하는 것이 편리 할 수 ​​있습니다.

# create a unique tag    
VERSION:=$(shell date +%Y%m%d%H%M%S)
TAG=xpmatteo/foobar:$(VERSION)

deploy:
    npm run-script build
    docker build -t $(TAG) . 
    docker push $(TAG)
    sed s%IMAGE_TAG_PLACEHOLDER%$(TAG)% foobar-deployment.yaml | kubectl apply -f - --record

sed명령은 배포 문서의 자리 표시자를 실제 생성 된 이미지 태그로 바꿉니다.


Gitlab-CI를 사용하여 이미지를 빌드 한 다음 GCK에 직접 배포합니다. 컨테이너의 실제 설정을 변경하지 않고 롤링 업데이트를 달성하기 위해 깔끔한 트릭을 사용하면 레이블이 현재 commit-short-sha로 변경됩니다.

내 명령은 다음과 같습니다.

kubectl patch deployment my-deployment -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"build\":\"$CI_COMMIT_SHORT_SHA\"}}}}}}"

Where you can use any name and any value for the label as long as it changes with each build.

Have fun!

참고URL : https://stackoverflow.com/questions/40366192/kubernetes-how-to-make-deployment-to-update-image

반응형