Kubernetes的etcd节点和扩容方法是什么

66次阅读
没有评论

共计 10169 个字符,预计需要花费 26 分钟才能阅读完成。

这篇文章主要讲解了“Kubernetes 的 etcd 节点和扩容方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“Kubernetes 的 etcd 节点和扩容方法是什么”吧!

Kubernetes 使用 kubeadm 安装默认只有一个 etcd 实例,存在单点故障的风险。提升 Kubernetes 集群可用性的方法包括:1、备份(Kubernetes 探秘—etcd 状态数据及其备份);2、etcd 节点和实例扩容;3、apiserver 的多节点服务和负载均衡。这里主要实验 etcd 节点和实例的扩容。

一、etcd 扩容,主要思路

etcd 是一个独立的服务,在 kubernetes 中使用时将配置参数和数据目录分别映射到了宿主机目录,而且使用 hostnetwork 网络(本主机网络)。其中,/etc/kubernetes/manifest/etcd.yaml 为启动参数文件,/etc/kubernetes/pki/etcd 为 https 使用的证书,/var/lib/etcd 为该节点的 etcd 数据文件。

对于已用 kubeadm 安装的单 Master 节点 Kubernetes 集群,其 etcd 运行实例只有一个。我们希望将其 etcd 实例扩展到多个,以降低单点失效风险。Kubernetes 中 etcd 的扩容的思路如下:

所有节点安装 kubeadm/kubectl/kubelet,按照独立 master 节点安装。

创建 etcd 集群的证书,并复制到各个节点。

在各节点修改 etcd 启动配置文件,启动 etcd 实例。有多种方式 (运行结果一样、管理方式不同):

通过 kubectl 部署,让 kubernetes 控制启动。通过 nodeSelector 指定运行的节点。

通过 kubelet 服务来启动,操作系统通过 systemd 启动 kubelet 服务。这是 k8s 的标准过程。

通过 docker 的 –restart 参数让容器自行启动,由容器服务来进行管理。

把 etcd 作为宿主机服务来直接启动,不使用 Docker 或者 k8s 管理。

将所有节点 kube-apiserver.yaml 的 etcd 服务指向本地的 etcd 服务实例。

etcd 是分布式的存储,所有节点的数据将会自动同步,从任何节点访问都是一样的。

二、etcd 扩容,实验步骤第一步:安装多个节点

准备好安装 etcd 的节点。我使用 ubuntu 18.04LTS,然后安装 Docker CE 18.06 和 kubernetes 1.12.3。

我这里的三个节点分别为:

podc01, 10.1.1.201

podc02, 10.1.1.202

podc03, 10.1.1.203

需要提前把 k8s 用到的容器镜像拉取下来到每一个节点。参考:

Kubernetes 1.12.3 快速升级

Kubernetes 版本锁定到 1.12.3

多网卡 Ubuntu 服务器安装 Kubernetes

Ubuntu 18.04 设置多网卡多端口聚合

快速建立 Kubernetes 集群,从零开始

第二步:创建 etcd 证书

本想尝试复制主节点的 /etc/kubernetes/kpi 和 /etc/kubernetes/manifest 目录到所有副(mate)节点,启动后出现各种问题无法正常访问,提示是 ca 证书问题。最后,准备从头开始创建自己的证书和部署 yaml 文件。

创建证书使用 cfssl 来创建,需要下载模版文件和修改定义文件,包括 ca 机构、ca-config 配置、ca-key 私钥、csr 请求、server/peer/client 等证书的配置模版文件等。需要将里面的信息按照自己的环境进行修改。

最后生成 cert-file 证书文件、key-file 公钥文件和 trusted-ca-file 证书机构文件(因为我们这里用的是自签名,所以创建自己的证书机构文件)。

这三个文件在 etcd 实例启动时配置进去(注意:API2 和 API3 的参数名称有些不同),需要放到每一个节点的相应目录,并映射到 etcd 容器卷中。

使用 etcdctl 作为服务客户端访问时也需要指定相应的参数,其它对端(Peer)etcd 实例也需要使用这些参数来相互访问、组成集群、同步数据。

1、准备 cfssl 证书工具

