K8S二进制部署高可用集群-1.22[三]
本节前言:
本节关键字:ETCD、键值数据库;
本节为部署"ETCD"集群,"ETCD"集群主要作用为:提供分布式键值数据存储,保存了整个集群的状态;可用于服务发现、共享配置以及一致性保障;关于"ETCD",博主深入不够,所以本处没什么可以说;
本节开始……
一、预创建目录
搭建二进制的K8S高可用集群,我们需要一些目录用保存相关数据及配置,本处将会预先创建一些K8S高可用集群所使用到的目录,并且博主会对这些目录的作用作一个简单的说明;注意,这些东西都可以按你本人的设想进行优化,但如果你使用本博客的示例去模拟实验,博主不建议你修改这些目录结构,原因是,假若你变更一个目录的名称,你极可能需要修改后续的大量配置文件,而那些配置的关联性,实际上是非常复杂的;
创建预定义目录;操作目标[192.168.100.41 -43]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 不只包含"证书"文件,还包含了K8S的一些".kubeconfig"及".conf"文件, # 一般情况下,这里的文件都是整个集群内通用的[一般情况是指不扩容MASTER] mkdir -p /opt/cluster/ssl/{rootca,etcd,kubernetes} # 基于KUBELET的特殊性,此文件夹专用于存放KUBELET的相关"证书" mkdir -p /opt/cluster/kubelet/ssl # KUBERNETES的日志目录 mkdir -p /opt/cluster/log/{kube-apiserver,kube-controller-manager,kube-scheduler,kube-proxy,kubelet} # KUBERNETES的插件目录 mkdir -p /opt/cluster/plugins/{calico,coredns} # ETCD的数据保存目录 mkdir -p /opt/cluster/etcd/{data,wal} |
目录作用说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ tree /opt/cluster /opt/cluster ├── etcd # 保存ETCD的数据 │ ├── data │ └── wal ├── kubelet # 此目录下会保存关于KUBELET的"kubelet.kubeconfig"文件[自动生成] │ └── ssl # 专用于保存KUBELET组的证书[自动生成] ├── log # K8S组件的日志目录 │ ├── kube-apiserver │ ├── kube-controller-manager │ ├── kubelet │ ├── kube-proxy │ └── kube-scheduler ├── plugins │ ├── calico # 保存CALICO的YAML文件 │ └── coredns # 保存CoreDNS的YAML文件 └── ssl # 此目录下会保存CFSSL的基本配置文件 ├── etcd # 保存ETCD的相关密钥 ├── kubernetes # 保存K8S集群的密钥、配置文件、KUBECONFIG[不包括KUBELET部分] └── rootca # 保存根CA的相关密钥 |
二、ETCD集群部署
注意:在执行本步骤前,你应该已经将[ cfssl、cfssljson、etcd、etcdctl ]这些文件保存至"/usr/local/bin";另外"etcd、etcdctl"应该部署至三个K8S的MASTER节点~
以下操作均在[192.168.100.41]进行,然后按需要推送至[192.168.100.42 - 43];开始:创建"CFSSL"的配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 创建"cfssl"的配置文件 # 生成一份CFSSL的配置文件模板"cfssl print-defaults config > cfssl-conf.json" $ cd /opt/cluster/ssl $ cat > cfssl-conf.json << "EOF" { "signing": { "default": { "expiry": "87600h" }, "profiles": { "common": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "87600h" } } } } EOF |
创建CA根证书的证书请求文件并生成根CA证书:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# 生成 ROOTCA CSR 配置文件; # 生成一份"证书请求"模板cfssl print-defaults csr > rootca/rootca-csr.json $ cd /opt/cluster/ssl $ cat > rootca/rootca-csr.json << "EOF" { "CN": "rootca", "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "CN", "ST": "GuangDong", "L": "GuangZhou", "O": "ROOTCA", "OU": "LEMONSYS" } ] } EOF # 生成"根证书" -- “rootca-key.pem"与"rootca.pem" # 此处"-initca"是要点,表明根据相应的"证书请求"生成一个"根证书" $ cd /opt/cluster/ssl $ cfssl gencert -initca rootca/rootca-csr.json | cfssljson -bare rootca/rootca |
创建ETCD证书[客户端访问与节点间互访使用同一套证书]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# 生成"ETCD"的证书请求"etcd-csr.json" $ cd /opt/cluster/ssl $ cat > etcd/etcd-csr.json << "EOF" { "CN": "etcd-cluster", # 本处CN可随便定义 "hosts": [ # 设定与"--advertise-client-urls"的定义配置有关 "127.0.0.1", # 当"--advertise-client-urls"的定义为IP时,本处必须定义IP "192.168.100.41", # 只定义IP时,无法使用域名格式的"URL"进行访问[即使定义了"hosts"文件] "192.168.100.42", # 当"--advertise-client-urls"的定义为域名时,本处必须定义域名 "192.168.100.43" # 只定义域名时,只能使用域名格式的"URL"进行访问[需要定义"hosts"文件] ], "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "CN", # 国家 "ST": "GuangDong", # 州/省 "L": "GuangZhou", # 市 "O": "KUBERNETES-ETCD", # 组织[二进制部署随便定义;但如果使用KUBEADM,本处有要求值为"system:masters",见官方文档] "OU": "LEMONSYS" # 部门 } ] } EOF # 生成服务器密钥对 -- "etcd-key.pem" 和"etcd.pem" $ cd /opt/cluster/ssl $ cfssl gencert -ca=rootca/rootca.pem -ca-key=rootca/rootca-key.pem --config=cfssl-conf.json -profile=common etcd/etcd-csr.json | cfssljson -bare etcd/etcd |
将证书与分发至其它服务器[192.168.100.42 - 43];
1 2 |
scp -r /opt/cluster/ssl 192.168.100.42:/opt/cluster/ scp -r /opt/cluster/ssl 192.168.100.43:/opt/cluster/ |
为"ETCD"生成"etcd.service"启动文件;本处特别注意,此文件非通用,需要修改的地方已在下文标注,请按实际情况生成;本步操作目标[192.168.100.41 - 43]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
cat > /usr/lib/systemd/system/etcd.service << "EOF" [Unit] Description=Kubernetes:Etcd After=network.target network-online.target Wants=network-online.target [Service] Restart=on-failure RestartSec=5 ExecStart=/usr/local/bin/etcd \ --name=etcd01 \ # [修改]节点名称[etcd01、etcd02、etcd03] --data-dir=/opt/cluster/etcd/data \ # ETCD数据保存目录 --wal-dir=/opt/cluster/etcd/wal \ # ETCD WAL 数据保存目录 --listen-peer-urls=https://192.168.100.41:2380 \ # [修改]ETCD节点宣告地址[成员通信] --listen-client-urls=https://192.168.100.41:2379,http://127.0.0.1:2379 \ # [修改]ETCD节点监听地址["127.0.0.1"允许非安全方式访问] --initial-advertise-peer-urls=https://192.168.100.41:2380 \ # [修改]设置集群成员访问本节点应该使用的地址 --initial-cluster=etcd01=https://192.168.100.41:2380,etcd02=https://192.168.100.42:2380,etcd03=https://192.168.100.43:2380 \ # 集群成员列表 --initial-cluster-state=new \ # 创建新的集群 --initial-cluster-token=373b3543a301630c \ # 集群引导创建期间所使用的TOKEN,临时工生成一个8字节的TOKEN # [ head -c 8 /dev/urandom | od -An -t x | tr -d ' ' ] --advertise-client-urls=https://192.168.100.41:2379 \ # [修改]设置客户端访问本节点应该使用的地址 --cert-file=/opt/cluster/ssl/etcd/etcd.pem \ # ETCD本节点"2379"的所使用的证书 --key-file=/opt/cluster/ssl/etcd/etcd-key.pem \ # ETCD本节点"2379"的所使用的密钥 --peer-cert-file=/opt/cluster/ssl/etcd/etcd.pem \ # ETCD本节点"2380"的所使用的证书 --peer-key-file=/opt/cluster/ssl/etcd/etcd-key.pem \ # ETCD本节点"2380"的所使用的密钥 --trusted-ca-file=/opt/cluster/ssl/rootca/rootca.pem \ # ETCD本节点"2379"的所使用的CA证书 --peer-trusted-ca-file=/opt/cluster/ssl/rootca/rootca.pem \ # ETCD本节点"2380"的所使用的CA证书 --client-cert-auth=true \ # 客户端访问本节点时,是否必须进行证书认证 --peer-client-cert-auth=true \ # 集群成员访问本节点时,是否必须进行证书认证 --logger=zap \ # 日志格式 --log-outputs=default \ # 日志输出方式 --log-level=info \ # 日志等级 --listen-metrics-urls=https://192.168.100.41:2381 \ # [修改]METRICS数据的获取地址 --enable-pprof=false # 禁止通过“URL/debug/pprof/”获取启动时的状态[建议禁用] [Install] WantedBy=multi-user.target EOF |
启动"ETCD"集群并设定开机启动[192.168.100.41 - 43]:
1 |
systemctl daemon-reload && systemctl enable --now etcd.service && systemctl status etcd.service |
测试"ETCD"集群:
1 2 3 4 5 6 7 |
etcdctl --endpoints=http://127.0.0.1:2379 -w table member list etcdctl --endpoints=http://127.0.0.1:2379 -w table endpoint health etcdctl --cacert=/opt/cluster/ssl/rootca/rootca.pem \ --cert=/opt/cluster/ssl/etcd/etcd.pem \ --key=/opt/cluster/ssl/etcd/etcd-key.pem \ --endpoints=https://192.168.100.41:2379 \ -w table member list |
关于二进制部署"ETCD"至此结束~~
结、
关于"ETCD",实际上博主也不太了解这个东西,可以这么说,如果不是K8S,或者这辈子博主也不会去了解它……下一节将是关于"KUBE-APISREVER"组件的二进制部署。本篇完,读者可点击以下链接进入下一章或返回上一章;
生成服务器密钥对 -- "etcd-key.pem" 和"etcd.pem",在这一步操作时有没有发生报错呢?我这里无法生成证书,报错内容是{"code":5100,"message":"Invalid policy: no key usage available"}
2022-08-10 下午5:57Failed to parse input: unexpected end of JSON input
我的百度网盘有当时所有使用的二进制文件的版本,你可以去下一下,已经有好几个人根据这个教程成功了~~
2022-08-22 上午8:42这里很清楚说明了,你的JSON文件有问题
2022-08-22 上午8:46这个问题已经解决了,cfssl print-defaults config > cfssl-conf.json 这一步操作要延后一点才行,现在问题卡在了下一章节,ETCD 集群起不来,我暂时还没找到解决方案。
2022-08-25 下午4:17"cfssl print-defaults config > cfssl-conf.json"只是注释说明,那不需要执行......我只是告诉你们有这么一回事而已,我还特别的注释了呢......
2022-08-28 上午7:34生成服务器密钥对 -- "etcd-key.pem" 和"etcd.pem"
2022-08-10 下午5:56