【K8S】搭建k8s 1.23.1 单master双node集群
【K8S】搭建k8s 1.23.1 单master双node集群
前言:从k8s 1.24开始,把dockershim去除了,官方推荐使用containerd作为容器运行时,根据我的实践,配置CRI是个大坑,没有准确避坑的直接结果将是kubelet的不健康(unhealthy),表现为kubeadm init时连接kubelet超时(timeout),我认为背后原因是kubelet和容器运行时对接不正确,目前还没有解决这个问题,其实我本身是做开发的,目前的能力还不足以使用二进制方式搭建k8s,还是得依赖kubeadm,并且我发现 阿里云容器和腾讯云容器的最新版本在1.24左右,所以在此给出我的方案:降版本,用回Dokcer,搭建k8s 1.23集群
开始之前
你得会vi、了解Linux的一些基本操作、遇到坑最好使用Google
系统准备
系统版本:CentOS el7(7.9),腾讯云主机,双核 2G 1M
提醒:不要使用腾出云系统,目前这个系统还不完善,使用CentOS可以更好地暴露问题。
关闭防火墙(也可以不关闭,但是你得摸清楚k8s用到哪些端口):
systemctl stop firewalld && systemctl disable firewalld
关闭 selinux(必须关闭)
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
# 在管理节点(master)上运行,下面都称为master
hostnamectl set-hostname master
# 在工作节点1 上运行
hostnamectl set-hostname node1
# 在工作节点2 上运行
hostnamectl set-hostname node2
在 master 修改 /etc/hosts
cat >> /etc/hosts << EOF
43.112.31.61 master
43.112.31.62 node1
43.112.31.63 node2
EOF
修改内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
时间同步
yum -y install chrony
systemctl start chronyd
chronyc sourcestats -v
下载和安装
处理k8s和docker的安装源,这里要注意,要指定k8s的安装版本。那么要不要指定docker的版本,目前我的测试发现,是不用的。
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
docker --version #我的是 version 20.10.23,
安装完docker一定要记得修改镜像源加速,加速器在阿里云申请,是免费的,每个人都可以有
https://cr.console.aliyun.com/cn-hangzhou/instances
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://z26h052d.mirror.aliyuncs.com"]
}
EOF
添加 k8s 的 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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装k8s,这些版本号是我在阿里云yum源仓库里找的
yum install -y kubeadm-1.23.1 kubelet-1.23.1 kubectl-1.23.1
systemctl enable kubelet
部署
使用kubeadm init 部署一个集群,其实就是把master节点 安装k8s必要组件,然后部署一个 控制平面,接着生成一系列文件比如证书。
kubeadm init \
--apiserver-advertise-address=43.112.31.61 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.1 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
--v=6
--v=6是把一些比较深层的运行输出保留到控制台中,你可以--v=7 8 9都行。 service-cidr和pod-network-cidr不要动,特别是10.244.0.0/16,你可以在网络插件的yaml里面看到这个地址。
init成功后,首先可以看到一个命令,保存起来,使用这个命令,可以让node在24小时内加入集群(或者说加入master所在的集群)
kubeadm join 43.112.31.61:6443 --token 6mkdfi.o57cmq5hj9ziuf --discovery-token-ca-cert-hash sha256:64de66aac7ceb27a284d72b58aab6de
现在k8s组件就安装好了,还要让kubectl拥有能够访问集群的权限,这里直接把一些秘钥复制过去。你还是在kubeadm init成功后可以看到这些命令
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 # 查看节点,此时都是notReady
安装网络插件
kubectl apply –f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
各node使用上面的kubeadm join那一串加入到集群中
然后,使用kubectl查看节点状态
kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 7d23h v1.23.1
node1 Ready
node2 Ready
疑问
- kubeadm init 失败怎么办,尝试重启docker,重置k8s,再次尝试kubeadm init
systemctl daemon-reload
systemctl restart docker
kubeadm reset # reset卡住时就把kubeadm卸载掉,重新安装
kubeadm init
- kubeadm join 提示秘钥过期,在master节点重新生成即可
kubeadm token create --print-join-command