Service 基礎
今天開始來分享Service 的基礎知識,后續(xù)我們可以慢慢打磨,分享 Service 的進階知識和原理

Service 基本概念
Service 是 K8S 最核心的概念了
我們可以通過創(chuàng)建 Service ,為一組具有相同功能的容器應用提供一個統(tǒng)一的入口地址,并且可以將請求分發(fā)到后端的各個容器應用上
我們來看看完成的 Service 是什么樣子的,我們來手寫一份
apiVersion:?v1
kind:?Service
metadata:
??name:?service?name
??namespace:
??labels:
??-?name:?label?name
??annotations:
??-?name:?annotations?name
spec:
??selector:?[]
??type:?string
??clusterIP:?spec?ip
??sessionAffinity:?string
??ports:
??-?name:?ports?name
????protocol:?tcp/udp
????port:?int
????targetPort:?int
????nodePort:?int
??status:
????loadBalancer:
??????ingress:
????????ip:?string
????????hostname:?string
??
整一張表來解釋一下上面某些字段的含義
屬性字段值類型必須?說明metadata.labels[]listno自定義屬性標簽metadata.annotations[]listno自定義注解標簽spec.selector[]listyes配置 label selector
選擇具有指定 label 標簽的pod 作為管理范圍spec.typestringyesservice 的類型
- ClusterIP
虛擬服務的 ip,用于 K8S 內部 的pod 相互訪問
- NodePort
使用的是宿主機的端口,外部可以通過訪問 node 的 ip 和端口,就可以達到訪問內部服務的目的
- ?loadBalancer
使用外接的負載均衡器完成到服務的負載分發(fā),需要在 loadBalancer 字段處指定外部負載均衡器的 ip 地址,并且同時需要定義 ClusterIP 和 NodePortspec.ClusterIPstringno虛擬服務的 ip 地址
如果 spec.type 指定的是 ?loadBalancer ?,那么這個 ip 就需要寫,其他的情況,可以不寫,系統(tǒng)默認分配spec.sessionAffinitystringno是否支持 session
默認值是空,可以填我們的 ClusterIP
功能是,將一個源 IP 地址的客戶端訪問的請求,都轉發(fā)到同一個后端 podspec.ports[].portintno內部服務監(jiān)聽的端口spec.ports[].targetPortintno需要轉發(fā)到 pod 的端口號spec.ports[].nodePortintno指定映射到物理機的端口號,這個時候需要 spec.type=NodePortspec.statusobjectno屬于外部均衡器,status 下面的都是 外部均衡器的配置了
Service 的名稱定義
對于 service 的對象名稱的定義也是需要遵循規(guī)范的
點我查看名稱定義
例如截一個官方說明的圖

關于 service 的端口
定義 service 的時候,我們可以定義 1 個端口,也可以定義 多個端口的
例如這樣的是 service 的 1 個端口 ,官方的案例是內部服務監(jiān)聽 80 端口,會轉發(fā)到 pod 的 9376 端口,用的是 tcp 協(xié)議

這樣的是 2 個端口,屬于 service 的多端口定義
例如我們的服務開了多個端口,這些端口是不能定義沖突的,我們必須要定義好每個端口的名稱,端口號,以及協(xié)議,不能有歧義,如下:

上述的 1 個端口和多個端口,都是 服務監(jiān)聽的端口號,都是作為服務端的,需要客戶端來訪問的
外部的 service
如果是我們的 service 需要訪問外部的一個服務,需要和外部進行一個連接,例如數據庫服務,或者訪問外部的一個集群的時候,我們需要如何寫我們的 service 呢?

我們可以通過在 yaml 中 創(chuàng)建一個 無 Label Selector 的 Service 實現

我們仔細看一下,上面官方寫的 1 個端口 和 多個端口的 yaml,都會使用 Label Selector 來指定一個 app,目的是為了運行起來之后能夠關聯到對應的 pod
例如這樣

那么我們來寫一個 無 Label Selector ?的服務吧
無 Label Selector ?的 ?Service
apiVersion:?v1
kind:?Service
metadata:
??name:?xiaomotong-svc
spec:
??ports:
??-?protocol:?TCP
????port:?80
????targetPort:?80
寫完這個 service 發(fā)現,他不知道如何去找到 pod 的,那么我們可以寫一個 endpoints,名稱需要和 上面這個service 的名稱一致,這樣 endpoints 指定的 pod ,就可以被 上面這個service 訪問到了
寫一個 Endpoints
apiVersion:?v1
kind:?Endpoints
metadata:
??name:?xiaomotong-svc
subsets:
-?addresses:
??-?IP:?10.253.33.3
??ports:
??-?port:?8080?
這樣寫,將 Endpoints 要和 上面的 service 就對應起來的, 感興趣的 xdm 可以在自己的 k8s 集群上面玩一玩, 此處寫的 subsets.addresses.IP 是一個能夠運行的 pod ip
今天就到這里,學習所得,若有偏差,還請斧正
歡迎點贊,關注,收藏
朋友們,你的支持和鼓勵,是我堅持分享,提高質量的動力

好了,本次就到這里
技術是開放的,我們的心態(tài),更應是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵云原生,歡迎點贊關注收藏,下次見~