Skip to content

Instantly share code, notes, and snippets.

@ShotaKitazawa
Last active June 14, 2018 00:23
Show Gist options
  • Select an option

  • Save ShotaKitazawa/a8c25d098fd2ef526179dfb5b024bf28 to your computer and use it in GitHub Desktop.

Select an option

Save ShotaKitazawa/a8c25d098fd2ef526179dfb5b024bf28 to your computer and use it in GitHub Desktop.
Kubernetes Node for Raspberry Pi

OS

Raspbian GNU/Linux 9 (stretch)

初期設定

パッケージのインストール

apt install telnet curl lsof tmux tcpdump git locate vim

ネットワーク設定

Network Manager をインストールします。

apt install network-manager

Network Manager を有効にします。

systemctl disable --now networking.service
systemctl enable --now network-manager

/etc/network/interfaces のバックアップを取ります。

yes no | cp -ai /etc/network/interfaces{,.default}

/etc/network/interfaces の設定を無効化します。

perl -pi -e 's|^|#|g' /etc/network/interfaces

eth0 の IPアドレスを固定します。

MY_ADDRESS="192.168.13.2/24"
nmcli con add ifname eth0 con-name eth0 type ethernet ipv4.addresses $MY_ADDRESS ipv4.dns 192.168.13.1 ipv4.gateway 192.168.13.1

root ユーザのパスワードを登録します。

# passwd
(パスワードを入力します)

hosts ファイルの編集

cat << '_EOF_' >> /etc/hosts
# for k8s
192.168.13.2    k8s01
192.168.13.3    k8s02
192.168.13.4    k8s03
_EOF_

SSH 設定

SSH の設定を行います。当設定後、PuTTY 等の SSH クライアントよりリモートログインが可能となります。

インストール

OpenSSH サーバーをインストールします。

apt install openssh-server

設定

root ユーザへのリモートログインを許可します

perl -pi -e 's|^(PermitRootLogin) .*|$1 yes|g' /etc/ssh/sshd_config

鍵追加

cd $HOME
mkdir .ssh && chmod 700 .ssh
cat << _EOF_ >> .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBNnWw32jjCM0fZeMcaW4RdD5pdMLUe7hP5aRPPBrSPJS0f0BOuJj5x90P9QcfvWI+AygbxWLU2DNdazDZPaVCgViZtM73xLtpru3rmTK6ogDdsgSEcok819bVnwTj5RPa3RveBiv8UyXSb9igegFwCTpvz51a9Wy2lCyhFP5/STmTc9I9WwFsf3X8bZUvpRElWX9xQGgbdQM37pSnrsf1cbUwpQre034y5LSfU3FSiqFd5UK8HUoGnbefaAQifLrsf0WGGs059hSluOdn6NqFtG/67liPBEB6DAIwCujuzTQBfrCcqAteX7qKi6FIVJhsxJcd6nj/5kpjys9Har01
_EOF_
chmod 600 .ssh/authorized_keys

設定の反映

設定を反映します。

systemctl restart sshd

Docker

TODO: Docker のインストール

Kubernetes

Kubernetes クライアントの kubectl をインストールします。

TODO: バイナリの配置

Kubernetes 初期設定

各 Kubernetes コンポーネントで使用される共通の認証用ファイルを作成します。当手順では認証に X.509 Client Certs (デジタル証明書を用いたユーザ認証) を用います。

当ファイルは Master Node にて作成し、各 Node に配布されます。以降の手順は配布後に行ってください。

kubernetes-cni

kubernetes-cni をインストールします。これにより Kubernetes から様々なソフトウェア (ex. ovs, flannel, calico) を用いた Node 間通信が可能となります。

mkdir -p /opt/cni/bin
cd /opt/cni/bin
wget https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-arm64-v0.7.1.tgz
tar xvzf cni-plugins-amd64-v0.7.1.tgz
rm -f cni-plugins-amd64-v0.7.1.tgz

設定ファイルを作成します。

mkdir -p /etc/cni/net.d/
cat << '_EOF_' > /etc/cni/net.d/flannel.conflist 
{
  "name": "flannel0",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}
_EOF_

kubelet

TODO: バイナリの配置

systemd ファイルを作成します。

cat << '_EOF_' > /etc/systemd/system/kubelet.service 
[Unit]
Description=kubelet
Documentation=http://kubernetes.io/docs/

[Service]
CPUShares=700
MemoryLimit=250M

EnvironmentFile=/etc/default/kubelet

ExecStart=/usr/bin/kubelet $KUBE_OPTS

ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target
_EOF_
systemctl daemon-reload

設定ファイルを作成します。

cat << _EOF_ > /etc/default/kubelet
KUBE_OPTS="--v=1 \\
--address=0.0.0.0 \\
--port=10250 \\
--container-runtime=docker \\
--kubeconfig=${HOME}/.kube/config \\
--fail-swap-on=false  \\
--network-plugin=cni \\
--cni-conf-dir=/etc/cni/net.d \\
--cni-bin-dir=/opt/cni/bin \\
--cluster-dns=10.254.0.254 \\
--cluster-domain=cluster.local \\
"
_EOF_
  • cgroups にてメモリ割当を許可します。
    • 各リソースに cgroup が割り当てられていることを確認します。
# cat /proc/cgroups 
#subsys_name	hierarchy	num_cgroups	enabled
cpuset	8	5	1
cpu	5	69	1
cpuacct	5	69	1
blkio	9	69	1
memory	2	104	1
devices	3	69	1
freezer	11	5	1
net_cls	7	5	1
perf_event	10	5	1
net_prio	7	5	1
hugetlb	4	5	1
pids	6	70	1
  • 割り当てられていないリソースがある場合、 /boot/cmdline.txt の1行目の末尾に追記して再起動
    • 以下はメモリの例
cgroup_enable=memory cgroup_memory=1

起動します。

systemctl enable --now kubelet.service

kube-proxy

TODO: バイナリの配置

systemd ファイルを作成します。

cat << '_EOF_' > /etc/systemd/system/kube-proxy.service
[Unit]
Description=kube-proxy
Documentation=http://kubernetes.io/docs/

[Service]
CPUShares=700
MemoryLimit=250M

EnvironmentFile=/etc/default/kube-proxy

ExecStart=/usr/bin/kube-proxy $KUBE_OPTS

ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target
_EOF_
systemctl daemon-reload

設定ファイルを作成します。

cat << _EOF_ > /etc/default/kube-proxy
KUBE_OPTS="--v=1 \\
--bind-address=0.0.0.0 \\
--master=https://k8s01:6443 \\
--kubeconfig=${HOME}/.kube/config \\
"
_EOF_

起動します。

systemctl enable --now kube-proxy.service

flannel

TODO: バイナリの配置

systemd ファイルを作成します。

cat << '_EOF_' > /etc/systemd/system/flanneld.service 
[Unit]
Description=flanneld
Documentation=http://kubernetes.io/docs/

[Service]
CPUShares=700
MemoryLimit=250M

EnvironmentFile=/etc/default/flanneld

ExecStart=/usr/bin/flanneld $FLANNEL_OPTS

ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target
_EOF_
systemctl daemon-reload

設定ファイルを作成します。

cat << '_EOF_' > /etc/default/flanneld
FLANNEL_OPTS="-v=1 \
-etcd-endpoints http://k8s01:2379 \
-etcd-username etcd-1 \
-iface eth0 \
-kube-api-url http://k8s01:8080 \
"
_EOF_

起動します。

systemctl enable --now flanneld.service
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment