【轉】k8s中Pod、ReplicaSet、Deployment、Service的概念


k8s中Pod、ReplicaSet、Deployment、Service的概念
一、Pod
二、ReplicaSet
  2.1 Label(標簽)
  2.2 Label Selector(標簽選擇器)
三、Deployment
四、Service
五、總結
一、Pod
Pod 是可以在 Kubernetes 中創建和管理的、最小的可部署的計算單元。Pod中包含了一個或多個容器,還包括了存儲、網絡等各個容器共享的資源。Pod支持多種容器環境,Docker則是最流行的容器環境。

簡單來說k8s不想直接操作container,因為操作container的事情是docker來做的,k8s中要有自己的最小操作單位,稱之為Pod。說白了,Pod就是一個或多個Container的組合。

每個Pod中都有一個pause容器,pause是Kubernetes基礎設施的一部分,Kubernetes管理的所有pod里,pause容器是第一個啟動的,用於實現Kubernetes集群里pod之間的網絡通訊。

 

 

 

二、ReplicaSet
ReplicaSet 的目的是維護一組在任何時候都處於運行狀態的 Pod 副本的穩定集合。 因此,它通常用來保證給定數量的、完全相同的 Pod 的可用性。(確保任何時間都有指定數量的 Pod 副本在運行)

先說下Replication Controller。Replication Controller的作用是確保Pod以指定的副本個數運行。

ReplicaSet是Replication Controller升級版。ReplicaSet和Replication Controller之間的唯一區別是對選擇器支持。Replication Controller只支持基於等式的selector(env=dev或environment!=qa),但ReplicaSet還支持新的,基於集合的selector(version in (v1.0,v2.0)或env notin (dev, qa))

 

 

 


2.1 Label(標簽)
Label是Kubernetes系統中的一個核心概念。
Label以key/value鍵值對的形式附加到各種對象上,如Pod、Service、RC、Node等。
Label定義了這些對象的可識別屬性,用來對它們進行管理和選擇。Label可以在創建時附加到對象上,也可以在對象創建后通過API進行管理。

 

 

 


2.2 Label Selector(標簽選擇器)
在為對象定義好Label后,其他對象就可以使用Label Selector(選擇器)來定義其作用的對象了。

Label Selector的定義由多個逗號分隔的條件組成。

“labels”: {
“key1”: “value1”,
“key2”: “value2”
}

當前有兩種Label Selector:

基於等式的(Equality-based)和基於集合的(Set-based),在使用時可以將多個Label進行組合來選擇。

1、基於等式的Label Selector使用等式類的表達式來進行選擇:

name = redis-slave: 選擇所有包含Label中key="name"且value="redis-slave"的對象;
env != production: 選擇所有包括Label中的key="env"且value不等於"production"的對象。

2、基於集合的Label Selector使用集合操作的表達式來進行選擇:

name in (redis-master, redis-slave): 選擇所有包含Label中的key="name"且value="redis-master"或"redis-slave"的對象;
name not in (php-frontend): 選擇所有包含Label中的key="name"且value不等於"php-frontend"的對象。

ps:在某些對象需要對另一些對象進行選擇時,可以將多個Label Selector進行組合,使用逗號","進行分隔即可。
基於等式的LabelSelector和基於集合的Label Selector可以任意組合。
例如:

name=redis-slave,env!=production
name not in (php-frontend),env!=production

三、Deployment
Deployment用於管理Pod、ReplicaSet,可實現滾動升級和回滾應用、擴容和縮容。

 

 

 


四、Service
試想一個問題,ReplicaSet定義了pod的數量是2,當一個pod由於某種原因停止了,ReplicaSet會新建一個pod,以確保運行中的pod數量始終是2。但每個pod都有自己的ip,前端請求不知道這個新pod的ip是什么,那前端的請求如何發送到新pod中呢?
答案是使用Service
k8s的Service定義了一個服務的訪問入口地址,前端的應用通過這個入口地址訪問其背后的一組由Pod副本組成的集群實例,來自外部的訪問請求被負載均衡到后端的各個容器應用上。Service與其后端Pod副本集群之間則是通過Label Selector實現關聯。
簡單來說前端請求不是直接發送給Pod,而是發送到Service,Service再將請求轉發給pod。

 

 

 

上圖可能太抽象,我們可以看看下面這張圖。
假設我們把一個服務做了高可用,這個服務分別部署在了兩個節點上,當我們想訪問該服務時,則此時訪問的不是pod而是service,service會再給我們做負載均衡。

 

 

 

k8s中的service中有三種類型:

  ClusterIP:提供一個集群內部的虛擬IP以供Pod訪問。
  NodePort:在每個Node上打開一個端口以供外部訪問。
  LoadBalancer:通過外部的負載均衡器來訪問。
五、總結
Pod里是容器,Pod被ReplicaSet管理,ReplicaSet控制pod的數量;ReplicaSet被Deployment管理,Deployment控制pod應用的升級、回滾,當然也能控制pod的數量。Service提供一個統一固定入口,負責將前端請求轉發給Pod。

deployment和service yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 81   
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort

 


Deployment:
① apiVersion 是當前配置格式的版本。
② kind 是要創建的資源類型,這里分別創建了Deployment和Service。
③ metadata 是該資源的元數據,name 是必需的元數據項。
④ spec 部分是 Deployment 的規格說明。
⑤ replicas 指明副本數量,默認為 1。
⑥matchLabels 指匹配的pod的標簽是什么。
⑦ template 定義 Pod 的模板,這是配置文件的重要部分。
⑧ metadata 定義 Pod 的元數據,至少要定義一個 label。label 的 key 和 value 可以任意指定。
⑨ spec 描述 Pod 的規格,此部分定義 Pod 中每一個容器的屬性,name 和 image 是必需的。

Service:
① port Service 服務暴露的端口
② targetPort 容器暴露的端口
③ type Service的類型

k8s集群搭建步驟:
https://blog.csdn.net/qq_35080214/article/details/110928221
from:https://blog.csdn.net/qq_35080214/article/details/111177787


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM