自分で環境を組み立てることで理解するタイプの人間にはRaspberry Piはうってつけ。ということで、k8sクラスタを組んでみることにしました。
幸いなことにすでに実施されている方がいるので、基本はその手順ににそってやるだけなんですが、汗。
準備
- 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
手順
基本設定
- Raspbian Stretch Liteをダウンロード https://www.raspberrypi.org/
- Etcherなどを用いてSDカードにFlash!
https://www.balena.io/etcher/
- Raspberry Piを起動しraspi-configを実行
- 2 Network Optionsを選択
- N1 Hostnameを選択してホスト名を設定
- 設定にて決定した名前を入力してOK
- ホスト名の設定後、同じ2 Network OptionsにあるN2 Wi-Fiを選択してWi-Fiの設定
- トップに戻り5 Interfacing Optionsを選択
- P2 SSHを選択してSSHを有効化
- その他、タイムゾーンやロケールなどは任意に設定
- /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 - Raspberry Piを再起動
- 同一ネットワーク内のリモート端末からSSHでRaspberry Piに接続
$ ssh pi@k8s-master.local
- 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
- スクリプトを実行
$ sh install.sh
- Dockerをサービス化
$ sudo systemctl enable docker.service
- Dockerをサービスにて実行
$ sudo systemctl start docker.service
- 上記手順を2台目以降のRaspberry Piにて実施。ホスト名、IPアドレスは2台目以降に決定した設定を行う。
Kubernetesクラスタの設定
マスターノード
- kubeadmを用いてKubernetesマスターをイニシャライズを実行する前にpod-eviction-timeoutの設定とnode-monitor-grace-periodの設定が初期値は長いため変更。
初期値 変更値 pod-eviction-timeout 5 min 10 sec node-monitor-grace-period 40 sec 10 sec - 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 - kubeadm initの実行
$ sudo kubeadm init –config kubeadm_conf.yaml
- 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}
- 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
ワーカーノード
- 2台目のRaspberry Piをワーカーノードとして追加するため、マスターノードを初期化した際の最後に表示されたガイドの青字部分のコマンドをsuduにて実行。{MYTOKEN}と{MYHASH}の部分は便宜上変数値としているが、実際には初期化した環境で表示されたものを実行すること。
$ sudo kubeadm join 192.168.11.90:6443 –token {MYTOKEN} –discovery-token-ca-cert-hash {MYHASH}
- 3台目以降のRaspberry Piにも同じコマンドを実行
コンテイナーネットワークの設定
ノード間通信を行うためにコンテイナーネットワークが必要となる。ここではWeave-netを用いて設定する。
- 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