一、系统信息
# cat /etc/anolis-release
Anolis OS release 8.9
# uname -r
5.10.134-16.2.an8.x86_64
二、节点规划
主机名 | ip | 应用 | 备注 |
pro-k8s-master1-413 | 192.168.4.13 | Kube-apiserver,kube-controller-manager,kube-scheduler | |
pro-k8s-master2-414 | 192.168.4.14 | Kube-apiserver,kube-controller-manager,kube-scheduler | |
pro-k8s-master3-415 | 192.168.4.15 预留4.16-20 |
Kube-apiserver,kube-controller-manager,kube-scheduler | |
pro-anol89-k8sma-hake-410 | 192.168.4.10 | haproxy、keepalived | |
pro-anol89-k8sma-hake-411 | 192.168.4.11 | haproxy、keepalived | |
vip | 192.168.4.12 | ||
三、haproxy keepalived 部署
3.1 haproxy配置文件修改
# dnf -y install haproxy keepalived
# cat >/etc/haproxy/haproxy.cfg<<"EOF"
global
maxconn 2000
ulimit-n 16384
log 127.0.0.1 local0 err
stats timeout 30s
defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
timeout http-request 15s
timeout http-keep-alive 15s
frontend monitor-in
bind *:33305
mode http
option httplog
monitor-uri /monitor
frontend k8s-master
bind 0.0.0.0:6443
bind 127.0.0.1:6443
mode tcp
option tcplog
tcp-request inspect-delay 5s
default_backend k8s-master
backend k8s-master
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server k8s-master01 192.168.4.13:6443 check
server k8s-master02 192.168.4.14:6443 check
server k8s-master03 192.168.4.15:6443 check
EOF
注释:
这段配置代码是指定了一个HAProxy负载均衡器的配置。下面对各部分进行详细解释:
1. global:
- maxconn 2000: 设置每个进程的最大连接数为2000。
- ulimit-n 16384: 设置每个进程的最大文件描述符数为16384。
- log 127.0.0.1 local0 err: 指定日志的输出地址为本地主机的127.0.0.1,并且只记录错误级别的日志。
- stats timeout 30s: 设置查看负载均衡器统计信息的超时时间为30秒。
2. defaults:
- log global: 使默认日志与global部分相同。
- mode http: 设定负载均衡器的工作模式为HTTP模式。
- option httplog: 使负载均衡器记录HTTP协议的日志。
- timeout connect 5000: 设置与后端服务器建立连接的超时时间为5秒。
- timeout client 50000: 设置与客户端的连接超时时间为50秒。
- timeout server 50000: 设置与后端服务器连接的超时时间为50秒。
- timeout http-request 15s: 设置处理HTTP请求的超时时间为15秒。
- timeout http-keep-alive 15s: 设置保持HTTP连接的超时时间为15秒。
3. frontend monitor-in:
- bind *:33305: 监听所有IP地址的33305端口。
- mode http: 设定frontend的工作模式为HTTP模式。
- option httplog: 记录HTTP协议的日志。
- monitor-uri /monitor: 设置监控URI为/monitor。
4. frontend k8s-master:
- bind 0.0.0.0:9443: 监听所有IP地址的9443端口。
- bind 127.0.0.1:9443: 监听本地主机的9443端口。
- mode tcp: 设定frontend的工作模式为TCP模式。
- option tcplog: 记录TCP协议的日志。
- tcp-request inspect-delay 5s: 设置在接收到请求后延迟5秒进行检查。
- default_backend k8s-master: 设置默认的后端服务器组为k8s-master。
5. backend k8s-master:
- mode tcp: 设定backend的工作模式为TCP模式。
- option 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 k8s-master01 192.168.1.41:6443 check: 增加一个名为k8s-master01的服务器,IP地址为192.168.1.41,端口号为6443,并对其进行健康检查。
- server k8s-master02 192.168.1.42:6443 check: 增加一个名为k8s-master02的服务器,IP地址为192.168.1.42,端口号为6443,并对其进行健康检查。
- server k8s-master03 192.168.1.43:6443 check: 增加一个名为k8s-master03的服务器,IP地址为192.168.1.43,端口号为6443,并对其进行健康检查。
以上就是这段配置代码的详细解释。它主要定义了全局配置、默认配置、前端监听和后端服务器组的相关参数和设置。通过这些配置,可以实现负载均衡和监控功能。
3.2 keepalived master配置
#cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
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 ens18
mcast_src_ip 192.168.4.10
virtual_router_id 51
priority 100
nopreempt
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA#KAAUTH
}
virtual_ipaddress {
192.168.4.12
}
track_script {
chk_apiserver
} }
EOF
3.3 备节点配置
# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
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 ens18
mcast_src_ip 192.168.4.11
virtual_router_id 51
priority 80
nopreempt
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA#KAAUTH
}
virtual_ipaddress {
192.168.4.12
}
track_script {
chk_apiserver
} }
EOF
注释:
这是一个用于配置keepalived的配置文件。下面是对每个部分的详细解释:
- `global_defs`部分定义了全局参数。
- `router_id`参数指定了当前路由器的标识,这里设置为"LVS_DEVEL"。
- `vrrp_script`部分定义了一个VRRP脚本。`chk_apiserver`是脚本的名称,
- `script`参数指定了脚本的路径。该脚本每5秒执行一次,返回值为0表示服务正常,返回值为1表示服务异常。
- `weight`参数指定了根据脚本返回的值来调整优先级,这里设置为-5。
- `fall`参数指定了失败阈值,当连续2次脚本返回值为1时认为服务异常。
- `rise`参数指定了恢复阈值,当连续1次脚本返回值为0时认为服务恢复正常。
- `vrrp_instance`部分定义了一个VRRP实例。`VI_1`是实例的名称。
- `state`参数指定了当前实例的状态,这里设置为MASTER表示当前实例是主节点。
- `interface`参数指定了要监听的网卡,这里设置为ens18。
- `mcast_src_ip`参数指定了VRRP报文的源IP地址,这里设置为192.168.1.41。
- `virtual_router_id`参数指定了虚拟路由器的ID,这里设置为51。
- `priority`参数指定了实例的优先级,优先级越高(数值越大)越有可能被选为主节点。
- `nopreempt`参数指定了当主节点失效后不要抢占身份,即不要自动切换为主节点。
- `advert_int`参数指定了发送广播的间隔时间,这里设置为2秒。
- `authentication`部分指定了认证参数
- `auth_type`参数指定了认证类型,这里设置为PASS表示使用密码认证,
- `auth_pass`参数指定了认证密码,这里设置为K8SHA_KA_AUTH。
- `virtual_ipaddress`部分指定了虚拟IP地址,这里设置为192.168.1.46。
- `track_script`部分指定了要跟踪的脚本,这里跟踪了chk_apiserver脚本。
3.4 健康检查脚本配置
# /etc/keepalived
# cat > /etc/keepalived/check_apiserver.sh << EOF
#!/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
EOF
# 给脚本授权
# chmod +x /etc/keepalived/check_apiserver.sh
注释:
# 这段脚本是一个简单的bash脚本,主要用来检查是否有名为haproxy的进程正在运行。
#
# 脚本的主要逻辑如下:
# 1. 首先设置一个变量err为0,用来记录错误次数。
# 2. 使用一个循环,在循环内部执行以下操作:
# a. 使用pgrep命令检查是否有名为haproxy的进程在运行。如果不存在该进程,将err加1,并暂停1秒钟,然后继续下一次循环。
# b. 如果存在haproxy进程,将err重置为0,并跳出循环。
# 3. 检查err的值,如果不为0,表示检查失败,输出一条错误信息并执行“systemctl stop keepalived”命令停止keepalived进程,并退出脚本返回1。
# 4. 如果err的值为0,表示检查成功,退出脚本返回0。
#
# 该脚本的主要作用是检查是否存在运行中的haproxy进程,如果无法检测到haproxy进程,将停止keepalived进程并返回错误状态。如果haproxy进程存在,则返回成功状态。这个脚本可能是作为一个健康检查脚本的一部分,在确保haproxy服务可用的情况下,才继续运行其他操作。
3.5 启动
# systemctl daemon-reload
# 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
# systemctl enable --now haproxy.service
# 启用并立即启动haproxy.service单元。haproxy.service是haproxy守护进程的systemd服务单元。
# systemctl enable --now keepalived.service
# 启用并立即启动keepalived.service单元。keepalived.service是keepalived守护进程的systemd服务单元。
3.6 测试
四、下载kubernetes二进制文件<所有master上操作>
# https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.30.md
# wget https://dl.k8s.io/v1.30.2/kubernetes-server-linux-amd64.tar.gz
解压包:
# tar -xf kubernetes-server-linux-amd64.tar.gz --strip-components=3 -C /usr/local/bin kubernetes/server/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy}
# 这是一个tar命令,用于解压指定的kubernetes-server-linux-amd64.tar.gz文件,并将其中的特定文件提取到/usr/local/bin目录下。
#
# 命令的解释如下:
# - tar:用于处理tar压缩文件的命令。
# - -xf:表示解压操作。
# - kubernetes-server-linux-amd64.tar.gz:要解压的文件名。
# - --strip-components=3:表示解压时忽略压缩文件中的前3级目录结构,提取文件时直接放到目标目录中。
# - -C /usr/local/bin:指定提取文件的目标目录为/usr/local/bin。
# - kubernetes/server/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy}:要解压和提取的文件名模式,用花括号括起来表示模式中的多个可能的文件名。
#
# 总的来说,这个命令的作用是将kubernetes-server-linux-amd64.tar.gz文件中的kubelet、kubectl、kube-apiserver、kube-controller-manager、kube-scheduler和kube-proxy六个文件提取到/usr/local/bin目录下,同时忽略文件路径中的前三级目录结构。
五、cfssl 部署
下载地址;
# https://github.com/cloudflare/cfssl/releases
# https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssl_1.6.5_linux_amd64
# https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssljson_1.6.5_linux_amd64
# https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssl-certinfo_1.6.5_linux_amd64
# chmod +x cfssl*
# mv cfssl_1.6.5_linux_amd64 /usr/local/bin/cfssl
# mv cfssljson_1.6.5_linux_amd64 /usr/local/bin/cfssljson
# mv cfssl-certinfo_1.6.5_linux_amd64 /usr/local/bin/cfssl-certinfo
六、生成k8s相关证书
6.1 所有master节点创建证书目录
# mkdir -p /etc/kubernetes/pki
6.2 其中一台节点生成k8s证书
# 写入生成证书所需的配置文件
# cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "876000h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "876000h"
}
}
}
}
EOF
# cat > ca-csr.json << EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "Kubernetes",
"OU": "Kubernetes-manual"
}
],
"ca": {
"expiry": "876000h"
}
}
EOF
注释:
# 这是一个用于生成 Kubernetes 相关证书的配置文件。该配置文件中包含以下信息:
#
# - CN:CommonName,即用于标识证书的通用名称。在此配置中,CN 设置为 "kubernetes",表示该证书是用于 Kubernetes。
# - key:用于生成证书的算法和大小。在此配置中,使用的算法是 RSA,大小是 2048 位。
# - names:用于证书中的名称字段的详细信息。在此配置中,有以下字段信息:
# - C:Country,即国家。在此配置中,设置为 "CN"。
# - ST:State,即省/州。在此配置中,设置为 "Beijing"。
# - L:Locality,即城市。在此配置中,设置为 "Beijing"。
# - O:Organization,即组织。在此配置中,设置为 "Kubernetes"。
# - OU:Organization Unit,即组织单位。在此配置中,设置为 "Kubernetes-manual"。
# - ca:用于证书签名的证书颁发机构(CA)的配置信息。在此配置中,设置了证书的有效期为 876000 小时。
#
# 这个配置文件可以用于生成 Kubernetes 相关的证书,以确保集群中的通信安全性。
# cfssl gencert -initca ca-csr.json | cfssljson -bare /etc/kubernetes/pki/ca
# 具体的解释如下:
#
# cfssl是一个用于生成TLS/SSL证书的工具,它支持PKI、JSON格式配置文件以及与许多其他集成工具的配合使用。
#
# gencert参数表示生成证书的操作。-initca参数表示初始化一个CA(证书颁发机构)。CA是用于签发其他证书的根证书。ca-csr.json是一个JSON格式的配置文件,其中包含了CA的详细信息,如私钥、公钥、有效期等。这个文件提供了生成CA证书所需的信息。
#
# | 符号表示将上一个命令的输出作为下一个命令的输入。
#
# cfssljson是cfssl工具的一个子命令,用于格式化cfssl生成的JSON数据。 -bare参数表示直接输出裸证书,即只生成证书文件,不包含其他格式的文件。/etc/kubernetes/pki/ca是指定生成的证书文件的路径和名称。
#
# 所以,这条命令的含义是使用cfssl工具根据配置文件ca-csr.json生成一个CA证书,并将证书文件保存在/etc/kubernetes/pki/ca路径下。
# cat > apiserver-csr.json << EOF
{
"CN": "kube-apiserver",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "Kubernetes",
"OU": "Kubernetes-manual"
}
]
}
EOF
注释:
# 这是一个用于生成 Kubernetes 相关证书的配置文件。该配置文件中包含以下信息:
#
# - `CN` 字段指定了证书的通用名称 (Common Name),这里设置为 "kube-apiserver",表示该证书用于 Kubernetes API Server。
# - `key` 字段指定了生成证书时所选用的加密算法和密钥长度。这里选用了 RSA 算法,密钥长度为 2048 位。
# - `names` 字段包含了一组有关证书持有者信息的项。这里使用了以下信息:
# - `C` 表示国家代码 (Country),这里设置为 "CN" 表示中国。
# - `ST` 表示州或省份 (State),这里设置为 "Beijing" 表示北京市。
# - `L` 表示城市或地区 (Location),这里设置为 "Beijing" 表示北京市。
# - `O` 表示组织名称 (Organization),这里设置为 "Kubernetes" 表示 Kubernetes。
# - `OU` 表示组织单位 (Organizational Unit),这里设置为 "Kubernetes-manual" 表示手动管理的 Kubernetes 集群。
#
# 这个配置文件可以用于生成 Kubernetes 相关的证书,以确保集群中的通信安全性。
# 生成一个根证书 ,多写了一些IP作为预留IP,为将来添加node做准备
# 10.96.0.1是service网段的第一个地址,需要计算,192.168.1.46为高可用vip地址
# 若没有IPv6 可删除可保留
# cfssl gencert \
-ca=/etc/kubernetes/pki/ca.pem \
-ca-key=/etc/kubernetes/pki/ca-key.pem \
-config=ca-config.json \
-hostname=10.96.0.1,192.168.4.12,127.0.0.1,kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.default.svc.cluster.local,192.168.4.13,192.168.4.14,192.168.4.15,192.168.4.16,192.168.4.17 \
-profile=kubernetes apiserver-csr.json | cfssljson -bare /etc/kubernetes/pki/apiserver
# 这个命令是使用cfssl工具生成Kubernetes API Server的证书。
#
# 命令的参数解释如下:
# - `-ca=/etc/kubernetes/pki/ca.pem`:指定证书的颁发机构(CA)文件路径。
# - `-ca-key=/etc/kubernetes/pki/ca-key.pem`:指定证书的颁发机构(CA)私钥文件路径。
# - `-config=ca-config.json`:指定证书生成的配置文件路径,配置文件中包含了证书的有效期、加密算法等信息。
# - `-hostname=10.96.0.1,192.168.1.46,127.0.0.1,fc00:43f4:1eea:1::10`:指定证书的主机名或IP地址列表。
# - `-profile=kubernetes`:指定证书生成的配置文件中的配置文件名。
# - `apiserver-csr.json`:API Server的证书签名请求配置文件路径。
# - `| cfssljson -bare /etc/kubernetes/pki/apiserver`:通过管道将生成的证书输出到cfssljson工具,将其转换为PEM编码格式,并保存到 `/etc/kubernetes/pki/apiserver.pem` 和 `/etc/kubernetes/pki/apiserver-key.pem` 文件中。
#
# 最终,这个命令将会生成API Server的证书和私钥,并保存到指定的文件中。
6.3 生成apiserver聚合证书
# cat > front-proxy-ca-csr.json << EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"ca": {
"expiry": "876000h"
}
}
EOF
注释:
# 这个JSON文件表示了生成一个名为"kubernetes"的证书的配置信息。这个证书