OSS Fan ~OSSでLinuxサーバ構築~

作成日: 2018/05/28
更新日: 2018/06/021

OSSでLinuxサーバ構築

Kubernetes 1.10.2でReplicaSetの作成と削除

トップページOSSでLinuxサーバ構築 > Kubernetes 1.10.2でReplicaSetの作成と削除
このエントリーをはてなブックマークに追加

概要

 『Kubernetes 1.10.2をAWS EC2(CentOS 7.5)へインストールしてkubeadmでマスタサーバとして構成』と 『Kubernetes 1.10.2をAWS EC2(CentOS 7.5)へインストールしてkubeadmでk8sのノードとして構成』で 構築したKubernetesのクラスタ環境でReplicaSetを作成し、ノードでDockerコンテナが稼働することを確認します。 また、Podが停止した時に自動で再起動されることも確認します。 kubernetes.ioで公開されているReplicaSetのサンプルの定義ファイルをそのまま使って試します。

構成

利用環境

 サーバ環境はAWS(Amazon Web Services)のEC2インスタンスを利用しました。 サーバのスペックは以下のとおりです。

■サーバスペック
項目内容
AMICentOS 7 (x86_64) - with Updates HVM
インスタンスタイプt2.micro
vCPU1
メモリ1GiB
ディスク汎用SSD(GP2) 8GiB
リージョン日本

サーバ構成

OSバージョン

CentOS 7.5.1804 x86_64

ソフトウェア・パッケージ一覧

  • docker-1.13.1-58.git87f2fab.el7.centos.x86_64.rpm
  • 32e8bd812a3944ccf07750d52088a118fa11493d34e009e2873317e0f0b0dfd2-kubectl-1.10.2-0.x86_64.rpm
  • b754a6990af7d7012189610b0dc69e6e950c13a8c415b9ebea8d56352e9719fd-kubeadm-1.10.2-0.x86_64.rpm
  • bdee083331998c4631bf6653454c584fb796944fe97271906acbaacbf340e1d5-kubelet-1.10.2-0.x86_64.rpm

サーバ構築

マスタサーバでReplicaSetの作成

(1) ReplicaSetの定義ファイル作成

 kubernetes.ioで公開されているサンプルの定義ファイルをそのまま作成します。

$ sudo su -
Last login: Tue May 22 14:05:38 UTC 2018 on pts/0
# cd /data/k8s/
# vi frontend.yaml
ファイル名:/data/k8s/frontend.yaml
※ファイルを新規作成※
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
    matchExpressions:
      - {key: tier, operator: In, values: [frontend]}
  template:
    metadata:
      labels:
        app: guestbook
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 80

(2) 定義ファイルからReplicaSetを作成

 上記の定義ファイルを元にReplicaSetを作成します。

# kubectl create -f frontend.yaml
replicaset.apps "frontend" created

(3) Podの確認

 ReplicaSetの定義ファイルで定義したレプリカ数だけPodが作成されます。 今回は3を設定しているので、ReplicaSet 1つに対してPodが3つ作成されます。 Podの状態を表示すると、kube create を実行した直後は、Podの状態が ContainerCreating となっていますが、 しばらく待って再度確認すると Running に変わっています。

# kubectl get pods
NAME             READY     STATUS              RESTARTS   AGE
frontend-4w896   0/1       ContainerCreating   0          7s
frontend-dvkfv   0/1       ContainerCreating   0          7s
frontend-q7dc5   0/1       ContainerCreating   0          7s
(ちょっと待つ)
# kubectl get pods
NAME             READY     STATUS    RESTARTS   AGE
frontend-4w896   1/1       Running   0          54s
frontend-dvkfv   1/1       Running   0          54s
frontend-q7dc5   1/1       Running   0          54s

(4) ReplicaSetの確認

 ReplicaSetの情報を表示すると、frontendという名のReplicaSetが作成されていることが分かります。 また、Podの必要数3つに対して、現在3つのPodが作成され、3つとも利用可能な状態になっています。

# kubectl get rs
NAME       DESIRED   CURRENT   READY     AGE
frontend   3         3         3         59s

 これで定義ファイルを元に frontend という名のReplicaSetが作成され、Podが起動したことが確認できました。

ノードでDockerコンテナの起動確認

(1) Dockerコンテナの確認

 続いて、ノード(Kubernetesで管理するサーバ、Dockerの実行環境)にログインして、 3つのPodからそれぞれ起動された3つのDockerコンテナが存在していることを確認します。 ReplicaSetの定義ファイルで定義した通り、gb-frontendという名のDockerイメージを元にコンテナを起動しています。 以下の実行結果では、表示されたうち上からの3つのコンテナが今回起動したものになります。

