天天看點

Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系

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

  1. Kubernetes支援多個虛拟叢集,它們底層依賴于同一個實體叢集。 這些虛拟叢集被稱為命名空間。可以實作多套環境的資源隔離或者多租戶的資源隔離。
  2. 資源的名稱需要在命名空間内是唯一的,但不能跨命名空間。命名空間不能互相嵌套,每個Kubernetes資源隻能在一個命名空間中。命名空間是在多個使用者之間劃分叢集資源的一種方法(通過資源配額)
  3. k8s叢集中的所有的Pod都是可以互相通路的,将兩個Pod劃分到不同的Namespace下。Kubernetes通過将叢集内部的資源配置設定到不同的Namespace中,可以形成邏輯上的"組",以友善不同組的資源進行隔離使用和管理,不同的Namespace下的Pod互相之間是通路不通的。
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
  1. default:沒有指明使用其它命名空間的對象所使用的預設命名空間;
  2. kube-system:Kubernetes系統建立對象所使用的命名空間;
  3. 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
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
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
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
3. 删除pod
kubectl delete pod nginx-5c9b49c46-mdvz5 -n bubble-dev
           

使用delete删除pod,之後又會重新啟動一個pod

Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
4. 删除pod控制器

查詢指定namespace下的pod控制器

kubectl get deployment -n bubble-dev
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系

删除pod控制器

kubectl delete deployment nginx -n bubble-dev
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系

此時pod已經被徹底删除了

Label

  1. Label其實就是一對key/value,被關聯到對象上,比如Pod,标簽的使用我們傾向于能夠辨別對象的特點,Labels的值對系統本身并沒有什麼含義,隻是對使用者才有意義。同一個資源對象的Labels屬性的key必須唯一,Label可以附加到各種資源對象上,如Node、Pod、Service、RC等。一個資源擁有多個标簽,可以實作不同次元的管理。标簽(Label)的組成::key=value。Label可以在建立對象時就附加到對象上,也可以在對象建立後通過API進行額外添加或修改;
  2. Label必須以字母或數字開頭,可以使用字母、數字、連字元、點和下劃線,最長63個字元。
  3. 當相同類型的資源越來越多,對資源劃分管理是很有必要的,此時就可以使用Label為資源對象命名,以便于配置、部署等管理工作,提升資源的管理效率。Label的作用類似Java包能對不同檔案分開管理,讓整體更加有條理,更利于維護。
  4. 通過Label來對對象進行引用。

例如:

  1. 版本标簽:“version”:"“v1”, “version”:“v2”(灰階釋出)
  2. 環境标簽:“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  # 指定鏡像的名稱
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
2. 建立資源
kubectl create -f nginx-pod.yaml
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
3. 檢視标簽
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系

此時pod是沒有标簽的

4. 建立标簽
kubectl label pod nginx-pod -n bubble-dev version=1.0
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
5. 更新标簽
kubectl label pod nginx-pod -n bubble-dev version=2.0 --overwrite
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
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  # 指定鏡像的名稱
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
7. 使用yaml檔案建立标簽

删除原來的namespace和pod,再建立包含标簽的資源

kubectl delete -f nginx-pod.yaml
kubectl create -f nginx-pod-label.yaml
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
8. 根據标簽搜尋
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系

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

Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
2. 檢視deployment的詳細資訊
kubectl describe deployment nginx -n bubble-dev
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系

Service

Service是k8s中的一個重要概念,主要是提供負載均衡和服務自動發現。Pod IP會随着Pod的重建産生變化,可以使用Service提供的IP對Pod進行通路。

Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
1. 建立service
kubectl expose deploy nginx --name=nginx-service --type=ClusterIP --target-port=80 -n bubble-dev
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
2. 檢視指定namespace下的service
kubectl get service -n bubble-dev
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
3. 檢視指定namespace下的service的額外資訊
kubectl get service -n bubble-dev -o wide
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系

可以通過CLUSTER-IP在工作節點上對nginx進行通路

Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
4. 建立新的service并暴露外網位址
kubectl expose deploy nginx --name=nginx-service-new --type=NodePort --target-port=80 -n bubble-dev
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
5. 檢視指定namespace下的pod和service
kubectl get pods,service -n bubble-dev
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
kubectl describe pod nginx-5c9b49c46-6bs8c -n bubble-dev
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
6. 從外網通路nginx

根據上面查詢到的工作節點ip+service暴露的端口進行通路

Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
7. 删除service
kubectl delete svc nginx-service -n bubble-dev
kubectl delete svc nginx-service-new -n bubble-dev
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系
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
           
Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之間的關系