Kubernetes部署consul集群
Consul简介
Consul是一个服务发现和注册的工具,其具有分布式、高扩展性能特点
Consul主要包含如下功能:
- 服务发现: 支持 http 和 dns 两种协议的服务注册和发现方式
- 监控检查: 支持多种方式的健康检查
- Key/Value存储: 支持通过HTTP API实现分布式KV数据存储
- 多数据中心支持:支持任意数量数据中心
官方架构图:
使用场景
- docker 实例的注册与配置共享
- coreos 实例的注册与配置共享
- vitess 集群
- SaaS 应用的配置共享
- 与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件
优势
- 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft
- 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持
- 支持健康检查. etcd 不提供此功能
- 支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议
- 官方提供web管理界面, etcd 无此功能
角色
- client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.
- server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个
k8s部署consul
创建consul statefulset
[root@k8s01 consul]# vim consul.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: consul
namespace: tools-env
spec:
replicas: 3
updateStrategy:
type: RollingUpdate
serviceName: consul
selector:
matchLabels:
app: consul
template:
metadata:
labels:
app: consul
spec:
terminationGracePeriodSeconds: 10
securityContext:
fsGroup: 1000
containers:
- name: consul
image: consul:1.12.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8500
name: ui-port
- containerPort: 8400
name: alt-port
- containerPort: 53
name: udp-port
- containerPort: 8443
name: https-port
- containerPort: 8080
name: http-port
- containerPort: 8301
name: serflan
- containerPort: 8302
name: serfwan
- containerPort: 8600
name: consuldns
- containerPort: 8300
name: server
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
args:
- "agent"
- "-server"
- "-advertise=$(POD_IP)"
- "-bind=0.0.0.0"
- "-bootstrap-expect=3"
- "-data-dir=/consul/data"
- "-disable-host-node-id"
- "-domain=cluster.local"
- "-retry-join=consul-0.consul.$(NAMESPACE).svc.cluster.local"
- "-retry-join=consul-1.consul.$(NAMESPACE).svc.cluster.local"
- "-retry-join=consul-2.consul.$(NAMESPACE).svc.cluster.local"
- "-client=0.0.0.0"
- "-ui"
resources:
limits:
cpu: "200m"
memory: "512Mi"
requests:
cpu: "100m"
memory: "128Mi"
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- consul leave
volumeMounts:
- name: consul-data
mountPath: /consul/data
volumeClaimTemplates:
- metadata:
name: consul-data
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
[root@k8s01 consul]# kubectl apply -f consul.yaml
statefulset.apps/consul created
创建consul service
[root@k8s01 consul]# vim consul-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
name: consul
namespace: tools-env
labels:
name: consul
spec:
clusterIP: None
ports:
- name: defult
port: 80
targetPort: 8500
- name: http
port: 8500
targetPort: 8500
- name: https
port: 8443
targetPort: 8443
- name: rpc
port: 8400
targetPort: 8400
- name: serflan-tcp
protocol: "TCP"
port: 8301
targetPort: 8301
- name: serflan-udp
protocol: "UDP"
port: 8301
targetPort: 8301
- name: serfwan-tcp
protocol: "TCP"
port: 8302
targetPort: 8302
- name: serfwan-udp
protocol: "UDP"
port: 8302
targetPort: 8302
- name: server
port: 8300
targetPort: 8300
- name: consuldns
port: 8600
targetPort: 8600
selector:
app: consul
---
apiVersion: v1
kind: Service
metadata:
name: consul-web
namespace: tools-env
labels:
name: consul
spec:
ports:
- name: http
port: 8500
targetPort: 8500
nodePort: 38500
type: NodePort
selector:
app: consul
[root@k8s01 consul]# kubectl apply -f consul-svc.yaml
service/consul created
service/consul-web created
创建consul ingress
[root@k8s01 consul]# vim consul-ing.yaml
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: consul
namespace: tools-env
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: consul.example.com
http:
paths:
- path: /
backend:
serviceName: consul
servicePort: 80
consul web界面访问
浏览器访问域名或者IP:38500
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
爱吃可爱多!
喜欢就支持一下吧
打赏
微信
支付宝