天天看點

k8s service和pod是怎麼關聯起來的

作者:傳說中的黃瓜

Kubernetes是一個用于自動部署、擴充和管理容器化應用程式的開源平台。其中兩個核心概念是Pod和Service,它們是如何關聯的呢?

Pod

Pod是Kubernetes中最小的可部署單元,它是一個由一個或多個容器組成的最小部署單元。Pod可以被視為一個邏輯主機,它包含了應用程式所需的所有資源,如存儲、網絡和命名空間等。

Pod通常會包含一個或多個應用程式容器,這些容器共享相同的網絡命名空間、IP位址和端口空間。這意味着容器可以互相通信,并且可以使用相同的端口号來監聽來自服務請求的流量。

Pod在Kubernetes中被認為是短暫的、易失的執行個體,因為它們可以随時被删除并重新建立。這意味着如果一個Pod崩潰或被删除,它的IP位址也将被釋放,并且任何正在向該位址發送請求的用戶端将無法連接配接到它。是以,我們需要一個抽象層,來幫助我們管理這些容器。

Service

Service是一個抽象層,用于定義一組Pod的通路政策。Service可以公開一組Pod,使它們可以被其他應用程式或服務通路。它為Pod提供了一個穩定的IP位址和DNS名稱,這些位址和名稱可以在容器之間共享。

Service有三種類型:ClusterIP、NodePort和LoadBalancer。其中,ClusterIP類型是最常用的類型,它為Pod提供了一個穩定的IP位址和DNS名稱,該位址和名稱隻能在Kubernetes叢集内部使用。NodePort類型為Pod提供了一個靜态端口号,這個端口可以用于從叢集外部通路Pod。LoadBalancer類型為Pod提供了一個外部負載均衡器,這個負載均衡器可以自動将請求路由到後端Pod中。

Pod與Service的關系

在Kubernetes中,Service與Pod是通過标簽進行關聯的。Pod可以使用标簽來描述它們自己,并且Service可以使用相同的标簽來選擇要公開的Pod。

具體來說,當建立一個Pod時,我們可以為它添加标簽,例如app=web。然後,在建立Service時,我們可以使用相同的标簽選擇要公開的Pod,例如選擇所有具有标簽app=web的Pod。

下面是一個示例Pod和Service的定義:

apiVersion: v1
kind: Pod
metadata:
  name: web-pod
  labels:
    app: web
spec:
  containers:
  - name: web-container
    image: nginx

---

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
  - name: http
    port: 80           

其中,Pod可以通過标簽(labels)來進行分類和管理,而Service可以通過選擇器(selector)來将一組Pod聚合在一起,以提供統一的網絡服務。

具體來說,Pod的标簽是用來對Pod進行分類和标記的。一個Pod可以有多個标簽,并且同一個标簽可以被多個Pod使用。标簽的格式是一個key-value對,例如:

pod:
metadata:
  labels:
    app: nginx
    tier: frontend
           

在這個例子中,我們為一個Pod添加了兩個标簽,分别是app: nginx和tier: frontend。這個Pod可以被用來部署nginx服務的前端元件。當我們需要對這些Pod進行管理時,可以使用标簽進行篩選,例如:

kubectl get pods -l app=nginx
           

這條指令将會列出所有擁有app=nginx标簽的Pod。

Service的選擇器與Pod的标簽類似,用來對一組Pod進行分類和管理。一個Service必須指定一個選擇器,這個選擇器将會與Pod的标簽進行比對,進而确定哪些Pod屬于這個Service。選擇器的格式也是一個key-value對,例如:

service:
spec:
  selector:
    app: nginx
    tier: frontend
           

在這個例子中,我們為一個Service指定了一個選擇器,要求所有屬于app=nginx且tier=frontend的Pod都會被這個Service聚合起來。當我們需要通路這些Pod提供的服務時,可以通過Service的ClusterIP來通路,例如:

javascriptCopy codecurl http://nginx-service.default.svc.cluster.local
           

這條指令将會向名為nginx-service的Service發送請求,該Service将請求轉發給與其選擇器比對的所有Pod。是以,Pod的标簽和Service的選擇器是密切相關的,它們共同構成了Kubernetes中管理和提供服務的基礎。

繼續閱讀