mkdir ~/cfssl   cd ~/cfssl
mkdir bin   cd bin
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O cfssljson 
chmod +x {cfssl,cfssljson}
export PATH=$PATH:~/cfssl/bin

可选:为了方便,可以将 path 添加到~/.profile 文件中,或者复制到 /usr/local/bin 目录。

2、创建证书配置文件

创建证书配置文件目录:

mkdir -p ~/cfssl/etcd-certs   cd ~/cfssl/etcd-certs

生成证书配置文件放到~/cfssl/etcd-certs 目录中,文件模版如下:

# ==============================================
# ca-config.json
  signing : {
  default : {
  expiry :  43800h 
 },
  profiles : {
  server : {
  expiry :  43800h ,
  usages : [
  signing ,
  key encipherment ,
  server auth 
 ]
 },
  client : {
  expiry :  43800h ,
  usages : [
  signing ,
  key encipherment ,
  client auth 
 ]
 },
  peer : {
  expiry :  43800h ,
  usages : [
  signing ,
  key encipherment ,
  server auth ,
  client auth 
 ]
 }
 }
 }
# ==============================================
# ca-csr.json
  CN :  My own CA ,
  key : {
  algo :  rsa ,
  size : 2048
 },
  names : [
 {
  C :  US ,
  L :  CA ,
  O :  My Company Name ,
  ST :  San Francisco ,
  OU :  Org Unit 1 ,
  OU :  Org Unit 2 
 }
 ]
# ==============================================
# server.json
  CN :  etcd0 ,
  hosts : [
  127.0.0.1 ,
  0.0.0.0 ,
  10.1.1.201 ,
  10.1.1.202 ,
  10.1.1.203 
 ],
  key : {
  algo :  ecdsa ,
  size : 256
 },
  names : [
 {
  C :  US ,
  L :  CA ,
  ST :  San Francisco 
 }
 ]
# ==============================================
# peer1.json #  填本机 IP
  CN :  etcd0 ,
  hosts : [
  10.1.1.201 
 ],
  key : {
  algo :  ecdsa ,
  size : 256
 },
  names : [
 {
  C :  US ,
  L :  CA ,
  ST :  San Francisco 
 }
 ]
# ==============================================
# client.json
  CN :  client ,
  hosts : [
  
 ],
  key : {
  algo :  ecdsa ,
  size : 256
 },
  names : [
 {
  C :  US ,
  L :  CA ,
  ST :  San Francisco 
 }
 ]
}

3、创建 etcd 集群的证书

操作如下:

cd ~/cfssl/etcd-certs
 
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer peer1.json | cfssljson -bare peer1
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client

查看所产生的证书文件:

ls -l ~/cfssl/etcd-certs

文件包括:

...

第三步:启动 etcd 多实例

注意:

因为扩容过程中,需要将原来的 etcd 库删除,会导致 kubernetes 集群的 master 节点信息丢失,因此在扩容之前,建议使用 etcdctl snapshot 命令进行备份。或者,另建 etcd 节点,将原来的数据传送过去。

启动 etcd 实例之前,务必将 /var/lib/etcd 目录清空,否则一些设置的参数将不会起作用,仍然保留原来的状态。

注意,etcd 的下面几个参数只在第一次启动(初始化)时起作用,包括:

  – –initial-advertise-peer-urls=http://10.1.1.202:2380

  – –initial-cluster=podc02=http://10.1.1.202:2380,podc03=http://10.1.1.203:2380

  – –initial-cluster-token=etcd-cluster

  – –initial-cluster-state=new

如果是添加新节点,先在原来的节点运行 member add xxx。然后 - –initial-cluster-state=existing,再启动服务。

1、上传证书文件

将 cfssl/etcd-certs 目录拷贝到 /etc/kubernetes/pki/etcd-certs 目录,可以使用 scp 或 sftp 上传。

2、编辑启动文件

编辑 /etc/kubernetes/manifests/etcd.yaml 文件,这是 kubelet 启动 etcd 实例的配置文件。

# /etc/kubernetes/manifests/etcd.yaml
apiVersion: v1
kind: Pod
metadata:
 annotations:
 scheduler.alpha.kubernetes.io/critical-pod:  
 creationTimestamp: null
 labels:
 component: etcd
 tier: control-plane
 name: etcd
 namespace: kube-system
