温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-12-24 09:43:09 来源:亿速云 阅读:500 作者:iii 栏目:云计算

这篇文章主要讲解了“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 ~/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节点和扩容方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI