web-dev-qa-db-ja.com

Kubernetesに画像の再プルを強制するにはどうすればよいですか?

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

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

93
Torsten Bronger

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

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

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

Kubernetesは、次のいずれかの場合、Podの作成時にプルします( pdating-images doc を参照):

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

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

  • imagePullPolicyIfNotPresentまたはNeverに設定し、 pre-pull :各クラスターノードでイメージを手動でプルして、最新のものをキャッシュしてから、kubectl rolling-updateまたは同様の操作を行いますポッドを再起動します(簡単に壊れたハック!)
  • 一時的にimagePullPolicyを変更し、kubectl applyを実行し、ポッドを再起動し(例:kubectl rolling-update)、imagePullPolicyを元に戻し、kubectl applyをやり直します(ugい!)
  • プルおよびプッシュsome-public-image:latestをプライベートリポジトリに移動し、kubectl rolling-updateを実行します(重い!)

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

77
Wernight

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

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

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

kubectl delete pod my-app-3498980157-2zxhd

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

15
Everett Toews

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

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

展開を想定 これらの要件を満たしている の場合、K8は新しいイメージを取得して再展開します。

8
Tamlyn

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

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

6
sjking

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

4
Robert Bailey

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

展開のローリング再起動を行う新しいkubectl rollout restartコマンドを作成します。

プルリクエスト がマージされました。バージョン1.15の一部になります( changelog

2
S.Spieker

展開ファイルでimagePullPolicy: Alwaysを定義できます。

0
Sachin Arote