はじめに

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の復習になりました。