千家信息网

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

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"Kubernetes的etcd节点和扩容方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Kubernetes的etcd节点
千家信息网最后更新 2026年11月01日Kubernetes的etcd节点和扩容方法是什么

这篇文章主要讲解了"Kubernetes的etcd节点和扩容方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"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 ~/cfsslmkdir bin && cd binwget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O cfsslwget 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 servercfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer peer1.json | cfssljson -bare peer1cfssl 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.yamlapiVersion: v1kind: Podmetadata:  annotations:    scheduler.alpha.kubernetes.io/critical-pod: ""  creationTimestamp: null  labels:    component: etcd    tier: control-plane  name: etcd  namespace: kube-systemspec:  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-certsstatus: {}

参照上面的模式,在各个副节点修改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.yamlapiVersion: v1kind: Podmetadata:  annotations:    scheduler.alpha.kubernetes.io/critical-pod: ""  creationTimestamp: null  labels:    component: etcd    tier: control-plane  name: etcd  namespace: kube-systemspec:  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-certsstatus: {}

进入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-healthmember 5856099674401300 is healthy: got healthy result from https://10.1.86.201:2379member df99f445ac908d15 is healthy: got healthy result from https://10.1.86.202:2379cluster 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节点和扩容方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

节点 文件 证书 实例 集群 服务 目录 配置 参数 数据 容器 方法 运行 内容 备份 多个 思路 机构 模版 状态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技股 互联网科技公司经营范围 深圳恒合互联网络科技有限公司 互联网科技的英文 安徽鑫晟辉互联网科技 融势互联网科技 一五八零互联网科技 深圳互联网科技怎么样 北京三清互联网科技 北京大学互联网科技怎么样 重庆互联网医院沙龙医盟信息科技 新兴科技互联网创新大赛颁奖典礼 速维有品互联网信息科技(苏州)有限公司 科技类公司包括互联网吗 民营互联网公司国防科技 西安小鹰速贷互联网科技有限公司 玉溪新华互联网科技好不好 中天科技中国工业互联网 新氧科技和美国互联网有关系吗 河南商务圈互联网科技有限公司 互联网科技活动banner 互联网的科技 喔噻互联网科技 上海挚品互联网科技 伴你行互联网科技有限公司 创业天下互联网科技有限公司 北京华百购互联网科技有限公司 现代互联网科技股 工业互联网等科技实现智能化赋能 2021世界互联网领先科技成果发布
0