LoginSignup
6
11

More than 3 years have passed since last update.

一足遅れて Kubernetes を学び始める - 03. Raspberry Pi -

Last updated at Posted at 2019-04-28

ストーリー

  1. 一足遅れて Kubernetes を学び始める - 01. 環境選択編 -
  2. 一足遅れて Kubernetes を学び始める - 02. Docker For Mac -
  3. 一足遅れて Kubernetes を学び始める - 03. Raspberry Pi -
  4. 一足遅れて Kubernetes を学び始める - 04. kubectl -
  5. 一足遅れて Kubernetes を学び始める - 05. workloads その1 -
  6. 一足遅れて Kubernetes を学び始める - 06. workloads その2 -
  7. 一足遅れて Kubernetes を学び始める - 07. workloads その3 -
  8. 一足遅れて Kubernetes を学び始める - 08. discovery&LB その1 -
  9. 一足遅れて Kubernetes を学び始める - 09. discovery&LB その2 -
  10. 一足遅れて Kubernetes を学び始める - 10. config&storage その1 -
  11. 一足遅れて Kubernetes を学び始める - 11. config&storage その2 -
  12. 一足遅れて Kubernetes を学び始める - 12. リソース制限 -
  13. 一足遅れて Kubernetes を学び始める - 13. ヘルスチェックとコンテナライフサイクル -
  14. 一足遅れて Kubernetes を学び始める - 14. スケジューリング -
  15. 一足遅れて Kubernetes を学び始める - 15. セキュリティ -
  16. 一足遅れて Kubernetes を学び始める - 16. コンポーネント -

前回

一足遅れて Kubernetes を学び始める - 02. Docker For Mac -では、MacでKubernetesを軽く動かしてみました。DockerForMacでは、NodeがMasterのみだったため、Kubernetesを学習するには、ものたりない感がありました。そこで、RaspberryPiを使っておうちKubernetesを構築することになりました。

@go_vargoさんのRaspberry PiでおうちKubernetes構築【物理編】, Raspberry PiでおうちKubernetes構築【論理編】をベースに進めていきます。

他、参考サイト

レシピ

商品名 個数 用途
Raspberry Pi 3 Model B 3つ MasterNode1台
WorkerNode2台
microSDHCカード 16GB 3枚 RaspberryPiのimage書き込み先
LANケーブル 1本 RaspberryPiとネットワーク接続
USB充電器 1台 RaspberryPiの電源
Micro USBケーブル 4本 RaspberryPiとUSB充電器をつなげる
for Raspberry Pi ケース 専用 4段
ヒートシンク付
1台 4段
(3:RaspberryPi,1:USB充電器)

RaspberryPiは世代3のModelBならWiFi接続できるので、自宅のWiFiにつなげることにしました。自宅ではSoftbankAirを使っています。
(ただし、初回のみLANケーブルでネットワーク接続します)

また、私の環境は下記のとおりです。

machine
iMac (21.5-inch, 2017)

構築(物理)

Raspberry PiでおうちKubernetes構築【物理編】で十分な情報があります。こちらを参考にして組み立てします。
できたものがこちらです。
kubernetes_raspberrypi.png

WiFiを使うために、LANケーブルやWiFi親機などがなくなり、スッキリしました。
電源を確保できるところであれば、家の中なら、どこでも持ち運びできます。 :sparkles:

構築(論理)

Raspbian Stretch Liteをダウンロードしておきます。
2019-04-08-raspbian-stretch-lite.img

Stepの1から3までの手順をRaspberryPi一台ずつ 、下記の手続きを踏んでいきます。

1. 初期設定

microSDカードをMacにつなげた後に、下記を実施します。

$ diskutil list
$ sudo diskutil umount /dev/disk3s1
$ sudo dd bs=1m if=2019-04-08-raspbian-stretch-lite.img of=/dev/rdisk3 conv=sync
$ cd /Volumes/boot
$ touch ssh
$ vim cmdline.txt
# 下記を末尾に追記
cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

イメージを書き込み際、r をつける (rdisk3)と、高速になるそうです。

2. RaspberryPiに接続

MicroSDカードをRaspbeeryPiに挿入し、電源をつけたら、下記を実施します。
LANケーブルは、自宅のWiFiに直接つなげます。(私の場合はSoftBankAir)

hostnameは、お好みの名前にします。(私は、Master:raspi001, Worker:raspi002,raspi003としました。)

$ slogin pi@raspberrypi.local
# 初回password「raspberry」
pi@raspbeerypi:~ $ sudo passwd pi
pi@raspbeerypi:~ $ sudo apt-get update && sudo apt-get -y upgrade && sudo apt-get install -y vim
pi@raspbeerypi:~ $ sudo vim /etc/hostname
pi@raspbeerypi:~ $ sudo sh -c 'wpa_passphrase <SSID> <PASSWORD> >> /etc/wpa_supplicant/wpa_supplicant.conf'
pi@raspbeerypi:~ $ sudo shutdown -r now

※ 2回目以降は、ssh-keygen -R raspberrypi.localをしましょう。

電源を落として、LANケーブルを外します。再度電源をつけて数分待ってから、下記を実施します。

$ slogin pi@raspi001.local
pi@raspi001:~ $ 

接続できたら成功です。

3. 各種インストール

おまじないをします。

pi@raspi001:~ $ sudo dphys-swapfile swapoff && sudo dphys-swapfile uninstall && sudo update-rc.d dphys-swapfile remove

Dockerをインストールします。

pi@raspi001:~ $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y
pi@raspi001:~ $ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
pi@raspi001:~ $ echo "deb [arch=armhf] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
     $(lsb_release -cs) stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list
pi@raspi001:~ $ sudo apt-get update -y
pi@raspi001:~ $ sudo apt-get install docker-ce -y

Kubernetesをインストールします。

pi@raspi001:~ $ curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg|sudo apt-key add - 
pi@raspi001:~ $ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kube.list
pi@raspi001:~ $ sudo apt-get update -y && sudo apt-get install kubelet kubeadm kubectl -y

4. MasterNodeの設定

MasterNodeにするRaspberryPiに対して下記を実施します。

pi@raspi001:~ $ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
pi@raspi001:~ $ mkdir -p $HOME/.kube
pi@raspi001:~ $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
pi@raspi001:~ $ sudo chown $(id -u):$(id -g) $HOME/.kube/config

出力されるjoinメッセージをメモしておき、WorkerNodeの構築時に使います。

こちらに従い下記を実行します。

pi@raspi001:~ $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
pi@raspi001:~ $ kubectl get pods --all-namespaces
NAMESPACE     NAME                               READY   STATUS              RESTARTS   AGE
kube-system   coredns-fb8b8dccf-lglcr            0/1     ContainerCreating   0          4d16h
kube-system   coredns-fb8b8dccf-snt7d            0/1     ContainerCreating   0          4d16h
...

5. WorkerNodeの設定

MasterNodeから出力されたjoinコマンドを実施します。

pi@raspi002 $ kubeadm join 192.168.3.32:6443 --token X \
    --discovery-token-ca-cert-hash sha256:X

6. MasterNodeから確認

Nodeが増えているか確認します。

pi@raspi001:~ $ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
raspi001   Ready    master   65m   v1.14.1
raspi002   Ready    <none>   18m   v1.14.1
raspi002   Ready    <none>   18m   v1.14.1
pi@raspi001:~ $ kubectl label node raspi002 node-role.kubernetes.io/worker=worker
pi@raspi001:~ $ kubectl label node raspi003 node-role.kubernetes.io/worker=worker
pi@raspi001:~ $ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
raspi001   Ready    master   65m   v1.14.1
raspi002   Ready    worker   37m   v1.14.1
raspi003   Ready    worker   37m   v1.14.1

7. ブラウザから確認

試しにデプロイ→サービス公開→ブラウザ確認までを、さっと通してみます。

pi@raspi001:~ $ kubectl run nginx --image=nginx --replicas=1 --port=80
pi@raspi001:~ $ kubectl expose deployment nginx --port 80 --target-port 80 --type NodePort
pi@raspi001:~ $ kubectl get svc nginx
NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.99.227.194   <none>        80:30783/TCP   17m

サービス公開までしたので、アクセスしてみます。

内部

pi@raspi001:~ $ curl http://10.99.227.194:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>

外部

pi@raspi001:~ $ ifconfig
...
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.32  netmask 255.255.255.0  broadcast 192.168.3.255

http://192.168.3.32:30783にアクセス

nginx

OK!

お片付け

pi@raspi001:~ $ kubectl delete deployments nginx
deployment.extensions "nginx" deleted
pi@raspi001:~ $ kubectl  delete service nginx
service "nginx" deleted

完成

すんなりと構築することができました。これは先人たちの記事がたくさんあるので、
サクサクと進めることができました。これで、Kubernetesを使いまくります!! :muscle: :muscle:
次回はこちらです。

6
11
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
6
11