K8s-Pod


 

一:Pod-資源對象概述

Pod是k8s系統中可以創建和管理的最小單元,是資源對象模型中由用戶創建或部署的最小資源對象模型,也是在k8s上運行容器化應用的資源對象,其他的資源對象都是用來支撐或者擴展Pod對象功能的,比如控制器對象是用來管控Pod對象的,Service或者Ingress資源對象是用來暴露Pod引用對象的,PersistentVolume資源對象是用來為Pod提供存儲等等,k8s不會直接處理容器,而是Pod,Pod是由一個或者多個container組成的。

節點,Pod,容器之前的關系

 

 

二:Pod 特性:

2.1  資源共享

一個Pod里的多個容器可以共享存儲和網絡,可以看作一個邏輯的主機。共享的如 namespace,cgroups或者其他的隔離資源。

多個容器共享同一個network namespace,由此在一個Pod里的多個容器共享Pod的IP和端口namespace,所以一個Pod內的多個容器之間可以通過localhost來進行通信,所需要注意的是不同容器要注意不要有端口沖突即可。不同的Pod有不同的IP,不同Pod內的多個容器之前通信,不可以使用IPC(如果沒有特殊指定的話)通信,通常情況下使用Pod的IP進行通信。

一個Pod里的多個容器可以共享存儲卷,這個存儲卷會被定義為Pod的一部分,並且可以掛載到該Pod里的所有容器的文件系統上。

2.2 生命周期短暫

Pod屬於生命周期比較短暫的組件,比如,當Pod所在節點發生故障,那么該節點上的Pod會被調度到其他節點,但需要注意的是,被重新調度的Pod是一個全新的Pod,跟之前的Pod沒有半毛錢關系。

2.3  平坦的網絡

K8s集群中的所有Pod都在同一個共享網絡地址空間中,也就是說每個Pod都可以通過其他Pod的IP地址來實現訪問。

三:Pod-使用

核心原則是:將多個應用分散到多個Pod中

原因:基於資源的合理應用;擴縮容,不同應用應該有不同的擴縮容策略等。

如果容器之間不是必須運行在一起的話,那么就放到不同的Pod里

如果容器之前是相互獨立的組件,那么就放到不同的Pod里

如果容器之前擴縮容策略不一樣,那么就放到不同的Pod里

結論:單Pod單容器應用,除非特殊原因

 

 

 

四:Pod-創建

創建Pod可以使用兩種方式,一種是通過命令行加各種命令行參數的方式,另一種是表單方式創建(推薦)。以下是一個創建Pod時的大概流程

# 流程:

1:kubectl 向K8s API發送一個REST HTTP請求

2:調度器將其調度到一個工作節點上

3:被調度的工作節點上的kubelet會告知Docker拉取鏡像,下載后運行容器。

 

4.1 命令行加各種命令行參數的方式創建一個Pod

這里使用 luksa/kubia鏡像(訪問該鏡像可以輸出該容器的hostname)構建一個Pod

# 查看當前Pod資源

# pods的縮寫是po,以下兩個命令的作用是一樣的。可以看到當前沒有任何資源

[root@k8s-master-node1 ~]# kubectl get pods

No resources found.

[root@k8s-master-node1 ~]# kubectl get po

No resources found.

 

# 創建一個Pod資源

#--image 指定鏡像名稱,--port指定該容器的端口  --generator=run/v1 是指讓k8s創建一個RC資源,而不是deployment資源,kubia是指RC的名稱

[root@k8s-master-node1 ~]# kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1

 

 

# 再次查看Pod資源,一個叫kubia-v7mlq的Pod被運行起來了

# NAME:Pod的名稱,REAY: 表示運行個數 前面的1表示正在運行的個數,后面的1表示總共要運行的個數, STATUS:表示狀態  RESTARTS:表示被重啟的次數, AGE:表示啟動的時間。

[root@k8s-master-node1 ~]# kubectl get pods

NAME          READY   STATUS    RESTARTS   AGE

