• Post author:
  • Post category:运维
  • Post comments:3评论
  • Reading time:10 mins read

本文将介绍如何使用Kubeadm部署一个单Master节点的K8S集群。

1. 准备工作

1.1 准备两台Ubuntu服务器

这里我选择使用阿里云突发性能实例,主要是比较便宜,给每台服务器配置最低2cpu2g以上内存,如图。

本文使用的Linux系统为Ubuntu20.04-64位,K8S版本为1.22.1,docker版本为20.10.8

注意此步骤需在集群内所有的宿主机执行。

1.2 配置主机名称与Hosts文件的IP映射关系

echo "master01" >/etc/hostname

vim /etc/hosts

172.26.65.240 master01
172.26.65.241 worker01

1.3 关闭防火墙

sudo ufw disable

1.4 关闭swap内存

sudo vi /etc/fstab

# 将第二行,以“/dev/fd0”开头的一行以“#”符号注释
UUID=e2048966-750b-4795-a9a2-7b477d6681bf /   ext4    errors=remount-ro 0    1
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0

# 临时关闭swapoff
swapoff -a

1.5 将桥接的IPv4流量传递到iptables的链

cat > /etc/sysctl.d/k8s.conf << EOF
   net.bridge.bridge-nf-call-ip6tables = 1
   net.bridge.bridge-nf-call-iptables = 1
   EOF

sysctl --system

1.6 同步时区

sudo apt-get install ntp
ntpdate time.windows.com
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

2. 安装Docker

注意此步骤需在集群内所有的宿主机执行。

2.1 允许apt-get通过https使用仓库,并添加docker官方GPG key,设置docker稳定版仓库

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update

2.2 安装最新的docker-ce,同时避免每次使用docker都需要加上sudo

sudo apt-get install docker-ce
sudo usermod -a -G docker $USER

2.3 重启系统

reboot

3. 安装必要的k8s组件工具

安装docker之后,就可以下载k8s的三个组件了,分别为kubelet、kubeadm、kubectl。注意这一步骤要在集群内所有的宿主机上执行安装,先介绍一下这三者。

  • kubelt::k8s的核心服务
  • kubeadm:官方k8s部署工具,适合学习和测试k8s快速搭建集群环境,我们在集群内所有的宿主机上安装k8s环境都将使用它来完成,除此之外还有很多其他安装k8s的方式,比如企业常用的二进制部署方式,如有兴趣可自行查询,此处不再详述。
  • kubectl:k8s的命令行工具,环境安装后对k8s的全部操作都依赖它来执行。

其实这些组件的安装原本是很简单的,只需要apt install就好了,但是因为某些不可描述的原因,它们的下载地址在国内无法访问所以我们需要使用国内的镜像站来进行下载,依次执行以下命令:

# 使得 apt 支持 ssl 传输
apt-get update && apt-get install -y apt-transport-https
# 下载 gpg 密钥
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
# 添加 k8s 镜像源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# 更新源列表
apt-get update
# 下载 kubectl,kubeadm以及 kubelet
apt-get install -y kubelet kubeadm kubectl

4. 安装Master节点

接下来需要初始化集群的master节点,本文主要介绍单master节点集群的安装,多master节点的高可用K8S的具体安装方式不在此详述。

注意此步骤仅需在集群内作为Master节点的宿主机执行,大致可分为如下几步:

  • 使用Kubeadm init初始化master节点
  • 在初始化后的master节点内安装网络插件
  • 配置kubectl工具

4.1 初始化Master节点

使用kubeadm init命令就可以完成初始化,不过初始化时需要提供必要的参数,注意–apiserver-advertise-address必须为你master节点的内网ip,不然无法完成初始化操作。

注意如果你需要在公网访问你的集群,还需要加上–apiserver-cert-extra-sans stringSlice={你的公网ip}

关于kubeadm init命令的参数详见K8S官方文档

kubeadm init \
--apiserver-advertise-address={替换为你master节点的内网ip} \
--image-repository registry.aliyuncs.com/google_containers \

--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
  • 如果你的服务器不足2核cpu可以添加–ignore-preflight-errors=NumCpu来忽略错误。
  • –image-repository参数指明了镜像源,因为k8s的很多镜像都在外网无法访问,所以这里指定使用阿里的谷歌镜像源,如不设置在国内会拉取不到镜像。
  • –kubernetes-version可以指定k8s的版本,一般不需要填写,如果你安装过程中出现了异常,可以指定本文同版本的k8s版本。
  • 如果你在init后因发生任何异常导致初始化终止了,可以使用kubeadm reset重置之后再重新进行初始化,注意该命令会将此master完全重置。

可能发生的异常:

  • 报错failed to pull image registry.aliyuncs.com/google_containers/coredns:v1.8.4

该异常原因为阿里的镜像仓库该镜像的tag为1.8.4,而不是v1.8.4(根据你的k8s版本可能不是1.8.4,具体看你init的控制台报错),解决方式如下:

