先上圖
在Kubernetes叢集中,service通過標籤選擇器選著對應的pod,然後對請求進行轉發,看個動畫,能直接了當體會到便籤選擇器
pod,endpoints,service三者關係
1、舉個例子說明
先看部署檔案,主要看註釋部分。因為檔案太長,本文刪除了yaml檔案的部分欄位
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: gogs
labels: # 定義StatefulSet的標籤,為後面Service選擇器提供標籤
app: gogs
spec:
serviceName: gogs
replicas: 1
selector:
matchLabels: # 標籤選擇器,StatefulSet通過該標籤選擇pod
app: gogs
template:
metadata:
labels: # 定義pod的標籤
app: gogs
spec:
terminationGracePeriodSeconds: 180
.......
---
apiVersion: v1
kind: Service
metadata:
name: gogs
labels:
app: gogs
spec:
type: NodePort
ports:
- port: 3000
targetPort: 3000
selector: # 標籤匹配器,Service通過該標籤匹配到對應的Pod
app: gogs
2、檢視執行結果
[root@k8s-node001 ~]# kubectl get po,ep,svc
NAME READY STATUS RESTARTS AGE
pod/gogs-0 1/1 Running 0 3d1h
NAME ENDPOINTS AGE
endpoints/gogs 100.68.150.197:3000 3d1h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/gogs NodePort 10.106.102.74 <none> 3000:30526/TCP 3d1h
3、通過kubectl describe來檢視pod,endpoints,service詳情
4、從上圖可以看出關聯資訊:
1、Pod和Endpoint的的IP是一致的,Endpoint是用來對映那些能對外提供服務的pod,如果pod執行狀態不是running,就不會產出Endpoint
2、StatefulSet 和 Pod 的關係是通過 label-selector 來關聯的
3、 Service可以簡單理解為 Kubernetes 內建的一個 LoadBalancer,它的作用就是給多個 Pod 提供負載均衡。
4、Service通過標籤 app: gogs來匹配它所要做負載均衡的 Pod
好了,對pod,endpoints,service三者關係做了簡單介紹,接下來我們來介紹Kubernetes中的幾種Service Type
ClusterIP
通過叢集的內部 IP 暴露服務,選擇該值,服務只能夠在叢集內部可以訪問,這也是預設的 ServiceType
缺點:服務只能夠在叢集內部可以訪問
栗子
apiVersion: v1
kind: Service
metadata:
name: gogs-clusterip
spec:
type: ClusterIP
ports:
- port: 3000
targetPort: 3000
selector:
app: gogs
結果
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gogs-clusterip ClusterIP 10.104.1.9 <none> 3000/TCP 2m11s
可以看到10.104.1.9是叢集內部的一個IP,在叢集外是無法訪問到的
NodePort
如果將 type 欄位設定為 NodePort,則 Kubernetes將在指定的範圍內分配埠(預設值:30000-32767)。 每個節點將隨機分配的埠代理到服務中。
舉栗子
apiVersion: v1
kind: Service
metadata:
name: gogs
spec:
type: NodePort
ports:
- port: 3000
targetPort: 3000
selector:
app: gogs
結果
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gogs NodePort 10.106.102.74 <none> 3000:30526/TCP 3d2h
這裡可以看到,隨機分配了埠30526,現在可以通過叢集任意節點的IP+30526訪問到該服務
Ingress
Ingress 公開了從叢集外部到叢集內服務的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 資源上定義的規則控制。
可以將 Ingress 配置為服務提供外部可訪問的 URL、負載均衡流量、終止 SSL/TLS,以及提供基於名稱的虛擬主機等能力。 Ingress 控制器 通常負責通過負載均衡器來實現 Ingress,儘管它也可以配置邊緣路由器或其他前端來幫助處理流量。
栗子
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: gogs-gogs
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: gogs.test.cn
http:
paths:
- path: /
backend:
serviceName: gogs
servicePort: 3000
結果
NAME CLASS HOSTS ADDRESS PORTS AGE
gogs-gogs <none> gogs.test.cn 10.26.25.21 80 3d19h
現在通過域名gogs.test.cn就可以訪問到gogs了
注意,gogs.test.cn需要自行新增DNS解析到ingress所在機器的IP
LoadBalancer
建立服務時,你可以選擇自動建立雲網路負載均衡器。這提供了一個外部可訪問的 IP 地址, 可將流量分配到叢集節點上的正確埠上,LoadBalancer一般都是公有云廠商提供,不需要自建,這裡就介紹了。