はじめに
OpenShiftの勉強をするにあたり、CodeReady Container環境を使ってKubernetes公式チュートリアルを一通りやってみる。
学習内容
公式チュートリアルでは、Deploymentの作成、状態確認、外部公開、スケールアウト、アップデート、ロールバックを行う。 https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/
環境
以下で作成したCodeReady Container環境を使用 https://kurikube.github.io/post/20210131/
Module 1 - Create a Kubernetes cluster
Cluster details
この章ではクラスターの起動と状態確認を行う。
クラスターの起動と状態確認
Code Ready Containerのバージョンを確認する。
[centos@ip-172-31-19-74 ~]$ crc version
WARN A new version (1.39.0) has been published on https://developers.redhat.com/content-gateway/file/pub/openshift-v4/clients/crc/1.39.0/crc-linux-amd64.tar.xz
CodeReady Containers version: 1.38.0+659b2cbd
OpenShift version: 4.9.12 (embedded in executable)
OpenShift APIを実行するコマンドラインツールoc
のバージョンとマスターノードのバージョンを確認する。
[centos@ip-172-31-19-74 ~]$ oc version
Client Version: 4.9.12
Kubernetes Version: v1.22.3+e790d7f
クラスターの詳細確認
クラスターの詳細情報を取得する。
[centos@ip-172-31-19-74 ~]$ oc cluster-info
Kubernetes control plane is running at https://api.crc.testing:6443
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
全てのノード情報を取得する。CRC環境では1つのノードのみが実行されており、ステータスはReadyとなっている。
[centos@ip-172-31-19-74 ~]$ oc get nodes
NAME STATUS ROLES AGE VERSION
crc-xxcfw-master-0 Ready master,worker 30d v1.22.3+e790d7f
Module2 - Deploy an app
この章では、oc
を使ってアプリのデプロイを行う。
アプリのデプロイ
oc create deployment
を使用してアプリを起動する。
[centos@ip-172-31-19-74 ~]$ oc create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
deployment.apps/kubernetes-bootcamp created
デプロイを作成したときに実行されたこと
- アプリケーションのインスタンスを実行できる適切なノードを検索した
- アプリケーションをそのノードで実行するようにスケジュールした
- 必要に応じて新しいノードでインスタンスを再スケジュールするようにクラスタを構成した
デプロイのリストを表示する。
[centos@ip-172-31-19-74 ~]$ oc get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1/1 1 1 13s
もちろん、--dry-run -o yaml
を付けてyamlを表示することも可能。
[centos@ip-172-31-19-74 ~]$ oc create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --dry-run -o yaml
W0204 23:04:59.900200 4025 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: kubernetes-bootcamp
name: kubernetes-bootcamp
spec:
replicas: 1
selector:
matchLabels:
app: kubernetes-bootcamp
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: kubernetes-bootcamp
spec:
containers:
- image: gcr.io/google-samples/kubernetes-bootcamp:v1
name: kubernetes-bootcamp
resources: {}
status: {}
アプリへの通信
OpenShift内で実行されるPodは、Kubernetesと同様に分離されたプライベートネットワークで実行されている。デフォルトでは同じクラスタ内の他のPodとServiceからは表示されるが、そのネットワーク外には表示されない。外部ネットワークとPodを通信させるためにはproxyまたはexposeを使用する。
oc proxy
を実行するとクラスタのプライベートネットワークに通信を転送するプロキシを作成できる。プロキシはCtr-Cを押すことで終了できる。
[centos@ip-172-31-19-74 ~]$ oc proxy
Starting to serve on 127.0.0.1:8001
別のターミナルを起動して、プロキシ経由でAPIエンドポイントへアクセスし、バージョン情報を取得できる。
[centos@ip-172-31-19-74 ~]$ curl localhost:8001/version
{
"major": "1",
"minor": "22",
"gitVersion": "v1.22.3+e790d7f",
"gitCommit": "3a0f2c90b43e6cffd07f57b5b78dd9f083e47ee2",
"gitTreeState": "clean",
"buildDate": "2021-12-14T02:10:38Z",
"goVersion": "go1.16.6",
"compiler": "gc",
"platform": "linux/amd64"
Module3 - Explore your app
アプリの設定を確認する
先ほどのシナリオでデプロイされたPodが1つ起動している。
[centos@ip-172-31-19-74 ~]$ oc get po
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-57978f5f5d-ft6vs 1/1 Running 0 93s
コンテナの詳細情報を表示するにはoc describe pods
を使用する。
[centos@ip-172-31-19-74 ~]$ oc describe pods
Name: kubernetes-bootcamp-57978f5f5d-ft6vs
Namespace: default
Priority: 0
Node: crc-xxcfw-master-0/192.168.126.11
Start Time: Fri, 04 Feb 2022 23:04:36 +0000
Labels: app=kubernetes-bootcamp
pod-template-hash=57978f5f5d
Annotations: k8s.v1.cni.cncf.io/network-status:
[{
"name": "openshift-sdn",
"interface": "eth0",
"ips": [
"10.217.0.57"
],
"default": true,
"dns": {}
}]
k8s.v1.cni.cncf.io/networks-status:
[{
"name": "openshift-sdn",
"interface": "eth0",
"ips": [
"10.217.0.57"
],
"default": true,
"dns": {}
}]
Status: Running
IP: 10.217.0.57
IPs:
IP: 10.217.0.57
Controlled By: ReplicaSet/kubernetes-bootcamp-57978f5f5d
Containers:
kubernetes-bootcamp:
Container ID: cri-o://606d252709fb35c3a9df5592fe36fc3169377d8f7be5b8fecc81448e8d77ac5b
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Image ID: gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
Port: <none>
Host Port: <none>
State: Running
Started: Fri, 04 Feb 2022 23:04:47 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-69mkv (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-69mkv:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
ConfigMapName: openshift-service-ca.crt
ConfigMapOptional: <nil>
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 104s default-scheduler Successfully assigned default/kubernetes-bootcamp-57978f5f5d-ft6vs to crc-xxcfw-master-0
Normal AddedInterface 103s multus Add eth0 [10.217.0.57/23] from openshift-sdn
Normal Pulling 103s kubelet Pulling image "gcr.io/google-samples/kubernetes-bootcamp:v1"
Normal Pulled 93s kubelet Successfully pulled image "gcr.io/google-samples/kubernetes-bootcamp:v1" in 9.338791024s
Normal Created 93s kubelet Created container kubernetes-bootcamp
Normal Started 93s kubelet Started container kubernetes-bootcamp
コンテナのログを確認する
アプリケーションがSTDOUTに送信するものが、Pod内のコンテナのログになる。kubectlと同様にoc logs
コマンドによってログを取得できる。
[centos@ip-172-31-19-74 ~]$ oc logs kubernetes-bootcamp-57978f5f5d-ft6vs
Kubernetes Bootcamp App Started At: 2022-02-04T23:04:47.402Z | Running On: kubernetes-bootcamp-57978f5f5d-ft6vs
コンテナ上でコマンドを実行する
kubectlと同様にoc exec
コマンドにより起動しているコンテナに対して直接コマンドを実行できる。
[centos@ip-172-31-19-74 ~]$ oc exec [centos@ip-172-31-19-74 ~]$ oc logs kubernetes-bootcamp-57978f5f5d-ft6vs
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Error from server (NotFound): pods "[centos@ip-172-31-19-74" not found
[centos@ip-172-31-19-74 ~]$ oc exec kubernetes-bootcamp-57978f5f5d-ft6vs env
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
TERM=xterm
HOSTNAME=kubernetes-bootcamp-57978f5f5d-ft6vs
NSS_SDB_USE_CACHE=no
KUBERNETES_SERVICE_HOST=10.217.4.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.217.4.1:443
KUBERNETES_PORT_443_TCP=tcp://10.217.4.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.217.4.1
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
HOME=/root
このPodにはコンテナが1つしかないためコンテナ自体の名前は省略できる。
次に、PodのコンテナでBashセッションを開始する。
[centos@ip-172-31-19-74 ~]$ oc exec -it kubernetes-bootcamp-57978f5f5d-ft6vs -- bash
root@kubernetes-bootcamp-57978f5f5d-ft6vs:/# ls
bin boot core dev etc home lib lib64 media mnt opt proc root run sbin server.js srv sys tmp usr var
root@kubernetes-bootcamp-57978f5f5d-ft6vs:/# cat server.js
var http = require('http');
var requests=0;
var podname= process.env.HOSTNAME;
var startTime;
var host;
var handleRequest = function(request, response) {
response.setHeader('Content-Type', 'text/plain');
response.writeHead(200);
response.write("Hello Kubernetes bootcamp! | Running on: ");
response.write(host);
response.end(" | v=1\n");
console.log("Running On:" ,host, "| Total Requests:", ++requests,"| App Uptime:", (new Date() - startTime)/1000 , "seconds", "| Log Time:",new Date());
}
var www = http.createServer(handleRequest);
www.listen(8080,function () {
startTime = new Date();;
host = process.env.HOSTNAME;
console.log ("Kubernetes Bootcamp App Started At:",startTime, "| Running On: " ,host, "\n" );
});
アプリケーションが起動していることが以下のコマンドからも確認できる。
root@kubernetes-bootcamp-57978f5f5d-ft6vs:/# curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-57978f5f5d-ft6vs | v=1
exitでコネクションが終了する。
Module4 - Expose your app publicly
新しいサービスを作成
クラスタの現在のServiceを確認する。
[centos@ip-172-31-19-74 ~]$ oc get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.217.4.1 <none> 443/TCP 30d
openshift ExternalName <none> kubernetes.default.svc.cluster.local <none> 30d
kubectlと同様にoc expose
コマンドで、typeとポート番号を指定してNodePortを作成できる。
[centos@ip-172-31-19-74 ~]$ oc expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
[centos@ip-172-31-19-74 ~]$ oc get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.217.4.1 <none> 443/TCP 30d
kubernetes-bootcamp NodePort 10.217.4.219 <none> 8080:31263/TCP 6s
openshift ExternalName <none> kubernetes.default.svc.cluster.local <none> 30d
これで、ノードのIPアドレスと外部公開したポート番号に対してcurlすることでアプリがクラスタの外部に公開されていることをテストできる。
[centos@ip-172-31-19-74 ~]$ curl 192.168.130.11:31263
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-57978f5f5d-ft6vs | v=1
これでアクセスできた。192.168.130.11はcrc ip
で確認したCRC VMのIPアドレス。
ラベルを使う
Deploymentを作成すると、自動的にPodのlabelが作成される。このlabelを使用してPodのリストをフィルタすることができる。
[centos@ip-172-31-19-74 ~]$ oc get pods -l app=kubernetes-bootcamp
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-57978f5f5d-ft6vs 1/1 Running 0 7m22s
kubectlと同様にoc label
コマンドを使って新しいラベルを設定できる。
[centos@ip-172-31-19-74 ~]$ oc label po kubernetes-bootcamp-57978f5f5d-ft6vs version=v1
pod/kubernetes-bootcamp-57978f5f5d-ft6vs labeled
[centos@ip-172-31-19-74 ~]$ oc describe pod/kubernetes-bootcamp-57978f5f5d-ft6vs
Name: kubernetes-bootcamp-57978f5f5d-ft6vs
Namespace: default
Priority: 0
Node: crc-xxcfw-master-0/192.168.126.11
Start Time: Fri, 04 Feb 2022 23:04:36 +0000
Labels: app=kubernetes-bootcamp
pod-template-hash=57978f5f5d
version=v1
Annotations: k8s.v1.cni.cncf.io/network-status:
[{
"name": "openshift-sdn",
"interface": "eth0",
"ips": [
"10.217.0.57"
],
"default": true,
"dns": {}
}]
k8s.v1.cni.cncf.io/networks-status:
[{
"name": "openshift-sdn",
"interface": "eth0",
"ips": [
"10.217.0.57"
],
"default": true,
"dns": {}
}]
Status: Running
IP: 10.217.0.57
IPs:
IP: 10.217.0.57
Controlled By: ReplicaSet/kubernetes-bootcamp-57978f5f5d
Containers:
kubernetes-bootcamp:
Container ID: cri-o://606d252709fb35c3a9df5592fe36fc3169377d8f7be5b8fecc81448e8d77ac5b
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Image ID: gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
Port: <none>
Host Port: <none>
State: Running
Started: Fri, 04 Feb 2022 23:04:47 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-69mkv (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-69mkv:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
ConfigMapName: openshift-service-ca.crt
ConfigMapOptional: <nil>
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 8m35s default-scheduler Successfully assigned default/kubernetes-bootcamp-57978f5f5d-ft6vs to crc-xxcfw-master-0
Normal AddedInterface 8m34s multus Add eth0 [10.217.0.57/23] from openshift-sdn
Normal Pulling 8m34s kubelet Pulling image "gcr.io/google-samples/kubernetes-bootcamp:v1"
Normal Pulled 8m24s kubelet Successfully pulled image "gcr.io/google-samples/kubernetes-bootcamp:v1" in 9.338791024s
Normal Created 8m24s kubelet Created container kubernetes-bootcamp
Normal Started 8m24s kubelet Started container kubernetes-bootcamp
新しいlabelを指定してPodをフィルタしてみる。
[centos@ip-172-31-19-74 ~]$ oc get pods -l version=v1
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-57978f5f5d-ft6vs 1/1 Running 0 9m4s
Serviceの削除
kubectlと同様にoc delete service
コマンドでserviceを削除できる。同様にラベルを使える。
[centos@ip-172-31-19-74 ~]$ oc delete service -l app=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
serviceが削除されたのでクラスタ外部からのアクセスは出来なくなるが、クラスタ内部からのアクセスは可能である。
[centos@ip-172-31-19-74 ~]$ oc exec -it kubernetes-bootcamp-57978f5f5d-ft6vs -- curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-57978f5f5d-ft6vs | v=1
Module5 - Scale up your app
oc scale
を使用してデプロイをスケーリングし、動作中の負荷分散を確認する。
deploymentをスケーリングする
deploymentの状態を確認する。
[centos@ip-172-31-19-74 ~]$ oc get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1/1 1 1 9m49s
deploymentによってReplicaSetが作成されていることを確認する。
[centos@ip-172-31-19-74 ~]$ oc get rs
NAME DESIRED CURRENT READY AGE
kubernetes-bootcamp-57978f5f5d 1 1 1 9m56s
次に、kubectlと同様にoc scale
コマンドによってdeploymentのレプリカ数を4にスケーリングする。
deploymentのレプリカ数が4つになり、podも異なるIPアドレスで4つのPodが起動している。
[centos@ip-172-31-19-74 ~]$ oc scale deployments/kubernetes-bootcamp --replicas=4
deployment.apps/kubernetes-bootcamp scaled
[centos@ip-172-31-19-74 ~]$ oc get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4/4 4 4 10m
[centos@ip-172-31-19-74 ~]$ oc get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubernetes-bootcamp-57978f5f5d-frgwr 1/1 Running 0 19s 10.217.0.62 crc-xxcfw-master-0 <none> <none>
kubernetes-bootcamp-57978f5f5d-ft6vs 1/1 Running 0 10m 10.217.0.57 crc-xxcfw-master-0 <none> <none>
kubernetes-bootcamp-57978f5f5d-k6vjt 1/1 Running 0 19s 10.217.0.63 crc-xxcfw-master-0 <none> <none>
kubernetes-bootcamp-57978f5f5d-qpmsh 1/1 Running 0 19s 10.217.0.64 crc-xxcfw-master-0 <none> <none>
oc describe
のEventsを見ると、レプリカ数が4つにスケーリングしたログが出力されている。
[centos@ip-172-31-19-74 ~]$ oc describe deployments/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
CreationTimestamp: Fri, 04 Feb 2022 23:04:36 +0000
Labels: app=kubernetes-bootcamp
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=kubernetes-bootcamp
Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=kubernetes-bootcamp
Containers:
kubernetes-bootcamp:
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: kubernetes-bootcamp-57978f5f5d (4/4 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set kubernetes-bootcamp-57978f5f5d to 1
Normal ScalingReplicaSet 30s deployment-controller Scaled up replica set kubernetes-bootcamp-57978f5f5d to 4
ロードバランシング
Serviceがトラフィックを負荷分散していることを確認する。まずはServiceを作成する。
[centos@ip-172-31-19-74 ~]$ oc expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
[centos@ip-172-31-19-74 ~]$ oc describe service/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: app=kubernetes-bootcamp
Annotations: <none>
Selector: app=kubernetes-bootcamp
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.217.5.18
IPs: 10.217.5.18
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 32411/TCP
Endpoints: 10.217.0.57:8080,10.217.0.62:8080,10.217.0.63:8080 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
クラスタ外部からアクセスすると、トラフィックは4つのPodにバランシングされて、アクセスするたびにpod名が変わっていることが見てわかる。
[centos@ip-172-31-19-74 ~]$ curl 192.168.130.11:32411
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-57978f5f5d-frgwr | v=1
[centos@ip-172-31-19-74 ~]$ curl 192.168.130.11:32411
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-57978f5f5d-frgwr | v=1
[centos@ip-172-31-19-74 ~]$ curl 192.168.130.11:32411
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-57978f5f5d-k6vjt | v=1
[centos@ip-172-31-19-74 ~]$ curl 192.168.130.11:32411
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-57978f5f5d-qpmsh | v=1
[centos@ip-172-31-19-74 ~]$ curl 192.168.130.11:32411
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-57978f5f5d-ft6vs | v=1
[centos@ip-172-31-19-74 ~]$ curl 192.168.130.11:32411
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-57978f5f5d-qpmsh | v=1
スケールダウン
レプリカ数を2つに変更してスケールダウンさせる。
[centos@ip-172-31-19-74 ~]$ oc scale deployments/kubernetes-bootcamp --replicas=2
deployment.apps/kubernetes-bootcamp scaled
4つあったpodのうち2つがTerminateされて、最終的にpod数は2つになる。
[centos@ip-172-31-19-74 ~]$ oc get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubernetes-bootcamp-57978f5f5d-ft6vs 1/1 Running 0 12m 10.217.0.57 crc-xxcfw-master-0 <none> <none>
kubernetes-bootcamp-57978f5f5d-k6vjt 1/1 Running 0 2m33s 10.217.0.63 crc-xxcfw-master-0 <none> <none>
Module6 - Update your app
デプロイされたアプリケーションをoc set image
で更新し、rollout undoコマンドでロールバックする。
アプリをアップデート
deploymentの状態を確認する。
[centos@ip-172-31-19-74 ~]$ oc get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 2/2 2 2 12m
[centos@ip-172-31-19-74 ~]$ oc describe deploy kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
CreationTimestamp: Fri, 04 Feb 2022 23:04:36 +0000
Labels: app=kubernetes-bootcamp
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=kubernetes-bootcamp
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=kubernetes-bootcamp
Containers:
kubernetes-bootcamp:
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: kubernetes-bootcamp-57978f5f5d (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 13m deployment-controller Scaled up replica set kubernetes-bootcamp-57978f5f5d to 1
Normal ScalingReplicaSet 2m55s deployment-controller Scaled up replica set kubernetes-bootcamp-57978f5f5d to 4
Normal ScalingReplicaSet 54s deployment-controller Scaled down replica set kubernetes-bootcamp-57978f5f5d to 2
kubectlと同様に、oc set image
コマンドを使ってimageをバージョン2へ更新する。
[centos@ip-172-31-19-74 ~]$ oc set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.apps/kubernetes-bootcamp image updated
[centos@ip-172-31-19-74 ~]$ oc describe deploy kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
CreationTimestamp: Fri, 04 Feb 2022 23:04:36 +0000
Labels: app=kubernetes-bootcamp
Annotations: deployment.kubernetes.io/revision: 2
Selector: app=kubernetes-bootcamp
Replicas: 2 desired | 1 updated | 3 total | 2 available | 1 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=kubernetes-bootcamp
Containers:
kubernetes-bootcamp:
Image: jocatalin/kubernetes-bootcamp:v2
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True ReplicaSetUpdated
OldReplicaSets: kubernetes-bootcamp-57978f5f5d (2/2 replicas created)
NewReplicaSet: kubernetes-bootcamp-769746fd4 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 13m deployment-controller Scaled up replica set kubernetes-bootcamp-57978f5f5d to 1
Normal ScalingReplicaSet 3m38s deployment-controller Scaled up replica set kubernetes-bootcamp-57978f5f5d to 4
Normal ScalingReplicaSet 97s deployment-controller Scaled down replica set kubernetes-bootcamp-57978f5f5d to 2
Normal ScalingReplicaSet 9s deployment-controller Scaled up replica set kubernetes-bootcamp-769746fd4 to 1
そうするとローリングアップデートにより古いpodがTerminatingされつつ新しいpodが作成される。
[centos@ip-172-31-19-74 ~]$ oc get po
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-769746fd4-fh884 1/1 Running 0 50s
kubernetes-bootcamp-769746fd4-v7xlb 1/1 Running 0 41s
アップデートの検証
curlでアクセスしてみるとデプロイされたアプリのバージョンがv=2になっていることが確認できる。
[centos@ip-172-31-19-74 ~]$ curl 192.168.130.11:32411
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-769746fd4-fh884 | v=2
アプリのロールバック
v=10のアプリケーションをデプロイする。
[centos@ip-172-31-19-74 ~]$ oc set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v10
deployment.apps/kubernetes-bootcamp image updated
リポジトリにはv10というimageは無いのでステータスが ImagePullBackOff のままになってしまう。
[centos@ip-172-31-19-74 ~]$ oc get po
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-769746fd4-fh884 1/1 Running 0 91s
kubernetes-bootcamp-769746fd4-v7xlb 1/1 Running 0 82s
kubernetes-bootcamp-7b6fc6c7d9-9jb6x 0/1 ErrImagePull 0 9s
そこでrolloutコマンドを使ってロールバックする。
[centos@ip-172-31-19-74 ~]$ oc rollout undo deployments/kubernetes-bootcamp
deployment.apps/kubernetes-bootcamp rolled back
ロールバック後はv2が実行されているのでロールバックが成功している。
[centos@ip-172-31-19-74 ~]$ oc describe deployments/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
CreationTimestamp: Fri, 04 Feb 2022 23:04:36 +0000
Labels: app=kubernetes-bootcamp
Annotations: deployment.kubernetes.io/revision: 4
Selector: app=kubernetes-bootcamp
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=kubernetes-bootcamp
Containers:
kubernetes-bootcamp:
Image: jocatalin/kubernetes-bootcamp:v2
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: kubernetes-bootcamp-769746fd4 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 15m deployment-controller Scaled up replica set kubernetes-bootcamp-57978f5f5d to 1
Normal ScalingReplicaSet 5m19s deployment-controller Scaled up replica set kubernetes-bootcamp-57978f5f5d to 4
Normal ScalingReplicaSet 3m18s deployment-controller Scaled down replica set kubernetes-bootcamp-57978f5f5d to 2
Normal ScalingReplicaSet 110s deployment-controller Scaled up replica set kubernetes-bootcamp-769746fd4 to 1
Normal ScalingReplicaSet 101s deployment-controller Scaled down replica set kubernetes-bootcamp-57978f5f5d to 1
Normal ScalingReplicaSet 101s deployment-controller Scaled up replica set kubernetes-bootcamp-769746fd4 to 2
Normal ScalingReplicaSet 98s deployment-controller Scaled down replica set kubernetes-bootcamp-57978f5f5d to 0
Normal ScalingReplicaSet 28s deployment-controller Scaled up replica set kubernetes-bootcamp-7b6fc6c7d9 to 1
Normal ScalingReplicaSet 8s deployment-controller Scaled down replica set kubernetes-bootcamp-7b6fc6c7d9 to 0
リビジョンを指定してロールバックすることも可能。
[centos@ip-172-31-19-74 ~]$ oc rollout undo deployments/kubernetes-bootcamp --to-revision=1
deployment.apps/kubernetes-bootcamp rolled back
–to-revision=1を指定したのでこのロールバック後はv1が実行されている。
[centos@ip-172-31-19-74 ~]$ oc describe deployments/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
CreationTimestamp: Fri, 04 Feb 2022 23:04:36 +0000
Labels: app=kubernetes-bootcamp
Annotations: deployment.kubernetes.io/revision: 5
Selector: app=kubernetes-bootcamp
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=kubernetes-bootcamp
Containers:
kubernetes-bootcamp:
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: kubernetes-bootcamp-57978f5f5d (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 6m17s deployment-controller Scaled up replica set kubernetes-bootcamp-57978f5f5d to 4
Normal ScalingReplicaSet 4m16s deployment-controller Scaled down replica set kubernetes-bootcamp-57978f5f5d to 2
Normal ScalingReplicaSet 2m48s deployment-controller Scaled up replica set kubernetes-bootcamp-769746fd4 to 1
Normal ScalingReplicaSet 2m39s deployment-controller Scaled down replica set kubernetes-bootcamp-57978f5f5d to 1
Normal ScalingReplicaSet 2m39s deployment-controller Scaled up replica set kubernetes-bootcamp-769746fd4 to 2
Normal ScalingReplicaSet 2m36s deployment-controller Scaled down replica set kubernetes-bootcamp-57978f5f5d to 0
Normal ScalingReplicaSet 86s deployment-controller Scaled up replica set kubernetes-bootcamp-7b6fc6c7d9 to 1
Normal ScalingReplicaSet 66s deployment-controller Scaled down replica set kubernetes-bootcamp-7b6fc6c7d9 to 0
Normal ScalingReplicaSet 12s (x2 over 16m) deployment-controller Scaled up replica set kubernetes-bootcamp-57978f5f5d to 1
Normal ScalingReplicaSet 5s (x3 over 8s) deployment-controller (combined from similar events): Scaled down replica set kubernetes-bootcamp-769746fd4 to 0
以上で公式チュートリアルは完了。 やってみる前から薄々気づいてはいたけど、このチュートリアルではOpenShiftならでは機能は一切使わないためkubectlコマンドがocコマンドに変わっているだけで、内容的には単なるkubernetesの復習になりました。