Kubeadm安装单master多node节点K8S集群

kubeadm安装k8s1.25版本集群步骤

记录在刚搭建的3个虚拟机里成功安装K8S1.25版本集群的步骤

由于是成功创建后才记录的博客,只记录了操作步骤,过程中执行命令后的截图会有部分缺失,或者换成了文字。

环境说明

实验环境规划

操作系统:centos7.9

每个服务器配置: 4Gib内存/4vCPU/80G硬盘

网络:NAT模式

集群搭建规划

K8S集群角色 IP 主机名 安装的组件
控制节点 192.168.40.182 k8s-master1 apiserver、controller-manager、schedule、kubelet、etcd、kube-proxy、containerd、calico
工作节点 192.168.40.183 k8s-node1 Kube-proxy、calico、coredns、containerd、kubelet
工作节点 92.168.40.184 k8s-node2 Kube-proxy、calico、coredns、containerd、kubelet

初始化安装k8s集群的实验环境

安装虚拟机

安装虚拟机步骤见:

链接: Windows安装配置VMware

主要是:

1、修改机器IP,变成静态IP

2、关闭selinux

3、建议:自用的话,3个服务器root的登录密码设置一致,方面后面的操作

更新yum源和操作系统

ps. 3个服务器里都执行

bash 复制代码
yum update -y

查看操作系统

bash 复制代码
cat /etc/redhat-release

执行结果显示:CentOS Linux release 7.9.2009 (Core)

配置机器主机名

在192.168.40.182上执行

bash 复制代码
hostnamectl set-hostname k8s-master1 && bash

在192.168.40.183上执行

bash 复制代码
hostnamectl set-hostname k8s-node1 && bash

在192.168.40.184上执行

bash 复制代码
hostnamectl set-hostname k8s-node2 && bash

配置主机hosts文件,相互之间通过主机名互相访问

修改每台服务器的/etc/hosts文件,文件最后增加 如下内容:

ps. 文件里原有的配置不要动

powershell 复制代码
192.168.40.182   k8s-master1  
192.168.40.183   k8s-node1  
192.168.40.184   k8s-node2

配置主机之间无密码登录

ps. 以下命令3个服务器里都执行

1、配置到其他机器免密登录

bash 复制代码
ssh-keygen

ps. 以上命令执行后,一路回车,不输入密码

2、把本地生成的密钥文件和私钥文件拷贝到远程主机

bash 复制代码
ssh-copy-id k8s-master1


以上命令执行后,输入"yes",然后按提示输入k8s-master1服务器的登录密码

bash 复制代码
ssh-copy-id k8s-node1


以上命令执行后,输入"yes",然后按提示输入k8s-node1服务器的登录密码

bash 复制代码
ssh-copy-id k8s-node2


以上命令执行后,输入"yes",然后按提示输入k8s-node2服务器的登录密码

关闭交换分区swap,提升性能

ps. 以下命令3个服务器里都执行

bash 复制代码
swapoff -a

永久关闭:注释swap挂载,给swap这行开头加一下注释

bash 复制代码
vi /etc/fstab

为什么要关闭swap交换分区?

Swap是交换分区,如果机器内存不够,会使用swap分区,但是swap分区的性能较低,k8s设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s的时候可以指定--ignore-preflight-errors=Swap来解决。

修改机器内核参数

ps. 以下命令3个服务器里都执行

bash 复制代码
modprobe br_netfilter
bash 复制代码
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
bash 复制代码
sysctl -p /etc/sysctl.d/k8s.conf

关闭firewalld防火墙

ps. 3个服务器里都执行

bash 复制代码
systemctl stop firewalld && systemctl disable firewalld

配置阿里云的repo源

ps. 以下命令3个服务器里都执行

bash 复制代码
yum install yum-utils -y

配置国内安装docker和containerd的阿里云的repo源

bash 复制代码
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

配置安装k8s组件需要的阿里云的repo源

ps.以下命令 3个服务器里都执行

bash 复制代码
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
EOF

配置时间同步

ps. 以下命令3个服务器里都执行

安装ntpdate命令

bash 复制代码
yum install ntpdate -y

跟网络时间做同步

bash 复制代码
ntpdate cn.pool.ntp.org

把时间同步做成计划任务

bash 复制代码
crontab -e

写入:

powershell 复制代码
* */1 * * * /usr/sbin/ntpdate   cn.pool.ntp.org

重启crond服务

bash 复制代码
service crond restart

安装基础软件包

ps. 3个服务器里都执行

bash 复制代码
yum install -y device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack telnet ipvsadm

