【原文链接】Kubernetes----基于kubeadm工具在CentOS7.9虚拟机上部署一主两从类型的1.26版本的Kubernetes集群环境
环境规划信息如下,准备三台虚拟机,虚拟机的资源配置根据自身资源情况配置,最好设置2核以上,内存4G以上,磁盘50G以上,当然资源越多越好。
|主机名|ip地址|cpu|内存|磁盘|
|:—:—:—:—
|master|192.168.116.40|8核|32G|120G|
|node1|192.168.116.41|8核|32G|120G|
|node2|192.168.116.42|8核|32G|120G|
按照1.1中的主机名称的规划设置主机名,设置命令如下
hostnamectl set-hostname master # 在192.168.116.40 上执行
hostnamectl set-hostname node1 # 在192.168.116.41 上执行
hostnamectl set-hostname node2 # 在192.168.116.42 上执行
设置完成后,可以通过执行 hostname 命令查看主机名称是否正确配置。
使用CentOS操作系统要求版本要大于等于7.5 ,可通过如下命令查看,确认CentOS操作系统的版本符合要求
cat /etc/redhat-release
在三台虚拟机中分别编辑 /etc/hosts 文件,增加如下内容
192.168.116.40 master
192.168.116.41 node1
192.168.116.42 node2
配置完成后,分别在master节点上ping node1和node2,在node1节点上ping master和node2,在node2节点上ping master和node1节点,若均能ping通,则表示地址解析配置成功。
在三台虚拟机上均执行如下命令
systemctl start chronyd
systemctl enable chronyd
配置完成后,可分别在三台虚拟机上执行date命令,大概确认时间是否已保持一致。如时间已保持一致,表明配置成功。
在三台虚拟机上均执行如下命令,关闭防火墙(测试环境可以直接关闭,生产环境则需要谨慎考虑)
systemctl stop firewalld
systemctl disable firewalld
systemctl stop iptables
systemctl disable iptables
在三台虚拟机上分别编辑 /etc/selinux/config 文件,然后将 SELINUX=enforcing 修改为 SELINUX=disabled,如下为修改后的配置
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
修改后需要重启才会生效,这里暂时先不重启,待后续配置都配置完成后统一重启。
在三台服务器编辑 /etc/fstab 文件,然后将 /dev/mapper/centos-swap swap 一行注释,比如这里编辑后的配置如下所示
/dev/mapper/centos-root / xfs defaults 0 0
UUID=d2b7d48e-aec4-42ab-926a-6531422bd16e /boot xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
同样这里暂时也先不重启,待后续配置完成后统一重启。
在三台服务器上创建 /etc/sysctl.d/kubernetes.conf 文件,文件中增加如下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip.forward = 1
然后分别在三台服务器上执行如下命令,使配置生效
sysctl -p
然后分别在三台服务器上执行如下命令加载 br_netfilter 模块
modprobe br_netfilter
然后执行如下命令查看模块是否已被加载
lsmod | grep br_netfilter
当显示结果如下所示,则表示模块已被正确加载
[root@k8s-3 ~]# lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
[root@k8s-3 ~]#
在三台服务器上执行如下命令安装软件包 ipset和ipvsadm
yum install -y ipset ipvsadm
然后在三台服务器上分别创建 /etc/sysconfig/modules/ipvs.modules 文件,文件内容如下:
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
然后执行如下命令为文件增加可执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
然后执行如下命令,即执行上述文件
bash /etc/sysconfig/modules/ipvs.modules
执行完成后,通过执行 lsmod|grep ip_vs 命令查看结果,如下所示则表示配置成功
[root@k8s-3 ~]# lsmod|grep ip_vs
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 139264 2 ip_vs,nf_conntrack_ipv4
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
[root@k8s-3 ~]#
至此,服务器的基础配置已经配置完成,此时可以重启三台服务器了。
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum clean all
yum makecache
首先执行如下命令查看Docker的版本
yum list docker-ce --showduplicates
然后选择一个版本,比如这里选择 20.10.16-3.el7 版本,分别在三台服务器上执行如下命令安装Docker
yum install -y --setopt=obsolutes=0 docker-ce-20.10.16-3.el7
在三台服务器上编辑 /etc/docker/daemon.json 文件,配置如下内容
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://ooe7wn09.mirror.aliyuncs.com"]
}
执行如下命令即可启动Docker并设置开机自启动Docker
systemctl start docker
systemctl enable docker
编辑 /etc/containerd/config.toml 文件,将 disabled_plugins = [“cri”] 一行注释
然后重启 containerd
systemctl restart containerd
systemctl restart docker
下载并安装rpm
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.1-3.el7.x86_64.rpm
修改配置 /usr/lib/systemd/system/cri-docker.service, ExecStart 修改为如下内容
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
然后启动
systemctl daemon-reload
systemctl enable --now cri-docker
在三台服务器上编辑 /etc/yum.repos.d/kubernetes.repo 文件,文件内容如下
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
然后在三台服务器上执行如下命令更新yum源
yum clean all
yum makecache
然后通过如下命令查看可以安装的版本
yum list --showduplicates | grep kubeadm
比如这里可以安装 1.26.8-0 版本,即在三台服务器上执行如下命令安装 kubeadm,kubelet,kubectl
yum install -y --setopt=obsolutes=0 kubeadm-1.26.8-0 kubelet-1.26.8-0 kubectl-1.26.8-0
在三台服务器上编辑 /etc/sysconfig/kubelet 文件,然后编写如下内容
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
然后执行如下命令设置 kubelet 开机自启动
systemctl enable kubelet
首先通过 kubeadm config images list 命令查看需要的镜像以及tag值,比如这里是
registry.k8s.io/kube-apiserver:v1.26.9
registry.k8s.io/kube-controller-manager:v1.26.9
registry.k8s.io/kube-scheduler:v1.26.9
registry.k8s.io/kube-proxy:v1.26.9
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.9.3
因为k8s官网在国外,这里需要先从阿里云上下载,然后通过修改tag值的方式改为和k8s官网一样的,然后再进行安装
在三台服务器上执行如下命令
images=(kube-apiserver:v1.26.9 kube-controller-manager:v1.26.9 kube-scheduler:v1.26.9 kube-proxy:v1.26.9 pause:3.9 etcd:3.5.6-0 coredns:v1.9.3)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
docker tag k8s.gcr.io/coredns:v1.9.3 k8s.gcr.io/coredns/coredns:v1.9.3
然后通过 docker images 查看镜像,如下所示即此时镜像与k8s需要的官方镜像一致了
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 d7b085374dbc 6 weeks ago 581MB
k8s.gcr.io/kube-apiserver v1.21.14 e58b890e4ab4 14 months ago 126MB
k8s.gcr.io/kube-controller-manager v1.21.14 454f3565bb8a 14 months ago 120MB
k8s.gcr.io/kube-scheduler v1.21.14 f1e56fded161 14 months ago 50.9MB
k8s.gcr.io/kube-proxy v1.21.14 93283b563d47 14 months ago 104MB
k8s.gcr.io/pause 3.4.1 0f8457a4c2ec 2 years ago 683kB
k8s.gcr.io/coredns/coredns v1.8.0 296a6d5035e2 2 years ago 42.5MB
k8s.gcr.io/coredns v1.8.0 296a6d5035e2 2 years ago 42.5MB
k8s.gcr.io/etcd 3.4.13-0 0369cf4303ff 3 years ago 253MB
[root@master ~]#
注意,此时只需在master节点执行如下命令即可
kubeadm init --kubernetes-version=v1.26.9 --pod-network-cidr=10.240.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.116.40 --cri-socket=unix:///var/run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers
如下图所示,出现 “successfuly” 字样表示部署成功
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
此时通过 kubectl get nodes 命令可以查看当前集群环境的节点信息,如下所示,此时集群环境中只有一个master节点
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane,master 8m38s v1.21.10
[root@master ~]#
在集群初始化的结果回显中如下图所示已经给出提示了,通过在节点服务器上执行如下命令即可增加集群节点,因此此时可以到node1和node2节点上执行此命令。
kubeadm join 192.168.116.40:6443 --token gcd293.mazg2vbx7td1q84g \
--discovery-token-ca-cert-hash sha256:f6e8a63c31cf3b6b0e902368992d7358cdbd6de36c3e71bed291fa0ecd64fabd --cri-socket=unix:///var/run/cri-dockerd.sock
然后再次在master节点中查看集群的节点信息,如下所示,此时集群环境中已经存在三个节点了
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 6m48s v1.26.8
node1 NotReady <none> 26s v1.26.8
node2 NotReady <none> 5s v1.26.8
注意,这里只需要在master节点上操作,即在master节点上执行如下命令
cd /opt/
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
然后编辑配置文件,将配置文件中namespace修改为 kube-system,子网范围也需要配置跟前面k8s初始化的时候一致,比如这里是 10.240.0.0/16,修改完成后,就可以执行如下命令了。
kubectl apply -f kube-flannel.yml
稍微等待一两分钟,再次在master节点上查看集群节点状态,如下所示,此时master、node1、node2节点状态均为Ready状态了
[root@master opt]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 15m v1.21.10
node1 Ready <none> 4m4s v1.21.10
node2 Ready <none> 3m52s v1.21.10
[root@master opt]#
至此,一主两从的Kubernetes集群环境就搭建完成了。