web-dev-qa-db-ja.com

Kubernetesによる展開イメージの更新方法

次のようなカスタムDockerイメージを使用して、シングルポッドで展開します。

containers:
  - name: mycontainer
    image: myimage:latest

開発中に、新しい最新バージョンをプッシュし、展開を更新します。タグ/バージョンを明示的に定義し、ビルドごとに増分せずに、それを行う方法を見つけることができません

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

ポッドを猶予期間(コンテナの起動時間とイメージサイズに応じて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"も設定されていることを確認してください。

更新:

イメージ名を変更する必要のない別のトリックは、terminationGracePeriodSecondsのようなローリング更新をトリガーするフィールドの値を変更することです。これを行うには、kubectl edit deployment your_deploymentまたはkubectl apply -f your_deployment.yamlを使用するか、次のようなパッチを使用します。

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

常に数値を変更するようにしてください。

88
Camil

さて、このテーマについてはkubernetes GitHubプロジェクトで興味深い議論があります。問題を参照してください: https://github.com/kubernetes/kubernetes/issues/33664

そこで説明されているソリューションから、2つのうちの1つを提案します。

最初

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

2番目(ライナー1つ):

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

もちろん、両方の場合にimagePullPolicy: Alwaysが必要です。

19
Przemek Nowak

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コマンドは、展開ドキュメントのプレースホルダーを実際に生成されたイメージタグに置き換えます。

2
xpmatteo

Gitlab-CIを使用してイメージを構築し、GCKに直接展開します。コンテナの実際の設定を変更せずにローリング更新を達成するために、きちんとした小さなトリックを使用すると、現在のcommit-short-shaにラベルが変更されます。

私のコマンドは次のようになります。

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

ビルドごとに変更される限り、ラベルに任意の名前と値を使用できる場所。

楽しむ!

1
David Faber