SmartCloud コラム

Kubernetesを体験してみよう

2019.11.06事例/手順

UbuntuはLinuxデスクトップでユーザーから開発者までに人気のLinuxディストリビューションです。microk8sはUbuntuを開発、サポートするCanonical社が開発した、Kubernetesを簡単に展開することができるツールです。Kuberentesは仕様に沿った関連ソフトウェアに対して認定をしており、microk8sも認定されています。Ubuntuとmicrok8sを使って、Kubernetesを体験してみましょう。

 

まず、Ubuntu 16.04以降のバージョンを通常通りインストールしてください。

 

※次例はUbuntu 16.04をインストールする場合の例です。
Ubuntu 16.04 Desktopのインストール
https://tutorials.ubuntu.com/tutorial/tutorial-install-ubuntu-desktop-1604#0
Ubuntu 16.04 Serverのインストール
https://tutorials.ubuntu.com/tutorial/tutorial-install-ubuntu-server-1604#0

 


次のコマンドを実行します。するとchannelsにいくつかのバージョンが表示されると思います。ここで指定したバージョンのKubernetesのデプロイをサポートしています。

 

$ snap info microk8s

 

コマンドを実行した際に「snapコマンドが見つからない」といったエラーが表示されたら、「sudo apt update && sudo apt install snapd -y」と実行してsnapdをインストールしてください。

 

今回は「1.15/stable」を指定してデプロイしてみます。コマンドを実行したら、「sudo microk8s.status」の実行結果が「microk8s is running.」になるまで少々待ちます。

 

$ sudo snap install microk8s --channel=1.15/stable --classic

$ sudo microk8s.status

microk8s is running

addons:

rbac: disabled

knative: disabled

ingress: disabled

dns: disabled

metrics-server: disabled

linkerd: disabled

prometheus: disabled

istio: disabled

jaeger: disabled

fluentd: disabled

gpu: disabled

cilium: disabled

storage: disabled

dashboard: disabled

registry: disabled

 

永続データを取り扱いたいので、アドオンのstorageを有効化します。

 

$ sudo microk8s.enable storage

 

次の内容のYAMLファイルを作成して名前をつけて保存します。

 

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: myclaim

  labels:

    app: myclaim

spec:

  storageClassName: microk8s-hostpath

  accessModes:

  - ReadWriteOnce

    requests:

      storage: 2Gi

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginxapp1

spec:

  replicas: 1

  selector:

    matchLabels:

      app: nginxapp1

  template:

    metadata:

      labels:

        app: nginxapp1

    spec:

      containers:

      - name: nginxapp1

        image: nginx:alpine

        ports:

        - containerPort: 80

        volumeMounts:

        - mountPath: "/usr/share/nginx/html/"

          name: nginxapp1

      volumes:

      - name: nginxapp1

        persistentVolumeClaim:

          claimName: myclaim

---

apiVersion: v1

kind: Service

metadata:

  name: nginxapp1-nodeport

  labels:

    app: nginxapp1

spec:

  type: NodePort

  ports:

  - port: 80

    targetPort: 80

    nodePort: 30080

  selector:

    app: nginxapp1

 

先ほどのファイルをtestnginx.yamlという名前で保存した場合、次のコマンドを実行するとWebサーバーをKubernetes上で実行できます。

 

$ sudo microk8s.kubectl apply -f testnginx.yaml
次のコマンドを実行すると、Podの状態を確認できます。AVAILABLEが1であることを確認します。

 

$ sudo microk8s.kubectl get -f testnginx.yaml
(以下、実行結果例)

NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE

persistentvolumeclaim/myclaim   Bound    pvc-29ced48e-a72b-44ff-9115-466ce087fba3   2Gi        RWO            microk8s-hostpath   5s

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE

deployment.apps/webapp1   1/1     1            1           5s

NAME                         TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

service/nginxapp1-nodeport   NodePort   10.152.183.122   <none>        80:30080/TCP   5s

 