kubia-v7mlq   1/1     Running   0          14m

 

 

# 加入 –o wide參數看長信息

# NODE:運行該Pod的節點。IP:Pod的IP

[root@k8s-master-node1 ~]# kubectl get pods -o wide

NAME          READY   STATUS    RESTARTS   AGE   IP           NODE               NOMINATED NODE   READINESS GATES

kubia-v7mlq   1/1     Running   0          17m   10.244.1.6   k8s-worker-node1   <none>           <none>

 

 

# 查看Pod的詳細信息(信息非常詳細)

[root@k8s-master-node1 ~]# kubectl describe po kubia-v7mlq

 

 

4.2 表單方式創建一個Pod

# 認識以下表單方式對Pod的定義,使用之前已經創建好的Pod

[root@k8s-master-node1 ~]# kubectl get po kubia-v7mlq -o yaml

apiVersion: v1  # API版本

kind: Pod   # 表示資源類型

metadata:

  creationTimestamp: "2019-01-07T12:18:54Z"

  generateName: kubia-

  labels:

    run: kubia

  name: kubia-v7mlq

  namespace: default

  ownerReferences:

  - apiVersion: v1

    blockOwnerDeletion: true

    controller: true

    kind: ReplicationController

    name: kubia

    uid: 6654b1f5-1276-11e9-9a4b-00163e00518c

  resourceVersion: "30073"

  selfLink: /api/v1/namespaces/default/pods/kubia-v7mlq

  uid: 66565269-1276-11e9-9a4b-00163e00518c

spec:

  containers:

  - image: luksa/kubia

    imagePullPolicy: Always

    name: kubia
..............

 

 

Yaml是一種可以對Pod定義的一種表單形式

對Pod資源定義主要分如下幾個部分(其他資源對象一樣)

1:API版本

2:資源類型,比如Pod資源

3:metadata:包括名稱,名稱空間,標簽等

4:spec 關於Pod內容的實際規格說明,例如Pod的容器,卷及其他數據。

 

我們也可以通過命令行的方式查看具體怎么去定義

# 通過explain可以查看資源對象怎么進行定義

[root@k8s-master-node1 ~]# kubectl explain pods

[root@k8s-master-node1 ~]# kubectl explain pods.spec

 

這里我們創建一個Pod對象定義的yaml文件

[root@k8s-master-node1 pods]# cat kubia-manual.yaml

apiVersion: v1

kind: Pod

metadata:

  name: kubia-manual

spec:

  containers:

  - image: luksa/kubia

    name: kubia

    ports:

    - containerPort: 8080

      protocol: TCP

 

 

使用create –f 指定yaml文件的方式創建該Pod

[root@k8s-master-node1 pods]# kubectl create -f kubia-manual.yaml

pod/kubia-manual created

 

[root@k8s-master-node1 pods]# kubectl get po -o wide

 

 

也可以查看剛創建Pod的完成定義,如果沒有在yaml指定,使用默認配置,如下

# 查看kubia-manual完整的yaml

[root@k8s-master-node1 pods]# kubectl get po kubia-manual -o yaml

 

# 也可以以json格式輸出

[root@k8s-master-node1 pods]# kubectl get po kubia-manual -o json

 

 

Pod默認情況下只能在集群內部訪問,外界無法訪問,我們可以通過Service資源對象進行端口暴露,這里先使用另一種方法 端口轉發

[root@k8s-master-node1 pods]# kubectl port-forward kubia-manual 8888:8080

 

 

訪問以下試試 確實時我們創建的Pod

 

 

五:Pod-日志

容器日志在大於10M后會自動輪替,所以我們看到的是輪替后的日志,或者沒有輪替的日志,即有可能不是完整的日志

[root@k8s-master-node1 pods]# kubectl logs kubia-manual

 

 

# 如果Pod有多個容器時,查看某個容器的日志時需要加參數-c

[root@k8s-master-node1 pods]# kubectl logs kubia-manual -c kubia

 

 

六:Pod-標簽

