k8s

Consul on Kubernetes

Posted by NianShen Blog on September 20, 2018

Consul简介

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较 为简单。Consul使用Go语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合 。  

首先理解一下consul的架构

consul的节点可以分为server与client,都是通过consul agent命令来定义具体角色,client可以理解成consul集群的代理,开发者使用consul的SDK就可以无缝使用consul的各种功能,无需关心端口、consul集群的IP(k8s中的ClusterIP)等。

cluster.png

服务发现比较Consul vs Zookeeper vs Etcd vs Eureka

Feature Consul zookeeper etcd euerka
服务健康检查 服务状态,内存,硬盘等 (弱)长连接,keepalive 连接心跳 可配支持
多数据中心 支持
kv存储服务 支持 支持 支持
一致性 raft paxos raft
使用接口 支持http和dns 客户端 http/grpc http
watch支持 全量/支持long polling 支持 支持longpolling 支持longpolling
自身监控 metrics metrics metrics
安全 acl/https acl https支持(弱)
SpringCloud 支持 支持 支持 支持

 

以下内容来源于网络

  • 服务的健康检查 Euraka 使用时需要显式配置健康检查支持;Zookeeper,Etcd 则在失去了和服务进程的连接情况下显示任务不健康,而Consul相对更为详细点,比如内存是否已使用了90%,文件系统的空间是不是快不足了。
  • 多数据中心支持 Consul 通过 WAN 的 Gossip 协议,完成跨数据中心的同步。
  • KV存储服务 除了 Eureka ,其他几款都能够对外支持kv的存储服务,提供存储服务也能够较好的转化为动态配置服务。
  • 多语言能力与对外提供服务的接入协议 Zookeeper的跨语言支持较弱,Euraka 一般通过 sidecar的方式提供多语言客户端的接入支持。Etcd还提供了Grpc的支持。Consul除了标准的Restapi,还提供了DNS的支持。
  • Watch的支持(客户端观察到服务提供者变化) Zookeeper 支持服务器端推送变化,Eureka 2.0(正在开发中)也计划支持。 Eureka 1,Consul,Etcd则都通过长轮询的方式来实现变化感知。
  • 自身集群的监控 除了 Zookeeper ,其他几款都默认支持metrics,运维人员可以搜集并监控这些度量信息。
  • 安全 Consul,Zookeeper 支持ACL,另外 Consul,Etcd 支持安全通道https.

 

一,环境介绍

  • 操作系统:CentOS Linux release 7.5.1804 (Core)
  • 内核版本:3.10.0-862.11.6.el7.x86_64
  • Docker版本:17.03.2-ce
  • k8s版本:v1.10.0
  • k8s集群:3个master 3个etcd 3个node (kubeadm部署,网络使用flannel-v0.10.0-amd64)
  • 分布式存储:4节点GlusterFS,创建volume,提供持久化存储  

    二,部署

      1:设置cfssl环境

    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
    chmod +x cfssl_linux-amd64
    mv cfssl_linux-amd64 /usr/local/bin/cfssl
    chmod +x cfssljson_linux-amd64
    mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
    chmod +x cfssl-certinfo_linux-amd64
    mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
    export PATH=/usr/local/bin:$PATH
    

      2: 下载consul的二进制文件,https://www.consul.io/downloads.html 下载Linux版的,下下来之后unzip,并把可执行文件放到/usr/bin目录下。   3:clone文件

    git clone https://github.com/zhangzhaorui/consul-cluster-on-kubernetes.git && cd ./consul-cluster-on-kubernetes
    

      4:Consul集群中成员之间的RPC通信使用TLS进行加密

  • 通过以下命令初始化CA证书:
    cfssl gencert -initca ca/ca-csr.json | cfssljson -bare ca
    
  • 使用以下命令创建 TLS 证书 和 私有密钥:
    cfssl gencert \
    -ca=ca.pem \
    -ca-key=ca-key.pem \
    -config=ca/ca-config.json \
    -profile=default \
    ca/consul-csr.json | cfssljson -bare consul
    
  • 执行完以上命令之后,在当前目录你应该看到以下证书文件:
    ca-key.pem
    ca.pem
    consul-key.pem
    consul.pem
    

