Kubernetes之搭建

背景

Docker基础看完以后(Docker三剑客就没看了),辗转就到了k8s,k8s本质上替代的是docker三剑客中的docker-swarm,用于容器的大规模集群管理。本文记录的是kubernetes环境的搭建方式。

内容

万事开头难,是因为环境的搭建难,k8s也是如此,比起其他的要繁琐很多,因为我到现在都不知道自己的有没有搭建成功,但是下列方法搭建完以后,至少可以试验了。本文安装的环境:

1
2
3
OS: Ubuntu 20.10
CPU: 1CPU # 官方建议2CPU
MEMORY: 2G # 1G内存真实够呛

如果你不知道自己的环境是几核CPU,则可以通过如下命令查看:

1
sudo cat /proc/cpuinfo | grep "cores"

如果你和我一样,对内存也存在疑虑,则

1
sudo dmidecode -t memory | grep "Size"

当然,还有一个更简单的

1
2
3
4
5
# 直接查看服务器的硬件信息
dmidecode

# 或者,查看控制台
htop

之后开始环境搭建,首先更新一下源信息,并且将docker给安装好

1
2
sudo apt update
sudo apt install docker docker.io

docker获取国外的仓库镜像会很慢,所以这里可以考虑换一下源: sudo vim /etc/docker/daemon.json,同时k8s推荐docker cgroup的驱动程序为systemd,具体为啥,我也不懂,内容如下:

1
2
3
4
{
"registry-mirrors": ["https://registry.docker-cn.com"]
"exec-opts":["native.cgroupdriver=systemd"]
}

然后重启docker 的服务.

1
2
3
4
5
sudo systemctl daemon-reload
sudo service docker

# 这个是为了解决k8s使用过程中产生的一个警告
systemctl enable docker.service

接下来,准备安装k8s,由于其在google仓库中,扒拉下来需要翻墙,所以这里采用aliyun,修改文件:/etc/apt/sources.list,添加如下内容。

1
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main

用的时候需要key(不是很理解),所以还得添加key。

1
sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add 

然后安装相关依赖环境;

1
2
sudo apt update && sudo apt install -y apt-transport-https curl
sudo apt install -y kubelet kubeadm kubectl --allow-unauthenticated

检查安装是否成功。

1
2
# 打印版本信息
kubeadm version

然后初始化,检查本机作为master时,各种环境约束是否符合条件(需要主机能翻墙,不能翻墙请参考【故障检测】),命令执行后,就会初始化。

1
2
3
4
5
6
# 国内的话,时间会有点长,耐心等。成功的话,会有successful的提示的
# --pot-network-cidr:是定义内网区间段的,具体我还没弄明白
sudo kubeadm --pod-network-cidr=10.244.0.0/16

# 由于腾讯云买的1C2G,所以明显不行,解决方案
sudo kubeadm init --ignore-preflight-errors=NumCPU --pod-network-cidr=10.244.0.0/16

将本机激活为主节点,先添加环境变量(这个我也不是很明白)。

1
export KUBECONFIG=/etc/kubernetes/admin.conf

添加网络插件,执行命令

1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

保存使用配置,执行命令

1
kubeadm join

然后查看一些节点信息

1
kubectl get nodes

看返回的结果中,如果提示:status为ready,roles为master,则表示搭建算成功了

1
2
3
[root@vultr:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vultr.guest Ready master 118m v1.19.4

同时,还需要检查master各组件是否正常。

1
kubectl get cs

查看返回的结果中,如果提示:status为Healthy,MESSAGE为OK,则表示组件正常:

1
2
3
4
5
6
root@vultr:~# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}

But,这次scheduler、controller-manager不是很幸运的提示了UnHealthy,解决方案如下:

修改/etc/kubernetes/manifests/下面的两个文件:kube-controller-manager.yaml、kube-scheduler.yaml,将其中的- --port=0注释掉(也就是前面加#),然后重启服务:

1
2
3
4
systemctl restart kubelet.service

# 再次检查看组件状态
kubectl get cs

至此,主节点搭建结束,应该能实验了

故障检测

kubeadm初始化失败

初始化的时候其实需要从k8s.gcr.io拉取镜像,如果主机本身不能科学上网,就会因为拉取不到这些镜像而失败,解决方案是直接拉取其他仓库的同类镜像,然后通过修改标签的方式修改镜像的仓库,如下:

直接拉取镜像:

1
2
3
4
5
6
7
docker pull mirrorgooglecontainers/kube-apiserver:v1.19.4
docker pull mirrorgooglecontainers/kube-controller-manager:v1.19.4
docker pull mirrorgooglecontainers/kube-scheduler:v1.19.4
docker pull mirrorgooglecontainers/kube-proxy:v1.19.4
docker pull mirrorgooglecontainers/pause:3.2
docker pull mirrorgooglecontainers/etcd:3.4.13-0
docker pull coredns/coredns:1.7.0

修改镜像名后,重新初始化就可以了。

1
2
3
4
5
6
7
docker tag mirrorgooglecontainers/kube-apiserver:v1.19.4 k8s.gcr.io/kube-apiserver:v1.19.4
docker tag mirrorgooglecontainers/kube-controller-manager:v1.19.4 k8s.gcr.io/kube-controller-manager:v1.19.4
docker tag mirrorgooglecontainers/kube-scheduler:v1.19.4 k8s.gcr.io/kube-scheduler:v1.19.4
docker tag mirrorgooglecontainers/kube-proxy:v1.19.4 k8s.gcr.io/kube-proxy:v1.19.4
docker tag mirrorgooglecontainers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag mirrorgooglecontainers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag coredns/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0