2.kubeadm部署kubernetes
  IS4yhiOomKTv 2023年11月02日 33 0

部署前提

使用kubeadm部署Kubernetes集群的前提条件
◼ 支持Kubernetes运行的Linux主机,例如Debian、RedHat及其变体等
◼ 每主机2GB以上的内存,以及2颗以上的CPU
◼ 各主机间能够通过网络无障碍通信
◼ 独占的hostname、MAC地址以及product_uuid,主机名能够正常解析
◼ 放行由Kubernetes使用到的各端口,或直接禁用iptables
◼ 禁用各主机的上的Swap设备
◼ 各主机时间同步
准备代理服务,以便接入k8s.gcr.io,或根据部署过程提示的方法获取相应的Image

部署环境

 OS: Ubuntu 20.04.2 LTS
 Docker:20.10.21,CGroup Driver: systemd
 Kubernetes:v1.25.3, CRI: cri-dockerd, CNI: Flannel
 网络环境
  ◼ 节点网络:10.0.0.0/24
  ◼ Pod网络:10.244.0.0/16
  ◼ Service网络:10.96.0.0/12

IP地址

主机名

角色

10.0.0.100

K8s-master01.mm.com, K8s-master01, kubeapi.mm.com

Master

10.0.0.101

K8s-master02.mm.com, K8s-master02

Master

10.0.0.102

K8s-master03.mm.com, K8s-master03

Master

10.0.0.103

K8s-node01.mm.com, K8s-node01

Worker

10.0.0.104

K8s-node02.mm.com, K8s-node02

Worker

10.0.0.105

K8s-node03.mm.com, K8s-node03


Worker

集群部署步骤

验证各前提条件是否已然满足
在各节点上安装容器运行时
◼ 本示例选用Docker 20.10.21,但Kubernetes将直接使用Containerd
◼ 必要时,为Docker设置使用的代理服务
在各节点上安装kubeadm、kubelet和kubectl
创建集群
① 在控制平面的第一个节点上,使用kubeadm init命令拉起控制平面
◆会生成token以认证后续加入的节点
② (实验环境可选)将其它几个控制平面节点使用kubeadm join命令加入到控制平面集群中
◆提示:需要先从第一个控制平面节点上拿到CA及API Server等相应的证书
③ 将各worker节点使用kubeadm join命令加入到集群中
④ 确认各节点状态正常转为“Ready”
实例:

主机名解析:

[root@ubuntu2004 ~]#vim /etc/hosts
10.0.0.100  K8s-master01.mm.com, K8s-master01, kubeapi.mm.com 
10.0.0.101  K8s-master02.mm.com, K8s-master02
10.0.0.102  K8s-master03.mm.com, K8s-master03 
10.0.0.103  K8s-node01.mm.com, K8s-node01    
10.0.0.104  K8s-node02.mm.com, K8s-node02 
10.0.0.105  K8s-node03.mm.com, K8s-node03

修改主机名

[root@ubuntu2004 ~]#hostname K8s-master01
[root@ubuntu2004 ~]#hostname K8s-master02
[root@ubuntu2004 ~]#hostname K8s-master03
[root@ubuntu2004 ~]#hostname K8s-node01
[root@ubuntu2004 ~]#hostname K8s-node02
[root@ubuntu2004 ~]#hostname K8s-node03

时间同步

[root@K8s-master01 ~]#apt install chrony
开机自启

禁用swap

禁用所有带swap的
[root@K8s-master01 ~]#vim /etc/fstab 
#/swap.img  none    swap    sw  0   0
[root@K8s-master01 ~]#swapoff -a
查询swap设备
[root@K8s-master01 ~]#systemctl --type swap
如果有swap,再执行下一个命令
[root@K8s-master01 ~]#systemctl mask swap名字

禁用防火墙

apt install ufw
ufw disable

安装docker-ce和cri-dockerd:

安装docker-ce:
cat install_docker.sh 
#!/bin/bash

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
  "https://docker.mirrors.ustc.edu.cn",
  "https://hub-mirror.c.163.com",
  "https://reg-mirror.qiniu.com",
  "https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
  "max-size": "200m"
},
"storage-driver": "overlay2"  
}
EOF
sudo systemctl restart docker
安装cri-dockerd

项目地址:https://github.com/Mirantis/cri-dockerd
cri-dockerd项目提供了预制的二制格式的程序包,用户按需下载相应的系统和对应平台的版本即可完成安装,这里以Ubuntu 2004 64bits系统环境,以及cri-dockerd目前最新的程序版本v0.2.5为例。

lsb_release -rc(对应下载链接的facal)
Release:	20.04
Codename:	focal

下载安装
[root@K8s-master01 packages]# curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd_0.2.6.3-0.ubuntu-focal_amd64.deb
[root@K8s-master01 packages]#ls
cri-dockerd_0.2.6.3-0.ubuntu-focal_amd64.deb
[root@K8s-master01 packages]#cd
[root@K8s-master01 ~]#dpkg -i packages/cri-dockerd_0.2.6.3-0.ubuntu-focal_amd64_.deb
完成安装后,相应的服务cri-dockerd.service便会自动启动。

安装kubelet,kubeadm和kubectl

配置阿里kubernetes镜像仓库,命令行执行
1.
apt-get update && apt-get install -y apt-transport-https
2.添加kubernetes的key:
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
3.修改文件:
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
4.更新索引并安装kubernetes:
apt-get update
apt-get install -y kubelet kubeadm kubectl

整合kubelet和cri-dockerd

每个节点配置cri-dockerd
--network-plugin=cni :指定网络插件规范的类型,这里要用CNI
--cni-bin-dir=/opt/cni/bin :指定CNI插件二进制程序文件的搜索目录
--cni-cache-dir=/var/lib/cni/cache :CNI插件使用的缓存目录
--cni-conf-dir=/etc/cni/net.d:CNI插件加载配置文件的目录

[root@K8s-master01 ~]#vim /usr/lib/systemd/system/cri-docker.service
[Service]
Type=notify
#ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8 --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
加载重启
[root@K8s-master01 ~]#systemctl daemon-reload && systemctl restart cri-docker.service
配置kubelet

主要体现我们要运行的容器运行时是远程的,以及容器运行时目录
[root@K8s-node03 ~]#mkdir /etc/sysconfig
[root@K8s-node03 ~]#vim /etc/sysconfig/kubelet
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock"

初始化第一个主节点

初始化master节点(在master01上完成如下操作)拉取镜像:
[root@K8s-master01 ~]#kubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock
无法访问grc.io时,可以在上面的命令中使用:
--image-repository=registry.aliyuncs.com/google_containers

实际操作:
[root@K8s-master01 ~]#kubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock --image-repository=registry.aliyuncs.com/google_containers
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.3
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.25.3
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.25.3
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.25.3
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.8
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.4-0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.9.3

运行如下方式,完成k8s-master01节点的初始化

[root@K8s-master01 ~]#kubeadm init --control-plane-endpoint="kubeapi.magedu.com" --kubernetes-version=v1.25.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --cri-socket unix:///run/cri-dockerd.sock --upload-certs --image-repository=registry.aliyuncs.com/google_containers

# 第1个步骤提示, Kubernetes集群管理员认证到Kubernetes集群时使用的kubeconfig配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
根据提示执行以下命令:
mkdir .kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
由于使用管理员身份执行的,所以不用修改权限

部署网络插件

下载适配系统及硬件平台环境的flanneld至每个节点,并放置于/opt/bin/目录下:
[root@K8s-master01 ~]# mkdir /opt/bin/
[root@K8s-master01 ~]#curl -L https://github.com/flannel-io/flannel/releases/download/v0.20.1/flanneld-amd64 -o /opt/bin/flanneld
加执行权限
[root@K8s-master01 ~]#chmod +x /opt/bin/flanneld
并复制到其他节点:
[root@K8s-master01 ~]#scp -rp /opt/bin/ 10.0.0.101:/opt/
提示:下载flanneld的地址为 https://github.com/flannel-io/flannel/releases

随后,在初始化的第一个master节点k8s-master01上运行如下命令,向Kubernetes部署kube-flannel:
[root@K8s-master01 ~]#kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

验证有一个对应的pod开始运行了:
[root@K8s-master01 ~]#kubectl get pods -n kube-flannel
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-5jqb4   1/1     Running   0          101s
[root@K8s-master01 ~]#kubectl get nodes
NAME           STATUS   ROLES           AGE   VERSION
k8s-master01   Ready    control-plane   15m   v1.25.3

添加其他节点,加入集群

在初始化第一个节点后会生成以下命令:

加入master:
kubeadm join kubeapi.magedu.com:6443 --token u7fdw2.eg1rjwfkxl8d16fr \
	--discovery-token-ca-cert-hash sha256:874f24c082d4128823c6d12dd2d62d4d44548670514bf21eb9bb525401ac83ba \
	--control-plane --certificate-key c21146b7975d23fb8cabded191c3294cf936ebbf3921b5ad19da480864108288 --cri-socket unix:///run/cri-dockerd.sock
	
加入nodes:
kubeadm join kubeapi.magedu.com:6443 --token u7fdw2.eg1rjwfkxl8d16fr \
	--discovery-token-ca-cert-hash sha256:874f24c082d4128823c6d12dd2d62d4d44548670514bf21eb9bb525401ac83ba --cri-socket unix:///run/cri-dockerd.sock

观察master01节点,所有节点已添加完成,等待变成Ready

[root@K8s-master01 ~]#kubectl get nodes
NAME           STATUS   ROLES           AGE     VERSION
k8s-master01   Ready    control-plane   42m     v1.25.3
k8s-master02   Ready    control-plane   14m     v1.25.3
k8s-master03   Ready    control-plane   2m11s   v1.25.3
k8s-node01     Ready    <none>          11m     v1.25.3
k8s-node02     Ready    <none>          11m     v1.25.3
k8s-node03     Ready    <none>          11m     v1.25.3

补充知识:如果出现问题可以使用重置集群

重置集群:在01主节点初始化命令下会生成
kubeadm reset --cri-socket unix:///run/cri-dockerd.sock && rm -rf /etc/kubernetes/ /var/lib/kubelet /var/lib/dockershim /var/run/kubernetes /var/lib/cni /etc/cni/net.d 

    提示:先重置工作节点,再重置主节点;
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  cO5zyEmh8RH6   2023年12月09日   27   0   0 k8s证书
  wwLZeziuqjLR   2023年12月11日   32   0   0 Dockercentos
  MCWYWqSAMsot   2023年12月11日   33   0   0 Docker
  DnoStTHsc0vp   2023年12月11日   29   0   0 Docker
  wwLZeziuqjLR   2023年12月08日   104   0   0 Dockercentosbash