Kubernetes核心对象
在《Kubernetes 简介》中,我们了解到了 Kubernetes 是由哪些组件组成的,但是,我们现在只观察到了“形”,并没有领会其“神”,本章节就带大家来了解一下 Kubernetes 的核心对象有那些。
Kubernetes 的所有管理能力构建在对象抽象的基础上,它的核心对象有:
- Node:计算节点的抽象,用来描述计算节点的资源抽象、健康状态等
- Namespace:资源隔离的基本单位,只是逻辑上的隔离
- Pod:用来描述应用实例,包括镜像地址、资源需求等,是 Kubernetes 最核心的对象
- Service:为 Pod 提供集群内部访问入口,可以负载多个 Pod
# Node
Node 是 Pod 真正运行的主机,可以是物理机、也可以是虚拟机。
在每个 Node 节点上,必须安装 kubelet、kube-proxy 以及容器运行时,容器运行时可以选择 Docker、Containerd、Rkt 等,在新版本的 Kubernetes 中,docker-shim 从 Kubernetes 中移除了,如果要使用 Docker,就需要自己安装 docker-shim,所以如果是新版本的 Kubernetes,建议使用 Containerd,而不是 Docker。
# Namespace
Namespace 是对一组资源和对象的抽象集合。
常见的 pods,services,deployments 等都属于某一个 Namespace,我们可以通过kubectl get ns
来查看集群有多少 Namespace,如下:
## kubectl get ns
NAME STATUS AGE
default Active 610d
kube-node-lease Active 610d
kube-public Active 610d
kube-system Active 610d
2
3
4
5
6
# Pod
Pod 是一组紧密关联的容器组合,他们共享 PID,IPC,NETWORK,UTS namespace,一个 Pod 里可以运行多个容器,一个 Pod 里的多个容器共享网络和文件系统,它们可以直接通过 localhost 口进行通信。
Pod 是一个逻辑上的概念,在宿主机上并不存在一个 Pod 边界或者隔离环境,真正处理的是操作系统的 namespace 和 cgroups。
如上图,Pod 中的所有容器共享一个 Network namespace,并且可以声明共享同一个 volume,但是为了避免业务容器之间的强依赖,Kubernetes 引入了 Infra Container,它一定是 Pod 中最先启动的容器,其他的容器通过 Joine Network namespace 和 Infra Container 建立关联。
所以对于一个 Pod 中的多个容器来说:
- 它们可以直接通过 localhost 进行通信
- 它们看到的网络设备跟 Infra Container 完全一样
- 一个 Pod,不管有多少容器,它的 IP 地址只有一个
- Pod 的生命周期跟 Infra Container 保持一致,跟其他业务容器无关
一个 Pod 代表着某个应用程序的特定实例,如果我们需要去扩展这个应用程序,那么就意味着需要为该应用程序同时创建多个 Pod 实例,每个实例都代表着应用程序的一个运行副本。而这些副本化的 Pod 对象的创建和管理,都是由一组称为 Controller 的对象实现,比如 Deployment 控制器对象。
当创建 Pod 时,我们还可以使用 Pod Preset 对象为 Pod 注入特定的信息,比如 Configmap、Secret、存储卷、卷挂载、环境变量等。有了 Pod Preset 对象,Pod 模板的创建就不需要为每个模板显示提供所有信息。
基于预定的期望状态和各个节点的资源可用性,Master 会把 Pod 对象调度至选定的工作节点上运行,工作节点从指向的镜像仓库进行下载镜像,并在本地的容器运行时环境中启动容器。Master 会将整个集群的状态保存在 etcd 中,并通过 API Server 共享给集群的各个组件和客户端。
# Service
Pod 是灵活的,Pod 的 IP 是动态的,也就是说 Pod 的每次创建其 IP 地址是变化的。为了为应用提供稳定的访问入口,Kubernetes 引入了 Service 的概念。
Service 是应用服务的抽象,通过 Labels 为应用提供负载均衡和服务发现。匹配 Labels 的 Pod 和端口会加入到对应的 Endpoints 中,由 kube-proxy 负责将 Service IP 负载到这些 Endpoints 上。
每个 Service 会自动分配一个虚拟的 Cluster IP 和 DNS 名,只要这个 Service 不删除,其 IP 地址不会改变,其他服务可以通过 IP 地址和 DNS 来访问服务,不需要了解后端容器的 IP 是什么。
Service 的类型有四种,Cluster IP,LoadBalance,NodePort,ExternalName。其中 Cluster IP 是默认的类型。
(1)、Cluster IP:通过 集群内部 IP 暴露服务,默认是这个类型,选择该值,这个 Service 服务只能通过集群内部访问;
(2)、LoadBalance:使用云提供商的负载均衡器,可以向外部暴露服务,选择该值,外部的负载均衡器可以路由到 NodePort 服务和 Cluster IP 服务;
(3)、NodePort:如果选择该值,这个 Service 可以通过 NodeIP:NodePort 访问这个 Service 服务,NodePort 会路由到 Cluster IP 服务,这个 Cluster IP 会通过请求自动创建;
(4)、ExternalName:通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容,没有任何类型代理被创建,可以用于访问集群内其他没有 Labels 的 Pod,也可以访问其他 NameSpace 里的 Service。
# 总结
通过本章,我们了解到 Kubernetes 有哪些核心对象,它们分别代表什么意思,比如什么 Node,什么是 Pod。当然,在这章只是做了简单的介绍,具体的操作实践会在后面详细述说。