安装containerd服务

ps. 以下命令3个服务器里都执行

bash 复制代码
yum install -y containerd.io-1.6.6

接下来生成 containerd 的配置文件

bash 复制代码
mkdir -p /etc/containerd
bash 复制代码
containerd config default > /etc/containerd/config.toml

修改配置文件

bash 复制代码
vim /etc/containerd/config.toml

config.toml文件里的修改点:

1、把SystemdCgroup = false 修改成 = true

2、把sandbox_image = "k8s.gcr.io/pause:3.6" 修改成="registry.aliyuncs.com/google_containers/pause:3.7"

改后如图(相关文件的片段,非整个文件的内容):

配置 containerd 开机启动,并启动 containerd

bash 复制代码
systemctl enable containerd  --now

修改/etc/crictl.yaml文件

bash 复制代码
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
bash 复制代码
systemctl restart  containerd

安装docker服务

docker跟containerd不冲突,安装docker是为了能基于dockerfile构建镜像
ps. 以下命令3个服务器里都执行

bash 复制代码
yum install docker-ce -y
bash 复制代码
systemctl enable docker --now

配置containerd、docker镜像加速器

ps. 以下命令3个服务器里都执行

bash 复制代码
vim /etc/containerd/config.toml

config.toml文件里的修改点:找到config_path = "",修改成

config_path = "/etc/containerd/certs.d"

bash 复制代码
mkdir /etc/containerd/certs.d/docker.io/ -p
bash 复制代码
vim /etc/containerd/certs.d/docker.io/hosts.toml

写入如下内容

