k8s1.23.15版本二进制部署/扩容及高可用架构详解
Posted Echo&.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s1.23.15版本二进制部署/扩容及高可用架构详解相关的知识,希望对你有一定的参考价值。
前言
众所周知,kubernetes在2020年的1.20版本时就提出要移除docker。这次官方消息表明在1.24版本中彻底移除了dockershim,即移除docker。但是在1.24之前的版本中还是可以正常使用docker的。考虑到可能并不是所有项目环境都紧跟新版换掉了docker,本次就再最后体验一下可支持docker的最新k8s版本1.23.15,后续可能就研究怎么使用其他CRI,例如containerd了。
一、部署介绍及规划:
本次部署各组件版本:
顺便简单过一下组件作用
- etcd:
3.5.6
负责存储集群的持久化数据 - k8s-server:
1.23.15
(所有基础组件版本) -
- kube-apiserver:核心枢纽,提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
-
- kube-controller-manager:集群的管理控制中心,负责维护集群状态
-
- kube-scheduler:调度中心,负责节点资源管理,调度创建pod等
-
- kube-proxy:网络代理,负责为Service提供cluster内部的服务发现和负载均衡
-
- kubelet:负责维护pod生命周期
-
- kubctl:管理集群命令
-
- ……
明确目标:
部署: 快速部署三节点单master集群;
扩容: 新增一个节点,扩为双master集群,部署keepalived+nginx实现apiserver高可用,有条件的可以扩为三master集群
本次测试节点信息:
主机名(角色) | IP地址 | 节点规划 |
---|---|---|
k8s-master1 | 192.168.100.101 | etcd、kube-apiserver、kube-controller-manager、kube-proxy、kubelet、nginx、keepalived |
k8s-node1 | 192.168.100.102 | etcd、kube-proxy、kubelet |
k8s-node2 | 192.168.100.103 | etcd、kube-proxy、kubelet |
k8s-master2(待扩容机器) | 192.168.100.104 | kube-apiserver、kube-controller-manager、kube-proxy、kubelet、nginx、keepalived |
VIP(负载均衡器) | 192.168.100.105 |
服务器版本:
[root@k8s-master1 ~]# cat /etc/centos-release
CentOS Linux release 7.8.2003 (Core)
[root@k8s-master1 ~]# uname -a
Linux k8s-master1 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
二、部署前准备
系统初始化
为了方便二次执行,直接全部复制,改了IP执行就可
# 1、关闭防火墙和selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
# 2、配置hosts解析
cat >> /etc/hosts << EOF
192.168.100.101 k8s-master1
192.168.100.102 k8s-node1
192.168.100.103 k8s-node2
192.168.100.104 k8s-master2
EOF
# 3、关闭swap分区(避免有性能等其他问题)
swapoff -a #临时关闭
sed -i "s/^.*swap*/#&/" /etc/fstab #永久关闭
mount -a
# 4、将桥接的IPV4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
modprobe br_netfilter #载入模块
sysctl -p /etc/sysctl.d/k8s.conf #生效
# 5、配置ntp
yum -y install ntp vim wget
sed -i "s/^[^#].*iburst*/#&/g" /etc/ntp.conf #注释原有server配置
sed -i "/server 3/a\\server ntp.aliyun.com" /etc/ntp.conf #添加阿里云ntpserver
systemctl restart ntpd
systemctl enable ntpd
ntpq -p
拓展内容(可忽略,直接跳到第三步)
1、上边初始化时net.bridge.bridge-nf-call-ip6tables参数说明
为什么要开启 net.bridge.bridge-nf-call-ip6tables 配置(启用iptables过滤bridge网桥流量)
简述:
网桥是处于二层,iptables工作于三层
- 1、集群内一pod访问其他的service ip,会经过三层iptables的DNAT转发到pod_ip:port
- 2、当不开启此配置,当被访pod回复请求时,如果发现目标是在同一个节点,即同一网桥时,会直接走网桥到源pod,这样虽然能到源pod,但是由于没有原路返回,客户端与服务端的通信就不在一个 “频道” 上,不认为处在同一个连接,也就无法正常通信。
常见的问题现象就是偶现DNS解析失败,当 coredns 所在节点上的 pod 解析 dns 时,dns 请求落到当前节点的 coredns pod 上时,就可能发生这个问题。
感兴趣可以看详细说明:为什么 kubernetes 环境要求开启 bridge-nf-call-iptables ? - 腾讯云开发者社区-腾讯云 (tencent.com)
官方解读看这里:Network Plugins | Kubernetes
2、简单了解下TLS证书
因为k8s集群需要PKI证书来基于TLS/SSL来做认证,组件之间的通信都是通过证书来完成,可以理解为“口令”,组件通信时验证证书无误后,才会建立联系,交互信息,所以证书在部署及环境使用过程中也是比较重要的一项。
基础概念
- CA(Certification Authority):认证机构:负责颁发证书的权威机构(发送与接收组件双方之间的信任纽带)
- CSR(Certificate Signing Request):它是向CA机构申请数字签名证书时使用的请求文件
请求中会附上公钥信息以及国家,城市,域名,Email等信息,准备好CSR文件后就可以提交给CA机构,等待他们给我们签名,签好名后我们会收到crt文件,即证书。
证书:
CA机构对申请者的身份验证成功后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机 构的公章)后形成的一个数字文件。实际上,数字证书就是经过CA认证过的公钥,除了公钥,还有其他的信息,比如Email,国家,城市,域名等。
证书的编码格式:
- PEM(Privacy Enhanced Mail):通常用于数字证书认证机构CA,扩展名为.pem, .crt, .cer, 和.key。内容为Base64编码的ASCII码文件,有类似"-----BEGIN CERTIFICATE-----" 和 "-----END CERTIFICATE-----"的头尾标记
- DER(Distinguished Encoding Rules):与PEM不同之处在于其使用二进制而不是Base64编码的ASCII。扩展名为.der或者.cer
公钥私钥:
- 每个人都有一个公钥与私钥
- 私钥用来进行解密和签名,是给自己用的。
- 公钥由本人公开,用于加密和验证签名,是给别人用的。
- 当该用户发送文件时,用私钥签名,别人用他给的公钥解密,可以保证该信息是由他发送的。即数字签名。
- 当该用户接受文件时,别人用他的公钥加密,他用私钥解密,可以保证该信息只能由他看到。即安全传输。
简述CA原理
CA的产生,是因为多个组件之间通信时,需要加一第三方来判断数据来源是否合规,保证通信的安全性。
引入一个看到的比较好的例子,用介绍信来介绍原理
普通的介绍信
假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有人都不认识他,常用的办法是带公司开的一张介绍信,在信中说:兹有张三先生前往贵公司办理业务,请给予接洽…云云。然后在信上敲上A公司的公章。
张三先生到了 B 公司后,把介绍信递给 B 公司的前台李四小姐。李小姐一看介绍信上有 A 公司的公章,而且 A 公司是经常和 B 公司有业务往来的,这位李小姐就相信张先生不是歹人了。
这里,A公司就是CA机构,介绍信及颁发给张三的证书
引入中介权威机构的介绍信
如果和 B 公司有业务往来的公司很多,每个公司的公章都不同,那前台就要懂得分辨各种公章,非常麻烦。
所以,有C公司专门开设了一项“代理公章”的业务。
今后,A 公司的业务员去 B 公司,需要带2个介绍信:
介绍信1
含有 C 公司的公章及 A 公司的公章。并且特地注明:C 公司信任 A 公司。
介绍信2
仅含有 A 公司的公章,然后写上:兹有张三先生前往贵公司办理业务,请给予接洽…云云。
主要的好处在于:
对于B公司而言,就不需要记住各个公司的公章分别是什么;他只需要记住中介公司 C 的公章即可。当他拿到两份介绍信之后,先对介绍信1的 C 公章,验明正身;确认无误之后,再比对介绍信1和介绍信2的两个 A 公章是否一致。如果是一样的,那就可以证明介绍信2,即A公司是可以信任的了。
最后直白一点,其实我们的身份证一定程度上也相当于是颁发给我们的证书~
本次集群内部署使用的为自签的CA证书
三、开始部署
1、etcd集群部署
Etcd 是 CoreOS 推出的高可用的分布式键值存储系统,内部采用 raft 协议作为一致性算法,主要用于k8s集群的服务发现及存储集群的状态和配置等,所以先部署ETCD数据库。
本次使用三台组建集群(集群模式最少三节点),与k8s集群复用三台节点(k8s-master1、k8s-node1、k8s-node2),也可以放在集群之外,网络互通即可。
三节点,可容忍一个节点故障;
五节点,可容忍两个节点故障
1.1、使用cfssl工具配置证书 (重点)
CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。
是一个开源的证书管理工具,使用json文件生成证书,相比openssl更方便使用。
详细的不多说,直接开始(master1节点操作)
如果下载不下来,可以点这里下载,为本次文章使用的所有软件包,官方拉取纯净版
# 下载工具包
mkdir /opt/software && cd /opt/software
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl_1.6.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssljson_1.6.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl-certinfo_1.6.0_linux_amd64
# 复制到/usr/local/bin目录,并赋予执行权限
cp cfssl_1.6.0_linux_amd64 /usr/local/bin/cfssl
cp cfssljson_1.6.0_linux_amd64 /usr/local/bin/cfssljson
cp cfssl-certinfo_1.6.0_linux_amd64 /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl*
1.2、创建给etcd使用的自签证书颁发机构(CA)
1.2.1、创建工作目录
mkdir -p ~/TLS/etcd,k8s && cd ~/TLS/etcd
1.2.2、配置证书生成策略,让CA软件知道颁发有什么功能的证书
cat > ca-config.json << EOF
"signing":
"default":
"expiry": "87600h"
,
"profiles":
"etcd":
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
EOF
可用参数介绍:
这个策略,有一个default默认的配置,和一个profiles,profiles可以设置多个profile,这里的profile是etcd。
- default:默认策略,指定了证书的默认有效期是一年(8760h)
- etcd:表示该配置(profile)的用途是为etcd生成证书及相关的校验工作
-
- expiry:也表示过期时间,如果不写以default中的为准
-
- signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
-
- key encipherment:密钥加密
-
- server auth:表示可以该CA 对 server 提供的证书进行验证
-
- client auth:表示可以用该 CA 对 client 提供的证书进行验证
1.2.3、创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件
cat > ca-csr.json << EOF
"CN": "etcd CA",
"key":
"algo": "rsa",
"size": 2048
,
"names": [
"C": "CN",
"L": "ShangHai",
"ST": "ShangHai"
]
EOF
可用参数介绍:
- CN:Common Name,CA名字
- key:生成证书的算法
- hosts:表示哪些主机名(域名)或者IP可以使用此csr申请证书,为空或者""表示所有的都可以使用
- names:一些其它的属性
-
- C:Country, 国家
-
- ST:State,州或者是省份
-
- L:Locality Name,地区,城市
-
- O:Organization Name,组织名称,公司名称(在k8s中常用于指定Group,进行RBAC绑定)
-
- OU:Organization Unit Name,组织单位名称,公司部门
1.2.4、生成自签CA证书
[root@k8s-master1 etcd]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
2022/11/29 01:42:38 [INFO] generating a new CA key and certificate from CSR
2022/11/29 01:42:38 [INFO] generate received request
2022/11/29 01:42:38 [INFO] received CSR
2022/11/29 01:42:38 [INFO] generating key: rsa-2048
2022/11/29 01:42:38 [INFO] encoded CSR
2022/11/29 01:42:38 [INFO] signed certificate with serial number 679003178885428426540893262351942198069353062273
# 当前目录下会生成 ca.pem和ca-key.pem文件
[root@k8s-master1 etcd]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
1.3、使用自签CA签发etcd证书
1.3.1、配置etcd请求证书申请文件
cat > server-csr.json << EOF
"CN": "etcd",
"hosts": [
"192.168.100.101",
"192.168.100.102",
"192.168.100.103"
],
"key":
"algo": "rsa",
"size": 2048
,
"names": [
"C": "CN",
"L": "ShangHai",
"ST": "ShangHai"
]
EOF
注:hosts项中ip为etcd集群内部通信的ip,如果后续etcd集群有扩容需求,那么在hosts项里可以预留几个IP
1.3.2、生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd server-csr.json | cfssljson -bare server
# 查看
[root@k8s-master1 etcd]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem server.csr server-csr.json server-key.pem server.pem
1.4、部署etcd
先在master1节点操作,后边把配置拷贝到另外两个节点修改启动etcd即可
# 下载二进制包
cd /opt/software
wget https://github.com/etcd-io/etcd/releases/download/v3.5.6/etcd-v3.5.6-linux-amd64.tar.gz
# 创建工作目录
mkdir -p /opt/etcd/bin,cfg,ssl
tar -zxvf etcd-v3.5.6-linux-amd64.tar.gz
cp etcd-v3.5.6-linux-amd64/etcd,etcdctl /opt/etcd/bin/
# 拷贝证书至工作目录
cp ~/TLS/etcd/*.pem /opt/etcd/ssl/
# 添加etcd配置
cat > /opt/etcd/cfg/etcd.conf << EOF
#[Member]
ETCD_NAME="etcd-1"
ETCD_DATA_DIR="/home/data/"
ETCD_LISTEN_PEER_URLS="https://192.168.100.101:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.100.101:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.100.101:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.100.101:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.100.101:2380,etcd-2=https://192.168.100.102:2380,etcd-3=https://192.168.100.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
配置介绍:
- ETCD_NAME: 节点名称,集群中唯一
- ETCD_DATA_DIR:数据存放目录
- ETCD_LISTEN_PEER_URLS:集群通讯监听地址
- ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址
- ETCD_INITIAL_CLUSTER:集群节点地址
- ETCD_INITIALCLUSTER_TOKEN:集群Token
- ETCD_INITIALCLUSTER_STATE:加入集群的状态:new是新集群,existing表示加入已有集群
1.4.1、使用systemd管理etcd
cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/opt/etcd/cfg/etcd.conf
ExecStart=/opt/etcd/bin/etcd \\
--cert-file=/opt/etcd/ssl/server.pem \\
--key-file=/opt/etcd/ssl/server-key.pem \\
--peer-cert-file=/opt/etcd/ssl/server.pem \\
--peer-key-file=/opt/etcd/ssl/server-key.pem \\
--trusted-ca-file=/opt/etcd/ssl/ca.pem \\
--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \\
--logger=zap
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
1.4.2、拷贝配置到另外两个节点
scp -r /opt/etcd/ 192.168.100.102:/opt/
scp -r /opt/etcd/ 192.168.100.103:/opt/
scp /usr/lib/systemd/system/etcd.service 192.168.100.102:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service 192.168.100.103:/usr/lib/systemd/system/
1.4.3、修改另外两个节点中的etcd配置
#[Member]
ETCD_NAME="etcd-1" # 节点名称,可改为etcd-2和etcd-3
ETCD_DATA_DIR="/home/data/" # 自定义数据目录
ETCD_LISTEN_PEER_URLS="https://192.168.100.101:2380" #改为当前节点IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.100.101:2379" #改为当前节点IP
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.100.101:2380" #改为当前节点IP
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.100.101:2379" #改为当前节点IP
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.100.101:2380,etcd-2=https://192.168.100.102:2380,etcd-3=https://192.168.100.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
1.4.4、启动etcd
需要注意的是三台节点的etcd服务需要同时启动,就三台机器,命令行工具多窗口执行即可
systemctl daemon-reload
systemctl start etcd
systemctl enable etcd
systemctl status etcd
# 查看集群节点状态如下即正常(记得修改命令中endpoint的IP为自己的IP)
[root@k8s-master1 software]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.100.101:2379,https://192.168.100.102:2379,https://192.168.100.103:2379" endpoint health --write-out=table
+------------------------------+--------+-------------+-------+
| ENDPOINT | HEALTH | TOOK | ERROR |
+------------------------------+--------+-------------+-------+
| https://192.168.100.101:2379 | true | 24.422088ms | |
| https://192.168.100.102:2379 | true | 23.776321ms | |
| https://192.168.100.103:2379 | true | 24.170148ms | |
+------------------------------+--------+-------------+-------+
2、安装docker
所有节点都操作
# 安装
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce-20.10.21
# 启动
systemctl start docker
systemctl enable docker
# 修改docker数据目录(可选操作)
cat > /etc/docker/daemon.json << EOF
"data-root": "/home/docker"
EOF
# 重启
systemctl restart docker
3、部署master节点
3.1、部署kube-apiver
3.1.1、生成kube-apiserver证书
自签CA证书(这个和上边那个etcd的CA区分开,单独给k8s使用的CA)
cd ~/TLS/k8s
# 添加CA配置
cat > ca-config.json << EOF
"signing":
"default":
"expiry": "87600h"
,
"profiles":
"kubernetes":
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
EOF
cat > ca-csr.json << EOF
"CN": "kubernetes",
"key":
"algo": "rsa",
"size": 2048
,
"names": [
"C": "CN",
"L": "ShangHai",
"ST": "ShangHai",
"O": "k8s",
"OU": "System"
]
EOF
# 生成证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
使用自签CA签发kube-apiserver的证书
hosts里要写入集群内的所有节点IP,包括后续要用的负载均衡VIP的IP,如果有扩容需求,可以预留几个IP
cat > apiserver-csr.json << EOF
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.100.101",
"192.168.100.102",
"192.168.100.103",
"192.168.100.104",
"192.168.100.105",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key":
"algo": "rsa",
"size": 2048
,
"names": [
"C": "CN",
"L": "ShangHai",
"ST": "ShangHai",
"O": "k8s",
"OU": "System"
]
EOF
# 生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver
3.1.2、下载二进制包,调整配置
如果下载不下来,可以点这里下载,为本次文章使用的所有软件包,官方拉取纯净版
# 下载/配置
cd /opt/software
wget https://dl.k8s.io/v1.23.15/kubernetes-server-linux-amd64.tar.gz
tar zxvf kubernetes-server-linux-amd64.tar.gz
mkdir -p /opt/kubernetes/bin,cfg,ssl,logs
cd kubernetes/server/bin
cp kube-apiserver kube-scheduler kube-controller-manager kubectl kubelet kube-proxy /opt/kubernetes/bin
cp kubectl /usr/bin
创建配置文件
两个\\必须要啊。第一个是转义符,使用转义符是为了使用EOF保留换行符;第二个是换行符,不然就跑一行去了
好像不加换行符服务启动识别有点问题
cat > /opt/kubernetes/cfg/kube-apiserver.conf << EOF
KUBE_APISERVER_OPTS="--logtostderr=false \\\\
--v=2 \\\\
--log-dir=/opt/kubernetes/logs \\\\
--etcd-servers=https://192.168.100.101:2379,https://192.168.100.102:2379,https://192.168.100.103:2379 \\\\
--bind-address=192.168.100.101 \\\\
--secure-port=6443 \\\\
--advertise-address=192.168.100.101 \\\\
--allow-privileged=true \\\\
--service-cluster-ip-range=10.0.0.0/16 \\\\
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\\\
--authorization-mode=RBAC,Node \\\\
--enable-bootstrap-token-auth=true \\\\
--token-auth-file=/opt/kubernetes/cfg/token.csv \\\\
--service-node-port-range=30000-32767 \\\\
--kubelet-client-certificate=/opt/kubernetes/ssl/apiserver.pem \\\\
--kubelet-client-key=/opt/kubernetes/ssl/apiserver-key.pem \\\\
--tls-cert-file=/opt/kubernetes/ssl/apiserver.pem \\\\
--tls-private-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\\\
--client-ca-file=/opt/kubernetes/ssl/ca.pem \\\\
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\\\
--service-account-issuer=https://kubernetes.default.svc.cluster.local \\\\
--service-account-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\\\
--etcd-cafile=/opt/etcd/ssl/ca.pem \\\\
--etcd-certfile=/opt/etcd/ssl/server.pem \\\\
--etcd-keyfile=/opt/etcd/ssl/server-key.pem \\\\
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \\\\
--proxy-client-cert-file=/opt/kubernetes/ssl/apiserver.pem \\\\
--proxy-client-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\\\
--requestheader-allowed-names=kubernetes \\\\
--requestheader-extra-headers-prefix=X-Remote-Extra- \\\\
--requestheader-group-headers=X-Remote-Group \\\\
--requestheader-username-headers=X-Remote-User \\\\
--enable-aggregator-routing=true \\\\
--audit-log-maxage=30 \\\\
--audit-log-maxbackup=3 \\\\
--audit-log-maxsize=100 \\\\
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
EOF
配置介绍:
- –logtostderr :启用日志(true为输出到标准输出,false为输出到日志文件里)
- –v :日志等级
- –log-dir :日志目录
- –etcd-servers :etcd集群地址
- –bind-address :监听地址
- –secure-port :https安全端口
- –advertise-address :集群通告地址
- –allow-privileged :启动授权
- –service-cluster-ip-range :Service虚拟IP地址段,这里掩码给16位,可以创建(2的16次方-2)=65534个地址
- –enable-admission-plugins : 准入控制模块
- –authorization-mode :认证授权,启用RBAC授权和节点自管理
- –enable-bootstrap-token-auth :启用TLS bootstrap机制
- –token-auth-file :bootstrap token文件
- –service-node-port-range :Service nodeport类型默认分配端口范围
- –kubelet-client-xxx :apiserver访问kubelet客户端证书
- –tls-xxx-file :apiserver https证书
- –service-account-issuer:此参数可作为服务账号令牌发放者的身份标识(Identifier)详细可参考官方解析和阿里云解析
- –service-account-signing-key-file:指向包含当前服务账号令牌发放者的私钥的文件路径
- –etcd-xxxfile :连接etcd集群证书
- –requestheader-client-ca-file,–proxy-client-cert-file,–proxy-client-key-file,–requestheader-allowed-names,–requestheader-extra-headers-prefix,–requestheader-group-headers,–requestheader-username-headers,–enable-aggregator-routing:启动聚合层网关配置
- –audit-log-xxx :审计日志
更多参数可查看官方介绍
拷贝生成证书到工作目录
cp ~/TLS/k8s/*.pem /opt/kubernetes/ssl/
3.1.3、启用TLS bootstrapping机制
当集群开启了 TLS 认证后,每个节点的 kubelet 组件都要使用由 apiserver 使用的 CA 签发的有效证书才能与 apiserver 通讯,此时如果节点多起来,为每个节点单独签署证书将是一件非常繁琐的事情;TLS bootstrapping 功能就是让 kubelet 先使用一个预定的低权限用户连接到 apiserver,然后向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署
详细内容见官方说明
工作流程:
创建令牌认证文件
# 生成随机数
[root@k8s-master1 cfg]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
a2dfd3748230d54213367c6dcb63efde
# 将生成的数创建token文件(将上边生成的数替换第一个值)
cat > /opt/kubernetes/cfg/token.csv << EOF
a2dfd3748230d54213367c6dcb63efde,kubelet-bootstrap,10001,"system:node-bootstrapper"
EOF
3.1.4、配置systemd管理服务
cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
ExecStart=/opt/kubernetes/bin/kube-apiserver \\$KUBE_APISERVER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
启动服务
systemctl daemon-reload
systemctl start kube-apiserver
systemctl enable kube-apiserver
systemctl status kube-apiserver
小提示:
启动会报下边这俩错,忽略就行,这个是说这俩参数准备弃用了,但是现在还能用(就跟前几年说移除docker一样)
FlagFlag --logtostderr has been deprecated, will be removed in a future release, see https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/2845-deprecate-klog-specific-flags-in-k8s-components
Flag --log-dir has been deprecated, will be removed in a future release, see https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/2845-deprecate-klog-specific-flags-in-k8s-components
3.2、部署kube-controller-manager
3.2.1、生成证书
cd ~/TLS/k8s
# 创建证书请求文件
cat > kube-controller-manager-csr.json << EOF
"CN": "system:kube-controller-manager",
"hosts": [],
"key":
"algo": "rsa",
"size": 2048
,
"names": [
"C": "CN",
"L": "ShangHai",
"ST": "ShangHai",
"O": "system:masters",
"OU": "System"
]
05.Nacos集群搭建及高可用方案
Nacos集群搭建及高可用方案
前言
集群架构图
首先我们来看一下官网的集群架构图,如下:
DNS:域名地址(防止因ip或者端口号变化而无法访问)
SLB:是负载均衡,这里我们会使用Nginx实现Nacos集群的负载均衡
集群规划
按照集群节点设置为奇数的原则,我们的Nacos集群规划三个节点Nacos01(192.168.8.190:8845)
、Nacos01(192.168.8.190:8846)
、Nacos01(192.168.8.190:8847)
;最后配置一台Nginx服务器Nginx(192.168.8.199)
。
问:为什么集群的个数建议设置为奇数个?
1:通常在集群中要求可用节点数量 > 集群总节点数量/2 ;如果是偶数个的话,当master节点宕机在各个子节点不可通信的情况下会形成若干小集群,每个小集群会选出自己的master,这就会导致脑裂的出现。
2:在容错能力相同的情况下,奇数台更节省资源。比如在遵循第一条规则的前提下,如集群节点为三个,则只允许一台机器宕机;集群节点为4个,同样只允许一台机器宕机;
集群搭建
准备工作
Nginx服务器
按照上述的集群规划,我们参照文章Nginx系列之一扫盲篇搭建我们的Nginx服务器,搭建完毕后我们在浏览器中访问http://192.168.8.199:80
(80是Nginx默认端口号,可以不写),如果出现以下欢迎界面则说明我们的Nginx服务器搭建成功。如下图:
Nacos服务器
Nacos是比较占用内存的(通常一个节点占用内存大于1个G),由于我们上面的三个节点在同一台服务器,所以我们要将Nacos的服务器内存调到3G以上,这里我们调整为5G。如下图所示:
如果宿主机内存在8G以下的童鞋建议不要将三个节点放在同一台服务器
清除数据
进群中的三个nacos节点我们通过复制nacos而来,但是集群搭建要求不能有原始数据,所以我们要将nacos和mysql中的数据清空
首先我们关闭nacos服务进入到nacos目录,执行命令rm -rf data
删除data目录
然后我们通过SQLyog连接MySQL5.7服务器中的nacos数据库,将数据库清空,重新导入nacos-mysql.mysql
,如下图:
集群搭建
1.拷贝nacos01
我们进入到目录/usr/tools
中执行命令cp -rf nacos nacos01
复制出nacos01,如下图
2.修改nacos01端口号
进入到目录nacos/conf
下,执行命令vim application.properties
,修改端口号为8845,如下图:
3.添加集群节点
在上面conf目录中我们看到了文件cluster.conf.example
,这个就是集群配置的模板文件,我们执行命令cp cluster.conf.example cluster.conf
拷贝并重新命名,如下图:
然后我们执行命令vim cluster.conf
编辑该配置文件,在该文件中添加以下配置:
192.168.8.190:8845
192.168.8.190:8846
192.168.8.190:8847
单个节点的所有配置就是这样了,后面的节点nacos02和nacos03只要拷贝nacos01然后改下端口号就可以了
4.拷贝nacos02、nacos03
回到/usr/tools
目录依次执行命令cp -rf nacos01 nacos02
、cp -rf nacos01 nacos03
,然后依次修改这两个节点的端口号为8846和8847
5.Nginx负载均衡
我们进入到Nginx服务器的/usr/tools/nginx/conf
目录,我们可以看到有个文件nginx.conf
,如下图:
执行命令vim nginx.conf
,添加upstream、注释掉原先的location,新增如下内容保存后退出:
upstream nacos-servers {
server 192.168.8.190:8845;
server 192.168.8.190:8846;
server 192.168.8.190:8847;
}
#location / {
# root html;
# index index.html index.htm;
#}
location / {
proxy_pass http://nacos-servers/;
}
最后执行命令nginx -s reload
重新启动nginx
测试
启动集群
我们依次启动nacos01、nacos02和nacos03,然后浏览器依次访问http://192.168.8.190:8445/nacos
、http://192.168.8.190:8446/nacos
、http://192.168.8.190:8447/nacos
。如下图所示:
nacos client
1.application.properties
我们打开项目01.springcloud_alibaba_nacos_client的application.properties
文件,修改spring.cloud.nacos.server-addr
的地址为Nginx的地址,如下
server.port=8800
# 代表微服务服务名 唯一 推荐 大写
spring.application.name=NACOSCLIENT
# nacos server 的地址修改为Nginx的地址
spring.cloud.nacos.server-addr=192.168.8.199:80
# 作为nacos client注册地址
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
# 指定向nacos server注册服务名称
spring.cloud.nacos.discovery.service=${spring.application.name}
2.启动client
我们启动client,如下图:
此时我们分别访问三个nacos,可以看到每个nacos的服务列表中都已经注册了我们的client,这也说明我们的集群搭建是成功的。如下图
以上是关于k8s1.23.15版本二进制部署/扩容及高可用架构详解的主要内容,如果未能解决你的问题,请参考以下文章