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インスタンスを利用しました。 サーバのスペックは以下のとおりです。
項目 | 内容 |
---|---|
AMI | CentOS 7 (x86_64) - with Updates HVM |
インスタンスタイプ | t2.micro |
vCPU | 1 |
メモリ | 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の作成
ReplicaSetの定義ファイル作成
kubernetes.ioで公開されているサンプルの定義ファイルをそのまま作成します。
$ sudo su - Last login: Tue May 22 14:05:38 UTC 2018 on pts/0 # cd /data/k8s/ # vi 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
定義ファイルからReplicaSetを作成
上記の定義ファイルを元にReplicaSetを作成します。
# kubectl create -f frontend.yaml replicaset.apps "frontend" created
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
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コンテナの起動確認
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
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を削除して、自動復旧の確認
事前の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
Podの停止
ReplicaSetで管理されているPodの起動・停止はReplicaSetの管理の一環として実施されます。 そのため、Podをコマンドで直接停止すると、ReplicaSetで定義された数のPodが起動していないと検知され、 自動でPodが再起動されます。 試しに、3つ起動しているPodのうちの1つを停止してみます。
# kubectl delete pod frontend-4w896 pod "frontend-4w896" deleted
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の削除
ReplicaSetの削除
今回作成した fronted という名のReplicaSetを削除してみます。
# kubectl delete rs frontend replicaset.extensions "frontend" deleted
ReplicaSetとPodの確認
ReplicaSetとPodの状態を確認します。 いずれもリソースが存在しないと表示され、ReplicaSetもPodも削除されたことが分かります。
# kubectl get rs No resources found. ←ReplicaSetが削除されたため、表示されなくなった # kubectl get pods No resources found. ←ReplicaSetの削除に合わせてPodも削除された
ノードでコンテナの削除確認
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
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の定義ファイルを参考にしました。