2018年1月9日火曜日

Oracle Linux 7 の Kubernetes で kubectl Basics。

Oracle Linux での Kubernetes のドキュメントに、kubectl についての説明があります。
そこでは YAML ファイルの利用について、MySQL のデプロイをもとに紹介されています。
しかし、YAML なしのコマンドラインでの「hello-world」についても
シンプルな例によさそうなので、「-f」で YAML ファイルを利用する方式で
ドキュメントに近いデプロイをしてみました。

もとにしたものは下記です。
Oracle Container Services for use with Kubernetes User's Guide
https://docs.oracle.com/cd/E52668_01/E88884/html/kubectl-basics.html

今回の環境。

Oracle Linux 7.4 です。kubeadm は、現時点での最新より1つ古いバージョンです。
[gowatana@k8s-master ~]$ cat /etc/oracle-release
Oracle Linux Server release 7.4
[gowatana@k8s-master ~]$ rpm -q kubeadm
kubeadm-1.7.4-2.0.1.el7.x86_64

Kubernetes クラスタの Master が 1ノード、Worker が 2ノードです。
[gowatana@k8s-master ~]$ kubectl get nodes
NAME            STATUS    AGE       VERSION
k8s-master      Ready     1d        v1.7.4+0c1a5fc
k8s-worker-01   Ready     1d        v1.7.4+0c1a5fc
k8s-worker-02   Ready     1d        v1.7.4+0c1a5fc

下記のように、クラスタをセットアップしてあります。

Pod / Deployment の作成。

kubectl run コマンドでは、Pod だけでなく Deployment も作成されます。

YAML hello-deployment.yml


Deployment を作成します。
[gowatana@k8s-master ~]$ kubectl create -f hello-deployment.yml
deployment "hello-deployment" created
[gowatana@k8s-master ~]$ kubectl get deployment
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-deployment   1         1         1            1           13s
[gowatana@k8s-master ~]$ kubectl get pods
NAME                                READY     STATUS    RESTARTS   AGE
hello-deployment-3824370859-r7j60   1/1       Running   0          55s

スケールアップ。

Pod を 1つから3つに増やしてみます。
[gowatana@k8s-master ~]$ kubectl scale -f hello-deployment.yml --replicas=3
deployment "hello-deployment" scaled
[gowatana@k8s-master ~]$ kubectl get deployment
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-deployment   3         3         3            3           3m
[gowatana@k8s-master ~]$ kubectl get pods
NAME                                READY     STATUS    RESTARTS   AGE
hello-deployment-3824370859-56df1   1/1       Running   0          26s
hello-deployment-3824370859-mksbb   1/1       Running   0          26s
hello-deployment-3824370859-r7j60   1/1       Running   0          3m

Service の作成。

Kubernetes クラスタの外部からアクセスできるように、Service を作成します。

YAML hello-service.yml


Service を作成します。
Pod は新たに3つ作成しなおしたので、以前の実行例とは名前が変わっています。
[gowatana@k8s-master ~]$ kubectl get pods
NAME                                READY     STATUS    RESTARTS   AGE
hello-deployment-3824370859-7xx2d   1/1       Running   0          14s
hello-deployment-3824370859-gvndx   1/1       Running   0          14s
hello-deployment-3824370859-r7j60   1/1       Running   0          10m
[gowatana@k8s-master ~]$ kubectl create -f hello-service.yml
service "hello-service" created
[gowatana@k8s-master ~]$ kubectl get service
NAME            CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
hello-service   10.109.229.118   <nodes>       80:31939/TCP   16s
kubernetes      10.96.0.1        <none>        443/TCP        1d

起動されたコンテナにアクセスしてみます。

このデモ用のコンテナでは、コンテナに付与されたホスト名を表示できるので、
ホスト名に含まれる文字列「hello-deployment」をもとに
コンテナへのアクセスを確認してみます。

