树莓派4B Ubuntu1804 构建K8s技术方案

说明:该方案基于树莓派镜像:raspi4b_k8s_init_mini.img,该方案不用翻qiang,不用翻qiang,不用翻qiang!

硬件版本:树莓派4b,4G版本,预装ubuntu-18.04.5-preinstalled-server-arm64+raspi4.img.xz

该镜像已安装docker 18.09.9,Cgroup Driver: systemd,Storage Driver: overlay2,

并设置 apt-mark hold docker-ce docker-ce-cli containerd.io

镜像已完成k8s v1.15.12 版本的 kubelet kubeadm kubectl 的组件安装,当尚未初始化

镜像中已包含如下与该版本匹配的k8s官方镜像,均已载入docker!

k8s.gcr.io/kube-apiserver:v1.15.12
k8s.gcr.io/kube-controller-manager:v1.15.12
k8s.gcr.io/kube-scheduler:v1.15.12
k8s.gcr.io/kube-proxy:v1.15.12
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

此外,镜像已整合 flannel 模块,并已载入 quay.io/coreos/flannel:v0.12.0-arm64镜像,待k8s安装完成,按照yaml文件初始化即可!镜像的使用会放在末尾介绍,下面主要是笔者构建整个集群的方法。

1、准备工作

// 关闭防火墙:
ufw disable
// 关闭交换空间:
swapoff -a
// 设置主机名
hostnamectl set-hostname k8s-master
// 设置内核路由转发
vim /etc/sysctl.conf
修改:net.ipv4.ip_forward = 1  #开启ipv4转发,允许内置路由
// 使设置生效
sysctl -p 
// 设置hosts地址解析
vim /etc/hosts
192.168.253.8 k8s-master
192.168.253.11 k8s-node01
192.168.253.12 k8s-node02
192.168.253.21 k8s-Edge01
192.168.253.22 k8s-Edge02
// 设置时区(亚洲,中国,北京)
tzselect
依次输入:
4 - 9 - 1 - 1
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
// 换源
cp /etc/apt/sources.list /etc/apt/sources.list.backup // 官方源备份
vim /etc/apt/sources.list                             // 插入中科大源
/*------------------------------- 适用于 Ubuntu 1804 ---------------------------------------*/
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security multiverse
// 更新
apt update && apt upgrade
// 开启树莓派WiFi
ifconfig wlan0 up
// 配置树莓派使用WiFi下的静态IP:
// 修改文件
vim /etc/netplan/50-cloud-init.yaml
network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
    wifis:
        wlan0:
            access-points:
                "WiFi名":
                     password: "密码"
            dhcp4: false
            dhcp6: no
            addresses: [192.168.253.12/24]
            gateway4: 192.168.253.1
            nameservers:
                addresses: [192.168.253.1, 223.5.5.5]
    version: 2
// 注意冒号之后的空格与缩进!
//启用 net.bridge.bridge-nf-call-iptables 和 -iptables6
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system

2、软件环境(docker的安装)

为保证k8s与项目框架的契合,选择使用k8s v1.15.12 版本,该版本官方最高支持到docker 18.09

(
cat <<EOF
deb [arch=arm64] https://download.docker.com/linux/ubuntu bionic stable
EOF
) > /etc/apt/sources.list.d/docker.list
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
apt update
apt -y install docker-ce-cli=5:18.09.9~3-0~ubuntu-bionic
apt-mark hold docker-ce-cli
apt -y install docker-ce=5:18.09.9~3-0~ubuntu-bionic // containerd.io 自动安装
apt-mark hold docker-ce containerd.io

docker安装完成后,使用docker info 查看生成信息,着重检查一下几点:

Cgroup Driver: systemd
Storage Driver: overlay2
    
如下程序可以对上述配置进行设置
# 创建或替换 /etc/docker/daemon.json 以启用 cgroup 的 systemd 驱动
$ sudo cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

// 将 cgroup 和交换选项添加到内核命令行中
// 请注意 "cgroup_enable=cpuset" 前的空格,以便在该行的最后一个项目后添加一个空格
vim  /boot/firmware/nobtcmd.txt    //Ubuntu1804 默认添加位置  
添加:cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 swapaccount=1
// 配置完后重启docker
systemctl daemon-reload
systemctl restart docker
// 注意:执行docker info无报错后发可往下执行!

3、正式安装k8s

