在CentOS7中搭建单机kubernetes集群
最近需要在自己的虚拟机中搭建一个单机的k8s集群,以便于学习k8s的基本原理和操作。但由于版本和国内网络状况的差异,根据官方和网上的各种文档都无法直接完成集群的搭建。因此在此记录一下完整的搭建过程供后续参考。使用kubeadm搭建单机集群在官方的安装文档https://kubernetes.io/zh/docs/tasks/tools/中,建议使用minikube、kind或kubeadm搭建集群
最近需要在自己的虚拟机中搭建一个单机的k8s集群,以便于学习k8s的基本原理和操作。但由于版本和国内网络状况的差异,根据官方和网上的各种文档都无法直接完成集群的搭建。因此在此记录一下完整的搭建过程供后续参考。
使用kubeadm搭建单机集群
在官方的安装文档https://kubernetes.io/zh/docs/tasks/tools/中,建议使用minikube、kind或kubeadm搭建集群。
笔者首先尝试了使用minikube搭建集群,但遇到的问题是minikube start命令启动后会停在一个步骤再也不动了,也没有任何报错信息。从当时的进程状态看,minikube启动执行了kubeadm init来建立集群,应该是kubeadm在建立集群时出现了问题。但是这时已经无法看到kubeadm的输出,也不知道到底遇到了什么问题,无从诊断和解决。
因此,笔者最终选择了直接使用kubeadm来搭建集群。kubeadm是k8s官方的部署工具,部署的集群可以直接用于生产环境,适用范围更广。
搭建步骤
1. 系统配置
kubeadm创建k8s集群时对系统配置有一些要求,需要预先满足:
禁用交换分区
- 关闭已挂载的swap分区:
[root@localhost install]# swapoff -a
- 删除swap挂载配置:将/etc/fstab中swap挂载配置删除或注释
[root@localhost install]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Apr 23 00:24:11 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=67a639c9-fb0e-4d8d-ba68-e0d7329d6b9c /boot xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
- 禁用selinux
[root@localhost install]# setenforce 0
[root@localhost install]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 关闭防火墙
[root@localhost zjl]# systemctl disable firewalld
[root@localhost zjl]# systemctl stop firewalld
2. 安装runtime
- k8s需要runtime来运行容器。这里我们选择安装docker:
[root@localhost install]# yum install -y docker
- 为docker配置代理。由于kubeadm后续安装时会使用docker pull下载k8s管理容器的镜像,而镜像下载地址k8s.gcr.io在国内不能直接访问,因此需要为其配置代理服务器来访问:
mkdir -p /etc/systemd/system/docker.service.d
cat <<EOF | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.134.1:10809/"
Environment="HTTPS_PROXY=http://192.168.134.1:10809/"
Environment="NO_PROXY=localhost,127.0.0.1,10.96.0.1,192.168.*"
EOF
systemctl daemon-reload
systemctl restart docker
如果没有可用的代理服务器,也可以从国内的镜像站拉取镜像,然后使用docker tag将镜像标记为k8s.gcr.io的镜像。不同版本的k8s和kubeadm需要的镜像列表是不同的,需要拉取的镜像列表可以使用kubeadm config images list命令获取。
3. 安装 kubeadm、kubelet 和 kubectl
- 配置k8s的yum repo,由于官方repo国内不能直接访问,改用阿里云的镜像repo:
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
- 安装kubelet kubeadm kubectl
[root@localhost install]# yum install -y kubelet kubeadm kubectl
- 启动kubelet
[root@localhost install]# systemctl enable --now kubelet
kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。
4. 使用kubeadm创建集群
- 执行kubeadm。这里需要加上--pod-network-cidr这个参数,因为一些第三方的POD网络插件会使用到这个参数的配置,例如后面我们安装的flannel。
[root@localhost install]# kubeadm init --pod-network-cidr=10.244.0.0/16
- 复制集群管理配置到用户路径
#普通用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#root用户
export KUBECONFIG=/etc/kubernetes/admin.conf
- 安装网络插件flannel
[root@localhost install]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
这个地址虽然是github的raw文件地址,但是在国内却因为dns的问题无法访问。因此也需要挂代理下载后使用,或者直接在https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml上将内容复制到文件中。
- 去除主机的Master标签
默认情况下,主节点上会有一个node-role.kubernetes.io/master:NoSchedule的taint(污点),使得POD默认无法调度到这个节点上。如果要建立单机集群,最简单的方式就是将这个taint去除:
kubectl taint nodes --all node-role.kubernetes.io/master-
- 加入其它节点
我们这里只建立单节点集群,如果有其他节点需要加入,可以执行kubeadm init执行后提供的命令:
kubeadm join 192.168.134.128:6443 --token 4a2aip.geid6hr4t7d3pxl9 --discovery-token-ca-cert-hash sha256:fbb45dee6e25ff417b44ad69180dd22eacaf0d6b0b5c106c3ac2623e92113c1d
需要注意的是这个命令中的token是有有效期的,默认是24小时。可以参考这篇文章中的方法来获取新的token:https://blog.csdn.net/qq_36820037/article/details/108696508。
至此,k8s的单机集群就创建完成了。
5. 尝试创建容器
[root@localhost k8s_test]# kubectl create -f rc_template.yaml
[root@localhost k8s_test]# kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 18m
可见已经可以正常创建replica和POD。
更多推荐
所有评论(0)