powershell 复制代码
[host."https://vh3bm52y.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]
  capabilities = ["pull"]

重启containerd

bash 复制代码
systemctl restart containerd

配置docker镜像加速器

bash 复制代码
vim /etc/docker/daemon.json

写入如下内容

json 复制代码
{
 "registry-mirrors":["https://vh3bm52y.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
} 

ps. 也可以在服务器节点上配置好,再远程拷贝到其他服务节点上,如下在k8s-master节点上执行:

bash 复制代码
scp daemon.json k8s-node1:/etc/docker/
scp daemon.json k8s-node2:/etc/docker/

重启docker

bash 复制代码
systemctl restart docker

安装初始化k8s需要的软件包

ps. 以下命令3个服务器里都执行

bash 复制代码
yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0
bash 复制代码
systemctl enable kubelet

注:每个软件包的作用

  • Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
  • kubelet: 安装在集群所有节点上,用于启动Pod,kubeadm安装k8s,控制节点和工作节点的组件
  • kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

kubeadm初始化k8s集群

ps. 仅在master节点的服务器上执行

bash 复制代码
kubeadm config print init-defaults > kubeadm.yaml

通过kubeadm config print init-defaults命令生成kubeadm.yaml文件,根据自己的需求修改配置,比如修改 imageRepository的值,kube-proxy 的模式为ipvs,需要注意的是由于本次使用的containerd作为运行时,所以在初始化节点的时候需要指定cgroupDriver为systemd

bash 复制代码
vim kubeadm.yaml

修改配置文件,修改地方用#标注了。仅改动标注部分,其他保持生成后的不变

yaml 复制代码
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.40.182 #控制节点(master节点)的ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock  #指定containerd容器运行时,/etc/crictl.yaml里的runtime-endpoint
  imagePullPolicy: IfNotPresent
  name:  k8s-master1 #控制节点主机名
  taints: null
---
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 指定阿里云镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.25.0 #k8s版本
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16    # 新增加的配置,指定pod网段
  serviceSubnet: 10.96.0.0/12 # 指定Service网段
scheduler: {}
#在文件最后,插入以下内容,(复制时,要带着---)
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

基于kubeadm.yaml初始化k8s集群

k8s镜像下载很慢有时候会失败,提供了镜像的压缩文件,可以通过导入获取镜像。

文件放在了网盘里可自取:

链接: https://pan.baidu.com/s/1uDSPp1AkcvVxBzL57dWeBQ

提取码: ixhg

以下命令3个服务器里都执行

bash 复制代码
ctr -n=k8s.io images import k8s_1.25.0.tar.gz

k8s_1.25.0.tar.gz这个文件如何来的?

这个文件把安装k8s需要的镜像都集成好了,通过ctr images export 这个命令把镜像输出到k8s_1.25.0.tar.gz文件。

如: ctr -n=k8s.io images export k8s_1.25.tar.gz docker.io/calico/node:v3.18.0 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.9.3

以上多个镜像用 空格 隔开

如果需安装其他版本,那就不需要实现解压镜像,可以从网络拉取镜像即可

ctr是containerd自带的工具,有命名空间的概念,若是k8s相关的镜像,都默认在k8s.io这个命名空间,所以导入镜像时需要指定命令空间为k8s.io

查看镜像

bash 复制代码
ctr -n=k8s.io images ls

ps. 仅在master节点的服务器上执行

bash 复制代码
kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification

看到类似返回表示执行成功

配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理

bash 复制代码
mkdir -p $HOME/.kube
bash 复制代码
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
bash 复制代码
sudo chown $(id -u):$(id -g) $HOME/.kube/config

扩容k8s集群-添加第一个工作节点

在k8s-master1上查看加入节点的命令

bash 复制代码
kubeadm token create --print-join-command

获取到返回的命令,我当时的是:

bash 复制代码
kubeadm join 192.168.40.182:6443 --token pmm98c.whu5zvft6y1g1e2c --discovery-token-ca-cert-hash sha256:ff5a016ba790353d8d9cf2c46c3d6cbaeeba81c12503fb514f9a7f8ff17667c2

将返回的命令后面加上"--ignore-preflight-errors=SystemVerification" ,分别在node1和node2中执行

我当时执行的是:

root@k8s-node1\~\]# kubeadm join 192.168.40.180:6443 --token vulvta.9ns7da3saibv4pg1 --discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a --ignore-preflight-errors=SystemVerification 看到下面图片响应的,说明k8s-node1节点已经加入到集群了,充当工作节点了 ![在这里插入图片描述](https://file.jishuzhan.net/article/1750063222653718529/09c301a1aecd6baaf42c735b7a3fa16b.webp) 在k8s-master1上执行下面命令,查看集群节点状况 ```bash kubectl get nodes ``` 当时返回的如图: ![在这里插入图片描述](https://file.jishuzhan.net/article/1750063222653718529/9007bc444125161b07f13cbebc4d87b1.webp) 对k8s-node1打个标签,显示work ```bash kubectl label nodes k8s-node1 node-role.kubernetes.io/work=work kubectl label nodes k8s-node2 node-role.kubernetes.io/work=work ``` ```bash kubectl get nodes ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1750063222653718529/f7cec35f63cc03e88a626913eed73710.webp) > 为什么在工作节点运行kubectl报错? > > \[root@k8s-node1 \~\]# kubectl get nodes > > The connection to the server localhost:8080 was refused - did you specify the right host or port? > > 因为在工作节点上没有$HOME/.kube/config文件。 在工作节点上执行kubectl的步骤如下: **分别在node1和node2中执行** ```bash mkdir $HOME/.kube/ ``` **在master节点中执行** ```bash scp /root/.kube/config k8s-node1:/root/.kube/ ``` **分别在node1和node2中执行** ```bash kubectl get nodes ``` ## 安装kubernetes网络组件-Calico 把安装calico需要的镜像calico.tar.gz(在上面提供的网盘里)传到3个服务器上,上传后执行 **ps. 以下命令3个服务器里都执行** ```bash ctr -n=k8s.io images import calico.tar.gz ``` 上传calico.yaml(在上面提供的网盘里)到master节点上,使用yaml文件安装calico 网络插件 ```bash kubectl apply -f calico.yaml ``` 注:在线下载配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml 以上安装结束,最后的截图如下: ```bash kubectl get nodes ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1750063222653718529/0bb3d75a63b3a89c4157acfc1e471fe1.webp)

相关推荐
无聊的HZ5 分钟前
k8s中, deployments 、pods 、replica sets 、services 他们分别是什么?有什么关联?
云原生·容器·kubernetes
liuc03171 小时前
docker下安装RediSearch
redis·docker·容器
庸子1 小时前
动静结合的防御体系:Kubernetes 网络零信任与漏洞扫描实战
网络·容器·kubernetes
工具罗某人1 小时前
Docker快速部署mysql8.0
运维·docker·容器
间彧1 小时前
K8s Gateway API与现有Ingress控制器如何实现平滑迁移?
kubernetes
醉风塘1 小时前
Docker Swarm 功能详细讲解
运维·docker·容器
间彧1 小时前
Kubernetes Gateway API相比传统Ingress有哪些具体优势?
kubernetes
间彧2 小时前
Service Mesh如何具体实现东西流量的熔断、重试等治理能力?
kubernetes
间彧2 小时前
K8s实际生产环境中,如何选择适合的南北流量暴露方案?各有什么优缺点?
kubernetes
间彧2 小时前
K8s集群中,什么是东西流量、南北流量
kubernetes