第一次使用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作为控制平面节点。

raspi4-master.jpeg

安装操作系统

在考虑使用树莓派时,首先要考虑的是树莓派操作系统(之前称为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 的清单”

    1. 初次接触Kubernetes – 1.环境配置

 

    初次接触Kubernetes – 2.Kubernetes安装
bannerAds