0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IoTデバイスでkuberenetes: Master node on RPi5 + Worker node on RPi4

Posted at

やりたいこと

  • IoTデバイスで動くシステムをKubernetesで管理
    image.png

環境

  • Master node
    • Device: Raspberry Pi 5
    • OS: Ubuntu 24.04 (64-bit)
  • Worker node
    • Device: Raspberry Pi 4
    • OS: Ubuntu Core 24 (64-bit)
  • Kubernetes
    $ kubectl version
    Client Version: v1.31.1
    Kustomize Version: v5.4.2
    Server Version: v1.31.0
    
    $ kubeadm version
    kubeadm version: &version.Info{Major:"1", Minor:"31", GitVersion:"v1.31.1", GitCommit:"948afe5ca072329a73c8e79ed5938717a5cb3d21", GitTreeState:"clean", BuildDate:"2024-09-11T21:26:49Z", GoVersion:"go1.22.6", Compiler:"gc", Platform:"linux/arm64"}
    
  • CRE: cri-o
    $ crio version
    ...
    Version:        1.31.1
    ...
    

手順

Master nodeセットアップ

準備

  1. Raspberry Pi 5にUbuntu 24.04をインストール
    1. Raspberry Pi Imagerで下記のように設定しSDカードを作成
      • Raspberry Piデバイス:Raspberry Pi 5
      • OS:Ubuntu Desktop 24.04.1 LTS (64-bit)
        • Other general-purpose OS > Ubuntu > Ubuntu Desktop 24.04.1 LTS (64-bit)を選択
      • ストレージ:SDXC CARD
    2. SDカードをRaspberry Pi 5に挿入して起動、初期設定
  2. sshでアクセスできるようにする
    1. Ubuntu起動後、Wi-Fiの設定
    2. openssh serverのインストール
    $ sudo apt update
    $ sudo apt install -y openssh-server
    

Kubernetesインストール

  1. 必要なツールのインストール

    $ sudo apt-get install -y software-properties-common curl
    
  2. インストールするKubernetesのバージョンに合わせた環境変数設定

    $ echo KUBERNETES_VERSION=v1.31
    $ echo CRIO_VERSION=v1.31
    
  3. Kubernetesのリポジトリキー・リポジトリを追加

    $ curl -fsSL https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/Release.key |
        sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    $ echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/ /" |
        sudo tee /etc/apt/sources.list.d/kubernetes.list
    
  4. CRI-Oのリポジトリキー・リポジトリを追加

    $ curl -fsSL https://pkgs.k8s.io/addons:/cri-o:/stable:/$CRIO_VERSION/deb/Release.key |
        sudo gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
    
    $ echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/stable:/$CRIO_VERSION/deb/ /" |
        sudo tee /etc/apt/sources.list.d/cri-o.list
    
  5. CRI-O, kubelet, kubeadm, kubectl, socatをインストール

    $ sudo apt-get update
    $ sudo apt-get install -y cri-o kubelet kubeadm kubectl socat
    
  6. CRI-Oのcgroup設定、サービス起動

    $ cat <<EOF | sudo tee /etc/crio/crio.conf.d/02-cgroup-manager.conf
    [crio.runtime]
    conmon_cgroup = "pod"
    cgroup_manager = "cgroupfs"
    EOF
    $ sudo systemctl start crio
    
  7. swapの無効化

    $ sudo systemctl disable swapfile.swap
    $ sudo systemctl stop swapfile.swap
    $ sudo swapoff -a
    $ sudo rm /swapfile
    
  8. br_netfilterをロード

    $ modprobe br_netfilter
    
  9. IP forwardingを有効化

    $ sysctl -w net.ipv4.ip_forward=1
    $ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.ipv4.ip_forward = 1
    EOF
    $ sudo sysctl --system
    
  10. Kubernetes clusterを起動

    $ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
    
  11. kubectlの設定

    $ mkdir -p $HOME/.kube
    $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  12. flannelのデプロイ

    $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.25.6/Documentation/kube-flannel.yml
    
    

Worker node

