1. 什么是etcd?
   etcd是一个分布式一致性键值存储系统,用于共享配置和服务发现,
   etcd基于raft协议实现数据同步(K-V数据),集群由多个节点组成。

   raft协议理解起来相比paxos并没有简单到哪里,因为都很难理解,所以我简单描述一下:

      每次写入都是在一个事务(tx)中完成的。
      一个事务(tx)可以包含若干put(写入k-v键值对)操作。
      etcd集群有一个leader,写入请求都会提交给它。
      leader先将数据保存成日志形式,并定时的将日志发往其他节点保存。
      当超过1/2节点成功保存了日志,则leader会将tx最终提交(也是一条日志)。
      一旦leader提交tx,则会在下一次心跳时将提交记录发送给其他节点,其他节点也会提交。
      leader宕机后,剩余节点协商找到拥有最大已提交tx ID(必须是被超过半数的节点已提交的)的节点作为新leader。
      
   这里最重要的是知道:

      raft中,后提交的事务ID>先提交的事务ID,每个事务ID都是唯一的。
      无论客户端是在哪个etcd节点提交,整个集群对外表现出数据视图最终都是一样的。

 

2. 通过kubespray部署的 host etcd cluster  (etcd v3.2.26)

    /bin/bash /usr/local/bin/etcd

    cat /usr/local/bin/etcd   // 通过docker容器启动了etcd
        #!/bin/bash
        /usr/bin/docker run \
        --restart=on-failure:5 \
        --env-file=/etc/etcd.env \      // 这个是主要的配置文件
        --net=host \
        -v /etc/ssl/certs:/etc/ssl/certs:ro \
        -v /etc/ssl/etcd/ssl:/etc/ssl/etcd/ssl:ro \
        -v /var/lib/etcd:/var/lib/etcd:rw \
        --memory=512M \
        --blkio-weight=1000 \
        --name=etcd1 \
        quay.io/coreos/etcd:v3.2.26 \
        /usr/local/bin/etcd \
        "$@"

 

3. 集群配置

    /etc/etcd.env配置文件有集群的信息:
    ETCD_INITIAL_CLUSTER=etcd1=https://192.168.2.89:2380,etcd2=https://192.168.2.90:2380,etcd3=https://192.168.2.91:2380

    --data-dir:服务运行数据保存的路径   //数据路径,如何备份?
    --snapshot-count:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘
    --heartbeat-interval:leader 多久发送一次心跳到 followers。默认值是 100ms
    --eletion-timeout:重新投票的超时时间,如果follower在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms
    --listen-peer-urls:和同伴通信的地址,比如 http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost
    --advertise-client-urls:对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
    --listen-client-urls:对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和etcd交互
    --initial-advertise-peer-urls:该节点同伴监听地址,这个值会告诉集群中其他节点
    --initial-cluster:集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…。需要注意的是,这里的 node1 是节点的--name指定的名字;后面的ip1:2380 是--initial-advertise-peer-urls 指定的值
    --initial-cluster-state:新建集群的时候,这个值为 new;假如已经存在的集群,这个值为existing
    --initial-cluster-token:创建集群的token,这个值每个集群保持唯一。


    kube-apiserver这个容器进程,会带有etcd相关的参数:

    --etcd-cafile=/etc/ssl/etcd/ssl/ca.pem --etcd-certfile=/etc/ssl/etcd/ssl/node-k8s-master-2.pem --etcd-keyfile=/etc/ssl/etcd/ssl/node-k8s-master-2-key.pem --etcd-servers=https://192.168.2.89:2379,https://192.168.2.90:2379,https://192.168.2.91:2379

    (有两个端口:2379,2380; 2379是用来给客户端访问服务的,对外的。2380是集群节点间通信的,对内的)

 

4. 数据存储与发现
    
    ETCDCTL_API=3 etcdctl member list

    watch 监听
        watch 会监听key的变动 有变动时会在输出。这也正是服务发现需要使用的。

    我们监听 test键,然后对test执行修改和删除操作
    ETCDCTL_API=3 etcdctl watch test

    命令使用:
        export ETCDCTL_API=3
        
        etcdctl --help
        --cert=""    identify secure client using this TLS certificate file
        --key=""    identify secure client using this TLS key file

        cd  /etc/ssl/etcd/ssl
        
        // 集群成员
        etcdctl --cert=./ca.pem --key=./ca-key.pem member list  
        
        // 集群状态
        etcdctl --cert=./ca.pem --key=./ca-key.pem  --endpoints 192.168.2.89:2379,192.168.2.90:2379,192.168.2.91:2379 endpoint status  --write-out="table"   

        ETCDCTL_API=3 etcdctl --cert=./ca.pem --key=./ca-key.pem  put  test1 a
        ETCDCTL_API=3 etcdctl put test2 b
        ETCDCTL_API=3 etcdctl put test3 c
        ETCDCTL_API=3 etcdctl  --cert=./ca.pem --key=./ca-key.pem get --prefix test

        export ETCDCTL_API=3

        etcdctl  --cert=./ca.pem --key=./ca-key.pem put /json/user/a1 12
        etcdctl  --cert=./ca.pem --key=./ca-key.pem put /json/user/a2 13
        etcdctl  --cert=./ca.pem --key=./ca-key.pem watch --prefix  /json

        // k8s API对象
        get /registry/namespaces --prefix -w=fields
        get /registry/configmaps --prefix -w=fields
        get /registry/pods --prefix -w=fields

        get /registry/namespaces/default -w=json|python -m json.tool
        get /registry/namespaces --prefix -w=json|python -m json.tool    

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