spec:
 containers:
 - command:
 - etcd
 - --advertise-client-urls=https://10.1.1.201:2379
 - --cert-file=/etc/kubernetes/pki/etcd-certs/server.pem
 - --client-cert-auth=true
 - --data-dir=/var/lib/etcd
 - --initial-advertise-peer-urls=https://10.1.1.201:2380
 - --initial-cluster=etcd0=https://10.1.1.201:2380
 - --key-file=/etc/kubernetes/pki/etcd-certs/server-key.pem
 - --listen-client-urls=https://10.1.1.201:2379
 - --listen-peer-urls=https://10.1.1.201:2380
 - --name=etcd1
 - --peer-cert-file=/etc/kubernetes/pki/etcd-certs/peer1.pem
 - --peer-client-cert-auth=true
 - --peer-key-file=/etc/kubernetes/pki/etcd-certs/peer1-key.pem
 - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd-certs/ca.pem
 - --snapshot-count=10000
 - --trusted-ca-file=/etc/kubernetes/pki/etcd-certs/ca.pem
 image: k8s.gcr.io/etcd-amd64:3.2.18
 imagePullPolicy: IfNotPresent
 #livenessProbe:
 # exec:
 # command:
 # - /bin/sh
 # - -ec
 # - ETCDCTL_API=3 etcdctl --endpoints=https://[10.1.1.201]:2379 --cacert=/etc/kubernetes/pki/etcd-certs/ca.pem
 # --cert=/etc/kubernetes/pki/etcd-certs/client.pem --key=/etc/kubernetes/pki/etcd-certs/client-key.pem
 # get foo
 # failureThreshold: 8
 # initialDelaySeconds: 15
 # timeoutSeconds: 15
 name: etcd
 resources: {}
 volumeMounts:
 - mountPath: /var/lib/etcd
 name: etcd-data
 - mountPath: /etc/kubernetes/pki/etcd
 name: etcd-certs
 hostNetwork: true
 priorityClassName: system-cluster-critical
 volumes:
 - hostPath:
 path: /var/lib/etcd
 type: DirectoryOrCreate
 name: etcd-data
 - hostPath:
 path: /etc/kubernetes/pki/etcd-certs
 type: DirectoryOrCreate
 name: etcd-certs
status: {}

参照上面的模式,在各个副节点修改 etcd 启动参数 /etc/kubernetes/manifest/etcd.yaml 文件内容。

注意:IP 地址需要修改多个地方,不要遗漏、错误。

重启 kubelet 服务。

sudo systemctl restart kubelet。

检查 etcd 服务。

ectdctl 连接到实例,etcdctl member list。

最终,多节点的 etcd 实例链接为一个集群。

3、验证运行状态

进入 etcd 容器执行:

alias etcdv3= ETCDCTL_API=3 etcdctl --endpoints=https://[10.1.1.201]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.pem --cert=/etc/kubernetes/pki/etcd/client.pem --key=/etc/kubernetes/pki/etcd/client-key.pem 
etcdv3 member add etcd1 --peer-urls= https://10.1.1.202:2380

4、增加 etcd 节点

拷贝 etcd1(10.1.1.201) 节点上的证书到 etcd1(10.1.1.202) 节点上,复制 peer1.json 到 etcd2 的 peer2.json,修改 peer2.json。

# peer2.json
  CN :  etcd1 ,
  hosts : [
  10.1.86.202 
 ],
  key : {
  algo :  ecdsa ,
  size : 256
 },
  names : [
 {
  C :  US ,
  L :  CA ,
  ST :  San Francisco 
 }
 ]
}

重新生成在 etcd1 上生成 peer1 证书:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer peer1.json | cfssljson -bare peer1

启动 etcd1,配置文件如下:

# etcd02 etcd.yaml
apiVersion: v1
kind: Pod
metadata:
 annotations:
 scheduler.alpha.kubernetes.io/critical-pod:  
 creationTimestamp: null
 labels:
 component: etcd
 tier: control-plane
 name: etcd
 namespace: kube-system
