二进制部署1.23.0高可用集群(docker版)

第一章:k8s介绍及前期环境部署

img

kubernetes(k8s)是2014年由Google公司基于Go语言编写的一款开源的容器集群编排系统,用于自动化容器的部署、扩缩容和管理;

kubernetes(k8s)是基于Google内部的Borg系统的特征开发的一个版本,集成了Borg系统大部分优势;

官方地址:https://Kubernetes.io

代码托管平台:https://github.com/Kubernetes

**除了k8s还有哪些容器编排系统?**如:docker swarmOpenshiftRancherMesos等。

kubernetes具备的功能

  • **自我修复:**k8s可以监控容器的运行状况,并在发现容器出现异常时自动重启故障实例;
  • 弹性伸缩:k8s可以根据资源的使用情况自动地调整容器的副本数。例如,在高峰时段,k8s可以自动增加容器的副本数以应对更多的流量;而在低峰时段,k8s可以减少应用的副本数,节省资源;
  • **资源限额:**k8s允许指定每个容器所需的CPU和内存资源,能够更好的管理容器的资源使用量;
  • **滚动升级:**k8s可以在不中断服务的情况下滚动升级应用版本,确保在整个过程中仍有足够的实例在提供服务;
  • **负载均衡:**k8s可以根据应用的负载情况自动分配流量,确保各个实例之间的负载均衡,避免某些实例过载导致的性能下降;
  • **服务发现:**k8s可以自动发现应用的实例,并为它们分配一个统一的访问地址。这样,用户只需要知道这个统一的地址,就可以访问到应用的任意实例,而无需关心具体的实例信息;
  • **存储管理:**k8s可以自动管理应用的存储资源,为应用提供持久化的数据存储。这样,在应用实例发生变化时,用户数据仍能保持一致,确保数据的持久性;
  • **密钥与配置管理:**Kubernetes 允许你存储和管理敏感信息,例如:密码、令牌、证书、ssh密钥等信息进行统一管理,并共享给多个容器复用;

kubernetes集群角色

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:**负责为集群内的服务实现网络代理和负载均衡,确保服务的访问性;

非必须的集群组件:

  • **DNS服务:**严格意义上的必须插件,在k8s中,很多功能都需要用到DNS服务,例如:服务发现、有状态应用的访问等;
  • Dashboard: 是k8s集群WEB管理界面,如:Rancher、Kuboard等
  • 资源监控:例如metrics-server监视器,用于监控集群中资源利用率;

kubernetes集群类型

  • **一主多从集群:**由一台Master管理节点和多台Node工作节点组成,生产环境下Master节点存在单点故障的风险,适合学习和测试环境使用;
  • **多主多从集群:**由多台Master管理节点和多Node工作节点组成,安全性高,适合生产环境使用;

kubernetes集群规划

IP地址 主机名称 主机角色 操作系统 主机配置
192.168.0.111 master01 管理节点 Rocky 9.0 2C/4G/50G
192.168.0.112 master02 管理节点 Rocky 9.0 2C/4G/50G
192.168.0.113 master03 管理节点 Rocky 9.0 2C/2G/50G
192.168.0.114 node01 工作节点 Rocky 9.0 2C/4G/50G
192.168.0.115 node02 工作节点 Rocky 9.0 2C/4G/50G
192.168.0.117 k8s-ha1 主负载均衡节点 Rocky 9.0 2C/4G/50G
192.168.0.118 k8s-ha2 备负载均衡节点 Rocky 9.0 2C/4G/50G

kubernetes集群环境准备

