こんにちは、たねやつです。
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: {} # 今回は永続化しない
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の基本的なリソースであるDeploymentとServiceを使って手動でアプリケーションをデプロイしました。Kubernetesの概念は少し難しいですが、実際に動かしてみることで理解が深まったのではないでしょうか。
これで、CI/CDの「C(インテグレーション)」の部分と、デプロイ先である「D(デプロイメント)」の環境が整いました。
いよいよ次回は最終回です。この2つを繋ぎ、GitLab CI/CDからK3sへ全自動でデプロイするパイプラインを完成させます!