programing

이미지를 업데이트하기 위해 배포하는 방법을 Kubernetese

lovejava 2023. 9. 6. 21:40

이미지를 업데이트하기 위해 배포하는 방법을 Kubernetese

저는 단일 포드를 사용하여 구축을 수행하고 있으며, 맞춤형 도커 이미지는 다음과 같습니다.

containers:
  - name: mycontainer
    image: myimage:latest

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

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

(예: 및 크기에 기간을 ( : 에 할 하고 를 할 하고 를 )"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"세트.

업데이트:

이미지 이름을 변경할 필요가 없는 또 다른 방법은 롤링 업데이트를 트리거할 필드의 값을 변경하는 것입니다.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

으로 @Jodiug comment가 .1.15할 수 있습니다: version수다할을다수edn:을e

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

두 번째(라이너 1개):

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

입니다입니다.imagePullPolicy: Always두 경우 모두 필요합니다.

kubectl rollout restart deployment myapp

하고 이전 를 다른 입니다.kubectl rollout롤백 같은.

Gitlab-CI를 사용하여 이미지를 구축한 후 GCK에 직접 배포합니다.용기의 실제 설정을 변경하지 않고 롤링 업데이트를 달성하기 위해 깔끔한 작은 트릭을 사용하는 경우, 이는 라벨을 현재 커밋-숏-샤로 변경하는 것입니다.

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

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

각 빌드에 따라 변경되는 레이블의 이름과 값을 사용할 수 있습니다.

재미있게 보내!

다음 명령을 사용하여 업데이트할 수 있습니다.

kubectl set image deployment/<<deployment-name>> -n=<<namespace>> <<container_name>>=<<your_dockerhub_username>>/<<image_name you want to set now>>:<<tag_of_the_image_you_want>>

예를들면,

kubectl set image deployment/my-deployment -n=sample-namespace my-container=alex/my-sample-image-from-dockerhub:1.1

여기서:

  • kubectl set image deployment/my-deployment- 이름이 지정된 배포 이미지를 설정하고자 합니다.my-deployment
  • -n=sample-namespace- 이 배포는 다음 이름의 네임스페이스에 속합니다.sample-namespace. 배포 환경이 기본 네임스페이스에 속해 있으면 명령에서 이 부분을 언급할 필요가 없습니다.
  • my-container는 이전에 배포 구성의 YAML 파일에 언급된 컨테이너 이름입니다.
  • alex/my-sample-image-from-dockerhub:1.1는 배포에 대해 설정하고 컨테이너를 실행할 새 이미지입니다.여기서,alex도커허브 이미지의 사용자 이름입니다(해당되는 경우).my-sample-image-from-dockerhub:1.1사용할 이미지와 태그.

k8s는 우리가 배포할 때마다 다른 이미지 태그를 제공하기를 기대하는 것 같습니다.제 기본 전략은 CI 시스템이 도커 이미지를 생성하고 밀어 넣도록 하는 것이며, 이 이미지들에 빌드 번호를 태그하는 것입니다.xpmatteo/foobar:456.

로컬 개발을 위해서는 다음과 같은 스크립트나 makefile을 사용하는 것이 편리할 수 있습니다.

# 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명령어는 배포 문서의 자리 표시자를 실제 생성된 이미지 태그로 바꿉니다.

디버깅에 더 적합하지만 언급할 가치가 있는 또 다른 옵션은 롤아웃의 개정 기록을 확인하는 것입니다.

$ kubectl rollout history deployment my-dep
deployment.apps/my-dep
 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>

각 리비전의 세부 정보를 보려면 다음을 실행합니다.

 kubectl rollout history deployment my-dep --revision=2

다음을 실행하여 이전 개정판으로 돌아갑니다.

 $kubectl rollout undo deployment my-dep --to-revision=2

그리고 다시 새로운 것으로 돌아가는 겁니다.
달리는 것처럼ctrl+z -> ctrl+y(:

(*) 변경 원인은<none>당신이 업데이트를 실행해야 하기 때문입니다.--recordflag - 여기에 언급된 것처럼:

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record

(**) 이 깃발을 감가상각하는 것에 대한 논의가 있습니다.

저는 Azure DevOps를 사용하여 컨테이너화 어플리케이션을 배포하고 있으며 빌드 ID를 사용하여 이 문제를 쉽게 해결할 수 있습니다.

새로운 빌드 ID를 빌드하고 생성할 때마다 이 빌드 ID를 도커 이미지의 태그로 사용하는 예는 다음과 같습니다.

이미지 이름:buildID

이미지가 빌드(CI)에 성공하면 배포 yml 파일의 CD 파이프라인에서 이미지 이름을 다음과 같이 지정합니다.

이미지 이름:env:buildID

여기서 evn:buildid는 빌드 ID 값을 가지는 azure devops 변수입니다.

CI(Build) 및 CD(Deploy)를 변경할 때마다 새로운 변경사항이 발생합니다.

CI/CD에 대한 빌드 정의가 필요하다면 코멘트 부탁드립니다.

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