目录
k8s集群类型
一主多从集群:由一台Master管理节点和多台Node工作节点组成,生产环境下Master节点存在单点故障的风险,适合学习和测试环境使用;
多主多从集群:由多台Master管理节点和多Node工作节点组成,安全性高,适合生产环境使用;
k8s集群规划:
本章采用一主多从集群进行演示
主机名
IP地址
角色
操作系统
硬件最低配置
Master
192.168.100.101
管理节点
CentOS 7
2Core/4G内存/50G+
node01
192.168.100.102
工作节点
CentOS 7
1Core/2G内存/50G
node02
192.168.100.103
工作节点
CentOS 7
1Core/2G内存/50G+
注意:master节点CPU必须为2核心(不然后续集群初始化会报错),内存2+
1.基础环境准备:
(1)保证可以连接外网
(2)关闭禁用防火墙和selinux
(3)同步阿里云服务器时间(达到集群之间时间同步)****
yum install ntpdate -y
ntpdate ntp1.aliyun.com
(4)主机名规划
hostnamectl set-hostname 主机名
2.集群环境部署
提示:以下前期环境准备需要在所有节点都执行(可使用Ansible或xshell自带的终端同步)
******(1)配置集群之间本地解析 ******
集群在初始化时需要能够解析到每个节点的主机名
cat <<END>> /etc/hosts
192.168.100.101 master
192.168.100.102 node01
192.168.100.103 node02
END
******(2)**开启bridge网桥过滤功能
bridge (桥接网络) 是 Linux 系统中的一种虚拟网络设备,它充当一个虚拟的交换机,为集群内的容器提供网络通信功能,容器就可以通过这个 bridge 与其他容器或外部网络通信了。
cat <<EOF>> /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
参数解释:
net.bridge.bridge-nf-call-ip6tables = 1 //对网桥上的IPv6数据包通过iptables处理
net.bridge.bridge-nf-call-iptables = 1 //对网桥上的IPv4数据包通过iptables处理 net.ipv4.ip_forward = 1 //开启IPv4路由转发,来实现集群中的容器与外部网络的通信
由于开启 bridge 功能,需要加载 br_netfilter 模块来允许在 bridge 设备上的数据包经过 iptables 防火墙处理
modprobe br_netfilter && lsmod | grep br_netfilter
加载配置文件,使上述配置生效
sysctl -p /etc/sysctl.d/k8s.conf
******(3)**配置ipvs代理功能
在k8s中 Service 有两种代理模式,一种是基于 iptables 的,一种是基于 ipvs ,两者对比 ipvs 负载均衡算法更加的灵活,且带有健康检查的功能,如果想要使用 ipvs 模式,需要手动载入 ipvs 模块。
ipset 和 ipvsadm 是两个与网络管理和负载均衡相关的软件包,提供多种负载均衡算法,如轮询(Round Robin)、加权轮询(Weighted Round Robin)、最小连接(Least Connection)、加权最小连接(Weighted Least Connection)等;
使用yum安装
yum -y install ipset ipvsadm
将需要加载的 ipvs 相关模块写入到文件中
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
EOF
模块介绍:
ip_vs //提供负载均衡的模块
ip_vs_rr //轮询算法的模块(默认)
ip_vs_wrr //加权轮询算法的模块,根据后端服务器的权重值转发请求
ip_vs_sh //哈希算法的模块,同一客户端的请求始终被分发到相同的后端服务器,保证会话一致性 nf_conntrack //链接跟踪的模块,用于跟踪一个连接的状态,例如 TCP 握手、数据传输和连接关闭等
添加可执行权限执行脚本加载模块
chmod +x /etc/sysconfig/modules/ipvs.modules
/etc/sysconfig/modules/ipvs.modules
lsmod | grep ip_vs
(4)关闭禁用swap分区
为了保证 kubelet 正常工作要求禁用SWAP,否则集群初始化失败
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
查看是否关闭
free -h|grep -i swap
为什么要关闭swap分区?
swap 启用后,在使用磁盘空间和内存交换数据时,性能表现会较差,会减慢程序执行的速度。有的软件的设计师不想使用交换,例如:kubelet 在 v1.8 版本以后强制要求 swap 必须关闭,否则会报错。
3.安装Docker(采用离线版部署较快)
Windows和Linux系统部署Docker容器(2)_windows linux如何运行 docker程序-CSDN博客
如果想直接在线安装Docker可以看我上一章文档
注意:也是三台服务器都需要安装,docker版本不要安装的太新尽量是20.10.0或以下版本不然会与k8s出现不兼容现象(需要另加插件),具体可查看k8s官网详情
百度网盘下载离线资源(会有限速现象)
链接:https://pan.baidu.com/s/13es-mHZx7QzYWLpu4V399w?pwd=f36s
提取码:f36s
(1)上传离线包并解压
tar xfz docker_20.10.0.tar.gz
(2)安装Docker
cd docker_20.10.0/
yum -y install ./*.rpm
(3)启用 Cgroup 控制组
用于限制进程的资源使用量,如CPU、内存资源
mkdir /etc/docker
cat <<EOF>> /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
(4)启动并查看Docker版本
systemctl enable docker --now
docker -v
Docker部署成功!!!
4.k8s集群部署
部署方式有哪些:
k8s集群有多种部署方式,目前常用的部署方式有如下两种:
kubeadm 部署方式:kubeadm是一个快速搭建kubernetes的集群工具;
二进制包部署方式(对新手不友好):从官网下载每个组件的二进制包,依次去安装,部署麻烦;
其他方式:通过一些开源的工具搭建,例如:sealos;
本章使用Kubeadm方式部署k8s集群,需要配置k8s软件仓库来安装集群所需软件,本实验使用阿里云YUM源
注意:三台服务器都需要配置
(1)使用阿里仓库进行安装
cat <<END>> /etc/yum.repos.d/k8s.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
END
******(2)**安装集群软件
本实验安装k8s 1.23.0版本软件
yum install -y kubeadm-1.23.0-0 kubelet-1.23.0-0 kubectl-1.23.0-0
如果报错:
需下载使用公网仓库(例如:阿里公网仓库)下载依赖
(3)配置 kubelet 启用 Cgroup 控制组
用于限制进程的资源使用量,如CPU、内存等
echo 'KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"' >/etc/sysconfig/kubelet
(4)设置kubelet开机自启
**5.**集群初始化
###master节点配置
******(1)**查看集群所需镜像文件
[root@master ~]# kubeadm config images list
******(2)**创建集群初始化配置文件
[root@master ~]# kubeadm config print init-defaults > kubeadm-config.yml
******(3)**配置集群初始化文件
[root@master ~]# vim kubeadm-config.yml
advertiseAddress: 192.168.100.101
name: master
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
(4)集群初始化
[root@master ~]# kubeadm init --config kubeadm-config.yml --upload-certs
拉取镜像过程可能会有点长请耐心等待(快慢取决于网速)
选项说明: --upload-certs //初始化过程将生成证书,并将其上传到etcd存储中,避免证书被移动或者删除,也不会影响集群。
init初始化失败:
注意:如果初始化环境报错说明前面基础环境有问题请仔细检查如:cpu2+ 内存2+,使用如下命令进行回退
[root@k8s-master ~]# kubeadm reset -f
[root@k8s-master ~]#
[root@k8s-master ~]# rm -rf /etc/kubernetes
[root@k8s-master ~]# rm -rf /var/lib/etcd/
[root@k8s-master ~]# rm -rf $HOME/.kube
如果显示此信息说明初始化成功!前面的基础环境没有问题
(5)根据提示,在master生成集群管理员配置文件
注意:认真查看提示信息,不能装作没看见
#在master主节点执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6.node节点加入集群
可根据提示信息加入node节点
token有效期为24小时,如果提示信息失效可重新生成(如果可以看到或找到提示信息就不用生成了):
在master节点重新生成包含新token的完整命令
重新生成token
[root@master ~]# kubeadm token create
查看token
[root@master ~]# kubeadm token create --print-join-command
(2)查看节点是否加入成功
[root@master ~]# kubectl get nodes
**7.**部署Calico网络
Calico 和 Flannel 是两种流行的 k8s 网络插件,它们都为集群中的 Pod 提供网络功能。然而,它们在实现方式和功能上有一些重要区别:
网络模型的区别:
Calico 使用 BGP(边界网关协议)作为其底层网络模型。它利用 BGP 为每个 Pod 分配一个唯一的 IP 地址,并在集群内部进行路由。Calico 支持网络策略,可以对流量进行精细控制,允许或拒绝特定的通信。
Flannel 则采用了一个简化的覆盖网络模型。它为每个节点分配一个 IP 地址子网,然后在这些子网之间建立覆盖网络。Flannel 将 Pod 的数据包封装到一个更大的网络数据包中,并在节点之间进行转发。Flannel 更注重简单和易用性,不提供与 Calico 类似的网络策略功能。
性能的区别:
由于 Calico 使用 BGP 进行路由,其性能通常优于 Flannel。Calico 可以实现直接的 Pod 到 Pod 通信,而无需在节点之间进行额外的封装和解封装操作。这使得 Calico 在大型或高度动态的集群中具有更好的性能。
Flannel 的覆盖网络模型会导致额外的封装和解封装开销,从而影响网络性能。对于较小的集群或对性能要求不高的场景,这可能并不是一个严重的问题。
******(1)**在 master节点安装下载 Calico 的yaml文件
[root@master ~]#
wget https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml
******(2)**创建calico网络
[root@master ~]# kubectl apply -f calico.yaml
******(3)**查看calico的Pod状态
[root@master ~]# kubectl get pod -n kube-system
显示镜像正在拉取
等十几分钟再次查看
这种现象就属于镜像没有拉取成功,正常的话应该显示Runing状态,由于镜像在国外难免会出一些问题,所以只能使用离线资源(提前下载好的镜像)了大家可以看我上一文档
离线部署Calico网络(如果拉取不到可使用离线方式部署):
k8s离线部署Calico网络(2续)-CSDN博客
删除calico命令:
[root@master ~]# kubectl delete pod 节点名称 -n kube-system
使用变量删除所有:慎用
[root@master ~]# kubectl delete pod $(kubectl get pods -n kube-system|grep calico-node|awk '{print $1}') -n kube-system
******(4)**检查集群状态
[root@master ~]# kubectl get nodes
状态显示‘Ready’就说明集群没有问题可以使用了!!!
8.验证:使用k8s运行一个nginx容器
(1)简单写一个nginx的yaml文件
[root@master ~]# vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30003
****(2)创建nginx容器****
[root@master ~]# kubectl apply -f nginx.yaml
(3)查看容器状态和映射端口
[root@master ~]# kubectl get pod,svc
(4)浏览器访问测试:
部署成功!!!!
版权归原作者 DevOps菜鸟(Xu JieHao) 所有, 如有侵权,请联系我们删除。