先上圖
在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一般都是公有雲廠商提供,不需要自建,這里就介紹了。