# 在需要初始化的节点上使用docker命令手动拉取镜像
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.4
# 给该镜像重新打标签
docker tag registry.aliyuncs.com/google_containers/coredns:1.8.4 registry.aliyuncs.com/google_containers/coredns:v1.8.4
# 删除原有镜像
docker rmi registry.aliyuncs.com/google_containers/coredns:1.8.4
# 再次执行kubeadm init命令

如果执行init后显示如下字样就说明初始化已成功,请把最后一行以kubeadm join开头的命令复制下来,后续安装集群内的worker节点时需要用到,注意该命令的token有效期为2小时,在此时限内你可以使用此命令将若干woker节点加入集群,如你丢失了这条命令或者超出了时限,可以在master节点使用kubeadm token create –print-join-command命令重新生成一条。

Your Kubernetes master 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/
 
You can now join any number of machines by running the following on each node
as root:
 
kubeadm joi 172.26.65.240:6443 --token wbryr0.am1n476fgjsno6wa --discovery-token-ca-cert-hash sha256:7640582747efefe7c2d537655e428faa6275dbaff631de37822eb8fd4c054807

4.2 配置kubectl命令工具

mkdir -p /root/.kube && \
cp /etc/kubernetes/admin.conf /root/.kube/config

执行完成后,可以尝试使用如下两条命令测试kubectl是否可用:

# 查看已加入的节点
kubectl get nodes
# 查看集群状态
kubectl get cs

如果你看到节点状态为NotReady,先不用急,因为集群的配置还没有完全完成。

如果集群状态controller-manager或kube-scheduler的状态为Unhealthy,可以参照如下方式解决:

vim /etc/kubernetes/controller-manager.conf
# 注释掉文件内的“--port=****”

然后重启该组件服务:

systemctl daemon-reload
systemctl restart kube-controller-manager.service
# or
systemctl restart kube-scheduler.service

之后再检查集群状态 kubectl get cs。

5. 部署Pod网络插件(CNI)

flannel是一个专门为k8s设计的网络规划服务,它的功能是让集群中不同节点的主机创建的docker容器都具有全集群唯一的虚拟ip地址。

部署方式为执行如下命令:

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

执行上述命令后可以使用kubectl get pods -n kube-system来检查是否安装成功。

如果有pod没有Running,可以通过如下命令查看错误的具体原因,比如这里我想查看kube-flannel-ds-amd64-8bmbm这个pod的错误信息:
kubectl describe pod kube-flannel-ds-amd64-8bmbm -n kube-system

着重检查详情页内event字段内的消息,一般具体的报错都会显示在这里。

k8s使用过程中如果遇到镜像拉取失败的情况,都可以使用手动拉取替代镜像后打tag的方式来曲线救国,比如flannel的镜像拉取失败的话,首先去docker官方仓库搜索同名镜像,找一个版本相同的镜像,使用docker pull拉取到本地,用docker tag重命名为拉取失败的镜像名称,注意使用此方法时,需要注意yaml文件内的imagePullPolicy的策略为IfNotPresent,如果为Always的话,会忽略本地镜像每次都进行远程拉取,同时需要注意的是该pod运行在集群内的哪个宿主机上,需要在该宿主机进行docker pull操作,不然仍然无法拉取到镜像。

flannel安装完成后使用 kubectl get nodes 检查节点状态,为Ready的话,master节点就部署成功了。

如果你只是需要一个单节点k8s,那么到这里就完成部署了。

6. 将Worker节点加入到K8S集群

在所有的Worker节点上执行如下命令,如果你找不到这条命令或者该token已过期,参照本文4.1步骤重新生成一个。

kubeadm joi 172.26.65.240:6443 --token wbryr0.am1n476fgjsno6wa --discovery-token-ca-cert-hash sha256:7640582747efefe7c2d537655e428faa6275dbaff631de37822eb8fd4c054807

执行成功后得到以下信息:

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 master to see this node join the cluster.

这时可以根据提示内的指示使用kubectl get nodes来检查集群内各个节点的状态了。

如果看到有Node的状态不是Ready,那么可以使用以下命令检查哪些Pod没有正常运行:

kubectl get pod --all-namespaces

然后按照前文所说的方法使用 kubectl describe pod { pod name } -n { namespace }检查问题并修复。

结语

至此,单master的k8s集群就搭建完成了,后续会介绍k8s如何将你的应用部署至k8s内运行,以及安装k8s的控制面板。

关于K8S的后续学习和内部对象的各种概念,请参考《一关系图让你理解K8s中的概念,Pod、Service、Job等到底有啥关系》,本文不再赘述。

引用

葫芦

葫芦,诞生于1992年8月11日,游戏宅,胶佬,爱好摸鱼,一个干过超市收银,工地里搬过砖,当过广告印刷狗,做过电焊铁艺的现役.Net程序员。

这篇文章有 3 个评论

  1. 第 郭强煜页

    优秀,博主厉害。会持续关注。

发表回复