Kubernetesにイメージを強制的に再プルさせるにはどうすればよいですか?


161

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

ローリング更新は実行されますが、再プルは行われません。どうして?


12
同じタグを使用して、別の画像を指定しました。別のタグを付ける必要がある場合でも、imagePullPolicyフィールドには意味がありません。
Torsten Bronger、2015年

4
特定のタグを使用したいのですが、最新バージョンです。
Torsten Bronger、2018

3
@TorstenBrongerこれはKubernetes / Docker理論の重大な変更だと思います。image:tag(latest以外)を2つの異なるタイミングでプルし、2つの異なるイメージを取得できるという考えには問題があります。タグはバージョン番号に似ています。画像が変更された場合は、常にタグを変更することをお勧めします。
–duct_tape_coder

2
場合によります。非常に安定したAPIを備えたソフトウェアがありますが、セキュリティが更新されています。そこで、明示的に言わなくても最新版が欲しいです。
Torsten Bronger

1
@TorstenBrongerの使用に関してはlatest、行わないでください。最新は、最新のタグで画像を取得します。必要なのはSemVerの範囲です。たとえば、1.2.3です。これにより、> = 1.2.3から<1.3.0の範囲のタグが付いたイメージがプルされます。イメージベンダーがSemVerを知っている限り(そしてこれは重要な部分です)、後方互換性のある変更は(意図的に)追加されておらず、新しい機能は追加されていません(セキュリティ上の懸念)。latest生産システムでは絶対に使用しないでください。
David J Eddy

回答:


141

Kubernetesは、次の場合にポッドの作成をプルします(updated-images docを参照):

  • タグ付けされた画像の使用 :latest
  • imagePullPolicy: Always 指定されている

これは、常にプルしたい場合に最適です。しかし、オンデマンドで実行したい場合はどうなりますか。たとえば、使用しsome-public-image:latestたいが、要求されたときに手動で新しいバージョンのみをプルしたい場合。現在できること:

  • またはに設定imagePullPolicyして事前にプル:各クラスターノードのイメージを手動でプルして最新のキャッシュを作成し、次にa または類似の操作を行ってポッドを再起動します(醜い簡単に壊れたハック!)IfNotPresentNeverkubectl rolling-update
  • 一時的に変更imagePullPolicy、実行kubectl apply、ポッドの再起動(例kubectl rolling-update:)imagePullPolicy、元に戻す、やり直しkubectl apply(醜い!)
  • some-public-image:latestプライベートリポジトリにプルしてプッシュし、kubectl rolling-update(重い!)

オンデマンドプルに適したソリューションはありません。変更された場合はコメントしてください。この回答を更新します。


使用するときにkubernetesがポッドの作成を引き出すと言っています-ingは:latestどうpatchですか?また、常に最新/最新の画像を取得しますか?私にはうまくいかないようです:(
pkyeck

パッチがポッドの再作成を強制するかどうかによって異なります。おそらくそうではなく、それから再び引っ張られることはありません。ポッドを手動で強制終了するか、独自のタグを付けて、更新されたタグでパッチを適用できます。
2016年

これは別の質問に対する答えです。私は再プルを強制するように頼みました。
Torsten Bronger、2016

これにより、GCRから新しいプルを強制することができました。私が持っていた:latest新しいイメージで指摘したタグを、およびkubectl rolling-updateポッドを更新するために働きました。
Randy L

ありがとう。Pull&Pushアプローチに参加しました。bashスクリプトを使用して可能な限り自動化しましたが、同意しました。重いです:)
arcseldon

77

imagePullPolicyスペックデータ内ではなく、コンテナデータ内でグループ化する必要があります。しかし、私はそれが奇妙だと思うので、これについて問題を提出しました。また、エラーメッセージはありません。

したがって、このスペックスニペットは機能します。

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

3
imagePullPolicy(またはタグ付け:latest)は、常にプルしたい場合に適していますが、オンデマンドでプルするという問題は解決しません。
平日2016年

1
はい、質問で述べたように、私は常に引きたいです。
Torsten Bronger、2016

