k8sクラスタをRaspberry Pi3で組み立てる

k8s-rpi

自分で環境を組み立てることで理解するタイプの人間にはRaspberry Piはうってつけ。ということで、k8sクラスタを組んでみることにしました。

幸いなことにすでに実施されている方がいるので、基本はその手順ににそってやるだけなんですが、汗。

詳細はこちら → Setting up a Kubernetes 1.11 Raspberry Pi Cluster using kubeadm [kubecloud.io] Kasper Nissen – Sep 14, 2018

準備

  • Raspberry Pi 3 B – 3台
    • Raspberry Pi 2 でもOK。Raspberry Pi Zero は ARM CPU が古くサポートされていないのでNG

設定

今回の設定には以下の情報で設定。

Hostname IP DNS
k8s-master 192.168.11.90 192.168.11.1
k8s-worker-01 192.168.11.91 192.168.11.1
k8s-worker-02 192.168.11.92 192.168.11.1

バージョン

2019年1月2日 現在

  • v1.13.1

手順

基本設定

  1. Raspbian Stretch Liteをダウンロード https://www.raspberrypi.org/screen shot 2019-01-20 at 20.29.39
    screen shot 2019-01-20 at 20.30.42
  2. Etcherなどを用いてSDカードにFlash!
    https://www.balena.io/etcher/
    screen shot 2019-01-20 at 20.32.59
  3. Raspberry Piを起動しraspi-configを実行
  4. 2 Network Optionsを選択
    screen shot 2019-01-20 at 21.13.52
  5. N1 Hostnameを選択してホスト名を設定
    screen shot 2019-01-20 at 21.14.09
  6. 設定にて決定した名前を入力してOK
    screen shot 2019-01-20 at 21.17.54
  7. ホスト名の設定後、同じ2 Network OptionsにあるN2 Wi-Fiを選択してWi-Fiの設定
    screen shot 2019-01-20 at 21.15.54
    screen shot 2019-01-20 at 21.19.54
  8. トップに戻り5 Interfacing Optionsを選択
    screen shot 2019-01-20 at 21.21.21
  9. P2 SSHを選択してSSHを有効化
    screen shot 2019-01-20 at 21.21.49
  10. その他、タイムゾーンやロケールなどは任意に設定
  11. /etc/dhcpcd.confファイルを編集してWiFiに固定IPアドレスを設定。ファイルの末尾に以下の設定を追加。赤字部分はRaspberry Piごとに変更。以下は1台目のマスターの例。

    interface wlan0
    static ip_address=192.168.11.90/24
    static routers=192.168.11.1
    static domain_name_servers=192.168.11.1

  12. Raspberry Piを再起動
  13. 同一ネットワーク内のリモート端末からSSHでRaspberry Piに接続

    $ ssh pi@k8s-master.local

  14. install.shファイルをpiユーザーフォルダに作成し、リンク先のInstalling the prerequisitesセクションにあるスクリプトをコピー。以下はそのリンク先のコピーまま。
    #!/bin/sh
    
    # Install Docker
    curl -sSL get.docker.com | sh && \
    sudo usermod pi -aG docker
    
    # Disable Swap
    sudo dphys-swapfile swapoff && \
    sudo dphys-swapfile uninstall && \
    sudo update-rc.d dphys-swapfile remove
    echo Adding " cgroup_enable=cpuset cgroup_enable=memory" to /boot/cmdline.txt
    sudo cp /boot/cmdline.txt /boot/cmdline_backup.txt
    orig="$(head -n1 /boot/cmdline.txt) cgroup_enable=cpuset cgroup_enable=memory"
    echo $orig | sudo tee /boot/cmdline.txt
    
    # Add repo list and install kubeadm
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \
    echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \
    sudo apt-get update -q && \
    sudo apt-get install -qy kubeadm
  15. スクリプトを実行

    $ sh install.sh

  16. Dockerをサービス化

    $ sudo systemctl enable docker.service

  17. Dockerをサービスにて実行

    $ sudo systemctl start docker.service

  18. 上記手順を2台目以降のRaspberry Piにて実施。ホスト名、IPアドレスは2台目以降に決定した設定を行う。

Kubernetesクラスタの設定

