kubernetes 服务发现与注册个人想法
初衷最近调研k8s,k8s是一个不错的docker编排工具,其中考虑到了很多在运维过程中的痛点,比如,RC、scale、autoscale、rolling-update等一系列的运维比较关心的东西,但是在k8s的服务暴露方面该需要做一些改进,自身的使用的clusterip只能k8s内部访问,服务服务需要对外的话,需要使用nodeport或者ingress,期访问结构都是通过clusterip进行i
·
初衷
最近调研k8s,k8s是一个不错的docker编排工具,其中考虑到了很多在运维过程中的痛点,比如,RC、scale、autoscale、rolling-update等一系列的运维比较关心的东西,但是在k8s的服务暴露方面该需要做一些改进,自身的使用的clusterip只能k8s内部访问,服务服务需要对外的话,需要使用nodeport或者ingress,期访问结构都是通过clusterip进行iptables的转发到后端的容器,效率不高,于是这个想法就产生了。想自己对着方面进行改造下。
实现
通过python etcd的包进行对k8s的services进行监控(递归watcher),然后通过观察对服务的变动,把变动的消息传送给rabbitmq,然后客户端监听rabbitmq的queue进行服务的变更通知与变更。然后利用新浪开源的nginx的upsync模块进行upstreams的变更从而对外服务。
简单Demo
# encoding=utf-8
import etcd
# 创建etcd连接
client = client = etcd.Client(host='10.69.33.113', port=2379, allow_reconnect=True)
def podslist(namespaces, service):
iplist = [];
try:
# 服务地址相关转化成字典
r = client.read("/registry/services/endpoints/%s/%s" % (namespaces, service), recursive=True)
k8sService = eval(r.value)
# 获取地址端口
siplist = k8sService["subsets"][0]["addresses"]
# 获取服务端口
sport = k8sService["subsets"][0]["ports"][0]["port"]
# 服务端口和port组成port返回
for ip in siplist:
iplist.append(ip["ip"] + ":" + str(sport))
return iplist
except Exception, e:
return e
# namespace 和 服务
namespace = "default"
service = "www-michael-com"
endpoints = podslist(namespace, service)
# nginx check方式
servercheck = '{"weight":1, "max_fails":1, "fail_timeout":10}'
# 添加后端 upstream server
for server in endpoints:
client.write("/upstreams/%s/%s" % (service, server), servercheck, ttl=None)
服务变动监控
import etcd
client = etcd.Client(host='10.69.33.113', port=2379, allow_reconnect=True)
while True:
change = client.watch("/registry/services/endpoints/", recursive=True, timeout=None)
print change.key + " " + change.action
- 以上纯属个人想法
更多推荐
已为社区贡献1条内容
所有评论(0)