spec:
 containers:
 - command:
 - etcd
 - --advertise-client-urls=https://10.1.1.202:2379
 - --cert-file=/etc/kubernetes/pki/etcd-certs/server.pem
 - --data-dir=/var/lib/etcd
 - --initial-advertise-peer-urls=https://10.1.1.202:2380
 - --initial-cluster=etcd01=https://10.1.1.201:2380,etcd02=https://10.1.1.202:2380
 - --key-file=/etc/kubernetes/pki/etcd-certs/server-key.pem
 - --listen-client-urls=https://10.1.1.202:2379
 - --listen-peer-urls=https://10.1.1.202:2380
 - --name=etcd02
 - --peer-cert-file=/etc/kubernetes/pki/etcd-certs/peer2.pem
 - --peer-client-cert-auth=true
 - --peer-key-file=/etc/kubernetes/pki/etcd-certs/peer2-key.pem
 - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd-certs/ca.pem
 - --snapshot-count=10000
 - --trusted-ca-file=/etc/kubernetes/pki/etcd-certs/ca.pem
 - --initial-cluster-state=existing #  千万别加双引号,被坑死
 image: k8s.gcr.io/etcd-amd64:3.2.18
 imagePullPolicy: IfNotPresent
 # livenessProbe:
 # exec:
 # command:
 # - /bin/sh
 # - -ec
 # - ETCDCTL_API=3 etcdctl --endpoints=https://[10.1.1.202]:2379 --cacert=/etc/kubernetes/pki/etcd-certs/ca.crt
 # --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd-certs/healthcheck-client.key
 # get foo
 # failureThreshold: 8
 # initialDelaySeconds: 15
 # timeoutSeconds: 15
 name: etcd
 resources: {}
 volumeMounts:
 - mountPath: /var/lib/etcd
 name: etcd-data
 - mountPath: /etc/kubernetes/pki/etcd
 name: etcd-certs
 hostNetwork: true
 priorityClassName: system-cluster-critical
 volumes:
 - hostPath:
 path: /var/lib/etcd
 type: DirectoryOrCreate
 name: etcd-data
 - hostPath:
 path: /etc/kubernetes/pki/etcd-certs
 type: DirectoryOrCreate
 name: etcd-certs
status: {}

进入 etcd 容器执行:

alias etcdv3= ETCDCTL_API=3 etcdctl --endpoints=https://[10.1.86.201]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.pem --cert=/etc/kubernetes/pki/etcd/client.pem --key=/etc/kubernetes/pki/etcd/client-key.pem 
etcdv3 member add etcd1 --peer-urls= https://10.1.1.203:2380

按照以上步骤,增加 etcd03。

5、etcd 集群健康检查

# etcdctl --endpoints=https://[10.1.1.201]:2379 --ca-file=/etc/kubernetes/pki/etcd-certs/ca.pem --cert-file=/etc/kubernetes/pki/etcd-certs/client.pem --key-file=/etc/kubernetes/pki/etcd-certs/client-key.pem cluster-health
member 5856099674401300 is healthy: got healthy result from https://10.1.86.201:2379
member df99f445ac908d15 is healthy: got healthy result from https://10.1.86.202:2379
cluster is healthy

第四步:修改 apiserver 服务指向

- --etcd-cafile=/etc/kubernetes/pki/etcd-certs/ca.pem
- --etcd-certfile=/etc/kubernetes/pki/etcd-certs/client.pem
- --etcd-keyfile=/etc/kubernetes/pki/etcd-certs/client-key.pem

至此,etcd 已经扩展成多节点的分布式集群,而且各个节点的 kubernetes 都是可以访问的。

注意:

上面的流程适合刚创建的 k8s 集群。

如果已经有 kubeadm 的多节点集群,可以先创建 node2/node3 的 etcd 集群,然后将 node1 的数据同步过来,再添加 node1 集群,就能保留原来的数据。

参考:Kubernetes 的 etcd 数据查看和迁移

上面所部署的工作节点还只能连接到一个 apiserver,其它副节点的 apiserver 虽然可用但是无法被工作节点连接到。

下一步需要实现多 master 节点的容错,遇主节点故障时可以转移访问其它的副节点。

感谢各位的阅读,以上就是“Kubernetes 的 etcd 节点和扩容方法是什么”的内容了,经过本文的学习后,相信大家对 Kubernetes 的 etcd 节点和扩容方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计10169字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)