(1)安装K8s相关软件
// 创建kubernetes的repo
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
// 添加密钥
sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
// 添加国内下载源,注意受限于版本限制,这里的xenial莫要去更改它!!
sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
// 更新安装包信息
sudo apt-get update
// 查看当前环境下合适的安装版本
apt-cache madison kubelet
// 安装指定版本的K8S
apt-get install -y kubelet=1.15.12-00 kubeadm=1.15.12-00 kubectl=1.15.12-00
// 为保证项目中其他模块不受影响,此处对K8s版本进行锁定,以避免误操作使其版本发生变化
apt-mark hold kubelet=1.15.12-00 kubeadm=1.15.12-00 kubectl=1.15.12-00
// 设置开机自启动
systemctl enable kubelet && sudo systemctl start kubelet
// 截至目前虽然已安装好软件,当还无法部署,因为国内网络原因需要使用一些技巧拉取一下部署镜像!
(2)拉取k8s部署镜像
// 查询当前环境需要的镜像
kubeadm config images list --kubernetes-version=v1.15.12
/*
系统输出如下:
	k8s.gcr.io/kube-apiserver:v1.15.12
	k8s.gcr.io/kube-controller-manager:v1.15.12
	k8s.gcr.io/kube-scheduler:v1.15.12
	k8s.gcr.io/kube-proxy:v1.15.12
	k8s.gcr.io/pause:3.1
	k8s.gcr.io/etcd:3.3.10
	k8s.gcr.io/coredns:1.3.1
*/
// 由于k8s.gcr.io、quay.io等被墙,相关镜像先再其他仓库下载,然后再重打标签进行使用
镜像下载方法:
可直接在PC上下载,如果PC能FQ当然最好不过了,不过不FQ也能下
官网镜像网址:   https://hub.docker.com/
/* 直接在网页上搜索对应的镜像名,如“kube-apiserver”,由于树莓派属于arm架构所以需要在搜索名后添加补充“kube-apiserver-arm64”然后再去搜索,选择好仓库后在Tag标签中选择合适版本,复制右边的命令即可下载到本地,下载下来后注意重新打上官方标签:*/
docker tag gcmirrors/kube-apiserver-arm64:v1.15.12 k8s.gcr.io/kube-apiserver:v1.15.12

// 本文给大家提供了下载好的镜像文件
链接:https://pan.baidu.com/s/1w46UsDBNXDRgbwOXcR1MSw 提取码:82hq 
// 下载好后,按照txt文档对镜像进行导入,并重新打上官方标签
docker load < flanneld-v0.12.0-arm64.docker
// 更多细节可参考这篇博客:
https://www.cnblogs.com/embedded-linux/p/10776221.html
(3)k8s-Master节点部署
// 以上步骤执行完后即可开始进行k8s的部署
先生成一个引导令牌来验证加入集群的节点
TOKEN=$(sudo kubeadm token generate)
echo $TOKEN
// 初始化主节点
sudo kubeadm init --token=${TOKEN} --kubernetes-version=v1.15.12 --pod-network-cidr=10.244.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.253.8:6443 --token yh4w3s.sdbg5np6v3reno5m \
    --discovery-token-ca-cert-hash sha256:3197f454f00883d7e0d1caa180c35ef2b42e20d414c38ac040a5a148598d105d 
*/

初始化成功后,按照文中提示,首先执行以下语句:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config  //若当前用户不是root用户需要执行

上面语句执行完后,现在执行kubectl get nodes,会发现master节点并不是ready状态,原因是还没初始化节点网络,

本文使用kube-flannel.yml文件进行网络初始化,文件可通过该连接下载:

链接:https://pan.baidu.com/s/1tLpGoDNPBlrJR65cJkVNCQ 提取码:xl2k

// 注意:上面的镜像包已包含kube-flannel.yml文件所需镜像,若上面导入了就可以不用导入了,若上面没导入,可执行下面语句进行镜像导入
docker load < flanneld-v0.12.0-arm64.docker
// 导入后,执行下面语句初始化节点网络
kubectl apply -f kube-flannel.yml
// 初始化成功后,再执行
kubectl get nodes
// 此时,master节点已成ready状态

如果kubeadm 生成的token过期后,此时集群需要增加节点则执行如下语句,重新生成密钥:
kubeadm token create
输出:aa78f6.8b4cafc8ed26c34f

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256
输出:0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37c971bd77ee501d845b538

将上面生成的串数据替换掉下面的 token 和 sha256 后面的字符串,IP改为master的IP
kubeadm join --token aa78f6.8b4cafc8ed26c34f --discovery-token-ca-cert-hash sha256:0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37c971bd77ee501d845b538 192.168.253.60:6443

截止到此处,k8s的master节点已部署完成。

(4)k8s-node节点部署

node节点只需要执行master节点自动生成的注册语句即可加入master集群

kubeadm join 192.168.253.8:6443 --token yh4w3s.sdbg5np6v3reno5m \
    --discovery-token-ca-cert-hash sha256:3197f454f00883d7e0d1caa180c35ef2b42e20d414c38ac040a5a148598d105d 

4、镜像使用

raspi4b_k8s_init_mini.img

登陆用户名:root,密码:123123

镜像连接:链接:https://pan.baidu.com/s/1fnEKYoNjCyunbpCB6Oxxpw 提取码:3tte

软件版本:docker 18.09.9,k8s版本 v1.15.12,flannel版本 v0.12.0

硬件版本:树莓派4b,4G版本,预装ubuntu-18.04.5-preinstalled-server-arm64+raspi4.img.xz

说明:拿到镜像后,只需配置一下静态IP(可参见我的另一篇博客),再按照k8s-Master节点部署这部分内容操作一下就可以完成master端的部署,将master的认证输出,在slave端执行一下即可将slave端加入集群

原版Ubuntu1804镜像可从Ubuntu官网下载:https://ubuntu.com/search?q=ubuntu-18.04.5-preinstalled-server-arm64%2Braspi4.img.xz

/* 镜像下载好后,上面的准备工作还是先执行一遍,由于镜像已安装好docker以及对应的k8s软件,相关对应版本的镜像也导入到位,到手后只需要执行初始化指令即可!也就是直接可以部署节点!*/

1、首先部署主节点,部署完后使用kube-flannel.yml初始化网络,对应flannel镜像也已集成到镜像中!

2、对于其他node节点,直接执行主节点自动生成的语句即可加入主节点k8s集群!

说明:本方案亲测有效,转载请注明出处,如果能帮到您,也欢迎大家打赏一下啊:)!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