kubernetes 服務發現與註冊個人想法

初衷

最近調研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
  • 以上純屬個人想法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章