一 实验环境
k8s集群master01:192.168.217.66 kube-apiserver kube-controller-manager kube-scheduler etcd
k8s集群master02:192.168.217.77
k8s集群node01:192.168.217.88 kubelet kube-proxy docker
k8s集群node02:192.168.217.99
etcd集群节点1:192.168.217.66 etcd
etcd集群节点2:192.168.217.88 etcd
etcd集群节点3:192.168.217.99 etcd
负载均衡nginx+keepalive01(master):192.168.217.22
负载均衡nginx+keepalive02(backup):192.168.217.44
VIP 192.168.10.100
二 操作系统初始化配置(所有机器)
1,关闭防火墙
systemctl stop firewalld systemctl disable firewalld iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X # iptables -F:这一部分命令是用来清空filter表中的所有规则链(包括INPUT、OUTPUT、FORWARD)。这意味着所有进入、离开或通过系统的数据包都将按照默认策略处理,通常是接受(ACCEPT)或拒绝(DROP)。 iptables -t nat -F:这里,-t nat指定了操作表为nat表,-F则表示清空。它会清空nat表内的规则,包括PREROUTING、POSTROUTING和OUTPUT链。这些规则通常用于网络地址转换(NAT),比如端口转发或者IP伪装。 iptables -t mangle -F:这部分命令清空了mangle表中的规则。mangle表用于修改数据包的服务类型、TTL(生存时间)值或标记等,通常涉及到更高级的路由和QoS(服务质量)控制。 iptables -X:此命令用于删除用户自定义的(非内置的)链。这不会影响INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING这样的内置链,而是会删除你自己创建的任何额外链。 综上所述,执行这个命令后,你的iptables规则将会被完全重置,所有的自定义规则都会被清除,系统将恢复到iptables的初始默认状态。在执行此操作前,请确保你了解这将对你的系统网络安全设置产生的影响,并已经做好了相应的备份或有恢复策略。
2,关闭selinux
swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab # -r 是开启扩展正则 将.*swap.* 换成#$
3,关闭swap
swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab # -r 是开启扩展正则 将.*swap.* 换成#$
4, 根据规划设置主机名
hostnamectl set-hostname master01 hostnamectl set-hostname master02 hostnamectl set-hostname node01 hostnamectl set-hostname node02
5, 做域名映射
cat >> /etc/hosts << EOF 192.168.217.66 master01 192.168.217.77 master02 192.168.217.88 node01 192.168.217.99 node02 EOF
6,调整内核参数
cat > /etc/sysctl.d/k8s.conf << EOF #开启网桥模式,可将网桥的流量传递给iptables链 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 #关闭ipv6协议 net.ipv6.conf.all.disable_ipv6=1 net.ipv4.ip_forward=1 EOF sysctl --system ## sysctl --system 命令用于从系统配置文件(通常是 /etc/sysctl.conf 以及 /etc/sysctl.d/ 目录下的其他配置文件)中读取并应用内核参数设置。当执行这个命令时,系统会遍历这些配置文件,将其中定义的内核参数值应用到当前运行的内核中,从而实现对系统行为的调整,例如开启或关闭IP转发、调整网络缓冲区大小、改变文件系统的行为等,而无需重启系统。
7, 时间同步
yum install ntpdate -y ntpdate time.windows.com
三 部署 docker引擎(node 节点)
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker.service systemctl enable docker.service
四 部署 etcd 集群
CFSSL 是为etcd 的准备的
CFSSL 生成的 密钥文件 会拖到 etcd 的ssl 目录中
1, etcd 介绍
1.1 etcd 是什么
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd是go语言编写的。
1.2 etcd 特点
etcd 作为服务发现系统,有以下的特点:
简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
安全:支持SSL证书验证
快速:单实例支持每秒2k+读操作
可靠:采用raft算法,实现分布式系统数据的可用性和一致性
1.3 etcd 端口
etcd 目前默认使用2379端口提供HTTP API服务, 2380端口和peer通信(这两个端口已经被IANA(互联网数字分配机构)官方预留给etcd)。 即etcd默认使用2379端口对外为客户端提供通讯,使用端口2380来进行服务器间内部通讯。
etcd 在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制,要求至少为3台或以上的奇数台。
2, 准备签发证书环境
CFSSL 是 CloudFlare 公司开源的一款 PKI/TLS 工具。 CFSSL 包含一个命令行工具和一个用于签名、验证和捆绑 TLS 证书的 HTTP API 服务。使用Go语言编写。
CFSSL 使用配置文件生成证书,因此自签之前,需要生成它识别的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。
CFSSL 用来为 etcd 提供 TLS 证书,它支持签三种类型的证书:
1、client 证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如 kube-apiserver 访问 etcd;
2、server 证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如 etcd 对外提供服务;
3、peer 证书,相互之间连接时使用的证书,如 etcd 节点之间进行验证和通信。
这里全部都使用同一套证书认证。
3, 下载CFSSL三个工具
下载
#准备cfssl证书生成工具 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
移到指定目录 加权限
cfssl:证书签发的工具命令 cfssljson:将 cfssl 生成的证书(json格式)变为文件承载式证书 cfssl-certinfo:验证证书的信息 cfssl-certinfo -cert <证书名称> #查看证书的信息
4, 生成Etcd证书
准备k8s 目录
上传 etcd-cert.sh (生成CFSSL 证书的脚本)和 etcd.sh (启动 etcd 的脚本)到 /opt/k8s/ 目录中
并加 执行权限
创建用于生成CA证书、etcd 服务器证书以及私钥的目录 将脚本移过去
编写脚本 注意更改证书 生命周期 以及etcf 服务器的ip 地址
运行脚本 生成CA证书、etcd 服务器证书以及私钥
ca-config.json
:CA(Certificate Authority,证书颁发机构)的配置文件,定义了如何生成CA证书的规则,比如默认有效期、密钥使用算法等。ca-csr.json
:CA证书签名请求文件(Certificate Signing Request),包含了请求CA签发证书所需的信息。ca.pem
:CA的公钥证书文件,用于验证由该CA签发的所有证书的真实性。server.csr
:服务器证书的签名请求文件,用于请求签发特定服务器的TLS证书。server-key.pem
:服务器私钥文件,与server.pem
一起用于服务器的TLS加密通信。server-csr.json
:另一个服务器证书签名请求文件,可能用于不同目的或备份。server.pem
:服务器的公钥证书文件,包含了服务器的公钥以及由CA签名的证书信息。etcd-cert.sh
:一个脚本文件,可能是用来自动化执行上述TLS证书生成过程的Shell脚本。
5,下载 etcd 的安装包,启动etcd
下载 etcd 的安装包 到/opt/k8s
https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
解压安装包并查看
etcd就是etcd 服务的启动命令,后面可跟各种启动参数
etcdctl主要为etcd 服务提供了命令行操作
创建用于存放 etcd 配置文件,命令文件,证书的目录
把 原来 压缩包解压出来的 etcd etcdctl 移动到 bin
将把4个.pem 结尾的 证书 放ssl
写etcd 启动脚本 (根据脚本示例 用位置变量 跟三个etcd 的ip来启动)脚本
确保所有的启动etcd 的准备环境(cfg 配置文件目前是空的 在启动etcd 脚本后会自动生成)
启动etcd 启动脚本
cd /opt/k8s/ ./etcd.sh etcd01 192.168.217.66 etcd02=https://192.168.217.88:2380,etcd03=https://192.168.217.99:2380 # 进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,可忽略这个情况
可另外打开一个窗口查看etcd进程是否正常ps -ef | grep etcd
注意 他可能会报超时的错误 查看端口都正常运行
6, 把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点
拷贝etcd 目录 下的所有文件(证书 配置文件 二进制文件)
拷贝服务管理文件
scp /usr/lib/systemd/system/etcd.service root@192.168.217.99:/usr/lib/systemd/system/ scp /usr/lib/systemd/system/etcd.service root@192.168.217.88:/usr/lib/systemd/system/
7, 在 node01 节点上操作(etcd02 )
vim /opt/etcd/cfg/etcd 写etcd02 的配置文件
启动etcd服务
8, 在 node02 节点上操作(etcd03 )
vim /opt/etcd/cfg/etcd
9 ,查看etcd主从 状态
启动顺序: 应先启动etcd01 再启动etcd02 03
9.1 检查etcd群集状态
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.217.66:2379,https://192.168.217.88:2379,https://192.168.217.99:2379" endpoint health --write-out=table ########## ------------------------------------------------------------------------------------------ --cert-file:识别HTTPS端使用SSL证书文件 --key-file:使用此SSL密钥文件标识HTTPS客户端 --ca-file:使用此CA证书验证启用https的服务器的证书 --endpoints:集群中以逗号分隔的机器地址列表 cluster-health:检查etcd集群的运行状况
9.2 更详细检查etcd群集状态
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.217.66:2379,https://192.168.217.88:2379,https://192.168.217.99:2379" endpoint status --write-out=table ###### ------------------------------------------------------------------------------------------ --cert-file:识别HTTPS端使用SSL证书文件 --key-file:使用此SSL密钥文件标识HTTPS客户端 --ca-file:使用此CA证书验证启用https的服务器的证书 --endpoints:集群中以逗号分隔的机器地址列表 cluster-health:检查etcd集群的运行状况
- ENDPOINT: 表示etcd集群中每个成员的访问地址和端口。
- ID: 是每个etcd节点在集群中的唯一标识符,通常是一个随机生成的字符串。
- VERSION: 显示etcd服务器的版本号。
- DB SIZE: 数据库的大小,这里以“20 kB”为例,表示当前etcd节点存储的数据量大小。
- IS LEADER: 指示该节点是否为集群中的领导者(Leader)。在Raft共识算法中,集群中只有一个Leader负责处理所有写操作和协调集群状态。结果显示为
true
或false
。- IS LEARNER: 表示该节点是否为学习者(Learner)节点,学习者节点接收复制的日志条目但不参与选举。结果显示为
true
或false
。- RAFT TERM: Raft协议中的任期号(Term),用于选举领导和日志复制的逻辑时钟。每当选举出新的领导者时,任期号就会递增。
- RAFT INDEX: 当前Raft日志条目的索引,表示了Raft日志的最新位置。
- RAFT APPLIED INDEX: 已经被应用到状态机的日志条目索引,这个值应该总是小于等于
RAFT INDEX
,表示哪些日志已经被实际执行。- ERRORS: 如果在检查该节点状态时遇到任何错误,这一列将显示具体的错误信息。如果没有错误,则为空。
9.3 查看etcd集群成员列表
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.217.66:2379,https://192.168.217.88:2379,https://192.168.217.99:2379" --write-out=table member list