たねやつの木

Photographs, Keyboards and Programming

【CI/CD勉強編-4】Raspberry PiにK3sを導入!Kubernetesへ手動デプロイ

こんにちは、たねやつです。

CI/CDパイプラインで、Raspberry Pi(ARM)でも動作するマルチプラットフォーム対応のDockerイメージをビルドできるようになりました。いよいよ、このイメージをデプロイする先の環境を構築していきます。

今回は、軽量なKubernetesディストリビューションである「K3s」をRaspberry Piにインストールし、CI/CDでビルドしたイメージを手動でデプロイするところまでを目指します。

前の記事

この記事でできること

  • KubernetesとK3sの概要がわかる。
  • Raspberry PiにK3sをインストールできる。
  • 開発PCからRaspberry Pi上のK3sクラスタを操作できるように設定できる。
  • Kubernetesのマニフェストファイルを作成し、手動でアプリケーションをデプロイできる。

KubernetesとK3sについて

  • Kubernetes (k8s): コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースプラットフォームです。非常に高機能ですが、その分要求するリソースも大きめです。

  • K3s: Rancher社(現SUSE)が開発した、リソースが限られた環境やIoTデバイス向けに最適化された軽量なKubernetesディストリビューションです。バイナリサイズが小さく、インストールも簡単なため、Raspberry Piでの利用に非常に適しています。

K3s環境構築と手動デプロイ手順

1. Raspberry PiにK3sをインストール

Raspberry PiにSSHでログインし、以下のコマンドを1行実行するだけでK3sがインストールされます。

curl -sfL https://get.k3s.io | sh -

インストールが完了すると、Raspberry PiがKubernetesのマスターノード兼ワーカーノードとして機能するようになります。

セキュリティに関する注意: このインストールスクリプトはインターネットからダウンロードして直接実行するものです。信頼できるソースから実行していることを確認してください。今回は公式のスクリプトを使用しています。

2. 開発PCからK3sを操作する設定

毎回Raspberry PiにSSHしてkubectlコマンドを打つのは大変です。そこで、開発PC(WSL)からRaspberry Pi上のK3sクラスタを操作できるように設定します。

まず、Raspberry Pi上で以下のコマンドを実行し、設定ファイルの内容を表示します。

sudo cat /etc/rancher/k3s/k3s.yaml

表示された内容をすべてコピーします。

次に、開発PC(WSL)の~/.kube/configファイルに、コピーした内容を貼り付けます。(configファイルがない場合は新規作成してください)。

貼り付けた設定ファイルの中の、serverアドレスを修正します。

  • 修正前: server: https://127.0.0.1:6443
  • 修正後: server: https://<Raspberry PiのIPアドレス>:6443

これで、開発PCのkubectlがRaspberry PiのK3sクラスタを向くようになります。以下のコマンドでノード情報が取得できれば成功です。

kubectl get nodes

Raspberry Piのホスト名が表示されるはずです。

3. Kubernetesマニフェストファイルの作成

Kubernetesでは、Deployment(どのようにPodを起動するか)やService(Podにどうやってアクセスするか)といったリソースの状態をYAMLファイルで定義します。これをマニフェストファイルと呼びます。

k8sというディレクトリを作成し、その中に2つのファイルを作成します。

  • k8s/deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cicd-learning-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cicd-learning-api
  template:
    metadata:
      labels:
        app: cicd-learning-api
    spec:
      containers:
      - name: api-container
        # GitLabコンテナレジストリのイメージを指定
        image: <Your-GitLab-Registry-Image-URL>
        ports:
        - containerPort: 8000
        env:
        - name: DATABASE_URL
          value: "postgresql://user:password@postgres-service:5432/mydatabase"
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  selector:
    app: postgres
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:15
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_USER
          value: "user"
        - name: POSTGRES_PASSWORD
          value: "password"
        - name: POSTGRES_DB
          value: "mydatabase"
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
      volumes:
      - name: postgres-storage
        emptyDir: {} # 今回は永続化しない
``の部分は、GitLabの`Deploy` > `Container Registry`で確認できる、ご自身のイメージURL(例: `registry.gitlab.com/your-username/your-project:main`)に書き換えてください。
  • k8s/service.yaml:
apiVersion: v1
kind: Service
metadata:
  name: cicd-learning-api-service
spec:
  selector:
    app: cicd-learning-api
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8000
  type: NodePort # クラスター外からアクセスできるようにする

4. 手動デプロイと動作確認

マニフェストファイルが準備できたら、kubectl applyコマンドでK3sクラスタに適用します。

# deployment.yamlを適用
kubectl apply -f k8s/deployment.yaml

# service.yamlを適用
kubectl apply -f k8s/service.yaml

以下のコマンドでPodのステータスがRunningになっていることを確認します。

kubectl get pods

次に、Serviceの情報を確認して、どのポートでアクセスできるかを調べます。

kubectl get service cicd-learning-api-service

PORT(S)の列に80:3xxxx/TCPのような表示があります。この3xxxxが外部からアクセスするためのポート番号です。

ブラウザで http://<Raspberry PiのIPアドレス>:<表示されたポート番号> にアクセスし、APIのメッセージが表示されればデプロイ成功です!

最後に

今回は、Raspberry PiにK3sをセットアップし、Kubernetesの基本的なリソースであるDeploymentServiceを使って手動でアプリケーションをデプロイしました。Kubernetesの概念は少し難しいですが、実際に動かしてみることで理解が深まったのではないでしょうか。

これで、CI/CDの「C(インテグレーション)」の部分と、デプロイ先である「D(デプロイメント)」の環境が整いました。

いよいよ次回は最終回です。この2つを繋ぎ、GitLab CI/CDからK3sへ全自動でデプロイするパイプラインを完成させます!

次の記事