Kubernetes Pod操做篇

前言

在上文Kubernetes入門篇中對kubernetes有一個初步的介紹,本文繼續介紹kubernetes的核心組件Pod,固然仍是以實際操做爲主;另外說明一點的是本系列是本人的學習筆記。node

Pod介紹

Pod是Kubernetes中最爲重要的核心概念,表明了Kubernetes中的基本構建模塊;一個Pod能夠包含一個容器或者多個容器,Pod自己是輕量級的,因此常常會建立不少Pod,緊密相關的容器進程常常放到同一個Pod中;一個Pod中的容器運行於相同的Network命名空間中,所以它們共享相同的IP地址和端口空間;Kubernetes集羣中的全部Pod都在同一個共享網絡地址空間中,每一個Pod均可以經過其餘Pod的IP地址來實現相互訪問,就像局域網上的計算機同樣。git

1.建立Pod

Pod和其餘Kubernetes資源一般是經過向Kubernetes REST API提供JSON或YAML描述文件來建立的,固然還有如kubectl run相似的簡單命令,只不過配置屬性有限;github

1.1 查詢Pod描述文件

[d:\k8s]$ kubectl get po kubia-dms8n -o yaml
apiVersion: v1
kind: Pod
metadata:
  ......
spec:
  ......
status:
  ......

-o指定具體的格式,能夠是yaml或者json格式;描述文件主要包括apiVersion,kind,metadata,spec以及status這幾塊:json

  • apiVersion:Kubernetes API版本;
  • kind:Kubernetes對象資源類型;
  • metadata:包括名稱、命名空間、標籤和關於該容器的其餘信息;
  • spec:包含pod內容的實際說明,例如pod的容器、卷和其餘數據;
  • status:包含運行中的pod的當前信息,例如pod所處的條件、每一個容器的描述和狀態,以及內部IP和其餘基本信息;

1.2 建立YAML描述文件

apiVersion: v1
kind: Pod
metadata: 
   name: kubia-manual
spec: 
   containers: 
   - image: ksfzhaohui/kubia
     name: kubia
     ports: 
     - containerPort: 8080
       protocol: TCP

kubia-manual爲指定的pod的名稱,ksfzhaohui/kubia使用的鏡像,kubia爲容器的名稱,8080爲應用監聽的端口;這裏的端口純粹是展現性的,最終以容器中應用綁定的端口爲準;segmentfault

1.3 建立pod

D:\k8s>kubectl create -f kubia-manual.yaml
pod/kubia-manual created

以上建立了一個名稱爲kubia-manual的pod,能夠查詢當前的pod列表:api

D:\k8s>kubectl get pods
NAME           READY   STATUS    RESTARTS   AGE
kubia-dms8n    1/1     Running   0          25h
kubia-manual   1/1     Running   0          2m8s

kubia-manual已經準備就緒,固然也能夠查詢指定pod的描述文件(同1.1);瀏覽器

1.4 查看應用日誌

D:\k8s>kubectl logs kubia-manual -c kubia
kubia server is starting...

以上表示查詢Pod爲kubia-manual中的容器kubia的日誌(由於一個pod中能夠包含多個容器),目前只有服務啓動成功的日誌,爲了更好的觀察日誌變更,對容器中部署的應用發起請求,以前是經過穿件service來和pod進行通訊,Kubernetes還提供了配置端口轉發到pod的方式:服務器

[d:\k8s]$ kubectl port-forward kubia-manual 8888:8080
Forwarding from 127.0.0.1:8888 -> 8080
Forwarding from [::1]:8888 -> 8080

而後在本地經過瀏覽器訪問:http://localhost:8888/
image.png網絡

繼續觀察容器中的日誌,由於Pod中只有一個容器,因此這裏能夠不指定具體容器學習

C:\Users\hui.zhao.cfs>kubectl logs kubia-manual
kubia server is starting...
Received request from ::ffff:127.0.0.1
Received request from ::ffff:127.0.0.1

2.Pod標籤

標籤是一種簡單卻功能強大的Kubernetes特性,不只能夠組織pod,也能夠組織全部其餘的Kubernetes資源;標籤是能夠附加到資源的任意鍵值對,用以選擇具備該確切標籤的資源;

2.1 建立Pod指定標籤

apiVersion: v1
kind: Pod
metadata: 
   name: kubia-manual-v2
   labels: 
     creation_method: manual
     env: prod
spec: 
   containers: 
   - image: ksfzhaohui/kubia
     name: kubia
     ports: 
     - containerPort: 8080
       protocol: TCP

在指定Pod名稱kubia-manual-v2的下面指定了兩個標籤鍵值對,建立Pod:

D:\k8s>kubectl create -f kubia-manual-with-labels.yaml
pod/kubia-manual-v2 created

查詢全部Pod,並顯示標籤:

[d:\k8s]$ kubectl get po --show-labels
NAME              READY   STATUS    RESTARTS   AGE   LABELS
kubia-dms8n       1/1     Running   0          26h   run=kubia
kubia-manual      1/1     Running   0          49m   <none>
kubia-manual-v2   1/1     Running   0          51s   creation_method=manual,env=prod

2.2 修改Pod標籤

[d:\k8s]$ kubectl label po kubia-manual creation_method=manual
pod/kubia-manual labeled

[d:\k8s]$ kubectl get po -L creation_method,env
NAME              READY   STATUS    RESTARTS   AGE   CREATION_METHOD   ENV
kubia-dms8n       1/1     Running   0          26h                     
kubia-manual      1/1     Running   0          55m   manual            
kubia-manual-v2   1/1     Running   0          7m    manual            prod

kubia-manual沒有指定標籤,能夠進行添加,同時也能夠修改:

[d:\k8s]$ kubectl label po kubia-manual-v2 env=debug --overwrite
pod/kubia-manual-v2 labeled

[d:\k8s]$ kubectl get po -L creation_method,env
NAME              READY   STATUS    RESTARTS   AGE     CREATION_METHOD   ENV
kubia-dms8n       1/1     Running   0          26h                       
kubia-manual      1/1     Running   0          57m     manual            
kubia-manual-v2   1/1     Running   0          8m13s   manual            debug

在更改現有標籤時,須要使用--overwrite選項;

2.3 使用標籤選擇器列出pod

標籤選擇器容許咱們選擇標記有特定標籤的pod子集,並對這些pod執行操做;

[d:\k8s]$ kubectl get po -l creation_method=manual
NAME              READY   STATUS    RESTARTS   AGE
kubia-manual      1/1     Running   0          137m
kubia-manual-v2   1/1     Running   0          88m

這裏使用了creation_method=manual的標籤選擇器,這裏能夠是一個表達式,好比!=,in,notin等,多個條件用逗號分隔:

[d:\k8s]$ kubectl get po -l creation_method=manual,env=debug
NAME              READY   STATUS    RESTARTS   AGE
kubia-manual-v2   1/1     Running   0          98m

2.4 使用標籤和選擇器來約束pod調度

Kubernetes將集羣中的全部節點抽象爲一個總體的大型部署平臺,全部pod都是近乎隨機地調度到工做節點上;可是有時候咱們但願調度到固定的硬件基礎設施上,好比GPU加速,固態硬盤等等,Kubernetes也提供了相關的支持,經過標籤和選擇器來實現;

[d:\k8s]$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   29h   v1.17.0

[d:\k8s]$ kubectl label node minikube gpu=true
node/minikube labeled

[d:\k8s]$ kubectl get nodes -l gpu=true
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   29h   v1.17.0

以上咱們給默認的節點minikube添加一個gpu=true的標籤來表示此工做節點是GPU加速節點;接下來須要給Pod指定節點選擇器指定爲gpu=true,這樣就能夠將Pod調度到特意的工做節點上;

apiVersion: v1
kind: Pod
metadata: 
   name: kubia-gpu
spec: 
   nodeSelector:
     gpu: "true"
   containers: 
   - image: ksfzhaohui/kubia
     name: kubia

以上建立了YAML描述文件,指定了nodeSelector而且設置爲gpu=true,建立Pod:

[d:\k8s]$ kubectl create -f kubia-gpu.yaml
pod/kubia-gpu created

而後查看Pod的詳細信息,看對應的節點信息:

[d:\k8s]$ kubectl get po kubia-gpu -o yaml
apiVersion: v1
kind: Pod
metadata:
  name: kubia-gpu
spec:
  nodeName: minikube
  nodeSelector:
    gpu: "true"

節點名稱調度到了minikube,而且顯示了節點選擇器信息;

3.Pod註解

除標籤外,pod和其餘對象還能夠包含莊解;註解也是鍵值對,與標籤不一樣,註解並非爲了保存標識信息而存在的,它們不能像標籤同樣用千對對象進行分組,可是註解能夠容納更多的信息;能夠給Pod添加和修改註解:

[d:\k8s]$ kubectl annotate pod kubia-manual mycompany.com/someannotation="foo bar"
pod/kubia-manual annotated
[d:\k8s]$ kubectl describe pod kubia-manual
Name:         kubia-manual
Annotations:  mycompany.com/someannotation: foo bar
......

4.Pod命名空間

標籤和命令空間均可以用來組織成組的,Pod是能夠有多個標籤的,能夠重疊;當時命名空間是不可用重疊的,將Pod分隔成徹底獨立的組,這樣分組首先更加類型更加清晰,另外就是不一樣的命名空間可使用相同的資源名稱;

4.1 查找命名空間

