Kubernetes集群搭建

背景

本文是通过 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集群搭建

  

安装

版本说明

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集群搭建

添加阿里云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集群搭建

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集群搭建

添加网络插件(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) 上分别执行命令:

kubeadm join 192.168.56.200:6443 --token j20y6p.3vzjgsvwdggpogof \
    --discovery-token-ca-cert-hash sha256:df5c648803fe1e1126db4aed89708bc2af097dbab14bbb02ee8402327a1628c9

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

Kubernetes集群搭建

 

异常处理

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

Kubernetes集群搭建

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

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

Kubernetes集群搭建

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

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

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

那再查看下节点状态:

Kubernetes集群搭建

 

其它

删除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集群搭建

修改好后,重启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

 

上一篇:docker安装kubelet


下一篇:Kubernetes 学习笔记 3 Node