こんにちは!オルターブースのいけだです!
今年の夏は一段と暑いですね!しかし我が家では「水炊き」が大好評です! 暑い夏にはやはり熱い鍋がいいですね!😁
さて、先日CloudNative Days Fukuoka 2023が開催されました。
弊社からは、稲岡君が登壇されておりましたね!
さてイベントでも話題が多かったコンテナ、Kubernetesですが、知ってはいるけど、どこから触り始めてみようか…と思う方も少なからずいるのではないでしょうか。
かく言う私もその一人でございます。
そこで今回は、自宅のRaspberry PiにKubernetes環境(MicroK8s) を作ってみよう。 という事で初歩の部分を記載していこうと思います!🙌
MicroK8sのインストール
MicroK8s は、ローカルシステムで実行するように設計された軽量の Kubernetes ディストリビューションです。 Raspberry Piでも動かすことができ、とても気軽に扱える感じで楽しいです。
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をデプロイし、ロードバランサーで負荷分散させるところまでやりたいので、metallb
と ingress
アドオンを有効化しておきます。
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.105
はLoadBalancer
の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 でクラスタを組んでみようと思います!
それではまた!👋