Node
Node: 节点,一个物理机或者一台虚拟机
Pod
Pod是K8S的最小调度单元,可以理解为容器的抽象。一个Pod就是一个或者多个应用容器的组合。它创建了一个容器的运行环境,在这个环境中,容器可以共享一些资源,比如网络,存储和运行时的一些配置等等,用到了Linux的namespace和cgroup功能。
Pod分为单容器Pod和多容器Pod,一般是单容器Pod
多容器Pod一般仅仅限于这些容器是高度耦合的情况,他们为了共享一些配置或者资源,不得不把他们放到一个容器中
应用程序要访问数据库的话,只需要知道数据库的IP地址,这里的IP地址是Pod在创建的时候自动创建的,是一个集群内部的IP地址(无法从集群外部访问),Pod之间通过这些IP地址进行通信。
Pod IP不稳定的问题
Pod并不是稳定的实体,它们非常容易被创建或者销毁,比如发生故障的时候,K8S会自动将发生故障的POD销毁掉然后从创建一个新的Pod替代他,这个时候IP也会重新分配,如果应用程序还用原来的IP的话,就会找不到这个应用
要解决这个问题,我们一般采用Service,Service 为一组 Pod 提供了一个稳定的抽象层。 Service 有自己的 ClusterIP (集群内部 IP),以及一个 DNS 名称。 即使后端 Pod 被销毁和重建,Service 的 ClusterIP 和 DNS 名称都不会改变。
Service
为了解决上面Pod IP不稳定的问题,K8S提供了一个名为Service的资源对象,它可以将一组Pod封装成一个服务,这个服务通过一个统一的入口来访问
内部服务和外部服务
内部服务:不能暴露或者不需要暴露给外部的服务,比如数据库、缓存、消息队列等,这些服务只需要在集群内部访问就可以了。
外部服务:后端的 API 接口或者前端界面等等,这些就是需要暴露给用户的服务。
K8S Service的几种类型
K8S Service的几种类型,决定了Service如何暴露给 外部流量,主要的类型有:
ClusterIP(默认)
这是一个默认的Service类型,它在集群内部创建一个虚拟IP地址,集群内的POD可以通过这个IP地址访问Service
从集群外部无法直接访问ClusterIP Service,这个主要用于集群内部服务之间的通信。
虽然Cluster IP本身不是外部服务,但它是其他外部服务类型的基础。
ClusterIP 最适合的场景:
微服务架构(如前端调用后端 API)
数据库 Service(如 MySQL、Redis 仅供集群内部访问)
内部消息队列(如 Kafka、RabbitMQ)
NodePort
NodePort Service除了拥有ClusterIP的功能以外,还在每个Node节点上打开一个指定端口(默认为 30000-32767 范围)。)
外部流量能通过NodeIP:NodePort访问Service
适用场景:
在开发或者测试环境,或者对外部访问要求不高的场景。
LoadBalancer
LoadBalancer Service是云环境中暴露外部服务的标准方式。
K8S会自动在运提供商处创建一个负载均衡器,将外部流量路由到Service关联的POD
适用场景: 需要高可用,可扩展,能够处理大量流量的外部服务
Deployment
如果服务端只有一个节点的话,这个节点发生故障会导致服务宕机(发生单点故障),无法实现搞可用性。
Deployment就是用来定义和管理应用程序的副本数量以及应用程序的更新策略,将一个或者多个POD结合在一起,简化应用程序的部署和更新操作,还可以副本控制,滚动更新,自动扩缩容等。
Ingress
https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
K8S中用来管理“集群内服务怎样被外部访问”的一种资源。
可以根据不同的域名,路径,把外部的HTTP/HTTPS请求灵活地路由到集群内部对应的Service上。
通过配置,Ingress 可为 Service 提供外部可访问的 URL、对其流量作负载均衡、 终止 SSL/TLS,以及基于名称的虚拟托管等能力。 Ingress 控制器 负责完成 Ingress 的工作,具体实现上通常会使用某个负载均衡器, 不过也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会随意公开端口或协议。 将 HTTP 和 HTTPS 以外的服务开放到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的 Service。
Volume
Kubernetes 卷为 Pod 中的容器提供了一种通过文件系统访问和共享数据的方式。存在不同类别的卷,你可以将其用于各种用途,例如:
基于 ConfigMap 或 Secret 填充配置文件
为 Pod 提供一些临时的涂销空间
在同一个 Pod 中的两个不同容器之间共享文件系统
在两个不同的 Pod 之间共享文件系统(即使这些 Pod 运行在不同的节点上)
持久化存储数据,这样即使 Pod 重启或被替换,存储的数据仍然可用
基于容器所在 Pod 的详细信息,将配置信息传递给运行在容器中的应用 (例如告诉边车容器:Pod 运行在哪个命名空间)
以只读权限访问另一个容器镜像中的数据
数据共享可以发生在容器内不同本地进程之间,或在不同容器之间,或在多个 Pod 之间。
StatefulSet
https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/
Stateful在Kubernetes中的作用是处理有状态的应用程序
StatefulSet 运行一组 Pod,并为每个 Pod 保留一个稳定的标识。 这可用于管理需要持久化存储或稳定、唯一网络标识的应用。