# docker ps
CONTAINER ID        IMAGE                                                                                                       COMMAND                  CREATED              STATUS              PORTS               NAMES
27dabea2f5e8        gcr.io/google_samples/gb-frontend@sha256:50b22839aaf6a18586d6751e8963cf684c27b9873ca926df22cdf88ed4452615   "apache2-foreground"     About a minute ago   Up About a minute                       k8s_php-redis_frontend-4w896_default_ae5a6fd3-5dd3-11e8-a073-0643f5f5d140_0 ←起動したDockerコンテナ
51b89e5acfe9        gcr.io/google_samples/gb-frontend@sha256:50b22839aaf6a18586d6751e8963cf684c27b9873ca926df22cdf88ed4452615   "apache2-foreground"     About a minute ago   Up About a minute                       k8s_php-redis_frontend-q7dc5_default_ae57fcd6-5dd3-11e8-a073-0643f5f5d140_0 ←起動したDockerコンテナ
3a3d7beafe98        gcr.io/google_samples/gb-frontend@sha256:50b22839aaf6a18586d6751e8963cf684c27b9873ca926df22cdf88ed4452615   "apache2-foreground"     About a minute ago   Up About a minute                       k8s_php-redis_frontend-dvkfv_default_ae58aea2-5dd3-11e8-a073-0643f5f5d140_0 ←起動したDockerコンテナ
2d0413fb4f58        k8s.gcr.io/pause-amd64:3.1                                                                                  "/pause"                 About a minute ago   Up About a minute                       k8s_POD_frontend-4w896_default_ae5a6fd3-5dd3-11e8-a073-0643f5f5d140_0
95f53d0e51f4        k8s.gcr.io/pause-amd64:3.1                                                                                  "/pause"                 About a minute ago   Up About a minute                       k8s_POD_frontend-q7dc5_default_ae57fcd6-5dd3-11e8-a073-0643f5f5d140_0
ad3f78af4e85        k8s.gcr.io/pause-amd64:3.1                                                                                  "/pause"                 About a minute ago   Up About a minute                       k8s_POD_frontend-dvkfv_default_ae58aea2-5dd3-11e8-a073-0643f5f5d140_0
7939fe8b6e01        f0fad859c909                                                                                                "/opt/bin/flanneld..."   3 days ago           Up 3 days                               k8s_kube-flannel_kube-flannel-ds-m9dkj_kube-system_0950d872-5abb-11e8-92f3-0643f5f5d140_0
739feabcaf8c        k8s.gcr.io/kube-proxy-amd64@sha256:c7036a8796fd20c16cb3b1cef803a8e980598bff499084c29f3c759bdb429cd2         "/usr/local/bin/ku..."   3 days ago           Up 3 days                               k8s_kube-proxy_kube-proxy-z2wft_kube-system_094ff39e-5abb-11e8-92f3-0643f5f5d140_0
403243e62b71        k8s.gcr.io/pause-amd64:3.1                                                                                  "/pause"                 3 days ago           Up 3 days                               k8s_POD_kube-proxy-z2wft_kube-system_094ff39e-5abb-11e8-92f3-0643f5f5d140_0
f3a5ecdf9ba9        k8s.gcr.io/pause-amd64:3.1                                                                                  "/pause"                 3 days ago           Up 3 days                               k8s_POD_kube-flannel-ds-m9dkj_kube-system_0950d872-5abb-11e8-92f3-0643f5f5d140_0

(2) Dockerイメージの確認

 一応このサーバにダウンロードされているDockerイメージの一覧を表示すると、 gb-frontendという名前でv3タグのイメージが存在していることが分かります。

# docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy-amd64             v1.10.2             77019aa0531a        3 weeks ago         97.1 MB
docker.io/busybox                       latest              8ac48589692a        6 weeks ago         1.15 MB
k8s.gcr.io/kubernetes-dashboard-amd64   v1.8.3              0c60bcf89900        3 months ago        102 MB
quay.io/coreos/flannel                  v0.10.0-amd64       f0fad859c909        3 months ago        44.6 MB
k8s.gcr.io/pause-amd64                  3.1                 da86e6ba6ca1        5 months ago        742 kB
gcr.io/google_samples/gb-frontend       v3                  c038466384ab        2 years ago         510 MB ←今回コンテナの元になったイメージ

マスタサーバでPodを削除して、自動復旧の確認

(1) 事前のReplicaSetとPodの状態確認

 1つのReplicaSetに対して3つのPodが起動しています。

# kubectl get rs
NAME       DESIRED   CURRENT   READY     AGE
frontend   3         3         3         49s
# kubectl get pods
NAME             READY     STATUS    RESTARTS   AGE
frontend-4w896   1/1       Running   0          54s
frontend-dvkfv   1/1       Running   0          54s
frontend-q7dc5   1/1       Running   0          54s

