etcd 元件浅解

在 Kubernetes 中元件间的通讯都是藉由 API Server 通讯,而 API Server 是和 etcd 通讯的唯一元件,因此在 Kubernetes 上所有状态都是藉由 API Server 来修改。从下面这个系统上预设元件来看,etcdcorednsapiservercontroller-managerscheduler 都运行在 master 上,我们所下达的 kubectl 相关命令都是 API Serverkubelete(每个节点都会安装的代理) 发起。

$ kubectl get pods -n kube-system -o custom-columns=POD:metadata.name,NODE:spec.nodeName 
POD                              NODE
coredns-66bff467f8-5pfbz         master
coredns-66bff467f8-v4txv         master
etcd-master                      master
kube-apiserver-master            master
kube-controller-manager-master   master
kube-flannel-ds-amd64-gljsn      master
kube-flannel-ds-amd64-s58vt      node01
kube-flannel-ds-amd64-w2q8g      node02
kube-proxy-fm749                 master
kube-proxy-xpt4b                 node01
kube-proxy-xxlnx                 node02
kube-scheduler-master            master

对於只有一个 master 来说其元件都没有高可用性,如果有实现的话 etcdAPI Server 将可以并行执行,相对的其它元件只有一个会做回应,其余都是备援状态。

如何使用 etcd

etcd 是一个分散式以 Key-value 做储存的软件,etcd 在 Kubernetes 中是唯一储存集群状态和一些数据的地方,那为何只有 API Server 可以对 etcd 读写?它避免了 Optimistic Concurrency Control 或是增强验证系统,这样替换元件时也方便。

储存在 etcd 的资源

储存在 etcd 中的资源依照目前不同版本有不一样的做法,在第二版会是以档案系统方式建立,而第三版是以 / 做为取代目录。这边补充一个 etcd 使用 RAFT 演算法保证一致性。

$ sudo apt install etcd-client # 安装套件

这边使用的环境是 kubeadm 架设的,而预设 etcd 使用 tls。

$ sudo ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key get /registry/namespaces/default -w=json | jq .
{
  "header": {
    "cluster_id": 14991974125033499000,
    "member_id": 13655367627031355000,
    "revision": 205622,
    "raft_term": 2
  },
  "kvs": [
    {
      "key": "L3JlZ2lzdHJ5L25hbWVzcGFjZXMvZGVmYXVsdA==",
      "create_revision": 152,
      "mod_revision": 152,
      "version": 1,
      "value": "azhzAAoPCgJ2MRIJTmFtZXNwYWNlErIBCpcBCgdkZWZhdWx0EgAaACIAKiQwN2ZjNjg5NS1lZDY2LTRlZDMtYWFkYS03MDRiZThmN2FjYjcyADgAQggInrvu+QUQAHoAigFPCg5rdWJlLWFwaXNlcnZlchIGVXBkYXRlGgJ2MSIICJ677vkFEAAyCEZpZWxkc1YxOh0KG3siZjpzdGF0dXMiOnsiZjpwaGFzZSI6e319fRIMCgprdWJlcm5ldGVzGggKBkFjdGl2ZRoAIgA="
    }
  ],
  "count": 1
}
$ sudo ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key get /registry/namespaces/ --prefix -w=json | jq . # --prefix 查看子目录

这边的 Key 使用 base64 编码,解码後就可以知道其结构

$ echo L3JlZ2lzdHJ5L25hbWVzcGFjZXMvZGVmYXVsdA== | base64 -d
/registry/namespaces/default

备份後续如果可以的话会补上~~~

参考资源


<<:  Day 26 -- 3 Steps 部署Sidekiq 背景任务在 Heroku

>>:  Chat & SignalR (Server)

Day05分行、分隔线与注解(HTML)

分行 <br>也是一个实用的标签 可以用来排版段落 例如 <p>现在是九月&...

【Day27】建立一个 QA Bot

今天要来跟各位一起解析 QnA Maker Bot,以下简称 QA Bot。 今天是参考 官方范例程...

[DAY 05]物品拍卖价格查询功能(3/4)

接续昨天要做的功能,我们要在discord上直接输入中文就能查询到物品的拍卖价格网址,今天主要是介绍...

EP17 - [TDD] 建立 Request 参数

Youtube 频道:https://www.youtube.com/c/kaochenlong ...

Base64

即使HTTP基本身份验证确实使用Base64来编码用户ID和密码,HTTP仍以明文形式传输编码,并依...