欢迎访问我的博客,目前从事Machine Learning,欢迎交流

【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 7d23h v1.23.1
node2 Ready 7d23h v1.23.1

疑问

  1. kubeadm init 失败怎么办,尝试重启docker,重置k8s,再次尝试kubeadm init
systemctl daemon-reload
systemctl restart docker
kubeadm reset # reset卡住时就把kubeadm卸载掉,重新安装
kubeadm init
  1. kubeadm join 提示秘钥过期,在master节点重新生成即可
kubeadm token create --print-join-command 
posted @ 2023-02-08 15:03  有蚊子  阅读(256)  评论(0编辑  收藏  举报