192.168.0.35 k8s-master
192.168.0.39 k8s-node1
192.168.0.116 k8s-node2
修改每台机器的名字
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
关闭防火墙和selinux
systemctl stop firewalld && systemctl disable firewalld
临时关闭selinux:
setenforce 0
永久关闭:
vim /etc/selinux/config
修改selinux为disabled或者permissive 重启生效
配置本地解析
echo '''
192.168.0.35 k8s-master
192.168.0.39 k8s-node1
192.168.0.116 k8s-node2
''' >> /etc/hosts
确保每个节点MAC地址和 product_uuid 的唯一性
你可以使用命令 ip link 或 ifconfig -a 来获取网络接口的 MAC 地址
可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验
一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。
同步时间
如果各机器上时间都没有问题,也没有偏差,则可以跳过该步骤。
# 安装ntp工具
yum install -y ntp
#设置时区
timedatectl set-timezone 'Asia/Shanghai'
# 同步时间
ntpdate ntp1.aliyun.com
升级内核
链接:linux(centos7.6–>7.9)内核升级
更新yum—版本高可以跳过此步骤
sudo yum update
每个节点都需要下载
yum install -y yum-utils device-mapper-persistent-data lvm2 git
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
注意:
如果使用的挂载磁盘则需要更改docker的数据目录
如果是启动过的docker则需要停止docker服务 然后把 /var/lib/docker/目录下的数据移动到新的目录 mv /var/lib/docker/ /data/docker/
修改docker默认数据存储目录配置,在/etc/docker/daemon.json文件添加 以下内容,若是没有/etc/docker/daemon.json文件,则新建该文件
vim /etc/docker/daemon.json
{
"data-root": "/data/docker"
}
启动docker
systemctl start docker
systemctl enable docker
设置开机自启
关闭swap分区
Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。方法一,通过kubelet的启动参数–fail-swap-on=false更改这个限制。方法二,关闭系统的Swap。
每个节点都需要关闭
swapoff -a
vim /etc/fstab 注释掉SWAP的自动挂载
使用free -m查看是否关闭
初始化的时候,它会自动拉取镜像但是自动拉取用的是k8s官网的源地址容易失败所以手动拉取aliyun的镜像。注意拉取的docker镜像的版本必须要和kubelet、kubectl的版本保持一致。在下面初始化时直接指定阿里云的镜像。
vim dockerpull.sh
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.9.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.6-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
执行脚本拉取镜像
bash dockerpull.sh
看下镜像是否都拉取成功
docker images
Kubernetes 的早期版本仅适用于特定的容器运行时:Docker Engine。 后来,Kubernetes 增加了对使用其他容器运行时的支持。为了实现编排器和许多不同的容器运行时之间交互操作创建了CRI 标准。 Docker Engine 没有实现(CRI)接口,所以Kubernetes 项目创建了特殊代码dockershim来帮助过渡,Dockershim 代码一直是一个临时解决方案(因此得名:shim)。 Kubernetes自v1.24移除了对Dockershim 的支持,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker 。
注意部署最新版本XXXX 默认不在是使用docker容器,所以需要下载一个插件
所有节点都需要下载
https://github.com/Mirantis/cri-dockerd/releases
下载对应版本的cri-dockerd rpm包,注意版本和linux版本,也可以自行下载上传至所有主机
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.2/cri-dockerd-0.3.2-3.el7.x86_64.rpm
安装
rpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.rpm
修改/usr/lib/systemd/system/cri-docker.service文件中ExecStart配置kubelet使用pause镜像
vim /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
systemctl daemon-reload
systemctl enable --now cri-docker
加载ipvs相关内核模块
vim mod.sh
#!/bin/bash
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4
modprobe br_netfilter
chmod +x mod.sh
bash mod.sh
scp mod.sh k8s-node1:/root/
scp mod.sh k8s-node2:/root/
发送后记得执行一下
vim /etc/rc.local 如果重新开机,需要重新加载,需要写在 /etc/rc.local 中开机自动加载
添加这句 bash /root.mod.sh
chmod +x /etc/rc.local
配置转发相关参数,否则可能会出错
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF
使配置生效
sysctl --system
查看是否加载成功
lsmod | grep ip_vs
所有节点都需要安装
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
拷贝到另外两台机器
scp /etc/yum.repos.d/kubernetes.repo k8s-node1:/etc/yum.repos.d/kubernetes.repo
scp /etc/yum.repos.d/kubernetes.repo k8s-node2:/etc/yum.repos.d/kubernetes.repo
yum makecache fast -y
yum install -y kubelet kubeadm kubectl ipvsadm
#注意,这样默认是下载最新版本
如果想下载旧版本,后面要跟上指定的版本号
yum install -y kubelet-1.22.2-0.x86_64 kubeadm-1.22.2-0.x86_64 kubectl-1.22.2-0.x86_64 ipvsadm
启动kubelet
systemctl daemon-reload
systemctl enable kubelet && systemctl restart kubelet
systemctl status kubelet
(每个节点都会报错),不用管master节点初始化之后就好了。
在master节点执行初始化(node节点不用执行)
参数详情:
apiserver-advertise-address 指定apiserver的IP,即master节点的IP
image-repository 设置镜像仓库为国内的阿里云镜像仓库
kubernetes-version 设置k8s的版本,跟步骤三的kubeadm版本一致
service-cidr 这是设置node节点的网络的,暂时这样设置
pod-network-cidr 这是设置node节点的网络的,暂时这样设置
cri-socket 设置cri使用cri-dockerd
查看版本
kubeadm version
kubeadm init --apiserver-advertise-address=192.168.0.35 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.27.2 --service-cidr=10.168.0.0/12 --pod-network-cidr=10.244.0.0/16 --cri-socket unix:///var/run/cri-dockerd.sock --ignore-preflight-errors=all
执行完初始化的命令 查看一下回显是否成功 返回0为成功
echo $?
kubeadm join 192.168.0.35:6443 --token 62kh2k.7lfpud7ridya1it7 \
--discovery-token-ca-cert-hash sha256:b55066a01216999577c2260bad6349ab8e293bff58ec9ea041b2c7c7bb51913e
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
完成master节点的时候k8s已经叫我们去配置pod网络了。在k8s系统上Pod网络的实现需要依赖于第三方插件进行种类有很多我们这里使用的flannel。
cd ~ && mkdir flannel && cd flannel
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
查看一下镜像版本随后使用docker拉取,所有节点都拉
vim kube-flannel.yml
docker pull docker.io/flannel/flannel:v0.22.0
docker pull docker.io/flannel/flannel-cni-plugin:v1.1.2
重新加载文件
kubectl apply -f kube-flannel.yml
kubectl get nodes
从NoReady 变成了 Ready 那么我们的flannel就部署好了
Node1 节点操作
kubeadm join 192.168.0.35:6443 --token 62kh2k.7lfpud7ridya1it7 \
--discovery-token-ca-cert-hash sha256:b55066a01216999577c2260bad6349ab8e293bff58ec9ea041b2c7c7bb51913e --cri-socket unix:///var/run/cri-dockerd.sock
再次查看状态,Node两个节点也已经加入成功
看下flannel运行状态
kubectl get pods --namespace kube-flannel