1
imagePullPolicy: Alwaysコンテナー定義内で使用すると、新しいバージョンのkubernetesイメージが:latestレジストリにプッシュされるたびにタグ付きのイメージがフェッチされますか?
pkaramol

1
@pkaramolいいえ。Kubernetes imagePullPolicy: Alwaysに常にレジストリからイメージをプルするように指示します。どのイメージがimage属性によって構成されるか。これをに設定するとimage: your-image:latest、常にタグyour-image付きのイメージがプルされlatestます。
Gajus

26

開発中のハックは、Deploymentマニフェストを変更して最新のタグを追加し、常にそのようにプルすることです

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

次に、ポッドを手動で削除します

kubectl delete pod my-app-3498980157-2zxhd

これはデプロイであるため、Kubernetesはポッドを自動的に再作成し、最新のイメージをpullします。


「デプロイメント」オブジェクトの「望ましい状態」の前提を利用するのが好きです...提案をありがとう!
マルチェロ

2
サービスとダウンタイムの障害が許容できる場合にのみ、戦略が実行可能であることは注目に値します。開発の場合は妥当と思われますが、本番デプロイではこの戦略を引き継ぐことはありません。
digitaldreamer 2018年

デプロイを編集し、imagePullPolicyを常にに変更し、ポッドを削除するだけで十分でした。ただし、これは開発環境です。kubernetes.io/docs/concepts/containers/images
Jos Roberto Almaraz

17

一般的な回避策は、ダミーのアノテーション(またはラベル)を使用してデプロイメントにパッチを適用することです。

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

デプロイメントがこれらの要件を満たしていると仮定すると、K8は新しいイメージをプルして再デプロイします。


2
はい、私はこれに注釈を使用します。
Torsten Bronger

どんなアノテーション?
ジェリルクック

1
別の洗練されたソリューションは、両方の組み合わせになります。注釈を追加し、Alwaysに設定ImagePullPolicyします。およびのようなアノテーションは非常に役立ち、不変のデプロイメントに向かいます。deployment.kubernetes.io/revision: "v-someversion"kubernetes.io/change-cause: the reason
シャンダン

16

それを直接行うための新しいコマンドがあります:

kubectl rollout restartデプロイメントのローリング再起動を実行する新しいコマンドを作成します。

プルリクエスト GOTが合併しました。バージョンの一部になります1.15changelog



はい、これは1.15の新しいkubernetesバージョンで更新をトリガーする最良の方法です。
イルカ

7

どうやら--image、既存のコンテナイメージと同じ引数を使用してローリングアップデートを実行するときは、も指定する必要があります--image-pull-policy。次のコマンドは、コンテナイメージと同じ場合、イメージを強制的にプルします。

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


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('+','_') , "\""}}}}}"))

3

コマンドkubectl rollout restart deploy YOUR-DEPLOYMENTimagePullPolicy: Alwaysポリシーを組み合わせると、すべてのポッドを最新バージョンのイメージで再起動できます。


3

ローリング更新コマンドは、イメージ引数が指定されている場合、イメージが現在レプリケーションコントローラに存在するものとは異なると想定します。


これは、イメージタグ(別名)が異なる必要があることを意味しますか?
Torsten Bronger、2015年

はい、--imageフラグを渡す場合、イメージ名は異なる必要があります。
Robert Bailey

1
私自身の答えが言うように、イメージ名が同じである場合にも機能します。それは単に、imagePullPolicyが間違った場所にあったということでした。私の弁護では、k8s 1.0のドキュメントはこの点で誤りです。
Torsten Bronger、2015年

ドキュメントが動作と同期していないときは、お奨めです。:/
ロバートベイリー

1
そのURLも古くなっています。
Dan Tenenbaum、


0

イメージプルポリシーは、新しいポッドが作成されるたびに実際にイメージをプルするのに常に役立ちます(これは、レプリカのスケーリングやポッドダイの作成や新しいポッドの作成など、どのような場合でも可能です)。

ただし、現在実行中のポッドのイメージを更新する場合は、デプロイが最良の方法です。それはあなたに問題なく完璧な更新を残します(主にポッドに永続的なボリュームが接続されている場合):)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.