k8s 之 Service 詳解(一)

2021-09-25 03:57:11 字數 2833 閱讀 7086

service用途:

service 為後端pod提供一組負載均衡**

建立服務:

kubectl expose  #快速建立服務

kubctl get svc #檢視服務資源

cluster-ip 顯示集群ip,只能在集群內部可以被訪問,服務的主要目標就是使集群內部的pod可以訪問這組pod。

targetport: http   #將80埠對映到容器中被稱為http 

targetport: https #將443埠對映到容器中被稱為https

服務發現:

通過建立服務,可以通過乙個穩定的ip訪問到pod,在服務週期內這個ip保持不變,後端的pod刪除重建或者數量增減,始終可以通過服務ip訪問到這些pod

服務發現的兩種方式:

1、通過環境變數發現:

在pod執行的時候,k8s會初始化一系列環境變數指向現在存在的服務,如果服務早於客戶端pod的建立,pod上的程序可以根據環境變數活的服務的ip和埠。

kubectl exec kubia-3inly env  

kubia_service_host=10.11.249.153   #這是服務集群的ip

kubia_service_port=80   #這是服務集群的埠

環境變數是獲得服務埠和ip的一種方式。

2、通過dns發現服務

pod是否使用內部dns服務根據pod中的spec的dnspolicy屬性來決定

示例:fqdn

backend-database.default.svc.cluster.local #鏈結資料庫的栗子

backend-database #對應的服務名稱

default #表示服務在其中定義的命名空間

svc.cluster.local #字尾,可以省略。

在pod上可以使用fqdn去訪問後端的資料庫服務。

kubectl exec -it pod名稱  bash  #進入pod shell環境

curl 或者 curl http://backend-database

注: 集群ip是虛擬ip,可以訪問但無法ping通

鏈結集群外部服務:

1、服務endpoint

服務並不是和pod直接相連的,有一種資源介於兩者之間,它就是endpoint。

通過 kubectl describe svc kubia 可以看到 endpoints: pod的ip列表和埠。

endpoint 就是暴露pod的ip和埠資源。

kubectl get endpoints kubia(服務名稱) #檢視endpoints的詳細資訊

spec中定義了pod選擇器,但在重定向傳入鏈結時不會直接使用它。選擇器用於構建ip列表和埠,並儲存在

endpoint資源中,當客戶端鏈結到服務時,服務**選擇這些ip和埠對中的乙個,並將傳入鏈結重定向到在該位置監聽的伺服器。

2、手動配置服務的endpoint

如果建立了不包含pod選擇器的服務,k8s就不會建立endpoint資源,這樣的話就需要手動配置endpoint資源。

示例:(1)、建立乙個不含pod選擇器的服務:

apiversion: v1

kind: service

metadata:

name: external-service  #服務的名字必須和endpoint物件的名字匹配

spec:

ports:

-  port: 80 #服務中沒有定義選擇器,它將接受80埠的傳入鏈結。

(2)手動建立endpoint資源

apiversion: v1

kind: endpoints

metadata:

name: external-service #eendpoint名稱必須與服務名稱匹配

subsets:

- addresses:

- ip: 11.11.11.11   #服務將鏈結重定向到endpoint的ip位址

- ip: 22.22.22.22

ports:

- port: 80   #endpoint的目標埠

3、為外部服務建立別名

除了收到配置服務的endpoint來代替公開的外部服務方法,另一種方法就是十一fqdn訪問外部服務

(1)建立externalname型別的服務

建立別名外部服務的服務時要將建立資源的乙個type欄位設定為externalname. 例如:api.***.com

示例:apiversion: v1

kind: service

metadata:

name: external-service

spec:

type: externalname  #**的type被設定成externalname

externalname: api.***.com  #實際服務的完全限定網域名稱

ports:

- port: 80

服務建立完成後pod可以通過external-service.default.svc.cluster.local網域名稱(external-service)鏈結到外部服務,而不是使用服務的實際fqdn。externaname服務僅在dns級別實施,為服務建立簡單的cname dns記錄。因此鏈結服務的客戶端將直接鏈到外部服務,完全繞過**服務,這些型別的服務不會獲得集群的ip

cname記錄指向完全限定網域名稱而不是數字ip位址。

K8S中Service屬性解釋

service的yaml檔案簡單解釋 apiversion v1 kind service 型別 metadata 元資料 name details service的名稱 labels 自定義標籤屬性列表 details service details spec 詳細描述 ports service...

k8s修改service埠範圍

vi etc kubernetes manifests kube apiserver.yaml 新增到如下位置,放在第一行引數 command kube apiserver service node port range 1 65535 有時候,修改檔案後自動會重建 api pod。如果沒有,直接刪...

K8s部署prometheus監控K8s細節

prometheus 一些配置檔案可以再github上找到。部署 root kube prometheus manifests 目錄下所有檔案 部署 root kube prometheus manifests setup 目錄下所有檔案 要注意的是自己要建立乙個工作空間 如果報錯執行下面語句 部署...