在上文Kubernetes入門篇中對kubernetes有一個初步的介紹,本文繼續介紹kubernetes的核心組件Pod,固然仍是以實際操做爲主;另外說明一點的是本系列是本人的學習筆記。node
Pod是Kubernetes中最爲重要的核心概念,表明了Kubernetes中的基本構建模塊;一個Pod能夠包含一個容器或者多個容器,Pod自己是輕量級的,因此常常會建立不少Pod,緊密相關的容器進程常常放到同一個Pod中;一個Pod中的容器運行於相同的Network命名空間中,所以它們共享相同的IP地址和端口空間;Kubernetes集羣中的全部Pod都在同一個共享網絡地址空間中,每一個Pod均可以經過其餘Pod的IP地址來實現相互訪問,就像局域網上的計算機同樣。git
Pod和其餘Kubernetes資源一般是經過向Kubernetes REST API提供JSON或YAML描述文件來建立的,固然還有如kubectl run相似的簡單命令,只不過配置屬性有限;github
[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: 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
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);瀏覽器
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/;網絡
繼續觀察容器中的日誌,由於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
標籤是一種簡單卻功能強大的Kubernetes特性,不只能夠組織pod,也能夠組織全部其餘的Kubernetes資源;標籤是能夠附加到資源的任意鍵值對,用以選擇具備該確切標籤的資源;
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
[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選項;
標籤選擇器容許咱們選擇標記有特定標籤的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
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,而且顯示了節點選擇器信息;
除標籤外,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 ......
標籤和命令空間均可以用來組織成組的,Pod是能夠有多個標籤的,能夠重疊;當時命名空間是不可用重疊的,將Pod分隔成徹底獨立的組,這樣分組首先更加類型更加清晰,另外就是不一樣的命名空間可使用相同的資源名稱;
[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列表;
命名空間是一種和其餘資源同樣的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描述文件建立命名空間;
能夠在建立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,這就是命名空間的隔離功能;注:儘管命名空間將對象分隔到不一樣的組,只容許你對屬於特定命名空間的對象進行操做, 但實際上命名空間之間並不提供對正在運行的對象的任何隔離。
[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終結中;
[d:\k8s]$ kubectl delete po -l creation_method=manual pod "kubia-manual" deleted pod "kubia-manual-v2" deleted
會列出全部被刪除的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都會被刪除;
[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