以下前期环境准备需要在所有节点都执行(不包括负载均衡节点

提示:不要忘了在每个节点都跑一遍环境初始化脚本!!!!!

配置集群之间本地解析

集群在初始化时,需要解析每个节点主机名,作为该节点在集群中的名称

192.168.0.111 master01
192.168.0.112 master02
192.168.0.113 master03
192.168.0.114 node01
192.168.0.115 node02

开启bridge网桥过滤

bridge(桥接) 是 Linux 系统中的一种虚拟网络设备,它充当一个虚拟的交换机,为集群内的容器提供网络通信功能,容器就可以通过这个 bridge 与其他容器或外部网络通信了。

/etc/sysctl.d/目录用于存放配置内核参数的文件,文件以.conf结尾,这些文件会在系统启动时自动加载。

cat > /etc/sysctl.d/k8s.conf <<EOF
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
命令解释:

modprobe //命令可以加载内核模块

br_netfilter //模块模块允许在bridge设备上的数据包经过iptables防火墙处理

加载配置文件,使上述配置生效

sysctl -p /etc/sysctl.d/k8s.conf

安装IPvs代理模块

在k8s中Service有两种代理模式,一种是基于iptables的,一种是基于ipvs,两者对比ipvs模式性能更高效,如果想要使用ipvs模式,需要手动载入ipvs模块。

ipsetipvsadm是网络管理和负载均衡相关的软件包,提供ip_vs模块

dnf -y install ipset ipvsadm

将需要加载的ipvs相关模块写入到文件中

/etc/modules-load.d/目录主要用于在系统启动时加载用户自定义的内核模块,这个目录中的文件以 .conf 结尾,文件中指定需要加载的内核模块。

cat > /etc/modules-load.d/ip_vs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
模块介绍:

ip_vs //提供负载均衡的模块,支持多种负载均衡算法,如轮询、最小连接、加权最小连接等

ip_vs_rr //轮询算法的模块(默认算法)

ip_vs_wrr //加权轮询算法的模块,根据后端服务器的权重值转发请求

ip_vs_sh //哈希算法的模块,同一客户端的请求始终被分发到相同的后端服务器,保证会话一致性

nf_conntrack //链接跟踪的模块,用于跟踪一个连接的状态,例如 TCP 握手、数据传输和连接关闭等

加载模块生效(这个文件会在下次系统启动时自动生效)

systemctl restart systemd-modules-load.service

过滤模块,验证是否成功加载

lsmod | grep ip_vs
===========================================================
ip_vs_sh               16384  0
ip_vs_wrr              16384  0
ip_vs_rr               16384  0
ip_vs                 188416  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          176128  1 ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              16384  3 nf_conntrack,xfs,ip_vs

关闭SWAP分区

为了保证 kubelet 正常工作,k8s强制要求禁用

swapoff -a && \
sed -ri 's/.*swap.*/#&/' /etc/fstab

Docker环境准备

添加阿里云docker-ce仓库

dnf install -y yum-utils && \
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker软件包

dnf install docker-ce-20.10.24-3.el9.x86_64 -y

启用Docker Cgroup用于限制进程的资源使用量,如CPU、内存资源

# step 1:创建/etc/docker目录
mkdir /etc/docker
# step 2:配置Cgroup和镜像加速器
cat > /etc/docker/daemon.json <<EOF
{
        "exec-opts": ["native.cgroupdriver=systemd"],
        "registry-mirrors": ["https://docker.1ms.run"]
}
EOF

启动docker并设置随机自启

systemctl enable docker --now

负载均衡环境准备

**haproxy:**为apiserver提供代理,集群的管理请求通过VIP进行接收,haproxy将所有管理请求轮询转发到每个master节点上。

**Keepalived:**为haproxy提供vip(192.168.0.100)在二个haproxy之间提供主备,实现代理故障自动切换。

img

以下操作只需要在k8s-ha1k8s-ha2配置。

提示:不要忘了跑一遍环境初始化脚本!!!!!

  1. 安装haproxy和keepalived软件包
dnf install haproxy keepalived -y 
  1. 修改haproxy配置文件,文件内容在k8s-ha1与k8s-ha2节点一致
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.0.111:6443  check  # 根据自己环境修改后端实例IP
  server master02   192.168.0.112:6443  check  # 根据自己环境修改后端实例IP
  server master03   192.168.0.113:6443  check  # 根据自己环境修改后端实例IP

k8s-ha1与k8s-ha2启动haproxy

systemctl enable haproxy --now
  1. 改keepalived配置文件

k8s-ha1节点keepalived配置文件内容如下

! Configuration File for keepalived
global_defs {
   
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
//自定义健康检查脚本,健康检查名称为chk_haproxy
vrrp_script chk_haproxy {
   
    //健康检查的脚本路径及名称
    script "/etc/keepalived/check_haproxy.sh"
    interval 5
    weight -5
    fall 2
    rise 1
}
vrrp_instance VI_1 {
   
    state MASTER             //节点身份,Master节点负责处理请求并优先拥有虚拟IP地址
    interface ens32          //虚拟IP地址绑定的网卡名称,根据实际情况修改
    virtual_router_id 51 
    priority 101             //节点的优先级,决定哪个节点将成为Master,数字越大优先级越高
    advert_int 2
    authentication {
   
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
   
        192.168.0.100/24     //定义虚拟IP地址
    }
    //引用健康检查,名称与上方vrrp_script中定义的名称保持一致
    track_script {
   
       chk_haproxy
    }
}
keepalived配置文件详解

//自定义健康检查脚本,健康检查名称为chk_haproxy

vrrp_script chk_apiserver {

//脚本所在的路径及名称

script "/etc/keepalived/check_haproxy.sh"

//监控检查的时间间隔,单位秒

interval 5

//健康检查的次数,连续2次健康检查失败,服务器将被标记为不健康

fall 2

//连续健康检查成功的次数,有1次健康检查成功,服务器将被标记为健康

rise 1

}

//配置了一个名为VI_1的VRRP实例组

vrrp_instance VI_1 {

//该节点在VRRP组中的身份,Master节点负责处理请求并拥有虚拟IP地址

state MASTER

//实例绑定的网络接口,实例通过这个网络接口与其他VRRP节点通信,以及虚拟IP地址的绑定

interface ens32

//虚拟的路由ID,范围1到255之间的整数,用于在一个网络中区分不同的VRRP实例组,但是在同一个VRRP组中的节点,该ID要保持一致

virtual_router_id 51

//实例的优先级,范围1到254之间的整数,用于决定在同一个VRRP组中哪个节点将成为Master节点,数字越大优先级越高

priority 101

//Master节点广播VRRP报文的时间间隔,用于通知其他Backup节点Master节点的存在和状态,在同一个VRRP组中,所有>节点的advert_int参数值必须相同

advert_int 2

//实例之间通信的身份验证机制

authentication {

//PASS为密码验证

auth_type PASS

//此密码必须为1到8个字符,在同一个VRRP组中,所有节点必须使用相同的密码,以确保正确的身份验证和通信

auth_pass abc123

}

//定义虚拟IP地址

virtual_ipaddress {

192.168.0.100/24

}

//引用自定义脚本,名称与上方vrrp_script中定义的名称保持一致

track_script {

chk_haproxy

}

}

k8s-ha2节点keepalived配置文件内容如下

! Configuration File for keepalived
global_defs {
   
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
//自定义健康检查脚本,健康检查名称为chk_haproxy
vrrp_script chk_haproxy {
   
    //健康检查的脚本路径及名称
    script "/etc/keepalived/check_haproxy.sh"
    interval 5
    weight -5
    fall 2
    rise 1
}
vrrp_instance VI_1 {
   
    state BACKUP             //节点身份,BACKUP为备用节点
    interface ens32          //虚拟IP地址绑定的网卡名称,根据实际情况修改
    virtual_router_id 51 
    priority 99              //节点的优先级,BACKUP要低于Master
    advert_int 2
    authentication {
   
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
   
        192.168.0.100/24     //定义虚拟IP地址
    }
    //引用健康检查,名称与上方vrrp_script中定义的名称保持一致
    track_script {
   
       chk_haproxy
    }
}

k8s-ha1与k8s-ha2定义检测haproxy脚本

#!/bin/bash
#检测haproxy状态
count=$(ps -C haproxy | grep -v PID | wc -l)
if [ $count -eq 0 ];then
   systemctl stop keepalived
fi

脚本添加执行权限

chmod +x /etc/keepalived/check_haproxy.sh

k8s-ha1与k8s-ha2节点启动keepalived

systemctl enable keepalived --now

在k8s-ha1节点确认VIP地址是否生成(ifconfig命令查看不到VIP)

ip a s ens32

集群配置免密认证

在master01主机生成密钥,下发公钥到集群其他节点。方便后期拷贝证书和相关配置文件。

ssh-keygen
for ip in 192.168.0.{
   112..115}
do
  ssh-copy-id $ip
done

第二章:准备集群证书

在k8s中,集群的各个组件(如kubelet、kube-scheduler、kube-controller-manager等)通过HTTPS进行相互通信,以确保通信的安全性。

k8s集群内部通讯并不需要购买商业证书,基本上都是使用自签证书来实现集群内部的通信。

SSL/TLS基本概念

HTTPS 协议,说白了就是“HTTP 协议”和“SSL/TLS 协议”的组合。

SSL: Secure Socket Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。为啥要发明 SSL 这个协议?原先互联网上使用的 HTTP 协议是明文的,内容是不加密的,这样就很可能在内容传输时被别人监听到,对于安全性要求较高的场合,必须要加密,https就是带加密的http协议。SSL协议的发明,就解决这些问题。目前SSL有1.0,2.0,3.0。

TLS: Transport Layer Security(传输层安全协议)相当于SSL的升级版,可以把SSL看作是windows7,而TLS看作是windows10。很多时候我们把这两者并列称呼 SSL/TLS,目前TLS有1.0,1.1,1.2,其中1.0基于SSL 3.0,修改不大。

SSL证书: SSL安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密;确保数据在传送中不被改变,即数据的完整性。SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道,由于SSL技术已建立到所有主要的浏览器和WEB服务器程序中,因此,仅需安装服务器证书就可以激活该功能了。通过它可以激活SSL协议,实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露。保证了双方传递信息的安全性,而且用户可以通过服务器证书验证他所访问的网站是否是真实可靠。

证书相关文件

公钥: 一个算法名称加上密码串,(理解成一把锁头)通过公钥对数据加密。

私钥: 一个算法名称加上密码串,(理解成一把钥匙)通过私钥对加密后的数据进行解密。
密钥:非对称加密的领域里,指的是私钥和公钥,他们总是成对出现,其主要作用是加密和解密。常用的加密强度是2048bit。
CA: certificate authority,专门用来给别人进行签名的单位或者机构。
申请(签名)文件: 包含公钥的加密方式,以及申请人的属性信息,比如域名、国家、地区等信息,然后发给CA进行签署。

签名过程: CA收到申请文件后,会走核实流程,确保申请人确实是证书中描述的申请人,防止别人冒充申请者申请证书,核实通过后,会用CA的私钥对申请文件进行签名,签名后的证书包含申请者的基本信息,CA的基本信息,证书的使用年限,申请人的公钥,签名用到的摘要算法,CA的签名。
证书文件: 经过CA签名后得到,如果是自己的私钥给自己的公钥签名,就叫自签名。

证书文件格式

**PEM:**是Privacy Enhanced Mail的简称,服务器证书(Apache和nginx等)的公钥和私钥文件以及自签名证书(用于测试或局域网环境)的公钥和私钥文件都可以储存为PEM格式,扩展名为 .pem .crt .cer .key
**DER:**是Distinguished Encoding Rules的简称,与PEM不同之处在编码格式不同,扩展名为.der .cer,所有类型的证书公钥和私钥文件都可以存储为DER格式。Java和Windows服务器使用DER格式证书。
CSR:证书签名请求CSR,是Certificate Signing Request的简称,它是向CA机构申请数字证书时使用的请求文件。当我们准备好CSR文件后就可以提交给CA机构,等待他们给我们签名,签好名后我们会收到crt文件,即证书。保留好CSR,当权威证书颁发机构颁发的证书过期的时候,还可以用同样的CSR来申请新的证书,key保持不变。

下载证书工具CFSSL

在master01节点创建目录用于准备集群相关证书

mkdir /root/work && cd /root/work

获取 CFSSL 工具自签集群所需的证书,CFSSL 工具用于生成CA证书和配对的证书密钥。

工具说明:

cfssl //管理证书的命令行工具。

cfssljson //当你使用cfssl工具生成新的证书和私钥时,证书的格式是JSON对象,该工具来解析这个JSON对象,将证书和私钥提取出来,分别保存为.pem文件。

cfssl-certinfo //这个工具可以读取PEM格式的证书,解析证书中的信息。

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

添加执行权限并将程序移动至 /usr/local/bin/

chmod +x cfssl*
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下辈子不学计算机了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值