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
ローリングアップデートは実行されますが、再プルは実行されません。なぜでしょうか?
ベストアンサー1
Kubernetesは、Podの作成時にプルを実行します(以下を参照)。画像の更新ドキュメント):
- タグ付けされた画像の使用
:latest
imagePullPolicy: Always
指定されている
常にプルしたい場合は、これは素晴らしい方法です。しかし、オンデマンドで実行したい場合はどうでしょうか。たとえば、some-public-image:latest
新しいバージョンを使用したいが、要求されたときにのみ手動でプルしたい場合などです。現在、次のことが可能です。
- または
imagePullPolicy
に設定し、IfNotPresent
Never
事前プル: 各クラスター ノードでイメージを手動でプルして最新のイメージがキャッシュされるようにし、またはkubectl rolling-update
同様の操作を実行してポッドを再起動します (簡単に壊れる醜いハックです)。 - を一時的に変更し
imagePullPolicy
、 を実行しkubectl apply
、ポッドを再起動 (例kubectl rolling-update
)、 を元に戻しimagePullPolicy
、 をやり直すkubectl apply
(醜い!) -
some-public-image:latest
プライベートリポジトリにプルしてプッシュkubectl rolling-update
し、 (重い!)
オンデマンド プルには適切な解決策はありません。状況が変わった場合は、コメントしてください。この回答を更新します。