kubernetes中的Pod簡述與實踐
阿新 • • 發佈:2018-05-17
kubernetes中的Pod簡述與實 pod kubernetes deployment kubernetes中的Pod簡述與實踐
- Pod的概念
詳細的Pod解釋可參考k8s官網,關於Pod的概念主要有以下幾點:
(1)Pod是kubernetes中你可以創建和部署的最小也是最簡的單位。一個Pod代表著集群中運行的一個進程;
(2)在Kubrenetes集群中Pod的使用方式;
(3)Pod中如何管理多個容器 - 理解Pod
上面已經說了“Pod是kubernetes中你可以創建和部署的最小也是最簡的單位。一個Pod代表著集群中運行的一個進程。”Pod中封裝著應用的容器(有的情況下是好幾個容器),存儲、獨立的網絡IP,管理容器如何運行的策略選項。Pod代表著部署的一個單位:kubernetes中應用的一個實例,可能由一個或者多個容器組合在一起共享資源。#說明 Docker是kubernetes中最常用的容器運行時,但是Pod也支持其他容器運行時。
#容器進行時,看參考如下文章或博客:
(1)解密容器運行時
(2)Kubernetes(k8s)容器運行時(CRI)簡介
(3)容器運行時接口、容器網絡接口、容器存儲接口解析 - Kubrenetes集群中Pod的兩種使用方式之一
一個Pod中運行一個容器。
“每個Pod中一個容器”的模式是最常見的用法;在這種使用方式中,你可以把Pod想象成是單個容器的封裝,kuberentes管理的是Pod而不是直接管理容器。#實戰 ##創建一個nginx容器的可以定義為: cat pod1-deployment apiVersion: v1 kind: Pod metadata: name: nginx-test namespace: test labels: app: web spec: containers: - name: front-end image: nginx:1.7.9 ports: - containerPort: 80
#創建pod kubectl create -f pod1-deployment --namespace=test pod "nginx-test" created
#查看pod kubectl get po --namespace=test NAME READY STATUS RESTARTS AGE nginx-test 1/1 Running 0 1m
#查看pod詳細情況 kubectl describe po nginx-test --namespace=test Name: nginx-test Namespace: test Node: swarm1/10.0.0.38 Start Time: Thu, 17 May 2018 17:33:50 +0800 Labels: app=web Annotations: <none> Status: Running IP: 10.244.2.131 Containers: front-end: Container ID: docker://5af319b84acfa076ac8500f39c81ff05e6664e6562d9593f5c7ba2fde0118372 Image: nginx:1.7.9 Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451 Port: 80/TCP Host Port: 0/TCP State: Running Started: Thu, 17 May 2018 17:34:07 +0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-z4ffx (ro) ... ...
#進入到pod(容器)內部 kubectl exec -it nginx-test /bin/bash --namespace=test root@nginx-test:/# nginx -v nginx version: nginx/1.7.9
##說明 kubectl exec 這條命令是對docker exec命令的包裝,可以讓你執行容器內部的命令,如果pod中只有一個容器在運行則此命令可以作用在pod上如: kubectl exec -it [pod] /bin/bash。 我們可以使用如下命令來進入一個運行中的pod: kubectl exec -it [pod name] --/bin/bash, -i:用來啟動標準輸入流STDIN -t:將輸入流定向到TTY(偽終端)中 -c [container-name]:一個Pod中啟動了多個容器,使用該參數來進入特定的容器中。
- Kubrenetes集群中Pod的兩種使用方式之二
在一個Pod中同時運行多個容器。
一個Pod中也可以同時封裝幾個需要緊密耦合互相協作的容器,它們之間共享資源。這些在同一個Pod中的容器可以互相協作成為一個service單位——一個容器共享文件,另一個“sidecar”容器來更新這些文件。Pod將這些容器的存儲資源作為一個實體來管理。#實戰 ##在一個pod裏放置兩個容器:nginx與redis cat test-deployment apiVersion: v1 kind: Pod metadata: name: rss-site namespace: test labels: app: web spec: containers: - name: front-end image: nginx:1.7.9 ports: - containerPort: 80 - name: rss-reader image: dockerhub.com/redis:3.2.8 ports: - containerPort: 88
##說明:文檔中“ image: dockerhub.com/redis:3.2.8”並不是真實的,如有需要請自行去下載!
#創建pod kubectl create -f test-deployment --namespace=test pods "rss-site"created
#查看pod kubectl get po --namespace=test NAME READY STATUS RESTARTS AGE rss-site 2/2 Running 0 2h
#查看pod詳細情況 kubectl describe po rss-site --namespace=test Name: rss-site Namespace: test Node: swarm1/10.0.0.38 Start Time: Thu, 17 May 2018 16:31:57 +0800 Labels: app=web Annotations: <none> Status: Running IP: 10.244.2.130 Containers: front-end: Container ID: docker://adb8115e7a559b0680a0a8bc79c4f535f1c6b8227acdb25f406c41bc7a29ac3c Image: nginx:1.7.9 Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451 Port: 80/TCP Host Port: 0/TCP State: Running Started: Thu, 17 May 2018 16:32:20 +0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-z4ffx (ro) rss-reader: Container ID: docker://19e642c9bfa2fe2c5161ea015ea02c0470eb360744df452a28f975f81acce30a Image: dockerhub.datagrand.com/global/redis:3.2.8 Image ID: docker-pullable://dockerhub.datagrand.com/global/redis@sha256:de7a70c04bb2de36bb32c44fe26ce92b9715922f80e07cb3f25aaf00a1f49bb5 Port: 88/TCP Host Port: 0/TCP State: Running Started: Thu, 17 May 2018 16:32:24 +0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-z4ffx (ro)
#分別進入pod(容器)內部 ##進入front-end kubectl exec -it rss-site -c front-end /bin/bash --namespace=test root@rss-site:/# nginx -v nginx version: nginx/1.7.9
#進入rss-reade kubectl exec -it rss-site -c rss-reader /bin/bash --namespace=test root@rss-site:/data#
##說明
在一個Pod中同時運行多個容器是一種比較高級的用法。只有當你的容器需要緊密配合協作的時候才考慮用這種模式。例如,你有一個容器作為web服務器運行,需要用到共享的volume,有另一個“sidecar”容器來從遠端獲取資源更新這些文件,如下圖所示: - Pod資源
Pod中可以共享兩種資源:網絡和存儲。
(1)網絡
每個Pod都會被分配一個唯一的IP地址。Pod中的所有容器共享網絡空間,包括IP地址和端口。Pod內部的容器可以使用localhost互相通信。Pod中的容器與外界通信時,必須分配共享網絡資源(例如使用宿主機的端口映射)。
(2)存儲
可以Pod指定多個共享的Volume。Pod中的所有容器都可以訪問共享的volume。Volume也可以用來持久化Pod中的存儲資源,以防容器重啟後文件丟失。 - 使用Pod
你很少會直接在kubernetes中創建單個Pod。因為Pod的生命周期是短暫的,用後即焚的實體。當Pod被創建後(不論是由你直接創建還是被其他Controller),都會被Kuberentes調度到集群的Node上。直到Pod的進程終止、被刪掉、因為缺少資源而被驅逐、或者Node故障之前這個Pod都會一直保持在那個Node上。
##說明
(1)重啟Pod中的容器跟重啟Pod不是一回事。Pod只提供容器的運行環境並保持容器的運行狀態,重啟容器不會造成Pod重啟。
(2)Pod不會自愈。如果Pod運行的Node故障,或者是調度器本身故障,這個Pod就會被刪除。同樣的,如果Pod所在Node缺少資源或者Pod處於維護狀態,Pod也會被驅逐。Kubernetes使用更高級的稱為Controller的抽象層,來管理Pod實例。雖然可以直接使用Pod,但是在Kubernetes中通常是使用Controller來管理Pod的。 - Pod和Controller
Controller可以創建和管理多個Pod,提供副本管理、滾動升級和集群級別的自愈能力。例如,如果一個Node故障,Controller就能自動將該節點上的Pod調度到其他健康的Node上。
具體的實例可參考:創建和管理多個Pod--Deployment
kubernetes中的Pod簡述與實踐