Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

おウチでKubernetes (MicroK8s) 始めてみた【初歩】

こんにちは!オルターブースのいけだです!

今年の夏は一段と暑いですね!しかし我が家では「水炊き」が大好評です! 暑い夏にはやはり熱い鍋がいいですね!😁

さて、先日CloudNative Days Fukuoka 2023が開催されました。

弊社からは、稲岡君が登壇されておりましたね!

aadojo.alterbooth.com

さてイベントでも話題が多かったコンテナ、Kubernetesですが、知ってはいるけど、どこから触り始めてみようか…と思う方も少なからずいるのではないでしょうか。

かく言う私もその一人でございます。

そこで今回は、自宅のRaspberry PiにKubernetes環境(MicroK8s) を作ってみよう。 という事で初歩の部分を記載していこうと思います!🙌

MicroK8sのインストール

MicroK8s は、ローカルシステムで実行するように設計された軽量の Kubernetes ディストリビューションです。 Raspberry Piでも動かすことができ、とても気軽に扱える感じで楽しいです。

microk8s.io

Raspberry PiへのUbuntuのインストールに関しては割愛します。

手順に関してはこちらに丁寧に記載されてます。

※MicroK8sを実行するには64 ビットのUbuntuCoreバージョンを使用する必要があります。

以降はSSHでRaspberry Piに接続できている事を前提に進めていきます。 https://microk8s.io/docs/install-raspberry-pi

sudo apt update

# MicroK8sのインストールにはSnapパッケージを使用する為インストールします。
sudo apt install snapd

MicroK8sをインストールします。

sudo snap install microk8s --classic --channel=1.25

追加のカーネルモジュールをインストールします。

sudo apt install linux-modules-extra-raspi

早速、MicroK8sを起動してみます。

sudo microk8s start
# ステータスを確認します。
sudo microk8s status --wait-ready
microk8s is running

kubectlコマンドをsudo microk8s kubectl と実行する必要があるので、kubectl だけで実行できるようにコマンドエイリアスの作成と、ユーザーグループへの追加をします。

sudo snap alias microk8s.kubectl kubectl
Added:
  - microk8s.kubectl as kubectl

sudo usermod -a -G microk8s $USER

kubectl コマンドが使用できるか確認します。

kubectl get node

NAME     STATUS   ROLES    AGE   VERSION
ubuntu   Ready    <none>   51d   v1.25.12

Podのデプロイ

次に、事前にテスト用に作成したNginxのイメージをPullしてPodをデプロイしてみます。

前もってDockerHubへPush済みイメージを使用します。

Dockerfileはいたってシンプルです。

FROM nginx:latest

COPY ./index.html /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

こちらをビルドし、DockerHubへPushしておきました。

また、Podをデプロイし、ロードバランサーで負荷分散させるところまでやりたいので、metallbingress アドオンを有効化しておきます。

sudo microk8s enable ingress

https://microk8s.io/docs/addon-ingress

sudo microk8s enable metallb

#MetalLB が IP を振り分けるアドレス範囲の入力が求められるので、自宅IPでぶつからなさそうな範囲を指定。
Enter each IP address range delimited by comma
 (e.g. '10.64.140.43-10.64.140.49,192.168.0.105-192.168.0.111')
: 192.168.1.<範囲指定>-192.168.1.<範囲指定>

https://microk8s.io/docs/addon-metallb

現在の「Pod」に関する情報を表示します。

#すべてのPodに関する情報を表示
kubectl get pods -A

NAMESPACE        NAME                  READY   STATUS    RESTARTS       AGE
kube-system      kubernetes-....        1/1     Running      略...                 
...

デプロイ用のマニフェストファイルを作成します。

my-nginx-deployment.yaml

apiVersion: apps/v1   #どのバージョンのk8s APIを利用するか
kind: Deployment  #作成するリソースの種類
metadata:
  name: my-nginx
spec:
  replicas: 10 #何個のPodを常時起動させておくか
  selector:
    matchLabels:
      app: my-nginx
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
      containers:
      - name: my-nginx #コンテナ名
        image: docker.io/<dockerID>/<レポジトリ名>:latest
      imagePullSecrets:
      - name: dockersecret #DockerHubへアクセスする認証情報
---
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    app: nginx
spec:
  type: LoadBalancer  #ロードバランサで負荷分散させる
  ports:
  - port: 80  #my-nginxで開放するポート
    protocol: TCP
  selector:
    app: my-nginx

DockerHubへアクセスする認証情報を生成します。

DOCKER_REGISTRY_SERVER=https://index.docker.io/v1/
DOCKER_USER=ユーザー名
DOCKER_PASSWORD=アクセストークン
DOCKER_EMAIL=メールアドレス

kubectl create secret docker-registry dockersecret \
 --docker-server=DOCKER_REGISTRY_SERVER \
 --docker-username=DOCKER_USER \
 --docker-password=DOCKER_PASSWORD \
 --docker-email=DOCKER_EMAIL