5:生成 Consul Gossip加密密钥(secret)和Consul Cluster的配置文件(configmap)

  • Consul Cluster使用共享的加密密钥进行加密通信,使用以下命令生成加密密钥:
    GOSSIP_ENCRYPTION_KEY=$(consul keygen)
    
  • 将Gossip加密密钥和TLS证书存储在kubernetes的Secret中:
    kubectl create secret generic consul \
    --from-literal="gossip-encryption-key=${GOSSIP_ENCRYPTION_KEY}" \
    --from-file=ca.pem \
    --from-file=consul.pem \
    --from-file=consul-key.pem
    
  • 将Consul集群使用的配置文件存储在kubernetes的configmap中:
    kubectl create configmap consul --from-file=configs/server.json
    

6:配置GlusterFS存储,生成pvpvc,提供Consul-cluster的持久化存储(PS:之后这块会在补充一下GFS的搭建,使用和怎样作为后端存储,我现在没有用heketi)

  • 在gluserfs集群中创建3个consul volume,ip地址请根据自己的情况设置。
gluster volume create consul-0 replica 2 transport tcp 172.18.130.21:/opt/consul-0 172.18.130.22:/opt/consul-0 172.18.130.23:/opt/consul-0 172.18.130.24:/opt/consul-0 force
gluster volume create consul-1 replica 2 transport tcp 172.18.130.21:/opt/consul-1 172.18.130.22:/opt/consul-1 172.18.130.23:/opt/consul-1 172.18.130.24:/opt/consul-1 force
gluster volume create consul-2 replica 2 transport tcp 172.18.130.21:/opt/consul-2 172.18.130.22:/opt/consul-2 172.18.130.23:/opt/consul-2 172.18.130.24:/opt/consul-2 force

gluster volume start consul-0
gluster volume start consul-1
gluster volume start consul-2
gluster volume quota consul-0 enable
gluster volume quota consul-1 enable
gluster volume quota consul-2 enable
gluster volume quota consul-0 limit-usage / 200MB
gluster volume quota consul-1 limit-usage / 200MB
gluster volume quota consul-2 limit-usage / 200MB
gluster volume set consul-0 performance.cache-size 10MB
gluster volume set consul-1 performance.cache-size 10MB
gluster volume set consul-2 performance.cache-size 10MB
gluster volume set consul-0 performance.io-thread-count 16
gluster volume set consul-1 performance.io-thread-count 16
gluster volume set consul-2 performance.io-thread-count 16
gluster volume set consul-0 network.ping-timeout 10
gluster volume set consul-1 network.ping-timeout 10
gluster volume set consul-2 network.ping-timeout 10
gluster volume set consul-0 cluster.self-heal-daemon on
gluster volume set consul-1 cluster.self-heal-daemon on
gluster volume set consul-2 cluster.self-heal-daemon on
gluster volume set consul-0 cluster.heal-timeout 300
gluster volume set consul-1 cluster.heal-timeout 300
gluster volume set consul-2 cluster.heal-timeout 300
gluster volume set consul-0 performance.write-behind-window-size 10MB
gluster volume set consul-1 performance.write-behind-window-size 10MB
gluster volume set consul-2 performance.write-behind-window-size 10MB

7:创建pvpvc

kubectl apply -f pvpvc/pv.yaml
kubectl apply -f pvpvc/pvc.yaml

pvpvc.png

8:创建service

kubectl create -f services/consul-service.yaml

svc.png

9:通过StatefulSet部署Consul集群

kubectl create -f statefulsets/consul-statefulsets.yaml 

pod.png

三,验证

1,查看pod的log

kubectl logs -f consul-0
  • 正确的日志是这样
  • 如果三个pod都在running状态的,但是kubectl logs -f consul-的时候报错no cluster leader说明三节点的consul集群没有启动成功,需要定位原因 log.png

2,进入到pod内部,执行consul members member.png

3,登陆webui,可以找一台服务器安装一个nginx,把podIP+port8500暴露出去,就可以访问consul的ui了,也可以通过traefik-ingress webui.png