[d:\k8s]$ kubectl get ns
NAME                   STATUS   AGE
default                Active   44h
kube-node-lease        Active   44h
kube-public            Active   44h
kube-system            Active   44h
kubernetes-dashboard   Active   44h

經過如上命令發現命名空間,以上這些命名空間都是默認建立好的,咱們建立的Pod都在default命令空間下,其餘的都是系統自帶的;

[d:\k8s]$ kubectl get po --namespace default
NAME              READY   STATUS    RESTARTS   AGE
kubia-dms8n       1/1     Running   0          2d2h
kubia-gpu         1/1     Running   0          30m
kubia-manual      1/1     Running   0          25h
kubia-manual-v2   1/1     Running   0          24h

也能夠經過查看指定命名空間對應的Pod列表;

4.2 建立命名空間

命名空間是一種和其餘資源同樣的Kubernetes資源,所以能夠經過將YAML文件提交到Kubernetes API服務器來建立該資源;

apiVersion: v1
kind: Namespace
metadata: 
  name: custom-namespace

kind指定爲Namespace,表示正在定義一個命名空間,custom-namespace爲命名空間的名字;

[d:\k8s]$ kubectl create -f custom-namespace.yaml
namespace/custom-namespace created
[d:\k8s]$ kubectl get ns
NAME                   STATUS   AGE
custom-namespace       Active   4s
......

以上經過yaml描述文件建立命名空間;

4.3 指定命名空間

能夠在建立Pod的時候指定命名空間:

[d:\k8s]$ kubectl create -f kubia-manual.yaml -n custom-namespace
pod/kubia-manual created

[d:\k8s]$ kubectl get po --namespace default
NAME              READY   STATUS    RESTARTS   AGE
kubia-manual      1/1     Running   0          19h

[d:\k8s]$ kubectl get po --namespace custom-namespace
NAME           READY   STATUS    RESTARTS   AGE
kubia-manual   1/1     Running   0          2m19s

能夠看到在default和custom-namespace命名空間中存在相同名稱的Pod,這就是命名空間的隔離功能;注:儘管命名空間將對象分隔到不一樣的組,只容許你對屬於特定命名空間的對象進行操做, 但實際上命名空間之間並不提供對正在運行的對象的任何隔離。

5.中止和移除pod

5.1 按名稱刪除pod

[d:\k8s]$ kubectl delete po kubia-gpu
pod "kubia-gpu" deleted
[d:\k8s]$ kubectl get po --namespace default
NAME              READY   STATUS        RESTARTS   AGE
kubia-gpu         1/1     Terminating   0          104m

在刪除pod的過程當中,實際上咱們在指示Kubernetes終止該pod中的全部容器,Kubernetes向進程發送一個SIGTERM信號並等待必定的秒數使其正常關閉;關閉的過程當中能夠發現Pod的狀態爲Terminating終結中;

5.2 使用標籤選擇器刪除pod

[d:\k8s]$ kubectl delete po -l creation_method=manual
pod "kubia-manual" deleted
pod "kubia-manual-v2" deleted

會列出全部被刪除的Pod;

5.3 經過刪除整個命名空間來刪除pod

[d:\k8s]$ kubectl delete ns custom-namespace
namespace "custom-namespace" deleted

[d:\k8s]$ kubectl get po --namespace custom-namespace
No resources found in custom-namespace namespace.

刪除命名空間的同時,其中包含的Pod都會被刪除;

5.4 刪除全部Pod

[d:\k8s]$ kubectl delete po --all
pod "kubia-dms8n" deleted
pod "kubia-gkv4v" deleted
pod "kubia-zxd9q" deleted

[d:\k8s]$ kubectl get po
NAME          READY   STATUS    RESTARTS   AGE
kubia-c9hlb   1/1     Running   0          46s
kubia-f4kwr   1/1     Running   0          46s
kubia-vttrc   1/1     Running   0          46s

刪除完全部Pod以後,又從新出現了三個Pod,主要緣由是上面三個Pod是否是直接建立的,而是建立一個ReplicationController,而後再由ReplicationController建立pod;若是想要刪除該pod須要刪除ReplicationController,能夠經過使用以下命令:

[d:\k8s]$ kubectl delete all --all
pod "kubia-c9hlb" deleted
pod "kubia-f4kwr" deleted
pod "kubia-vttrc" deleted
replicationcontroller "kubia" deleted
service "kubernetes" deleted
service "kubia" deleted

[d:\k8s]$ kubectl get po
No resources found in default namespace.

總結

本文繼續在閱讀Kubernetes in Action過程當中,實際操做的筆記;主要介紹了Kubernetes的核心組件Pod,包括Pod的建立,標籤,主鍵,命名空間以及中止和移除pod。

參考

Kubernetes in Action

博客地址

Github

相關文章
相關標籤/搜索