pod和容器(容易混淆的地⽅)
在Kubenetes中,所有的容器均在 pod 中运⾏,⼀个pod可以承载⼀个或者多个相关的docker容器(或rkt,以及⽤户⾃定义容器),同⼀个Pod中的容器可以部署在同⼀个物理机器(可以叫宿主机)上并且能够共享资源。⼀个Pod也可以包含多个磁盘卷组(volumes),这些卷组将会以⽬录的形式提供给⼀个容器,或者被所有Pod中的容器共享,对于⽤户创建的每个Pod,系统会⾃动选择那个健康并且有⾜够容量的机器,然后创建类似容器的容器,当容器创建失败的时候,容器会被node agent⾃动的重启,这个node agent叫kubelet,但是,如果是Pod失败或者机器,它不会⾃动的转移并且启动,除⾮⽤户定义了 replication controller。
docker进入容器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 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={.ainers[*].name} 命令查看。
在master上执⾏:
[root@fpNet-web-38 ~]# kubectl get pods stp-node-0 -o jsonpath={.ainers[*].name}
stp-node
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论