Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
-
-
- Pod、Namespace、Label、Deployment、Service之間的關系
-
- Namespace
- Pod
-
- 1. 建立一個namespace并運作一個pod
- 2. 檢視pod
- 3. 删除pod
- 4. 删除pod控制器
- Label
-
- 1. 建立yaml檔案(nginx-pod.yaml)
- 2. 建立資源
- 3. 檢視标簽
- 4. 建立标簽
- 5. 更新标簽
- 6. 建立yaml檔案(nginx-pod-label.yaml)
- 7. 使用yaml檔案建立标簽
- 8. 根據标簽搜尋
- Deployment
-
- 1. 建立namespace,并在namespace下建立三個nginx副本
- 2. 檢視deployment的詳細資訊
- Service
-
- 1. 建立service
- 2. 檢視指定namespace下的service
- 3. 檢視指定namespace下的service的額外資訊
- 4. 建立新的service并暴露外網位址
- 5. 檢視指定namespace下的pod和service
- 6. 從外網通路nginx
- 7. 删除service
- 8. 通過yaml檔案建立service
-
Pod、Namespace、Label、Deployment、Service之間的關系
Namespace
- Kubernetes支援多個虛拟叢集,它們底層依賴于同一個實體叢集。 這些虛拟叢集被稱為命名空間。可以實作多套環境的資源隔離或者多租戶的資源隔離。
- 資源的名稱需要在命名空間内是唯一的,但不能跨命名空間。命名空間不能互相嵌套,每個Kubernetes資源隻能在一個命名空間中。命名空間是在多個使用者之間劃分叢集資源的一種方法(通過資源配額)
- k8s叢集中的所有的Pod都是可以互相通路的,将兩個Pod劃分到不同的Namespace下。Kubernetes通過将叢集内部的資源配置設定到不同的Namespace中,可以形成邏輯上的"組",以友善不同組的資源進行隔離使用和管理,不同的Namespace下的Pod互相之間是通路不通的。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicWZwpmLkV2Y1MDMlRDNzEGOzMDN5cjMjRjN1cDM4kDN0EGOwUzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpeg)
- default:沒有指明使用其它命名空間的對象所使用的預設命名空間;
- kube-system:Kubernetes系統建立對象所使用的命名空間;
- kube-public:這個命名空間是自動建立的,所有使用者(包括未經過身份驗證的使用者)都可以讀取它。這個命名空間主要用于叢集使用,以防某些資源在整個叢集中應該是可見和可讀的。這個命名空間的公共方面隻是一種約定,而不是要求。
Pod
Pod是在k8s叢集進行管理的最小單元,程式要運作必須部署在容器(docker)中,而容器必須存在于Pod中。
Pod是對(docker)容器的封裝,1個Pod中可以存在一個或者多個容器。
1. 建立一個namespace并運作一個pod
kubectl create ns bubble-dev
kubectl run nginx --image=nginx:1.17.9 --port=80 --namespace=bubble-dev
2. 檢視pod
檢視指定namespace下的pod
kubectl get pod -n bubble-dev
檢視指定namespace下的pod的額外資訊
kubectl get pod -n bubble-dev -o wide
檢視pod的詳細資訊
kubectl describe pod nginx-5c9b49c46-mdvz5 -n bubble-dev
3. 删除pod
kubectl delete pod nginx-5c9b49c46-mdvz5 -n bubble-dev
使用delete删除pod,之後又會重新啟動一個pod
4. 删除pod控制器
查詢指定namespace下的pod控制器
kubectl get deployment -n bubble-dev
删除pod控制器
kubectl delete deployment nginx -n bubble-dev
此時pod已經被徹底删除了
Label
- Label其實就是一對key/value,被關聯到對象上,比如Pod,标簽的使用我們傾向于能夠辨別對象的特點,Labels的值對系統本身并沒有什麼含義,隻是對使用者才有意義。同一個資源對象的Labels屬性的key必須唯一,Label可以附加到各種資源對象上,如Node、Pod、Service、RC等。一個資源擁有多個标簽,可以實作不同次元的管理。标簽(Label)的組成::key=value。Label可以在建立對象時就附加到對象上,也可以在對象建立後通過API進行額外添加或修改;
- Label必須以字母或數字開頭,可以使用字母、數字、連字元、點和下劃線,最長63個字元。
- 當相同類型的資源越來越多,對資源劃分管理是很有必要的,此時就可以使用Label為資源對象命名,以便于配置、部署等管理工作,提升資源的管理效率。Label的作用類似Java包能對不同檔案分開管理,讓整體更加有條理,更利于維護。
- 通過Label來對對象進行引用。
例如:
- 版本标簽:“version”:"“v1”, “version”:“v2”(灰階釋出)
- 環境标簽:“environment”:“sit”,“environment”:“pre”,“environment”:“prd”
1. 建立yaml檔案(nginx-pod.yaml)
apiVersion: v1
kind: Namespace
metadata:
name: bubble-dev # 指定Namespace空間名稱
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod # 指定pod的名稱
namespace: bubble-dev # 指定該pod對應的Namespace
spec:
containers:
- name: nginx-container # 運作一個nginx容器
image: nginx:1.17.9 # 指定鏡像的名稱
2. 建立資源
kubectl create -f nginx-pod.yaml
3. 檢視标簽
此時pod是沒有标簽的
4. 建立标簽
kubectl label pod nginx-pod -n bubble-dev version=1.0
5. 更新标簽
kubectl label pod nginx-pod -n bubble-dev version=2.0 --overwrite
6. 建立yaml檔案(nginx-pod-label.yaml)
apiVersion: v1
kind: Namespace
metadata:
name: bubble-dev # 指定Namespace空間名稱
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod # 指定pod的名稱
namespace: bubble-dev # 指定該pod對應的Namespace
labels:
version: "8.0" # 指定labels标簽
env: "sit"
spec:
containers:
- name: nginx-container # 運作一個nginx容器
image: nginx:1.17.9 # 指定鏡像的名稱
7. 使用yaml檔案建立标簽
删除原來的namespace和pod,再建立包含标簽的資源
kubectl delete -f nginx-pod.yaml
kubectl create -f nginx-pod-label.yaml
8. 根據标簽搜尋
Deployment
Deployment為Pod和Replica Set提供聲明式更新。
你隻需要在Deployment中描述您想要的目标狀态是什麼,Deployment Controller就會幫您将Pod和ReplicaSet的實際狀态改變到您的目标狀态。您可以定義一個全新的Deployment來建立ReplicaSet或者删除已有的Deployment并建立一個新的來替換。
注意:您不該手動管理由Deployment建立的Replica Set,否則您就篡越了Deployment Controller的職責!
Pod是k8s中的最小單元,k8s不會直接控制Pod,而是通過Pod控制器來進行控制。Pod控制器用于對Pod的管理,確定Pod資源符合預期的狀态,當Pod的資源出現故障時,會嘗試進行重新開機或重建Pod。
1. 建立namespace,并在namespace下建立三個nginx副本
kubectl create ns bubble-dev
kubectl run nginx --image=nginx:1.17.9 --port=80 --replicas=3 --namespace=bubble-dev
–image 指定pod的鏡像
–port 指定端口
–replicas 指定建立pod數量
–namespace 指定namespace
2. 檢視deployment的詳細資訊
kubectl describe deployment nginx -n bubble-dev
Service
Service是k8s中的一個重要概念,主要是提供負載均衡和服務自動發現。Pod IP會随着Pod的重建産生變化,可以使用Service提供的IP對Pod進行通路。
1. 建立service
kubectl expose deploy nginx --name=nginx-service --type=ClusterIP --target-port=80 -n bubble-dev
2. 檢視指定namespace下的service
kubectl get service -n bubble-dev
3. 檢視指定namespace下的service的額外資訊
kubectl get service -n bubble-dev -o wide
可以通過CLUSTER-IP在工作節點上對nginx進行通路
4. 建立新的service并暴露外網位址
kubectl expose deploy nginx --name=nginx-service-new --type=NodePort --target-port=80 -n bubble-dev
5. 檢視指定namespace下的pod和service
kubectl get pods,service -n bubble-dev
kubectl describe pod nginx-5c9b49c46-6bs8c -n bubble-dev
6. 從外網通路nginx
根據上面查詢到的工作節點ip+service暴露的端口進行通路
7. 删除service
kubectl delete svc nginx-service -n bubble-dev
kubectl delete svc nginx-service-new -n bubble-dev
8. 通過yaml檔案建立service
apiVersion: v1
kind: Service
metadata :
name: nginx-service # Service名稱
namespace: bubble-dev # 命名空間
spec:
clusterIP: 10.99.114.201
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: ClusterIP