次のようなカスタムDockerイメージを使用して、シングルポッドで展開します。
containers:
- name: mycontainer
image: myimage:latest
開発中に、新しい最新バージョンをプッシュし、展開を更新します。タグ/バージョンを明示的に定義し、ビルドごとに増分せずに、それを行う方法を見つけることができません
kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1
ポッドを猶予期間(コンテナの起動時間とイメージサイズに応じて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}}}}'
常に数値を変更するようにしてください。
さて、このテーマについては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
kubectl patch deployment web -p \
"{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
もちろん、両方の場合にimagePullPolicy: Always
が必要です。
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
コマンドは、展開ドキュメントのプレースホルダーを実際に生成されたイメージタグに置き換えます。
Gitlab-CIを使用してイメージを構築し、GCKに直接展開します。コンテナの実際の設定を変更せずにローリング更新を達成するために、きちんとした小さなトリックを使用すると、現在のcommit-short-shaにラベルが変更されます。
私のコマンドは次のようになります。
kubectl patch deployment my-deployment -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"build\":\"$CI_COMMIT_SHORT_SHA\"}}}}}}"
ビルドごとに変更される限り、ラベルに任意の名前と値を使用できる場所。
楽しむ!