準備

  1. Raspberry Pi 4にRaspberry Pi OSをインストール
    1. Raspberry Pi Imagerで下記のように設定しSDカードを作成
      • Raspberry Piデバイス:Raspberry Pi 4
      • OS:Raspberry Pi OS (64-bit)
      • ストレージ:SDXC CARD
    2. SDカードをRaspberry Pi 4に挿入して起動、初期設定
      • 初期セットアップ画面でWi-FiをつなぐとUpdateが走るが、それをすると正常に再起動できなかったため、ネットワークはつながずにセットアップを完了した
  2. sshでアクセスできるようにする
    1. Raspberry Pi OS起動後、ターミナルを起動
    2. Raspberry Pi Software Configuration Toolを起動
      $ sudo raspi-config
      
    3. 3 Interface Options > I1 SSH > Yes を選択し、ssh接続が有効化されることを確認
  3. cgroup v2のmemory controllerを有効化する
    1. /boot/firmware/cmdline.txtを編集
      $ sudo sed -i -e "1 s/$/ cgroup_enable=memory/" /boot/firmware/cmdline.txt
      
  4. 再起動
    $ sudo reboot
    

Kubernetesインストール

  1. 必要なツールのインストール

    $ sudo apt-get install -y software-properties-common curl
    
  2. インストールするKubernetesのバージョンに合わせた環境変数設定

    $ echo KUBERNETES_VERSION=v1.31
    $ echo CRIO_VERSION=v1.31
    
  3. Kubernetesのリポジトリキー・リポジトリを追加

    $ curl -fsSL https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/Release.key |
        sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    $ echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/ /" |
        sudo tee /etc/apt/sources.list.d/kubernetes.list
    
  4. CRI-Oのリポジトリキー・リポジトリを追加

    $ curl -fsSL https://pkgs.k8s.io/addons:/cri-o:/stable:/$CRIO_VERSION/deb/Release.key |
        sudo gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
    
    $ echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/stable:/$CRIO_VERSION/deb/ /" |
        sudo tee /etc/apt/sources.list.d/cri-o.list
    
  5. CRI-O, kubelet, kubeadm, kubectl, socatをインストール

    $ sudo apt-get update
    $ sudo apt-get install -y cri-o kubelet kubeadm kubectl socat
    
  6. CRI-Oのcgroup設定、サービス起動

    $ cat <<EOF | sudo tee /etc/crio/crio.conf.d/02-cgroup-manager.conf
    [crio.runtime]
    conmon_cgroup = "pod"
    cgroup_manager = "cgroupfs"
    EOF
    $ sudo systemctl start crio
    
  7. swapの無効化

    $ sudo dphys-swapfile swapoff
    $ sudo dphys-swapfile uninstall
    $ sudo update-rc.d dphys-swapfile remove
    
  8. 必要なモジュールをロード

    $ sudo modprobe overlay
    $ sudo modprobe br_netfilter
    
  9. sysctlパラメータの設定・再起動

    $ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
    $ sudo sysctl --system
    
  10. kubeletのDNS情報取得先の設定を変更

    $ sudo sed -i 's|resolvConf: /run/systemd/resolve/resolv.conf|resolvConf: /etc/resolv.conf|' /var/lib/kubelet/config.yaml
    
  11. CRI-O、kubeletを実行する

    $ sudo systemctl enable crio
    $ sudo systemctl start crio
    $ sudo systemctl enable kubelet
    $ sudo systemctl start kubelet
    

動作確認

  • Master node(Raspberry Pi 5)でWorker nodeがReadyとなっていることを確認
    $ kubectl get nodes
    NAME             STATUS   ROLES           AGE   VERSION
    master-desktop   Ready    control-plane   9h    v1.31.1
    raspberrypi      Ready    <none>          9h    v1.31.1
    
  • サンプルのDeploymentをデプロイ
    $ kubectl apply -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: example
      template:
        metadata:
          labels:
            app: example
        spec:
          containers:
          - name: example-container
            image: nginx:latest
            ports:
            - containerPort: 80
    EOF
    
  • podが立ち上がっていることを確認
    $ kubectl get pods
    NAME                                  READY   STATUS    RESTARTS   AGE
    example-deployment-86d956c8b7-2s2sr   1/1     Running   0          9h
    

補足

  • 当初はRaspberry Pi5でもUbuntu Core 24 (64-bit)を動かそうと思ったが、初回起動時にフリーズしたっぽくUbuntu 24.04に変更した
  • モジュール、sysctlパラメータの詳細、過不足等不明なところが多いため追加で勉強が必要
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?