(2) Podの停止

 ReplicaSetで管理されているPodの起動・停止はReplicaSetの管理の一環として実施されます。 そのため、Podをコマンドで直接停止すると、ReplicaSetで定義された数のPodが起動していないと検知され、 自動でPodが再起動されます。 試しに、3つ起動しているPodのうちの1つを停止してみます。

# kubectl delete pod frontend-4w896
pod "frontend-4w896" deleted

(3) Pod停止後の動作確認

 Podを停止後に、ReplicaSetの状態確認を行うと、READYなPodが3→2に変わっていることが分かります。 少し待つとREADYなPodが3つに戻っており、新たなPodが起動していることが分かります。 新たに起動したPodは kubectl get pods の表示結果であるAGE(起動からの経過時間)を見れば判別できます。

# kubectl get rs
NAME       DESIRED   CURRENT   READY     AGE
frontend   3         3         2         6m ←READYなPodが2個に減った
(ちょっと待つ)
# kubectl get rs
NAME       DESIRED   CURRENT   READY     AGE
frontend   3         3         3         6m ←READYなPodが3個に戻った
# kubectl get pods
NAME             READY     STATUS    RESTARTS   AGE
frontend-dvkfv   1/1       Running   0          6m
frontend-q7dc5   1/1       Running   0          6m
frontend-zbdq2   1/1       Running   0          16s ←新しく起動した

マスタサーバでReplicaSetの削除

(1) ReplicaSetの削除

 今回作成した fronted という名のReplicaSetを削除してみます。

# kubectl delete rs frontend
replicaset.extensions "frontend" deleted

(2) ReplicaSetとPodの確認

 ReplicaSetとPodの状態を確認します。 いずれもリソースが存在しないと表示され、ReplicaSetもPodも削除されたことが分かります。

# kubectl get rs
No resources found. ←ReplicaSetが削除されたため、表示されなくなった
# kubectl get pods
No resources found. ←ReplicaSetの削除に合わせてPodも削除された

ノードでコンテナの削除確認

(1) Dockerコンテナの確認

 続いて、ノードで php-redis のDockerコンテナが停止して表示されなくなっていることを確認します。

# docker ps
CONTAINER ID        IMAGE                                                                                                 COMMAND                  CREATED             STATUS              PORTS               NAMES
7939fe8b6e01        f0fad859c909                                                                                          "/opt/bin/flanneld..."   3 days ago          Up 3 days                               k8s_kube-flannel_kube-flannel-ds-m9dkj_kube-system_0950d872-5abb-11e8-92f3-0643f5f5d140_0
739feabcaf8c        k8s.gcr.io/kube-proxy-amd64@sha256:c7036a8796fd20c16cb3b1cef803a8e980598bff499084c29f3c759bdb429cd2   "/usr/local/bin/ku..."   3 days ago          Up 3 days                               k8s_kube-proxy_kube-proxy-z2wft_kube-system_094ff39e-5abb-11e8-92f3-0643f5f5d140_0
403243e62b71        k8s.gcr.io/pause-amd64:3.1                                                                            "/pause"                 3 days ago          Up 3 days                               k8s_POD_kube-proxy-z2wft_kube-system_094ff39e-5abb-11e8-92f3-0643f5f5d140_0
f3a5ecdf9ba9        k8s.gcr.io/pause-amd64:3.1                                                                            "/pause"                 3 days ago          Up 3 days                               k8s_POD_kube-flannel-ds-m9dkj_kube-system_0950d872-5abb-11e8-92f3-0643f5f5d140_0

(2) Dockerイメージの確認

 余談ですが、今回のようにReplicaSeの削除に伴い、Dockerコンテナも削除されますが、 ダウンロードしたDockerイメージは削除されずに残っています。 そのため次回以降同じDockerイメージを利用する場合は改めてのダウンロードは行われないため、 起動が少し早くなることが期待されます。

# docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy-amd64             v1.10.2             77019aa0531a        3 weeks ago         97.1 MB
docker.io/busybox                       latest              8ac48589692a        6 weeks ago         1.15 MB
k8s.gcr.io/kubernetes-dashboard-amd64   v1.8.3              0c60bcf89900        3 months ago        102 MB
quay.io/coreos/flannel                  v0.10.0-amd64       f0fad859c909        3 months ago        44.6 MB
k8s.gcr.io/pause-amd64                  3.1                 da86e6ba6ca1        5 months ago        742 kB
gcr.io/google_samples/gb-frontend       v3                  c038466384ab        2 years ago         510 MB

参考にしたサイト

 Kubernetesの公式サイト kubernetes.io に掲載されているReplicaSetの定義ファイルを参考にしました。

プロフィール

らのっち

損害保険会社のIT企画部に勤務するSEです。OSSを勉強中です。

<所属>
日本PostgreSQLユーザ会とくしまOSS普及協議会


第000414号