次のコマンドを実行して、index.htmlを作成して、コンテナーに送り込みます。

まずは適当なHTMLコンテンツを作成します。

 

$ echo "<html><h1>Hello World</h1></html>" > index.html

 

次にPodを作成します。

 

$ sudo microk8s.kubectl apply -f testnginx.yaml
作成したPodを確認します。

 

$ sudo microk8s.kubectl get po
(以下、実行結果例)

 

NAME                       READY   STATUS    RESTARTS   AGE
webapp1-556f7bb485-gtdqm   1/1     Running   0          2m17s

 

作成したHTMLコンテンツ(index.html)をPodに送り込みます。

 

$ sudo microk8s.kubectl cp index.html webapp1-556f7bb485-gtdqm:/usr/share/nginx/html/index.html
ブラウザーでアクセスしてみましょう。

 

microk8sをインストールしたサーバーが192.168.1.100の場合、「http://192.168.1.100:30080」とロケーションバーに入力してEnterを押してみます。すると、NGINXのデフォルトページが表示されます。

 

スケールアップを試してみましょう。次のように実行してみてください。

 

$ sudo microk8s.kubectl scale deployment webapp1 --replicas=2
(以下、実行結果例)

 

deployment.extensions/webapp1 scaled
もう一度次のようにコマンドを実行すると、AVAILABLEが2に変わっているのが確認できます。「webapp1」というアプリケーションPodが2つになったことが確認できます。

 

$ sudo microk8s.kubectl get -f testnginx.yaml
(以下、実行結果例)

 

NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE

persistentvolumeclaim/myclaim   Bound    pvc-29ced48e-a72b-44ff-9115-466ce087fba3   2Gi        RWO            microk8s-hostpath   6m4sNAME                      READY   UP-TO-DATE   AVAILABLE   AGE

deployment.apps/webapp1   2/2     2            2           6m4s

NAME                         TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

service/nginxapp1-nodeport   NodePort   10.152.183.122   <none>        80:30080/TCP   6m4s

 

次のようにコマンドを実行してみます。

 

$ sudo microk8s.kubectl get pod
(以下、実行結果例)

 

NAME                       READY   STATUS    RESTARTS   AGE

webapp1-556f7bb485-8hgfq   1/1     Running   0          45s

webapp1-556f7bb485-gtdqm   1/1     Running   0          6m31s

 

次のようにコマンドを実行して、1つのPodを停止して、疑似的に障害を発生させてみます。deleteの後のPod名は手元の環境に合わせて置き換えて実行してください。

 

すると、「pod "Pod名" deleted」と表示されます。

 

$ sudo microk8s.kubectl delete pod webapp1-556f7bb485-8hgfq
(以下、実行結果例)

 

pod " webapp1-556f7bb485-8hgfq" deleted
もう一度Podの一覧を表示してみましょう。1個Podを削除しましたが、Podは2個見つかるはずです。これは現在、Podを2つ起動しなさいと定義しているため、1つPodが削除されたので要件を満たすために1つPodを作成して、合計2個のアプリケーションを動かすことを維持しているというわけです。

 

$ sudo microk8s.kubectl get pod
(以下、実行結果例)

 

NAME                       READY   STATUS    RESTARTS   AGE

webapp1-556f7bb485-gtdqm   1/1     Running   0          7m27s

webapp1-556f7bb485-xb8xx   1/1     Running   0          8s

 

参考サイト:

 

Ansible関連
https://docs.ansible.com/ansible/latest/
Docker関連
http://docs.docker.jp/index.html
https://docs.docker.com/
Kubernetes関連
https://kubernetes.io/ja/docs/concepts/
https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/
microk8s関連
https://microk8s.io/
https://microk8s.io/docs/

 

 

 

(日本仮想化技術株式会社 技術部/遠山 洋平)

 

※記載されている会社名、製品名、サービス名は各社の商標または登録商標です。

関連する記事


ページトップへ

お問い合わせ

「SmartCloud」問い合わせ

資料請求・お問い合わせ

ページトップへ