pod和容器(容易混淆的地方)

     在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

 

posted @ 2022-01-24 20:48  jinzi  阅读(3465)  评论(0编辑  收藏  举报