お問い合わせ
「SmartCloud」問い合わせ
資料請求・お問い合わせ
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/
(日本仮想化技術株式会社 技術部/遠山 洋平)
※記載されている会社名、製品名、サービス名は各社の商標または登録商標です。