Kubernetes service探究

Kubernetes是google開源的容器編排器,非常適合當下火熱的微服務架構,在容器編排領域,正逐步建立起主導地位。本文主要針對kubernetes service做一些剖析,先簡單介紹一下基本概念。
基本概念
Pod:kubernetes最小調度單位,是一組容器集合,可以理解成一個容器。
replication controller:副本控制器,保證pod個數始終與設定值一致,如果遇到pod故障,節點離線等,控制器會刪除這些狀態異常的pod,重新調度生成新的pod。通過label匹配pod,在彈性伸縮、滾動升級中發揮重要作用。
service:服務,是一個虛擬概念,邏輯上代理後端pod。衆所周知,pod生命週期短,狀態不穩定,pod異常後新生成的pod ip會發生變化,之前pod的訪問方式均不可達。通過service對pod做代理,service有固定的ip和port,ip:port組合自動關聯後端pod,即使pod發生改變,kubernetes內部更新這組關聯關係,使得service能夠匹配到新的pod。這樣,通過service提供的固定ip,用戶再也不用關心需要訪問哪個pod,以及pod會否發生改變,大大提高了服務質量。如果pod使用rc創建了多個副本,那麼service就能代理多個相同的pod,通過kube-proxy,實現負載均衡。
通過下面模版定義一個service,這個service代理了所有具有"app": "MyApp"標籤的pod,服務對外端口是80,服務ip在創建service的時候生成,也可以指定,這組ip:port在service的生命週期裏保持固定。訪問ip:port的流量會被重定向到後端pod的9376端口上,就是targetPort指定的。
{    "kind": "Service",    "apiVersion": "v1",    "metadata": {        "name": "my-service"    },    "spec": {        "selector": {            "app": "MyApp"        },        "ports": [            {                "protocol": "TCP",                "port": 80,                "targetPort": 9376            }        ]    }}
說到service,繞不開的一個組件是kube-proxy,實際上這個組件是專門爲service服務的,每個minion節點都會運行一個kube-proxy。通過kube-proxy,實現流量從service到pod的轉發,kube-proxy還可以實現簡單的負載均衡功能。kube-proxy有多種代理模式,下面是userspace方式,kube-proxy在minion節點上爲每一個服務創建一個臨時端口,service的ip:port過來的流量轉發到這個臨時端口上,kube-proxy會用內部的負載均衡機制(一般是輪尋),選擇一個後端pod,然後建立iptables,把流量導入到某個pod裏。

服務發現在微服務架構裏,服務之間經常要進行通信,服務發現就是解決不同服務之間通信的問題。比如一個nginx的pod,要訪問一個mysql服務,就需要知道mysql服務的ip的port,獲取ip和port的過程就是服務發現。Kubernetes 支持兩種服務發現模式,分別是環境變量和dns。
環境變量:pod創建的時候,服務的ip和port信息以環境變量的形式注入到pod裏,比如pod創建時有一個redis-master服務,服務ip地址是10.0.0.11,port是6379,則會把下面一系列環境變量注入到pod裏,通過這些環境變量訪問redis-master服務。 REDIS_MASTER_SERVICE_HOST=10.0.0.11REDIS_MASTER_SERVICE_PORT=6379REDIS_MASTER_PORT=tcp://10.0.0.11:6379REDIS_MASTER_PORT_6379_TCP=tcp://10.0.0.11:6379REDIS_MASTER_PORT_6379_TCP_PROTO=tcpREDIS_MASTER_PORT_6379_TCP_PORT=6379REDIS_MASTER_PORT_6379_TCP_ADDR=10.0.0.11 

dns服務器:

Kubernetes集羣內會內置一個dns服務器,service創建成功後,會在dns服務器裏導入一些記錄,想要訪問某個服務,通過dns服務器解析出對應的ip和port,從而實現服務訪問。
外部服務對於一些前端應用,可能需要暴露服務到外網,而其他服務只運行在內部。Service的Types字段可以指定服務類型,默認的是ClusterIP類型。這是集羣內部的服務類型,服務ip是一個內部ip;NodePort 和LoadBalancer是兩種外部服務類型。
NodePortNodePort類型,會爲服務在每個minion節點上暴露一個端口,通過節點ip和節點port可以訪問這個服務,同時服務依然會有ClusterIP類型的ip和端口,內部通過ClusterIP方式訪問,外部通過NodePort方式訪問。 LoadBalancer如果kubernetes集羣運行在第三方雲平臺上,比如openstack,那麼可以通過外部的loadbalancer來暴露服務,還能借用第三方的負載均衡機制實現負載均衡。以openstack爲例,藉助neutron的lbaas,訪問服務的流量會被直接轉發到後端的pod,跳過了內置的kube-proxy負載均衡。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章