microk8sを使ってkubernetesクラスタを構築してみる + metallbアドオンお試し
microk8sを用いてkubernetesクラスタを構築する
テクノロジーコラム
- 2020年09月04日公開
microk8sを使ってkubernetesクラスタを構築してみる + metallbアドオンお試し
はじめに
NTTテクノクロスではkuberenetesの検証やkubernetes構築支援、アプリケーションのkubernetes移行支援などを行っています。
アプリケーション開発をしていく中で、アプリケーションの管理をkubernetes上で行いたいが、kubernetes構築のハードルが高く、なかなか手が出せないといったことはありますか。
そういった場合、microk8sを用いると簡単に単ノード構成のkubernetesを構築することができます。加えて、microk8sはkubernetesクラスタも構築することができます。
今回はこの「microk8sを用いたkubernetesクラスタ構築」を試してみます。
また、microk8sのadd-onとして提供されている「metallb」も使ってみます。
metallbはkubernetes上のサービスにExternal-IP(外部IP)でアクセスできるようにする機能です。
kubernetesでアプリケーションを管理する場合、通常kuberentesのネットワークの上でアプリケーションが動作するため、kubernetes上のアプリケーションに外部から接続することはできません。
アプリケーションに接続する方法としてサービスをNodeportで起動し、ホストのポートと紐づけそこにhaproxy経由でアクセスさせるといった方法がありますが手間がかかってしまいます。
しかし、metallbを用いればkubernetesのサービスをLoad Balancerで起動するだけで、metallbが外部から接続可能なExternal IPを割り振り外部からアクセスできるようになります。
今回は以下の構成でkubernetesクラスタを構築します。
今回の構成について説明します。
まず、今回のkubernetesクラスタではmasterノード1台、workerノード1台のクラスタを構築します。マシンのOSはUbuntu 20.04を使用しました。
masterノード内のpodから説明します。
黄緑色の枠内で囲んだpodはkubernetes構成する基本的なpodです。これらはmicrok8sを用いると自動で構築されます。
次にオレンジ色で囲んだpodはmetallbを構成するpodです。これらも後述しますが、microk8sを用いる場合はコマンドを一つ入力することで構築されます。
masterノードで動作するpodは以上です。
次に、workerノードのpodについて説明します。
黄色い枠で囲んだpodはnginxのpodです。これはkubernetes上で動作するアプリケーションとして利用します。
metallbで外部から接続できるExternal IPを付与して接続確認を行うために利用します。
microk8sでkubernetesを構築する
microk8sのインストールする
microk8sを用いた単ノードのkubernetesはインストールが完了した時点で構築が完了します。
microk8sの最新版をインストールする場合は以下コマンドを実行します。インストールはsnapコマンドを利用を推奨されているため、snapコマンドを用います。
1$ sudo snap install microk8s --classic
microk8sコマンドの権限設定
microk8sではroot権限を必要とするコマンドをシームレスに実行できるようmicrok8sグループを作成しています。
任意のユーザをmicrok8sグループに追加します。
xxxxxxxxxx
11$ sudo usermod -a -G microk8s $USER
また.kube配下のキャッシュディレクトリにアクセスできるよう権限を変更します。
xxxxxxxxxx
11$ sudo chown -f -R $USER ~/.kube
権限の変更を適用するために、セッションの更新を行います。
kubernetesの動作確認
kubernetesが動作しているかをkubectlコマンドで確認してみます。
microk8sで構築したkubernetesでkubectlコマンドを使うには「microk8s kubectl」とする必要があります。
xxxxxxxxxx
31$ microk8s kubectl get nodes
2NAME STATUS ROLES AGE VERSION
3microk8s Ready <none> 2m29s v1.18.0
これで単ノードのkubernetesが構築ができました。
microk8sでkubernetesクラスタを構築する
次はkubernetesクラスタを構築していきます。
クラスタ構築はmicrok8sのコマンドを実行することで簡単に行えます。
準備
まず、microk8sがインストールされたマシンを複数台用意しましょう。
次にmasterノードとしたいマシン上で「microk8s add-node」コマンドを実行します。
このコマンドを実行することで、workerノードをmasterノードにjoinするためのコマンドが出力されます。
以下は実行例です。
xxxxxxxxxx
21$ microk8s add-node
2Join node with: microk8s join 192.168.10.2:25000/ZMlMMIoIJfdtfnDpvERBUIknDaqKlCqZ
クラスタリング
workerノードとしたいマシンで先ほど出力されたjoinのコマンドを実行します。
xxxxxxxxxx
11microk8s join 192.168.10.2:25000/ZMlMMIoIJfdtfnDpvERBUIknDaqKlCqZ
masterノードでクラスタにjoinされていることを確認します。
xxxxxxxxxx
41$ microk8s kubectl get node
2NAME STATUS ROLES AGE VERSION
3master Ready <none> 13m v1.18.0
4worker Ready <none> 68s v1.18.0
これでkubernetesクラスタの構築ができました。
microk8sのadd-onを使ってみる
add-onとは
microk8sでは複数のadd-onが実装されておりコマンドを実行することで簡単に利用することができます。
利用できるアドオンは「microk8s status」で確認することができます。
以下は実行例です。
xxxxxxxxxx
221$ microk8s status --wait-ready
2microk8s is running
3addons:
4cilium: disabled
5dashboard: disabled
6dns: disabled
7fluentd: disabled
8gpu: disabled
9helm: disabled
10helm3: disabled
11ingress: disabled
12istio: disabled
13jaeger: disabled
14knative: disabled
15kubeflow: disabled
16linkerd: disabled
17metallb: disabled
18metrics-server: disabled
19prometheus: disabled
20rbac: disabled
21registry: disabled
22storage: disabled
今回はkubernetes上のサービスに対し外部から接続できるExternal IPアドレスを付与できるmetallbを使ってみます。
metallbを有効にする
add-onを有効化するためには「microk8s enable <アドオン名>」のコマンドを実行するだけです。
metallbを有効化してみます。
構成図では以下部分となります。
有効化する際にサービスに付与するIPアドレスのレンジを指定する必要があります。
設定するネットワークはmetallbで利用したいものを入力してください。
今回はクラスタを構築したネットワークと同じネットワークを指定します
xxxxxxxxxx
31$ microk8s enable metallb
2Enabling MetalLB
3Enter the IP address range (e.g., 10.64.140.43-10.64.140.49):192.168.10.20-192.168.10.30
metallbが有効化されたことによりmetallbを構成するpodやサービスがデプロイされます。
xxxxxxxxxx
81$ microk8s kubectl get service,pod -A
2NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3default service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 23h
4
5NAMESPACE NAME READY STATUS RESTARTS AGE
6metallb-system pod/controller-5f98465b6b-nrp29 1/1 Running 0 2m39s
7metallb-system pod/speaker-b76zw 1/1 Running 0 2m39s
8metallb-system pod/speaker-vhz8q 1/1 Running 0 2m39s
nginxのコンテナを作成し外部から接続する
metallbの機能を試すために簡単なnginxコンテナをデプロイし、外部からアクセスしてみます。
以下の内容でnginxのマニュフェストファイルを作成し、kubernetesにデプロイします。
構成図では以下部分となります。
xxxxxxxxxx
341---
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5name: nginx-deployment
6spec:
7selector:
8matchLabels:
9app: nginx
10replicas: 3
11template:
12metadata:
13labels:
14app: nginx
15spec:
16containers:
17- name: nginx
18image: nginx:1.7.9
19ports:
20- containerPort: 80
21
22---
23
24apiVersion: v1
25kind: Service
26metadata:
27name: nginx
28spec:
29ports:
30- name: nginx
31port: 80
32selector:
33app: nginx
34type: LoadBalancer
作成したマニュフェストファイルを使用し、k8sにデプロイします。
xxxxxxxxxx
31$ microk8s kubectl apply -f nginx.yaml
2deployment.apps/nginx-deployment created
3service/nginx created
デプロイされたことを確認します。
xxxxxxxxxx
121$ microk8s kubectl get service,pod
2NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
3default service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 8d <none>
4default service/nginx LoadBalancer 10.152.183.188 192.168.10.21 80:31180/TCP 116m app=nginx
5
6NAMESPACE NAME READY STATUS RESTARTS AGE
7default pod/nginx-deployment-5bf87f5f59-frlzt 1/1 Running 0 7d2h
8default pod/nginx-deployment-5bf87f5f59-rt2rv 1/1 Running 0 7d2h
9default pod/nginx-deployment-5bf87f5f59-zvg4v 1/1 Running 0 7d2h
10metallb-system pod/controller-5f98465b6b-lbpjr 1/1 Running 0 8d
11metallb-system pod/speaker-75phx 1/1 Running 0 8d
12metallb-system pod/speaker-bzgbz 1/1 Running 0 8d
EIPを経由してnginxに接続できることを確認します。
x1$ curl 192.168.10.21:80
2
3<!DOCTYPE html>
4<html>
5<head>
6<title>Welcome to nginx!</title>
7<style>
8body {
9width: 35em;
10margin: 0 auto;
11font-family: Tahoma, Verdana, Arial, sans-serif;
12}
13</style>
14</head>
15<body>
16<h1>Welcome to nginx!</h1>
17<p>If you see this page, the nginx web server is successfully installed and
18working. Further configuration is required.</p>
19
20
21<p>For online documentation and support please refer to
22<a href="http://nginx.org/">nginx.org</a>.<br/>
23Commercial support is available at
24<a href="http://nginx.com/">nginx.com</a>.</p>
25
26
27<p><em>Thank you for using nginx.</em></p>
28
29</body>
30</html>
終わりに
今回はmicrok8sを用いてkubernetesクラスタを構築しました。
microk8sはインストールだけで単ノードのkubernetesを構築することができ、
kubernetesクラスタを構築する際は、masterノードで「microk8s add-node」コマンドを実行し、workerノードで「microk8s join」コマンドを実行するだけで簡単に構築することができます。
そのため、kubernetesを用いたアプリケーションの開発を行いたいけれど、
kubernetesの構築はちょっと......といった方にとても向いています。
また、今回はアドオンのうちmetallbのみを使ってみました、そのほかにも多くのアドオンが提供されています。
これらのアドオンも「microk8s enable」コマンド一つを実行するだけで利用することができるため、簡単に試すことができます。ぜひお試しください。
NTTテクノクロスではコミュニティの最新動向もキャッチアップしつつ、これまでに培ってきたkubernetes構築・運用のノウハウを活かした幅広いソリューションをご用意しております。 Ubuntu/OpenStack/OSS製品について何かお困りのことがございましたら、是非お声掛けください。
OSSクラウド基盤トータルサービス
※NTTテクノクロスではUbuntuの開発元であるCanonical社の商用サポート日本語窓口業務も行っています。
参考サイト
MicroK8s quick start guide https://microk8s.io/docs/
Multinode microk8s https://microk8s.io/docs/clustering