初衷

最近调研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
  • 以上纯属个人想法
Logo

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

更多推荐