標簽是一種可以附加到任意資源的任意鍵值對,是對資源的一種分類,一個資源可以有多個標簽,比如對Pod資源進行分類。創建資源的時候可以順帶將標簽創建,也可以創建資源后再貼標簽,也可以對資源的現有標簽進行修改

比如如下標簽

app: 指定Pod輸入哪個應用

rel:指定Pod運行的應用版本時stable,beta,。。。

6.1: 創建資源時貼標簽

# 給Pod貼兩個標簽  create_method env

apiVersion: v1

kind: Pod

metadata:

  name: kubia-manual-v2

  labels:

    create_method: manual

    env: prod

spec:

  containers:

  - image: luksa/kubia

    name: kubia

    ports:

    - containerPort: 8080

      protocol: TCP

 

 

創建Pod

[root@k8s-master-node1 pods]# kubectl create -f kubia-manual-with-labels.yaml

 

 

查看Pod的標簽

# 默認不顯示標簽

[root@k8s-master-node1 pods]# kubectl get po

 

# 使用 –show-labels

[root@k8s-master-node1 pods]# kubectl get po --show-labels

 

 

# 查看標簽的值

[root@k8s-master-node1 pods]# kubectl get po -L create_method,env

 

 

 

 

6.2 在已有資源上創建標簽

比如我們給kubia-manual 也貼一個create_method manual

[root@k8s-master-node1 pods]# kubectl label po kubia-manual create_method=manual

 

 

 

查看當前label情況

[root@k8s-master-node1 pods]# kubectl get pods --show-labels

 

 

 

 

[root@k8s-master-node1 pods]# kubectl get pods -L create_method,env

 

 

 

 

6.3 對現有標簽進行修改

# 將kubia-manual-v2 Pod的env標簽值改為debug 需要使用—overwrite

[root@k8s-master-node1 pods]# kubectl label po kubia-manual-v2 env=debug –overwrite

 

 

 

6.4 通過標簽篩選Pod子集

 

通常情況下標簽跟標簽選擇器放在一起使用,使用標簽選擇器通過標簽能篩選出Pod子集,然后做必要的操作

1:包含(不包含)使用特定鍵的標簽

2:包含特定鍵和值的標簽

3:包含指定鍵,但其值與我們指定的不同

例子:包含指定鍵和值的標簽Pod

[root@k8s-master-node1 pods]# kubectl get po -l create_method=manual

 

例子:查看包含標簽env的所有Pod(無論env的值是什么)

[root@k8s-master-node1 pods]# kubectl get po -l env

 

例子:選擇不含env標簽的Pod

[root@k8s-master-node1 pods]# kubectl get po -l '!env'

 

6.5  對Node貼標簽

 [root@k8s-master-node1 pods]# kubectl label node k8s-worker-node1 env=prod

 

# 篩選

[root@k8s-master-node1 pods]# kubectl get nodes -l env=prod

 

 

有的時候我們需要將某些應用調度到指定的服務器集上,可以通過node的標簽進行調度,例如

[root@k8s-master-node1 pods]# cat kubia-node.yaml

apiVersion: v1

kind: Pod

metadata:

  name: kubia-node

spec:

  nodeSelector:

    env: "prod"

  containers:

  - image: luksa/kubia

    name: kubia

    ports:

    - containerPort: 8080

      protocol: TCP

 

 

 

七:Pod-注解

注解跟標簽一樣也是鍵值對,所不同的是我們可以使用標簽選擇器並根據標簽對對象進行分組,注解沒有這樣的功能。

通過給對象添加注解,可以有效的為維護集群人員迅速的提供必要的信息,比如我們可以給對象添加創建對象的人員姓名的注解啊等等。

7.1 查找某對象的注解

 

7.2 添加及修改注解

[root@k8s-master-node1 ~]# kubectl annotate pod kubia-v7mlq commond/maintainer="wangys"

[root@k8s-master-node1 ~]# kubectl get po.tolerations kubia-v7mlq -o yaml

 

