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
ローリング更新は実行されますが、再プルは実行されません。どうして?
imagePullPolicy
を仕様データ内ではなくコンテナデータ内にグループ化する必要があります。しかし、私は奇妙だと思うので、これについて issue を提出しました。また、エラーメッセージはありません。
したがって、この仕様スニペットは機能します。
spec:
containers:
- name: myapp
image: myregistry.com/myapp:5c3dda6b
ports:
- containerPort: 80
imagePullPolicy: Always
imagePullSecrets:
- name: myregistry.com-registry-key
Kubernetesは、次のいずれかの場合、Podの作成時にプルします( pdating-images doc を参照):
:latest
でタグ付けされた画像の使用imagePullPolicy: Always
が指定されていますこれは、常にプルしたい場合に最適です。しかし、それをやりたい場合はどうすればいいですか?オンデマンド:たとえば、some-public-image:latest
を使用したいが、要求されたときに新しいバージョンのみを手動でプルしたい場合。現在、次のことができます。
imagePullPolicy
をIfNotPresent
またはNever
に設定し、 pre-pull :各クラスターノードでイメージを手動でプルして、最新のものをキャッシュしてから、kubectl rolling-update
または同様の操作を行いますポッドを再起動します(簡単に壊れたハック!)imagePullPolicy
を変更し、kubectl apply
を実行し、ポッドを再起動し(例:kubectl rolling-update
)、imagePullPolicy
を元に戻し、kubectl apply
をやり直します(ugい!)some-public-image:latest
をプライベートリポジトリに移動し、kubectl rolling-update
を実行します(重い!)オンデマンドプルに適したソリューションはありません。変更された場合はコメントしてください。このanwserを更新します。
開発中の私のハックは、展開マニフェストを変更して最新のタグを追加し、常にそのようにプルすることです
image: etoews/my-image:latest
imagePullPolicy: Always
次に、ポッドを手動で削除します
kubectl delete pod my-app-3498980157-2zxhd
これはデプロイメントであるため、Kubernetesは自動的にポッドを再作成し、最新のイメージをプルします。
一般的な回避策 は、ダミーの注釈(またはラベル)を使用してデプロイメントにパッチを適用することです。
kubectl patch deployment <name> -p \
"{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"
展開を想定 これらの要件を満たしている の場合、K8は新しいイメージを取得して再展開します。
現在、既存のコンテナイメージと同じ--image
引数を使用してローリング更新を実行する場合、--image-pull-policy
も指定する必要があります。次のコマンドは、コンテナイメージと同じ場合にイメージを強制的にプルする必要があります。
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always
ローリング更新コマンドにイメージ引数が指定されている場合、 イメージが異なると想定 現在レプリケーションコントローラーに存在するものよりも。
展開ファイルでimagePullPolicy: Always
を定義できます。