Service 核心概念
由於Pods可能會不斷的被Deployment重新啟動,每次啟動都會有不一樣的internal ip address,這使得外部要呼叫Pod內的服務會變得非常麻煩
所以若要能夠使每個pod之間都能夠曉得彼此要怎麼溝通,或是前端要呼叫某個pods內的後端API,這時候Service就可以擔任一個中介的角色
Service就是扮演主要窗口
Service提供固定的ip,供對外呼叫,並且負責繫結Pods
這時候對於Pods的label定義就特別重要,因為Service要怎麼知道綁定哪個Pod,就是透過labels
- Service透過
selector
認定label
為my-app
的pods
Service應用場景
- 流量控管
- 透過selector方式,可隨時切分流量
- A/B 測試
Service 網路探討
Pods怎麼找到Service
剛剛有提到Service是透過selector
,來找出Pod是否有對應的label
那Pod又是如何找到Service? 並透過Service與其他Pod溝通?
其過程是透過 kube-dns 來解析Service的DNS名稱,得到對應的cluster ip
kube-dns在k8s cluster建立後就會被建立
每次Pod建立,k8s都會在Pod的/etc/resolve.conf
中,自動加入kube-dns服務的domain name以及對應的ip,所以其他的Pods可以透過 kube-dns
的Service來找到正在運行的 kube-dns
服務
在自己啟動的nginx pod內/etc/resovle.conf
可看到 nameserver
的ip就是kube-dns
的cluster ip
Service又是如何找到Pods
關鍵在於透過Pods所處Node之iptable rules
,下圖可以清楚了解Service透過iptable rules,查找到對應Pod內的container服務
kube-proxy會在service創建的時候,將Service的ip記錄到node內的iptables, Service透過Node的iptables找到Pods服務。
Service 種類
ClusterIP (預設值)
將service對接在cluster的內部IP,使Pod之間可以互相溝通,即便Pod再不同的Node
簡單來說就是給內部Node使用的Service
NodePort
將service對接在每一個Node的靜態IP
Service會在綁定Node的固定IP與port號,提供給外部呼叫
可以給node外部呼叫的service
LoadBalancer
將service變成load balancer角色,並需要提供一對外IP供客戶端呼叫
ExternalName
將service當作是一個與DNS介接的中介角色,當DNS換ip位置了,只要更動ExternalName這個Service,就可以不用更動每個Pod所要介接DNS的新位置
Service 使用情境
前後端套用Service與Pods的情境
分別有兩個Node,一個是前端,另外一個是後端,各自都有Service Type為NodePort
,
前端的service給對外呼叫,後端的Service給前端的Pods做連接
使用kubectl創建Service
創建service
1 | kubectl create -f [yaml file] |
更新service
1 | kubectl apply -f [yaml file] |
記得在create時,加上
--save-config
刪除service
1 | kubectl delete -f [yaml file] |
使用kubectl創建Service
創建service的範例,類型是NodePort
1 | apiVersion: v1 |
這邊會困惑 spec.ports
中的 port
、targetPort
、nodePort
是什麼
- port: Service所運行的port
- targetPort: Pods內的container實際使用的port
- nodePort: 外部進來Pods的port
若沒有設置targetPort,那初始值會與port一樣
- service類型為NodePort
- port (service的port)與nodePort (Node的port)之映射關係
測試Service
透過 kubectl exe [pod-name] -- curl -s http://podID
來測試pod是否能夠測通
不過要事先在pod內安裝curl
1 | kubectl exec [pod-name] -it sh |
參考
- Using CoreDNS for Service Discovery
- IThome [Day 17] Pod 之間是如何找到彼此呢 - DNS Service Discovery
- Difference between targetPort and port in Kubernetes Service definition
- Oh my K8s service ! 談談Kube-proxy - 1