八:命名空間

K8s命名空間為對象提供了一個作用域,比如說我們可以將生產,開發,QA環境進行分組,然后通過該名稱空間資源進行資源進行分組。

在查看資源對象時,如果不指定命名空間,默認時在default的命名空間下查找的

盡管命名空間將對象分隔到不同的組中,只允許你對屬於指定命名空間的對象操作,但實際上命名空間並不提供對正在運行的對象的任何隔離,也就是說不同命名空間之間的Pod可以通過IP進行通訊,是否有網絡隔離效果取決於使用的k8s網絡方案。

 

8.1  查看命名空間

# namespace的縮寫是ns,有default kube-pulic kube-system命名空間

[root@k8s-master-node1 ~]# kubectl get namespace

 

8.2 查看指定命名空間下的資源

查看其他命名空間的Pod資源對象

[root@k8s-master-node1 ~]# kubectl get po -n kube-public

[root@k8s-master-node1 ~]# kubectl get po -n kube-system

 

我們可以看到在kube-system命名空間中k8s控制平面的各組件以Pod的方式運行。其實也好理解,因為這些組件比較重要,需要跟用戶的default命名空間分開,這樣就不會擔心用戶的誤操作將重要組件刪除或者致命操作。

 

8.3  創建命名空間

命名空間也時K8s資源對象的一種,我們可以通過手動或者清單方式創建

 

清單方式創建

創建一個custom-namespace,下面時該命名空間的清單

[root@k8s-master-node1 pods]# cat custom-namespace.yaml

apiVersion: v1

kind: Namespace

metadata:

  name: custom-namespace

 

創建

[root@k8s-master-node1 pods]# kubectl create -f custom-namespace.yaml

 

命令行創建

[root@k8s-master-node1 pods]# kubectl create ns custom-namespace-1

 

 

8.4 創建資源時選定指定的命名空間

8.4.1 命令行方式

[root@k8s-master-node1 pods]# kubectl create -f kubia-manual.yaml -n custom-namespace

 

 

在查看資源時前者時在default命名空間里查看Pod資源,后者是指定custom-namespace命名空間來查看Pod資源,兩個Pod的名稱一樣。

8.4.2 通過清單文件的方式創建

[root@k8s-master-node1 pods]# cat kubia-manual-namespace.yaml

apiVersion: v1

kind: Pod

metadata:

  name: kubia-manual

  namespace: custom-namespace-1

spec:

  containers:

  - image: luksa/kubia

    name: kubia

    ports:

    - containerPort: 8080

      protocol: TCP

 

創建

[root@k8s-master-node1 pods]# kubectl create -f kubia-manual-namespace.yaml

 

三個命名空間里都有同名的kubia-manual

 

8.5 快速切換命名空間

 

 

 

 

 

九:Pod-刪除

在刪除Pod的過程中,其實是K8s向進程他送了一個SIGTERM信號,隨后等待一定的時間(默認為30s),如果該Pod沒有及時關閉,K8s會發送SIGKILL終止該進程。

9.1 通過Pod的名稱刪除Pod

 

[root@k8s-master-node1 ~]# kubectl delete po kubia-node

pod "kubia-node" deleted

 

 

在通過指定名稱刪除Pod的時候,我們可以指定多個Pod進行刪除

 

9.2 使用標簽選擇器刪除Pod

 

這兩個Pod具有相同的標簽,我們可以通過標簽選擇器刪除他們

[root@k8s-master-node1 ~]# kubectl delete po -l create_method=manual

 

 

9.3 通過刪除命名空間來刪除Pod

 

[root@k8s-master-node1 ~]# kubectl delete ns custom-namespace

 

9.4 刪除名稱空間下的Pod資源,但是不刪除命名空間

# --all指對應Pod的所有資源實例全部刪除

[root@k8s-master-node1 ~]# kubectl delete po --all

pod "kubia-v7mlq" deleted

 

 

 

Pod定義文件詳解

 


免責聲明!

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



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