1. 程式人生 > >kubernetes中的Pod簡述與實踐

kubernetes中的Pod簡述與實踐

kubernetes中的Pod簡述與實 pod kubernetes deployment

kubernetes中的Pod簡述與實踐

  1. Pod的概念
    詳細的Pod解釋可參考k8s官網,關於Pod的概念主要有以下幾點:
    (1)Pod是kubernetes中你可以創建和部署的最小也是最簡的單位。一個Pod代表著集群中運行的一個進程;
    (2)在Kubrenetes集群中Pod的使用方式;
    (3)Pod中如何管理多個容器
  2. 理解Pod
    上面已經說了“Pod是kubernetes中你可以創建和部署的最小也是最簡的單位。一個Pod代表著集群中運行的一個進程。”Pod中封裝著應用的容器(有的情況下是好幾個容器),存儲、獨立的網絡IP,管理容器如何運行的策略選項。Pod代表著部署的一個單位:kubernetes中應用的一個實例,可能由一個或者多個容器組合在一起共享資源。
    #說明
    Docker是kubernetes中最常用的容器運行時,但是Pod也支持其他容器運行時。

    #容器進行時,看參考如下文章或博客:
    (1)解密容器運行時
    (2)Kubernetes(k8s)容器運行時(CRI)簡介
    (3)容器運行時接口、容器網絡接口、容器存儲接口解析

  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中啟動了多個容器,使用該參數來進入特定的容器中。
  4. 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”容器來從遠端獲取資源更新這些文件,如下圖所示:
    技術分享圖片

  5. Pod資源
    Pod中可以共享兩種資源:網絡和存儲。
    (1)網絡
    每個Pod都會被分配一個唯一的IP地址。Pod中的所有容器共享網絡空間,包括IP地址和端口。Pod內部的容器可以使用localhost互相通信。Pod中的容器與外界通信時,必須分配共享網絡資源(例如使用宿主機的端口映射)。
    (2)存儲
    可以Pod指定多個共享的Volume。Pod中的所有容器都可以訪問共享的volume。Volume也可以用來持久化Pod中的存儲資源,以防容器重啟後文件丟失。
  6. 使用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的。
  7. Pod和Controller
    Controller可以創建和管理多個Pod,提供副本管理、滾動升級和集群級別的自愈能力。例如,如果一個Node故障,Controller就能自動將該節點上的Pod調度到其他健康的Node上。
    具體的實例可參考:創建和管理多個Pod--Deployment

kubernetes中的Pod簡述與實踐