概要
k8s のローリングアップデート (rollout) は Deployment と ReplicaSet を使うことで実現できます
今回はローリングアップデート/ロールバックを試してみました
なお、環境は minikube を使っています
環境
- macOS 10.13.6
- minikube v0.28.2
- kubectl 1.11.2
Deployment 作成
- vim echoserver.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-echo
spec:
selector:
matchLabels:
run: my-echo
replicas: 1
template:
metadata:
labels:
run: my-echo
spec:
containers:
- name: my-echo-c
image: k8s.gcr.io/echoserver:1.3
ports:
- containerPort: 8080
kubectl create -f echoserver.yaml --record
--record
を付与することで rollout の一覧を確認したときに実行時のコマンドを残すことができます (後述)
Service 作成
vim echoserver_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: my-echo
spec:
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
run: my-echo
アクセスしやすいように Service を作成しておきます
- kubectl get svc my-echo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-echo NodePort 10.97.177.175 <none> 8080:30390/TCP 1m
minikube の IP の 30390 にアクセスすることでアプリにコンテナにアクセスできます
コンテナ確認
curl -s $(minikube ip):30390 | grep 'server_version'
server_version=nginx: 1.9.11 - lua: 10001
nginx のバージョンが 1.9.11 になっています
ローリングアップデート
先程の Deployment のファイルを新たに作成します
内容はほぼ同じで今回は image の部分を更新しています
- vim echoserver.yaml.1.4
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-echo
spec:
selector:
matchLabels:
run: my-echo
replicas: 1
template:
metadata:
labels:
run: my-echo
spec:
containers:
- name: my-echo-c
image: k8s.gcr.io/echoserver:1.4
ports:
- containerPort: 8080
kubectl apply -f echoserver.yaml.1.4 --record
create ではなく apply を使います
コンテナ確認
しばらくすると新たにコンテナが作成されます
Pods の状態を見てるとわかりますが、古いコンテナが削除されて新しいコンテナが起動するのが確認できると思います
curl -s $(minikube ip):30390 | grep 'server_version'
server_version=nginx: 1.10.0 - lua: 10001
同じエンドポイントにアクセスしていますが先程のバージョンとは違うバージョンになっていることがわかります
ロールバック
やっぱり元に戻したい場合に行います
- kubectl get rs
NAME DESIRED CURRENT READY AGE
my-echo-5bd677d688 1 1 1 54s
my-echo-7f5b5f6bf 0 0 0 3m
k8s はコンテナのデプロイ履歴を ReplicaSet として保存しています
数字が 0 になっていない方が現在デプロイされている ReplicaSet になります
kubectl rollout history deployment my-echo
deployments "my-echo"
REVISION CHANGE-CAUSE
1 kubectl create --filename=echoserver.yaml --record=true
2 kubectl apply --filename=echoserver.yaml.1.4 --record=true
rollout コマンドを使うことでその履歴を確認することができます
リビジョン番号が大きいほうが新しいバージョンになります
今回は 1 番に戻したいので以下のコマンドを使います
kubectl rollout undo deployment my-echo --to-revision=1
要するにリビジョン 1 番のときに実行したコマンドの状態に戻すということをしています
コンテナ確認
curl -s $(minikube ip):30390 | grep 'server_version'
server_version=nginx: 1.9.11 - lua: 10001
という感じでまた元のバージョンに戻っていることが確認できると思います
リビジョンもまた新しい番号が振られています
kubectl rollout history deployment my-echo
deployments "my-echo"
REVISION CHANGE-CAUSE
2 kubectl apply --filename=echoserver.yaml.1.4 --record=true
3 kubectl create --filename=echoserver.yaml --record=true
最後に
k8s でローリングアップデートとロールバックを試してみました
アップデートは Deployment を更新することで自動的にコンテナの再作成を行ってくれます
ロールバックは ReplicaSet の履歴管理を使うことで実現します
履歴に振られているリビジョン番号を指定することで戻りたい状態に簡単に戻すことができます
なお今回試したローリングアップデータは k8s で言うところの rollout になります
同じような機能で rolling-update というコマンドがありますが、それは現在だと非推奨になっています
rolling-update は Replication Controller に対して実行できるアップデート機能で rollout は Deployments に対して行えるアップデート機能です
0 件のコメント:
コメントを投稿