マスターノード

  1. kubeadmを用いてKubernetesマスターをイニシャライズを実行する前にpod-eviction-timeoutの設定とnode-monitor-grace-periodの設定が初期値は長いため変更。
    初期値 変更値
    pod-eviction-timeout 5 min 10 sec
    node-monitor-grace-period 40 sec 10 sec
  2. kubeadm_conf.yamlファイルを編集し、以下の内容を設定して初期値を変更。※ サイト上の設定は古いバージョン (おそらく 1.11.2) での設定のため、2019年1月2日現在の1.13.1ではスペースではなく、ドットにて設定する必要があるので注意。今後、さらに新しいバージョンでは設定が変更されている可能性があるので注意。

    apiVersion: kubeadm.k8s.io/v1beta1
    kind: ClusterConfiguration
    controllerManager:
    ..ExtraArgs:
    ….pod-eviction-timeout: 10s
    ….node-monitor-grace-period: 10s

  3. kubeadm initの実行

    $ sudo kubeadm init –config kubeadm_conf.yaml

  4. kubeadmの初期化は時間がかかるため完了するまで待機。終了時に “Your Kubernetes master has initialized successfully!” というメッセージが出るので、その内容を必ずメモしておく
    Your Kubernetes master has initialized successfully!
    
    To start using your cluster, you need to run the following as a regular user:
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
    You can now join any number of machines by running the following on each node 
    as root:
    
      kubeadm join 192.168.11.90:6443 --token {MYTOKEN} --discovery-token-ca-cert-hash {MYHASH}
  5. kubeadm initの結果のガイドに従い、緑色部分のコマンドを実行
    $  mkdir -p $HOME/.kube
    $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    $  sudo chown $(id -u):$(id -g) $HOME/.kube/config

ワーカーノード

  1. 2台目のRaspberry Piをワーカーノードとして追加するため、マスターノードを初期化した際の最後に表示されたガイドの青字部分のコマンドをsuduにて実行。{MYTOKEN}と{MYHASH}の部分は便宜上変数値としているが、実際には初期化した環境で表示されたものを実行すること。

    $ sudo kubeadm join 192.168.11.90:6443 –token {MYTOKEN} –discovery-token-ca-cert-hash {MYHASH}

  2. 3台目以降のRaspberry Piにも同じコマンドを実行

コンテイナーネットワークの設定

ノード間通信を行うためにコンテイナーネットワークが必要となる。ここではWeave-netを用いて設定する。

  1. kubectl applyを実行
    $ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

 

以上で一通りの設定が終了。kubectl get nodesを実行して全ノードがうまくつながっているかを確認。タイミングによってはSTATUSがNotReadyになっているかもしれないし、コンテイナーネットワークを設定する前に実行するとSTATUSはNotReadyとなっている。

kubectlコマンド

  • kubectl get nodes
    $ kubectl get nodes
    NAME            STATUS    ROLES     AGE       VERSION
    k8s-master      Ready     master    24h       v1.13.1
    k8s-worker-01   Ready               4h16m     v1.13.1
    k8s-worker-02   Ready               4h16m     v1.13.1
    
  • kubectl get pods –all-namespaces
    $ kubectl get pods --all-namespaces
    NAMESPACE     NAME                                    READY   STATUS        RESTARTS   AGE
    kube-system   coredns-86c58d9df4-4h2kx                1/1     Terminating   0          19d
    kube-system   coredns-86c58d9df4-g5gls                1/1     Running       0          92m
    kube-system   coredns-86c58d9df4-sml8w                1/1     Terminating   0          19d
    kube-system   coredns-86c58d9df4-tn5qk                1/1     Running       0          92m
    kube-system   etcd-k8s-master                         1/1     Running       2          19d
    kube-system   kube-apiserver-k8s-master               1/1     Running       2          19d
    kube-system   kube-controller-manager-k8s-master      1/1     Running       2          19d
    kube-system   kube-proxy-7xkn7                        1/1     Running       1          18d
    kube-system   kube-proxy-ghvzl                        1/1     Running       2          19d
    kube-system   kube-proxy-plcbg                        1/1     Running       0          18d
    kube-system   kube-scheduler-k8s-master               1/1     Running       2          19d
    kube-system   kubernetes-dashboard-56bcddb89b-tstml   1/1     Running       1          18d
    kube-system   weave-net-dq748                         2/2     Running       3          18d
    kube-system   weave-net-rzbpm                         2/2     Running       3          18d
    kube-system   weave-net-xvsd8                         2/2     Running       0          18d

コメントを残す

メールアドレスが公開されることはありません。