初衷
最近調研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
import 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"]
for ip in siplist:
iplist.append(ip["ip"] + ":" + str(sport))
return iplist
except Exception, e:
return e
namespace = "default"
service = "www-michael-com"
endpoints = podslist(namespace, service)
servercheck = '{"weight":1, "max_fails":1, "fail_timeout":10}'
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