背景
本文是通过 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 默认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 #开机启动
查看版本:
添加阿里云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节点加入集群会用到)
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
添加网络插件(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节点时生成的。执行结果:
异常处理
在master节点上执行 kubectl get pod -n kube-system,查看所有pod
如果状态不是Running,表示该Pod状态异常。
查看pod详情:kubectl describe pod -n kube-system kube-flannel-ds-4stc4
发现是下载镜像失败。重新下载镜像:
docker pull quay.io/coreos/flannel:v0.14.0
再次在master节点上查看pod,会发现pod状态都正常了。
那再查看下节点状态:
其它
删除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了,所以有两种办法解决以上问题:
- 还原docker驱动:将 /etc/docker/daemon.json 文件中 cgroupdriver 还原,即将 systemd 改为 cgroups。
- 修改kubelet驱动(推荐):在 /var/lib/kubelet/kubeadm-flags.env 文件中,增加配置:–cgroup-driver=systemd,如下所示:
修改好后,重启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