K8S集群保姆式搭建配置(多主多从高可用集群企业级搭建)
- K8S概括
- 一、集群环境规划
- 二、环境准备
- 三、安装Docker
- 四、部署负载均衡(只在node6、node7节点操作)
- 4.1 在node6、node7上安装haproxy和keepalived软件包
- 4.2 在node6、node7上,修改haproxy配置文件(清空内容,然后复制下面内容,配置文件内容node6、7保持一致)
- 4.3 node6、node7上启动haproxy
- 4.4 在node6(主负载均衡)上修改keepalived
- 4.5 在node7(备负载均衡)上修改keepalived
- 4.6 在node6(主负载均衡)上创建检测haproxy脚本
- 4.7 在node7(备负载均衡)上创建检测haproxy脚本
- 4.8 在node6、node7上修改脚本权限
- 4.9 在node6、node7上启动keepalived
- 4.10 在ndoe6节点确认VIP地址是否生成
- 五、使用kubeadm方式部署kubernetes集群
- 六、部署Pod网络插件Calico
- 七、部署Nginx测试集群是否正常
ansible包下载
sysconfigure.sh脚本下载
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/026527771ec94ff68f275916a6eb40d4.jpeg#pic_center)
K8S概括
Kubernetes(也称 k8s 或 “kube”)是一个开源的容器编排平台,可以自动化在部署、管理和扩展容器化应用过程中涉及的许多手动操作。
k8s集群需要建⽴在多个节点上,将多个节点组建成一个集群,然后进⾏统⼀管理,但是在k8s集群内部,这些节点⼜被划分成了两类⻆⾊: Master管理节点 和 Node工作节点
**Master管理节点组件:**
● API Server:作为集群的控制中心,处理外部和内部通信,接收用户请求并处理集群内部组件之间的通信;
● Scheduler:负责将待部署的 Pods 分配到合适的 Node 节点上,根据资源需求、策略和约束等因素进行调度;
● Controller Manager:管理集群中的各种控制器,例如: Deployment、ReplicaSet、StatefulSet控制器等,来管理集群中的各种资源;
● etcd:作为集群的数据存储,保存集群的配置信息和状态信息;
**Node工作节点组件:**
● Kubelet:负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;
● 容器运行时(如 Docker、containerd 等):负责运行和管理容器,提供容器生命周期管理功能。例如:创建、更新、删除容器等;
● Kube-proxy:负责为集群内的服务实现网络代理和负载均衡,确保服务的访问性 。废话不多说,直接开干
一、集群环境规划
搭建集群所需的服务器比较多,本次部署需要8台服务器:
node0
:部署ansible自动化运维工具,ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能 力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架;
node1、node2、node3
:Master管理节点:负责集群的所有管理工作,和协调集群中运行的容器应用;
node4、node5
:Node工作节点:负责运行集群中所有用户的容器应用, 执行实际的工作负载;
node6、node7
:负载均衡节点:负责根据应用的负载情况自动分配流量,确保各个实例之间的负载均衡,避免某些实例过载导致的性能下降;
二、环境准备
2.1 升级8台服务器linux内核(内核版本大于4.0的可以忽略)
#本实验环境下所有机器的操作系统为Centos7.5,内核版本为3.10.0,需要升级内核版本,要不然后面无法创建pod
#查看系统版本
cat /etc/redhat-release
#查看当前系统的内核:
uname -sr
#在 CentOS 7.6上启用 ELRepo 仓库:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
#查看可用的系统内核相关包:
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
#安装最新主线内核版本:
yum -y --enablerepo=elrepo-kernel install kernel-ml
#修改GRUB_DEFAULT=0,设置为0表示默认启动第一个操作系统或内核,从0开始计数
vi /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0 # 修改此处,原来是 saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
#加载
grub2-mkconfig -o /boot/grub2/grub.cfg
#查看默认内核
grubby --default-kernel
#重启服务器使配置生效
reboot
#内核版本升级成功
2.2 所有服务器执行sysconfigure.sh脚本
#执行sysconfigure.sh脚本,关闭防火墙、同步时间、内核优化等
bash sysconfigure.sh
2.3 node0节点部署Ansible
#将ansible包传到node0服务器
#解压包
tar -xf ansible.tar.gz
#进入ansible目录
cd ansible
#安装rpm包
yum install ./*.rpm -y
#修改hosts文件
vim /etc/ansible/hosts
#清空所有内容
#添加管理节点和工作节点的服务器IP,保存退出
[k8s] #组名
192.168.124.201
192.168.124.202
192.168.124.203
192.168.124.204
192.168.124.205
#查看管理列表
ansible k8s --list-host
2.4 node0密钥分发各节点
#在node0节点生成密钥
ssh-keygen
#分发密钥,一直输入yes并输入服务器密码
for ip in 192.168.124.{201..205}
do
ssh-copy-id $ip
done
2.5 配置各节点hosts文件
#在node0服务器上,修改hosts文件,将管理节点和工作节点的服务器IP以及服务器名进行添加
vim /etc/hosts
#在node0服务器上,通过ansible工具将修改后的hosts文件分发机器的etc目录
ansible k8s -m copy -a 'src=/etc/hosts dest=/etc/'
2.6 开启bridge网桥过滤功能
#在node0服务器上创建文件
vim k8s.conf
#添加内容并保存
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
#node0服务器上通过ansible工具拷贝文件到各节点
ansible k8s -m copy -a 'src=k8s.conf dest=/etc/sysctl.d/'
#node0服务器上通过ansible工具用命令加载br_netfilter模块到各节点
ansible k8s -m shell -a 'modprobe br_netfilter && lsmod | grep br_netfilter'
#node0服务器上通过ansible工具用命令生效到各节点
ansible k8s -m shell -a 'sysctl -p /etc/sysctl.d/k8s.conf'
2.7 关闭SWAP分区
#node0服务器上通过ansible工具用命令临时关闭swap到各节点
ansible k8s -m shell -a 'swapoff -a'
#node0服务器上通过ansible工具用命令永久关闭swap到各节点
ansible k8s -m shell -a 'sed -ri 's/.*swap.*/#&/' /etc/fstab'
三、安装Docker
#node0服务器上通过ansible工具用命令安装依赖环境到各节点
ansible k8s -m shell -a 'yum install -y yum-utils'
#node0服务器上通过ansible工具用命令添加阿里仓库到各节点
ansible k8s -m shell -a 'yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo'
#node0服务器上通过ansible工具用命令安装docker到各节点
ansible k8s -m shell -a 'yum -y install docker-ce-20.10.9-3.el7'
#node0服务器上通过ansible工具用命令创建文件到各节点
ansible k8s -m shell -a 'mkdir /etc/docker'
#node0服务器上创建文件
vim daemon.json
#添加内容并保存
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
#node0服务器上通过ansible工具拷贝刚创建文件到各节点
ansible k8s -m copy -a 'src=daemon.json dest=/etc/docker'
#node0服务器上通过ansible工具用命令启动docker到各节点
ansible k8s -m shell -a 'systemctl enable docker --now'
#查看各节点docker状态
systemctl status docker
四、部署负载均衡(只在node6、node7节点操作)
4.1 在node6、node7上安装haproxy和keepalived软件包
yum -y install haproxy keepalived
4.2 在node6、node7上,修改haproxy配置文件(清空内容,然后复制下面内容,配置文件内容node6、7保持一致)
global
maxconn 2000 #单个进程最大并发连接数
ulimit-n 16384 #每个进程可以打开的文件数量
log 127.0.0.1 local0 err #日志输出配置,所有日志都记录在本机系统日志,通过 local0 输出
stats timeout 30s #连接socket超时时间
defaults
log global #定义日志为global(全局)
mode http #使用的连接协议
option httplog #日志记录选项,httplog表示记录与HTTP会话相关的日志
timeout connect 5000 #定义haproxy将客户端请求转发至后端服务器所等待的超时时长
timeout client 50000 #客户端非活动状态的超时时长
timeout server 50000 #客户端与服务器端建立连接后,等待服务器端的超时时长
timeout http-request 15s #客户端建立连接但不请求数据时,关闭客户端连接超时时间
timeout http-keep-alive 15s # session 会话保持超时时间
frontend monitor-in #监控haproxy服务本身
bind *:33305 #监听的端口
mode http #使用的连接协议
option httplog #日志记录选项,httplog表示记录与HTTP会话相关的日志
monitor-uri /monitor #监控URL路径
frontend k8s-master #接收请求的前端名称,名称自定义,类似于Nginx的一个虚拟主机server。
bind 0.0.0.0:6443 #监听客户端请求的 IP地址和端口(以包含虚拟IP)
bind 127.0.0.1:6443
mode tcp #使用的连接协议
option tcplog #日志记录选项,tcplog表示记录与tcp会话相关的日志
tcp-request inspect-delay 5s #等待数据传输的最大超时时间
default_backend k8s-master #将监听到的客户端请求转发到指定的后端
backend k8s-master #后端服务器组,要与前端中设置的后端名称一致
mode tcp #使用的连接协议
option tcplog #日志记录选项,tcplog表示记录与tcp会话相关的日志
option tcp-check #tcp健康检查
balance roundrobin #负载均衡方式为轮询
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server master01 192.168.124.201:6443 check # 根据自己环境修改后端实例IP
server master02 192.168.124.202:6443 check # 根据自己环境修改后端实例IP
server master03 192.168.124.203:6443 check # 根据自己环境修改后端实例IP
4.3 node6、node7上启动haproxy
systemctl enable haproxy --now
4.4 在node6(主负载均衡)上修改keepalived
#vim /etc/keepalived/keepalived.conf,清空所有内容,添加下面内容保存
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 101
advert_int 2
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.124.199/24
}
track_script {
chk_apiserver
}
}
4.5 在node7(备负载均衡)上修改keepalived
#vim /etc/keepalived/keepalived.conf,清空所有内容,添加下面内容保存
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP #需要修改节点身份
interface ens33
virtual_router_id 51
priority 99 #备用节点优先级不能高于master
advert_int 2
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.124.199/24
}
track_script {
chk_apiserver
}
}
4.6 在node6(主负载均衡)上创建检测haproxy脚本
#vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
err=0
for k in $(seq 1 3)
do
check_code=$(pgrep haproxy)
if [[ $check_code == "" ]]; then
err=$(expr $err + 1)
sleep 1
continue
else
err=0
break
fi
done
if [[ $err != "0" ]]; then
echo "systemctl stop keepalived"
/usr/bin/systemctl stop keepalived
exit 1
else
exit 0
fi
4.7 在node7(备负载均衡)上创建检测haproxy脚本
#vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
err=0
for k in $(seq 1 3)
do
check_code=$(pgrep haproxy)
if [[ $check_code == "" ]]; then
err=$(expr $err + 1)
sleep 1
continue
else
err=0
break
fi
done
if [[ $err != "0" ]]; then
echo "systemctl stop keepalived"
/usr/bin/systemctl stop keepalived
exit 1
else
exit 0
fi
4.8 在node6、node7上修改脚本权限
chmod +x /etc/keepalived/check_haproxy.sh
4.9 在node6、node7上启动keepalived
systemctl enable keepalived --now
4.10 在ndoe6节点确认VIP地址是否生成
ip a
五、使用kubeadm方式部署kubernetes集群
提示:集群所有节点准备仓库,不包括负载均衡节点
5.1 在node1—node5节点添加阿里云kubernetes仓库
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=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
5.2 在node1—node5节点安装集群所需软件包
kubeadm:
用于初始化集群,并配置集群所需的组件并生成对应的安全证书和令牌;
kubelet:
负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;
kubectl:
用于管理k8集群的一个命令行工具;
yum install -y kubeadm-1.23.0-0 kubelet-1.23.0-0 kubectl-1.23.0-0
5.3 在node1—node5节点配置kubelet Cgroup控制组
kubelet启用Cgroup控制组,用于限制容器进程的CPU、内存资源使用量
cat > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
5.4 在node1—node5节点设置kubelet开机自启即可,集群初始化时kubelet会随着集群启动
systemctl enable kubelet
5.5 在node1上初始化集群
#查看集群所需镜像文件
kubeadm config images list
#生成集群初始化配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
#修改配置文件:vim kubeadm-config.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.124.201 #告诉k8s你的本机IP
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: node1 #告诉k8s你的本机名称
taints: null
---
apiServer:
certSANs:
- 192.168.124.199 #在证书中指定的可信IP地址,负载均衡的VIP
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.124.199:6443 #负载均衡器的IP,主要让Kubernetes知道生成主节点令牌
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #集群组件镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.23.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
#初始化集群
kubeadm init --config kubeadm-config.yaml --upload-certs
#初始化成功后,按照提示准备集群管理员配置文件,在node1上执行下面命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#根据你自己初始化集群后的提示,将标红的这部分复制到其他的管理节点:node2、node3中执行,将node2、node3加入管理节点
#添加成功后,在node2、node3上执行下面命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#根据你自己初始化集群后的提示,将标红的这部分复制到工作节点:node4、node5中执行,将node4、node5加入工作节点
六、部署Pod网络插件Calico
Calico 使用 BGP(边界网关协议)作为其底层网络模型。它利用 BGP 为每个 Pod 分配一个唯一的 IP 地址,并在集群内部进行路由。Calico 支持网络策略,可以对流量进行精细控制,允许或拒绝特定的通信。
6.1 在node1节点下载Calico文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml
6.2 在node1节点创建Calico网络
kubectl apply -f calico.yaml
6.3 等待Calico的Pod状态为Running即可
kubectl get pod -n kube-system
6.4 查看集群节点状态是否为Ready
kubectl get nodes
七、部署Nginx测试集群是否正常
7.1 在node1节点上部署Nginx
#vim nginx.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30002
7.2 创建Pod
kubectl apply -f nginx.yml
7.3 等待Pod状态为Running
kubectl get pod
7.4 查看Service的NodePort端口
kubectl get svc