【企业级K8S详细搭建 已把坑踩完 保姆级的搭建步骤】

K8S集群保姆式搭建配置(多主多从高可用集群企业级搭建)


ansible包下载
sysconfigure.sh脚本下载
在这里插入图片描述

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

在这里插入图片描述

7.5 可以在浏览器上访问集群任何主机IP:30002端口

在这里插入图片描述

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值