结合网上资料,利用k8s最后直接支持docker的版本1.23.17搭建,并本地验证完成。
1 虚拟机准备
1.1 规划
系统 | 角色/hostname | IP地址 | 配置 |
---|---|---|---|
CentOS 7.9 (需要7.5+) | master | 192.168.68.100 | 2Core、4G内存、40GB磁盘 |
CentOS 7.9 (需要7.5+) | node1 | 192.168.68.101 | 2Core、4G内存、40GB磁盘 |
CentOS 7.9 (需要7.5+) | node2 | 192.168.68.102 | 2Core、4G内存、40GB磁盘 |
1.2 虚拟机安装
使用VMWare Workstation 17
1.1.1 新建虚拟机
选择自定义,稍后安装系统
1.1.2 配置虚拟机
开启虚拟机,选择直接安装,软件选择时,选择 基础设施服务器
,安装位置 默认即可
接下来是网络设置,设置固定IP,DNS使用阿里云的公共 DNS:223.5.5.5,保存后,同时更改左下角主机名为对应名称即可,对应:master、node1、node2
配置完成,即可开始安装
,并设置系统密码
2 环境初始化
所有服务器节点都需要执行,使用 xshell 时,可以:工具 --> 发送键输入到所有会话,这样就是同时操作多个服务器
2.1 查看版本
确保版本 >= 7.5,本次使用的是7.9
cat /etc/redhat-release
2.2 配置主机名解析
方便集群间直接调用
cat>>/etc/hosts<<EOF
192.168.68.100 master
192.168.68.101 node1
192.168.68.102 node2
EOF
2.3 时间同步
k8s要求集群内节点时间精确一致。这里使用chronyd
进行时间同步,也可以使用 ntp ntpdate
systemctl start chronyd && systemctl enable chronyd
2.4 关闭防火墙
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
systemctl stop firewalld && systemctl disable firewalld
# 以下在 centos7 上未启用,可不做处理
systemctl stop iptables && systemctl disable iptables
2.5 禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
setenforce 0 && sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
2.6 禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2.7 修改内核参数和模块
修改linux的内核参数,添加网桥过滤和地址转发功能
cat <<EOF > /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
重新加载 使内核参数配置生效
sysctl --system && modprobe br_netfilter && lsmod | grep br_netfilter
2.8 ipset和ipvsadm
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
yum install ipset ipvsadm -y
编辑需要添加的模块脚本
cat <<EOF> /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
EOF
添加执行权限,并执行脚本
# 添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行脚本
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
2.9 重启服务器
reboot
3 安装docker
在所有服务器节点执行
3.1 准备
# 更新yum
yum update
# 卸载旧版docker
yum remove docker docker-common docker-selinux docker-engine
# 安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 或者使用阿里云的镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
3.2 安装
这里安装的是 20.10.24
版本
yum -y install docker-ce-20.10.24-3.el7 docker-ce-cli-20.10.24-3.el7 containerd.io
3.3 配置镜像地址
这里配置的清华镜像
Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
mkdir /etc/docker && cat <<EOF> /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
EOF
3.4 开机自启动
systemctl start docker && systemctl enable docker
4 kubernetes 安装
在所有服务器节点执行
4.1 配置镜像源
由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源
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=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
4.2 安装指定版本
安装kubeadm、kubelet和kubectl,这里安装的是1.23.17版本
yum -y install kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17
4.3 配置
配置kubelet的cgroup,与 3.3 配置相同:systemd
cat>/etc/sysconfig/kubelet<<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF
4.4 开机自启kubelet
启动不先启动,因为后边的安装过程中会自动启动
systemctl enable kubelet
5 集群安装
以下在所有服务器都要执行
kubernetes默认CA证书为10年,其他证书为一年,需要修改可参考:https://blog.csdn.net/bh451326803/article/details/125439466,修改完成再进行以下操作,无需修改可无视
5.1 准备集群镜像
由于网络原因,无法连接,下面提供了一种替代方案,直接使用阿里云镜像
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
下面开始对集群进行初始化,并将node节点加入到集群中
以下只在 master 服务器上执行
5.2 创建集群
kubeadm init \
--kubernetes-version=v1.23.17 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.68.100 --image-repository=registry.aliyuncs.com/google_containers
5.3 创建必要文件
上边集群创建成功后,命令行会提示以下信息
mkdir -p $HOME/ .kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
以下只在 node 服务器上执行
5.4 node节点加入集群
以下这个命令,是 5.1 创建集群成功后,会提示的一个命令,注意查看提示
kubeadm join 192.168.68.100:6443 --token 8587uc.o8knircuri8etnw2 \
--discovery-token-ca-cert-hash sha256:acc37967fb5b0acf39d7598f8a439cc7de88f439a3f4d0c9cae88e7901b9d3f
6 网络插件安装
以下在 master 节点执行
查看各个节点的状态kubectl get nodes
,全部都是notready状态,需要安装网络插件。k8s支持多种网络插件,如flannel,calico,canal等,这里选择flannel。
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
若无法访问,可直接去GitHub下载
https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
这里放到root目录下,之后再使用配置文件启动fannel
kubectl apply -f kube-flannel.yml
稍等片刻,再次查看node状态,发现为ready
kubectl get nodes
至此,集群环境搭建完成
7 验证集群
接入master节点,部署一个 nginx 进行测试
#部署nginx
kubectl create deployment nginx --image=nginx:1.18-alpine
#暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
获取到部署信息如下
可以发现port=32673,用浏览器访问master:port 或 node1:port 或 node2:port都可以进入nginx主页