zoukankan      html  css  js  c++  java
  • K8s之Etcd

    Etcd是一个开源的、高可用的、分布式的键值对数据存储系统,提供共享配置、服务的注册和发现。etcd与zookeeper相比算是轻量级系统,两者的一致性协议也一样,etcd的raft比zookeeper的paxos简单。Etcd基于Go语言实现。

    • 简单:基于HTTP+JSON的API让你用curl命令就可以轻松使用。
    • 安全:可选SSL客户认证机制。
    • 快速:每个实例每秒支持一千次写操作。
    • 可信:使用Raft算法充分实现了分布式系统数据的可用性和一致性。

    Etcd架构图如下: 

     从etcd的架构图中我们可以看到,etcd主要分为四个部分。

    • HTTP Server: 用于处理用户发送的API请求以及其它etcd节点的同步与心跳信息请求。
    • Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
    • Raft:Raft强一致性算法的具体实现,是etcd的核心。
    • WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。

    通常,一个用户的请求发送过来,会经由HTTP Server转发给Store进行具体的事务处理

    如果涉及到节点的修改,则交给Raft模块进行状态的变更、日志的记录,然后再同步给别的etcd节点以确认数据提交

    最后进行数据的提交,再次同步。

    ETCD参数说明:

    2379端口用于外部通信,2380用于内部通信

    --name
    etcd集群中的节点名,这里可以随意,可区分且不重复就行  
    --listen-peer-urls
    监听的用于节点之间通信的url,可监听多个,集群内部将通过这些url进行数据交互(如选举,数据同步等)
    --initial-advertise-peer-urls 
    建议用于节点之间通信的url,节点间将以该值进行通信。
    --listen-client-urls
    监听的用于客户端通信的url,同样可以监听多个。
    --advertise-client-urls
    建议使用的客户端通信url,该值用于etcd代理或etcd成员与etcd节点通信。
    --initial-cluster-token etcd-cluster-1
    节点的token值,设置该值后集群将生成唯一id,并为每个节点也生成唯一id,当使用相同配置文件再启动一个集群时,只要该token值不一样,etcd集群就不会相互影响。
    --initial-cluster
    也就是集群中所有的initial-advertise-peer-urls 的合集
    --initial-cluster-state new
    新建集群的标志
    --data-dir
    指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指定—wal-dir,还会存储WAL文件

    集群模式配置示例:

    vim /etc/systemd/system/etcd.service
    
    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=notify
    WorkingDirectory=/opt/etcd/
    User=etcd
    # set GOMAXPROCS to number of processors
    ExecStart=/usr/bin/etcd 
      --name=etcd1 
      --cert-file=/etc/kubernetes/ssl/etcd.pem 
      --key-file=/etc/kubernetes/ssl/etcd-key.pem 
      --peer-cert-file=/etc/kubernetes/ssl/etcd.pem 
      --peer-key-file=/etc/kubernetes/ssl/etcd-key.pem 
      --trusted-ca-file=/etc/kubernetes/ssl/ca.pem 
      --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem 
      --initial-advertise-peer-urls=https://172.16.1.64:2380 
      --listen-peer-urls=https://172.16.1.64:2380 
      --listen-client-urls=https://172.16.1.64:2379,http://127.0.0.1:2379 
      --advertise-client-urls=https://172.16.1.64:2379 
      --initial-cluster-token=k8s-etcd-cluster 
      --initial-cluster=etcd1=https://172.16.1.64:2380,etcd2=https://172.16.1.65:2380,etcd3=https://172.16.1.66:2380 
      --initial-cluster-state=new 
      --data-dir=/opt/etcd/
    Restart=on-failure
    RestartSec=5
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target

    分别启动所有etcd集群节点的服务
    systemctl daemon-reload
    systemctl enable etcd
    systemctl start etcd
    systemctl status etcd

    # 如果报错 请使用
    journalctl -f -t etcd 和 journalctl -u etcd 来定位问题

    验证etcd集群

    查看集群状态:

    etcdctl --endpoints=https://172.16.1.64:2379,https://172.16.1.65:2379,https://172.16.1.66:2379 
            --cert-file=/etc/kubernetes/ssl/etcd.pem 
            --ca-file=/etc/kubernetes/ssl/ca.pem 
            --key-file=/etc/kubernetes/ssl/etcd-key.pem 
            cluster-health
    member 35eefb8e7cc93b53 is healthy: got healthy result from https://172.16.1.66:2379
    member 4576ff5ed626a66b is healthy: got healthy result from https://172.16.1.64:2379
    member bf3bd651ec832339 is healthy: got healthy result from https://172.16.1.65:2379
    cluster is healthy

    查看集群成员:

    etcdctl --endpoints=https://172.16.1.64:2379,https://172.16.1.65:2379,https://172.16.1.66:2379
            --cert-file=/etc/kubernetes/ssl/etcd.pem 
            --ca-file=/etc/kubernetes/ssl/ca.pem 
            --key-file=/etc/kubernetes/ssl/etcd-key.pem 
            member list
    
    35eefb8e7cc93b53: name=etcd3 peerURLs=https://172.16.1.66:2380 clientURLs=https://172.16.1.66:2379 isLeader=false
    4576ff5ed626a66b: name=etcd1 peerURLs=https://172.16.1.64:2380 clientURLs=https://172.16.1.64:2379 isLeader=true
    bf3bd651ec832339: name=etcd2 peerURLs=https://172.16.1.65:2380 clientURLs=https://172.16.1.65:2379 isLeader=false
  • 相关阅读:
    使用discourse 作为社区工具
    dremio schema 更新的问题
    go-mysql-server 新版本发布
    开发一个dremio user_agent 解析函数
    java 几个不错的user_agent 解析工具包
    Docker Swarm 高可用详解
    用Docker Swarm实现容器服务高可用
    Docker 1.12 :认识 Swarm 模式下的节点崩溃处理
    Linux下磁盘分区调整(在不使用LVM的情况下)
    docker-swarm----多机容器管理
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/9951523.html
Copyright © 2011-2022 走看看