在Kubenetes中,所有的容器均在 pod 中運行,一個pod可以承載一個或者多個相關的docker容器(或rkt,以及用戶自定義容器),同一個Pod中的容器可以部署在同一個物理機器(可以叫宿主機)上並且能夠共享資源。一個Pod也可以包含多個磁盤卷組(volumes),這些卷組將會以目錄的形式提供給一個容器,或者被所有Pod中的容器共享,對於用戶創建的每個Pod,系統會自動選擇那個健康並且有足夠容量的機器,然后創建類似容器的容器,當容器創建失敗的時候,容器會被node agent自動的重啟,這個node agent叫kubelet,但是,如果是Pod失敗或者機器,它不會自動的轉移並且啟動,除非用戶定義了 replication controller。
pod是k8s集群管理的最小單元,但是容器包含在pod中,一個pod中有一個pause容器和若干個業務容器,而容器就是單獨的一個容器,簡而言之,pod是一組容器+pause容器構成,而容器單指一個容器。 所以我們在說pod的時候不能說pod容器怎么怎么樣之類的說法。
k8s是管理整個集群中的所有pod,包括調度pod,刪除pod,更新pod等。
一、POD(是k8s的核心,各種應用都基本以pod和yaml來進行管理)
Kubernetes 使用 Pod 來管理容器,即用master來進行管理, 每個 Pod 可以包含一個或多個緊密關聯的業務容器。一對多的關系。
而pod是部署到node節點上的或者master也可以設置可以部署pod, 假設部署到了node節點上, node節點上必然有docker, 我們可以通過docker命令進入容器
也可以在 master上通過執行 kubectl exec -it mdp-cc-85fd974f8c-slcwk -n default -- /bin/bash 這樣的命令進入pod 查看內部情況。
容器是一種便攜式、輕量級的操作系統級虛擬化技術,容器化不定是采用docker,但是這里我說的都是docker方式。它使用 NameSpace 隔離不同的軟件運行環境,並通過鏡像自包含軟件的運行環境,從而使得容器可以很方便的在任何地方運行。由於容器體積小且啟動快,因此可以在每個容器鏡像中打包一個應用程序。是一對一關系。
二、Node(pod載體)
Node節點是 Pod 真正運行的宿主機,可以是物理機,也可以是虛擬機
為了管理 Pod,每個 Node 節點上至少要安裝docker 、安裝kubelet(二進制是hyperkube) ,同時需要操作系統支持,centos6就對docker支持不好
三、Namespace(可以理解為隔離資源或者應用)
Namespace 是對一組資源和對象的抽象集合,比如可以用來將系統內部的對象划分為不同的項目組或用戶組。常見的 pods, services, replication controllers 和 deployments 等都是屬於某一個 namespace 的(默認是 default),我們開發的時候不同項目可以設置不同的 namespace,同時用k8s dashboard 令牌方式管理,而 node, persistentVolumes 等則不屬於任何 namespace
四、Service(對外提供服務)
Service 是應用服務的抽象,說白點就是nginx配置域名,指向集群master中暴露出來的端口,這個端口實際就是我們暴露的服務, labels 為應用提供負載均衡和服務發現機制。
匹配 labels 的 Pod IP 和端口列表組成 endpoints,由 kube-proxy 負責將服務 IP 負載均衡到這些 endpoints 上。
五、網絡通訊方式
我們考慮一下K8s集群中docker容器之間是如何通訊的?
我們這里我們有幾種pod的情況
1)在同一個POD上容器通信.
2)同一個Node,不同POD.
3)不同Node,不同POD.
1) 同一個POD上Container通信
在k8s中每個Pod中管理着一組Docker容器,既然是一組就是多個,每個docker容器,通過docker ps 查看都有一個容器id,
例如在node上
[root@ht5 calico]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8da13e0e551d e76b1866726d "/bin/sh -c 'java ${…" 16 hours ago Up 16 hours k8s_config-server-node_config-server-node-0_default_b0978e90-8f36-11ec-b44a-060eb4000e9d_0 370e764c4422 k8s.gcr.io/pause-amd64:3.0 "/pause" 16 hours ago Up 16 hours
這組Docker容器共享同一個網絡命名空間,Pod中的每個Docker容器擁有與Pod相同的IP和port地址空間,並且由於他們在同一個網絡命名空間,他們之間可以通過localhost相互訪問。
如果我們想看某個pod里面部署了幾個容器,我們可以通過 kubectl get pods mypodname -o jsonpath={.spec.containers[*].name} 命令查看。
在master上執行:
[root@fpNet-web-38 ~]# kubectl get pods stp-node-0 -o jsonpath={.spec.containers[*].name}
stp-node