生成したシークレットを検証します。

kubectl get secret dockersecret --output=yaml

#以下の情報が出力される
apiVersion: v1
data:
  <Base64でエンコードされた.dockerconfigjsonが存在します。これがあることでSecretの作成が正しく行われたことを示します。>
kind: Secret
metadata:
  creationTimestamp: "2023-08-01T00:00:00Z"
  name: dockersecret
  namespace: default
  resourceVersion: "..略..."
  uid: ...略...
type: kubernetes.io/dockerconfigjson

それでは作成したマニフェストファイルを使ってデプロイしてみます。

kubectl apply -f ./my-nginx-deployment.yaml

deployment.apps/my-nginx created
service/my-nginx created

Podを確認してみます。

kubectl get pods --namespace=default

my-nginx-7ccc7c9dd5-nhq85   1/1     Running   0          69s
my-nginx-7ccc7c9dd5-6prws   1/1     Running   0          68s
my-nginx-7ccc7c9dd5-7qxcz   1/1     Running   0          68s
my-nginx-7ccc7c9dd5-tlwhh   1/1     Running   0          68s
my-nginx-7ccc7c9dd5-6r9mn   1/1     Running   0          68s
my-nginx-7ccc7c9dd5-8kkhg   1/1     Running   0          68s
my-nginx-7ccc7c9dd5-q97tz   1/1     Running   0          68s
my-nginx-7ccc7c9dd5-r42qg   1/1     Running   0          68s
my-nginx-7ccc7c9dd5-594gn   1/1     Running   0          68s
my-nginx-7ccc7c9dd5-nzvrx   1/1     Running   0          68s

10個のPodが起動している事が分かりました。

DeploymentとServiceリソースの一覧を確認してみます。

kubectl get deployment

NAME       READY   UP-TO-DATE   AVAILABLE   AGE
my-nginx   10/10   10           10          4m
kubectl get service

NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)          AGE
kubernetes                  ClusterIP      10.152.183.1     <none>          443/TCP          51d
my-nginx                    LoadBalancer   10.152.183.203   192.168.1.105   80:30294/TCP     6m33s

my-nginx サービスは80番ポートを使用しています。 ノードは30294で外部からのアクセスを待ち受けています。 192.168.1.105LoadBalancerのIPアドレスです。

ロードバランサーのIPにアクセスしてみます。

作成したイメージをデプロイできてますね!

ここではLoadBalancerにアクセスし、ノード30294ポートへ転送、my-nginxサービス のPodへルーティングしてくれているという事ですね!

10個Podを起動しているので、試しに1つ停止してみます。

#Pod名を指定して削除
kubectl delete pods my-nginx-7ccc7c9dd5-nhq85

pod "my-nginx-7ccc7c9dd5-nhq85" deleted
kubectl get pods --namespace=default

# 1個停止しても新しく立ち上がって10個のまま
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-7ccc7c9dd5-6prws   1/1     Running   0          40m
my-nginx-7ccc7c9dd5-7qxcz   1/1     Running   0          40m
my-nginx-7ccc7c9dd5-tlwhh   1/1     Running   0          40m
my-nginx-7ccc7c9dd5-6r9mn   1/1     Running   0          40m
my-nginx-7ccc7c9dd5-8kkhg   1/1     Running   0          40m
my-nginx-7ccc7c9dd5-q97tz   1/1     Running   0          40m
my-nginx-7ccc7c9dd5-r42qg   1/1     Running   0          40m
my-nginx-7ccc7c9dd5-594gn   1/1     Running   0          40m
my-nginx-7ccc7c9dd5-nzvrx   1/1     Running   0          40m
my-nginx-7ccc7c9dd5-cgtb6   1/1     Running   0          28s

Podを停止してもすぐに新しいPodが起動する事が分かりました。

最後にダッシュボードを表示してみます!

アドオンを有効化します。

microk8s enable dashboard

ダッシュボードを起動します。

microk8s dashboard-proxy

Checking if Dashboard is running.
Infer repository core for addon dashboard
Waiting for Dashboard to come up.
Trying to get token from microk8s-dashboard-token
Waiting for secret token (attempt 0)
Dashboard will be available at https://127.0.0.1:10443 #接続用のポートが表示される
Use the following token to login:
---以下にトークンが表示されるのでコピー---

接続用のポートが表示されているので、ホストのIPアドレス:ポート番号でアクセスしてみます。

先程コピーしたアクセストークンを貼り付けます。

ダッシュボードが表示されました!

ダッシュボードからも同じ用にデプロイ作業をする事ができますね。

さいごに

簡単ではありますが、今回は初歩部分をやってみました!

MicroK8sは非常に分かりやすく、自宅で気軽に始められるので、勉強方法のとっかかりとしても始めやすいのではないでしょうか!

次回は2台のRaspberry Pi でクラスタを組んでみようと思います!

それではまた!👋