まずは、Kubernetes クラスタの CLUSTER-IP へのアクセスです。
クラスタ内部からのアクセスなので、Deployment 作成時に指定した 80 番ポートを
指定してアクセスしてみます。
何度かアクセスを繰り返すと、自動的に3つのコンテナに振り分けられている様子が分かります。
[gowatana@k8s-master ~]$ curl -s http://10.109.229.118:80 | grep hello-deployment
<p><span>Server&nbsp;name:</span> <span>hello-deployment-3824370859-gvndx</span></p>
[gowatana@k8s-master ~]$ curl -s http://10.109.229.118:80 | grep hello-deployment
<p><span>Server&nbsp;name:</span> <span>hello-deployment-3824370859-r7j60</span></p>
[gowatana@k8s-master ~]$ curl -s http://10.109.229.118:80 | grep hello-deployment
<p><span>Server&nbsp;name:</span> <span>hello-deployment-3824370859-r7j60</span></p>
[gowatana@k8s-master ~]$ curl -s http://10.109.229.118:80 | grep hello-deployment
<p><span>Server&nbsp;name:</span> <span>hello-deployment-3824370859-r7j60</span></p>
[gowatana@k8s-master ~]$ curl -s http://10.109.229.118:80 | grep hello-deployment
<p><span>Server&nbsp;name:</span> <span>hello-deployment-3824370859-7xx2d</span></p>

クラスタ外部からのアクセスで指定する EXTERNAL-IP は「nodes」となっているので、
Worker ノードの IP アドレスの 1つに自動付与された NodePort 31939 を指定して
アクセスしてみます。
[gowatana@k8s-master ~]$ curl -s http://10.0.2.6:31939 | grep hello-deployment
<p><span>Server&nbsp;name:</span> <span>hello-deployment-3824370859-r7j60</span></p>
[gowatana@k8s-master ~]$ curl -s http://10.0.2.6:31939 | grep hello-deployment
<p><span>Server&nbsp;name:</span> <span>hello-deployment-3824370859-7xx2d</span></p>
[gowatana@k8s-master ~]$ curl -s http://10.0.2.6:31939 | grep hello-deployment
<p><span>Server&nbsp;name:</span> <span>hello-deployment-3824370859-r7j60</span></p>
[gowatana@k8s-master ~]$ curl -s http://10.0.2.6:31939 | grep hello-deployment
<p><span>Server&nbsp;name:</span> <span>hello-deployment-3824370859-gvndx</span></p>

削除。

Service、Deployment などの削除でも、YAML を指定することができます。
YAML は、ここまで例示したものをそのまま指定します。

Service を削除します。
[gowatana@k8s-master ~]$ kubectl delete -f hello-service.yml
service "hello-service" deleted
[gowatana@k8s-master ~]$ kubectl get service
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.96.0.1    <none>        443/TCP   1d

Deployment を削除します。
[gowatana@k8s-master ~]$ kubectl delete -f hello-deployment.yml
deployment "hello-deployment" deleted
[gowatana@k8s-master ~]$ kubectl get deployment
No resources found.
[gowatana@k8s-master ~]$ kubectl get pods
No resources found.


ここまでのまとめ。

ここまでのものを、まとめて記載することもできます。

YAML hello-world.yml


作成。
[gowatana@k8s-master ~]$ kubectl create -f hello-world.yml
deployment "hello-deployment" created
service "hello-service" created
[gowatana@k8s-master ~]$ kubectl get deployment
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-deployment   1         1         1            1           49s
[gowatana@k8s-master ~]$ kubectl get pods
NAME                                READY     STATUS    RESTARTS   AGE
hello-deployment-3824370859-47sc1   1/1       Running   0          57s
[gowatana@k8s-master ~]$ kubectl get service
NAME            CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
hello-service   10.96.236.185   <nodes>       80:31972/TCP   1m
kubernetes      10.96.0.1       <none>        443/TCP        1d

削除。
[gowatana@k8s-master ~]$ kubectl delete -f hello-world.yml
deployment "hello-deployment" deleted
service "hello-service" deleted
[gowatana@k8s-master ~]$ kubectl get deployment
No resources found.
[gowatana@k8s-master ~]$ kubectl get pods
No resources found.
[gowatana@k8s-master ~]$ kubectl get service
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.96.0.1    <none>        443/TCP   1d

以上、kubectl を YAML で使用してみる話でした。

0 件のコメント:

コメントを投稿