背景

本文是通过 kubeadm工具实现k8s集群的搭建,如果想搭建单节点的,可以使用minikube。

 

相关资料

官网:​​Kubernetes​

 

环境

服务网格

虚拟机三台(Centos7.6),服务网格信息如下:

主机名

IP地址

角色

系统版本

k8s-master

192.168.20.200

master节点

CentOS Linux release 7.6.1810

k8s-node1

192.168.20.201

node节点

CentOS Linux release 7.6.1810

k8s-node2

192.168.20.202

node节点

CentOS Linux release 7.6.1810

安装要求

  • 硬件要求:2GB或更多内存、2个CPU更多,硬盘30GB或更多
  • 网络要求:集群中所有机器网络互通,并且能访问外网

环境准备

1、更新主机名



hostnamectl set-hostname k8s-master   #master节点
hostnamectl set-hostname k8s-node1 #node1节点
hostnamectl set-hostname k8s-node2 #node2节点


2、增加域名解析  --  所有节点

vim  /etc/hosts



192.168.56.200 k8s-master
192.168.56.201 k8s-node1
192.168.56.202 k8s-node2


3、关闭防火墙  --  所有节点




systemctl stop firewalld
systemctl disable firewalld


4、禁用selinux(Linux的一种安全子系统)   – 所有节点




sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0


5、禁用swap   – 所有节点




swapoff -a       #禁用swap(临时的)


永久禁用:vim /etc/fstab,注释掉下面的

Kubernetes集群搭建_centos

  

安装

版本说明

Kubernetes 默认CRI(容器运行时)为Docker,因此需要安装Docker。

Docker版本必须和 k8s 支持的版本对应(对应关系可自己百度)。本文安装的是:


组件

版本

Docker

19.03.5

Kubernetes

1.20.0

安装Docker

在所有节点执行安装命令:



yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce-19.03.5-3.el7 docker-ce-cli-19.03.5-3.el7
systemctl enable docker && systemctl start docker #开机启动


查看版本:

Kubernetes集群搭建_centos_02

添加阿里云yum源

可以进入​​阿里云yum镜像官网​​,拷贝yum源信息并在所有节点上执行:



cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


安装 kubeadm,kubelet和kubectl

在所有节点上执行:



yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0
systemctl enable kubelet && systemctl start kubelet #开机启动


更换驱动程序

容器运行时,推荐 docker 使用 systemd 作为 cgroup 驱动,而默认的安装驱动是 cgroupfs,所以需要更换下驱动(不更换也可以,但是在初始化master时会报警告)



cat > /etc/docker/daemon.json << EOF
{
"exec-opts":["native.cgroupdriver=systemd"]
}
EOF


这一步执行完,需要重启Docker~~

 

搭建集群

初始化 k8s master节点

1、在 master 节点(192.168.56.200) 上执行:



kubeadm init --apiserver-advertise-address=192.168.56.200 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.0 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16


执行完成后,会生成加入节点的命令(记录下来,node节点加入集群会用到)

Kubernetes集群搭建_docker_03

2、配置 kubectl (不执行这一步,无法使用kubectl命令)




mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config


查看节点信息:kubectl get nodes

Kubernetes集群搭建_linux_04

添加网络插件(CNI)

这里使用 flannel 作为网络插件,也可以使用 calico 等其它插件

在 master 节点(192.168.56.200)执行



wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml    #下载kube-flannel.yml文件
kubectl apply -f kube-flannel.yml


加入集群

在 node1 节点(192.168.56.201) 和 node2 节点(192.168.56.202) 上分别执行命令:

该命令为上面初始化master节点时生成的。执行结果:

Kubernetes集群搭建_初始化_05

 

异常处理

在master节点上执行 kubectl get pod -n kube-system,查看所有pod

Kubernetes集群搭建_centos_06

如果状态不是Running,表示该Pod状态异常。

查看pod详情:kubectl describe pod -n kube-system kube-flannel-ds-4stc4

Kubernetes集群搭建_linux_07

发现是下载镜像失败。重新下载镜像:



docker pull quay.io/coreos/flannel:v0.14.0


再次在master节点上查看pod,会发现pod状态都正常了。

那再查看下节点状态:

Kubernetes集群搭建_docker_08

 

其它

删除Docker

如果安装的Docker版本不匹配,删除Docker步骤:




yum list installed | grep docker
yum remove docker-ce.x86_64 docker-ce-cli.x86_64
rm -rf /var/lib/docker


子节点使用kubectl命令

默认只有 master 节点可以使用 kubect get 命令,如果其它节点也想执行,操作步骤:

a、将 master 节点上的 admin.conf 文件拷贝到子节点上(这里用的k8-node1)



scp /etc/kubernetes/admin.conf root@k8s-node1:/etc/kubernetes/


b、在子节点上执行命令



echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile


此时在子节点上就可以使用 kubectl get 命令了~~

token过期

默认token的有效期是24小时,过期之后,如果还有节点想加入集群,操作步骤:

在master上执行命令,打印出加入集群命令,然后在子节点上执行即可



kubeadm token create --print-join-command


在master上,查看 token 信息



kubeadm token list


 

踩坑

1、master节点执行kubectl get 命令,报错:The connection to the server 192.168.56.200:6443 was refused - did you specify the right host or port?

排查步骤:

a、查看kubelet进程:ps -ef | grep kubelet         – 找不到进程

b、查看kubelet日志:journalctl -fu kubelet       – 报错信息:failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

意思就是说,docker驱动和kubelet驱动不一致,之前搭建环境前,将docker的驱动由cgroups改为systemd了,所以有两种办法解决以上问题:

  1. 还原docker驱动:将 /etc/docker/daemon.json 文件中 cgroupdriver 还原,即将 systemd 改为 cgroups。
  2. 修改kubelet驱动(推荐):在 /var/lib/kubelet/kubeadm-flags.env 文件中,增加配置:–cgroup-driver=systemd,如下所示:


Kubernetes集群搭建_docker_09

修改好后,重启kubelet:systemctl restart kubelet

 

2、在初始化Master节点时,报错:[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

执行命令,即可解决:echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables


 


知识改变世界