第一次使用Kubernetes – 2.Kubernetes的安装
首先
那么,我们将在上一次构建的 Raspberry Pi 3 Model B 上安装操作系统和 Kubernetes。然而,首先我必须说一句道歉的话。
我尝试在Raspberry Pi 3 Model B上运行Kubernetes的控制平面节点,但由于性能不足,它无法正常运行。
因此,我决定将四台Raspberry Pi 3 Model B作为工作节点,将一台Raspberry Pi 4 Model B (4GB)作为控制平面节点。
我已经添加了一台设备,就是这样。
我决定将这个Raspberry Pi 4 Model B作为控制平面节点。

安装操作系统
在考虑使用树莓派时,首先要考虑的是树莓派操作系统(之前称为Raspbian)。但是,如果查看kubeadm的安装情况,树莓派操作系统并不受支持。因此,我们决定安装Ubuntu 20.04-LTS(64位)。
实际上,在Raspberry Pi OS上也可以安装Kubernetes并且运行良好。但是由于遇到问题时可能很少有相似经验的人可以帮助,会变得麻烦。所以我会选择Ubuntu。
在Raspberry Pi 2、3或4上安装Ubuntu服务器,请下载适用于Raspberry Pi 3的Ubuntu 20.04 LTS(64位)镜像。
准备SD卡
当OS镜像下载完成后,解压并将其写入microSD卡。
~/Downloads ❯❯❯ xz -dv ubuntu-20.04-preinstalled-server-arm64+raspi.img.xz
ubuntu-20.04-preinstalled-server-arm64+raspi.img.xz (1/1)
100 % 667.0 MiB / 3,054.4 MiB = 0.218 92 MiB/s 0:33
据说您可以使用Raspberry Pi Imager这个工具来写入操作系统镜像,就像这里所展示的一样。但是我的笔记本电脑是Ubuntu系统,因此我也可以使用dd命令来进行写入。
~/Downloads ❯❯❯ sudo dd if=ubuntu-20.04-preinstalled-server-arm64+raspi.img of=/dev/mmcblk0 status=progress
3201147392 bytes (3.2 GB, 3.0 GiB) copied, 622 s, 5.1 MB/s
6255474+0 records in
6255474+0 records out
3202802688 bytes (3.2 GB, 3.0 GiB) copied, 627.603 s, 5.1 MB/s
我们将执行这个任务,需要5张microSD卡(ControlPlane x 1, Node x 4)。
设定
从这里开始进行设置,但是在5台树莓派上连接显示器+键盘+鼠标来进行操作有点麻烦。因此,我们将在不连接这些外围设备的情况下进行设置。
实际上,该方法在《如何在树莓派上安装Ubuntu》中有说明,非常简单。另外,这也是一个参考。
当插入或拔出已经刷入操作系统镜像的microSD卡时,以下的分区会自动挂载。
~/Downloads ❯❯❯ df -k
...
/dev/mmcblk0p2 2754000 1813920 780472 70% /media/$USER/writable
/dev/mmcblk0p1 258095 62017 196079 25% /media/$USER/system-boot
设置IP地址。设置K8s集群的IP地址如下所示。
-
- hostname: k8s-master,ip address: 192.168.0.19/24
-
- hostname: k8s-node0, ip address: 192.168.0.10/24
-
- hostname: k8s-node1, ip address: 192.168.0.11/24
-
- hostname: k8s-node2, ip address: 192.168.0.12/24
- hostname: k8s-node3, ip address: 192.168.0.13/24
~/Downloads ❯❯❯ cd /media/$USER/system-boot
/m/n/system-boot ❯❯❯ vim network-config
version: 2
ethernets:
eth0:
dhcp4: no
addresses: [192.168.0.10/24]
gateway4: 192.168.0.1
nameservers:
addresses: [192.168.0.1,8.8.8.8]
optional: true
接下来要进行主机名和用户密码的设置。
/m/n/system-boot ❯❯❯ vim user-data
fqdn: k8s-node0
chpasswd:
expire: false
list:
- ubuntu:ubuntu
下面是Raspberry Pi 4 Ubuntu 19.10中无法在引导时启用cgroup内存,因此需要启用以满足Docker/K8s的需求。
~ ❯❯❯ vim /media/$USER/system-boot/cmdline.txt
-net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc
+net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 rootwait fixrtc
完成以上的設定後,請將microSD卡進行卸載,並插入樹莓派。
~ ❯❯❯ umount /media/naomori/system-boot
~ ❯❯❯ umount /media/naomori/writable
我們將同樣進行K8s集群的配置,包括5台機器(ControlPlane x 1,Node x 4)。
用 SSH 登录
一旦打开树莓派电源,我们将通过SSH登录(用户名:ubuntu,密码:ubuntu)。然后,我们将无需秘密密码的公钥复制到所有K8s集群上,以便方便登录。
~/Downloads ❯❯❯ ssh ubuntu@192.168.0.10
~/Downloads ❯❯❯ scp ~/.ssh/id_rsa.pub ubuntu@192.168.0.10:
ubuntu@k8s-node0:~$ cat id_rsa.pub >> .ssh/authorized_keys
ubuntu@k8s-node0:~$ rm -f id_rsa.pub
开始时做的事情
ubuntu@k8s-node0:~$ sudo apt update && sudo apt upgrade -y
此外,为了方便访问每个节点,我们会在/etc/hosts中添加条目。
ubuntu@k8s-node0:~$ sudo vim /etc/hosts
# K8s
192.168.0.19 k8s-master
192.168.0.10 k8s-node0
192.168.0.11 k8s-node1
192.168.0.12 k8s-node2
192.168.0.13 k8s-node3
我会设定时间。
ubuntu@k8s-node0:~$ sudo timedatectl set-timezone Asia/Tokyo
ubuntu@k8s-node0:~$ timedatectl
Local time: Mon 2020-07-06 22:13:48 JST
Universal time: Mon 2020-07-06 13:13:48 UTC
RTC time: n/a
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
安装Docker
根据在Ubuntu上安装Docker的参考,安装Docker引擎。
ubuntu@k8s-node0:~$ sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
ubuntu@k8s-node0:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
ubuntu@k8s-node0:~$ sudo apt-key fingerprint 0EBFCD88
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
ubuntu@k8s-node0:~$ sudo add-apt-repository \
"deb [arch=arm64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
ubuntu@k8s-node0:~$ sudo apt update
根据这里的说明,指定Docker的版本进行安装。
ubuntu@k8s-node0:~$ sudo apt install -y \
containerd.io=1.2.13-2 \
docker-ce=5:19.03.11~3-0~ubuntu-$(lsb_release -cs) \
docker-ce-cli=5:19.03.11~3-0~ubuntu-$(lsb_release -cs)
由于与Kubernetes的版本依赖问题,将docker-ce版本固定为当前版本。
ubuntu@k8s-node0:~$ sudo apt-mark hold containerd.io docker-ce docker-ce-cli
containerd.io set on hold.
docker-ce set on hold.
docker-ce-cli set on hold.
我将更改Docker的设置。
ubuntu@k8s-node0:~$ sudo vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
ubuntu@k8s-node0:~$ sudo mkdir -p /etc/systemd/system/docker.service.d
ubuntu@k8s-node0:~$ sudo systemctl daemon-reload
ubuntu@k8s-node0:~$ sudo systemctl restart docker
ubuntu@k8s-node0:~$ sudo usermod -aG docker ubuntu
ubuntu@k8s-node0:~$ sudo systemctl enable docker
我要完成以上的任务,有5个设备(控制平面 1 台,节点 4 台)。
Kubernetes的安装
参照 kubeadm 安装指南来进行安装。
禁用iptables使用nftables后端。
ubuntu@k8s-node0:~$ sudo apt-get install -y iptables arptables ebtables
ubuntu@k8s-node0:~$ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
ubuntu@k8s-node0:~$ sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
ubuntu@k8s-node0:~$ sudo update-alternatives --set arptables /usr/sbin/arptables-legacy
ubuntu@k8s-node0:~$ sudo update-alternatives --set ebtables /usr/sbin/ebtables-legacy
kubeadm 的安装
ubuntu@k8s-node0:~$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl
ubuntu@k8s-node0:~$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
ubuntu@k8s-node0:~$ cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
ubuntu@k8s-node0:~$ sudo apt update
ubuntu@k8s-node0:~$ sudo apt install -y kubelet kubeadm kubectl
ubuntu@k8s-node0:~$ sudo apt-mark hold kubelet kubeadm kubectl
kubelet set on hold.
kubeadm set on hold.
kubectl set on hold.
交换失效
为了使kubelet正常运行,必须禁用swap。因此,我们将禁用swap。
ubuntu@k8s-node0:~$ sudo swapoff -a
上述的工作将会完成5个单位(ControlPlane x 1,Node x 4)。
使用kubeadm创建单控制平面集群
参考使用kubeadm创建单个控制平面集群时,我们将创建一个Kubernetes集群。我们将使用kube-router作为网络解决方案。
控制平面节点的初始化
我在Master节点上执行以下操作。
ubuntu@k8s-master:~$ sudo kubeadm init --pod-network-cidr=10.1.0.0/16
Your Kubernetes control-plane 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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.0.19:6443 --token n1o5q2.coajyablijtdj1qb \
--discovery-token-ca-cert-hash sha256:5e0856b519d1f97db37fa1742c4613f99ef3f9eafd4a7bbbf5a5d270145c81bb
一旦完成后,被告知执行以下操作,我会按照要求去做。
ubuntu@k8s-master:~$ mkdir -p $HOME/.kube
ubuntu@k8s-master:~$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
ubuntu@k8s-master:~$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装Pod网络插件
我决定使用 kube-router 作为 Pod 网络。我将参考使用 kubeadm 部署 kube-router。
ubuntu@k8s-master:~$ KUBECONFIG=$HOME/.kube/config kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
ubuntu@k8s-master:~$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-66bff467f8-j8snh 1/1 Running 0 19m
coredns-66bff467f8-ntsxk 1/1 Running 0 19m
etcd-k8s-master 1/1 Running 0 19m
kube-apiserver-k8s-master 1/1 Running 0 19m
kube-controller-manager-k8s-master 1/1 Running 0 19m
kube-proxy-87dh9 1/1 Running 0 19m
kube-router-xlw62 1/1 Running 0 17m
kube-scheduler-k8s-master 1/1 Running 0 19m
节点的加入
在k8s-node[0-3]上运行以下命令,使其加入K8s集群。
ubuntu@k8s-node0:~$ sudo kubeadm join 192.168.0.19:6443 --token n1o5q2.coajyablijtdj1qb --discovery-token-ca-cert-hash sha256:5e0856b519d1f97db37fa1742c4613f99ef3f9eafd4a7bbbf5a5d270145c81bb
...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
我会确认全部都已经开始运行了。
ubuntu@k8s-master:~$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-66bff467f8-j8snh 1/1 Running 0 45m
coredns-66bff467f8-ntsxk 1/1 Running 0 45m
etcd-k8s-master 1/1 Running 0 45m
kube-apiserver-k8s-master 1/1 Running 0 45m
kube-controller-manager-k8s-master 1/1 Running 0 45m
kube-proxy-4skhr 1/1 Running 0 19m
kube-proxy-5b7k9 1/1 Running 0 20m
kube-proxy-87dh9 1/1 Running 0 45m
kube-proxy-n6w99 1/1 Running 0 19m
kube-proxy-tw7cr 1/1 Running 0 20m
kube-router-65lkl 1/1 Running 0 20m
kube-router-np5z5 1/1 Running 0 20m
kube-router-ntzkv 1/1 Running 0 19m
kube-router-xlw62 1/1 Running 0 43m
kube-router-zjhd6 1/1 Running 0 19m
kube-scheduler-k8s-master 1/1 Running 0 45m
检查节点的运行状态。
ubuntu@k8s-master:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 33m v1.18.5
k8s-node0 Ready <none> 8m10s v1.18.5
k8s-node1 Ready <none> 7m34s v1.18.5
k8s-node2 Ready <none> 7m37s v1.18.5
k8s-node3 Ready <none> 7m32s v1.18.5
设定角色
ubuntu@k8s-master:~$ kubectl label nodes k8s-node0 kubernetes.io/role=node
ubuntu@k8s-master:~$ kubectl label nodes k8s-node1 kubernetes.io/role=node
ubuntu@k8s-master:~$ kubectl label nodes k8s-node2 kubernetes.io/role=node
ubuntu@k8s-master:~$ kubectl label nodes k8s-node3 kubernetes.io/role=node
ubuntu@k8s-master:~$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 85m v1.18.5
k8s-node0 Ready node 60m v1.18.5
k8s-node1 Ready node 60m v1.18.5
k8s-node2 Ready node 60m v1.18.5
k8s-node3 Ready node 60m v1.18.5
ubuntu@k8s-master:~$ kubectl cluster-info
Kubernetes master is running at https://192.168.0.19:6443
KubeDNS is running at https://192.168.0.19:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
使用 kubectl 命令从另一个节点(Ubuntu 20.04 LTS)进行控制。
你还可以从另一个节点(Ubuntu 20.04 LTS)上执行kubectl命令。按照“安装和设置kubectl”进行kubectl安装。
~ ❯❯❯ sudo snap install kubectl --classic
在主节点上复制输出。
ubuntu@k8s-master:~$ kubectl config view --raw
将其粘贴到另一个节点的~/.kube/config中。
~ ❯❯❯ vim ~/.kube/config
您可以从任何节点执行kubectl命令。您还可以通过kubectl completion完成命令的补全。
概括
我已经成功搭建了一个Kubernetes集群,其中控制平面节点是一台树莓派4模型B,节点使用了四台树莓派3模型B。
接下来,我打算从学习Docker一步步进入到学习Kubernetes,并从容器开发一直到K8s的正式运营,来全面学习Kubernetes。虽然我还没有看完全部内容,但是我觉得这本书的架构和组件解释非常易懂,是一本很好的书。
“第一次使用 Kubernetes 的清单”
-
- 初次接触Kubernetes – 1.环境配置
- 初次接触Kubernetes – 2.Kubernetes安装