Kubernetes 特点
轻量级:资源消耗小,开源,弹性伸缩,负载均衡: IPVS
Etcd
etcd 的官方将它定位成一个可信赖的分布式键值存储服务,它能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。推荐 Kubernetes 集群中使用 Etcd v3 版, v2 版本已在 Kubernetes v1.11 中弃用
Master
Master 是 K8S 集群的大脑,它的主要职责是调度,即决定将应用放在哪里运行。Master 运行 Linux 操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个 Master,副本数最好是 >=3 奇数个。Master 运行着如下 Daemon 服务:kube-apiserver、kube-scheduler、kube-controller-manager。
-
API Server 提供 HTTP/HTTPS RESTful API,即 Kubernetes API。API Server 是 Kubernetes Cluster 的前端接口,各种客户端工具(CLI 或 UI)以及 Kubernetes 其他组件可以通过它管理 Cluster 的各种资源,即所有服务访问的统一入口。
-
Scheduler 负责接受任务,选择合适的节点进行分配任务。
-
Controller-Manager:作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
Node
Node 的职责是运行容器应用。Node 由 Master 管理,Node 负责监控并汇报容器的状态,并根据 Master 的要求管理容器的生命周期。Node 运行在 Linux 操作系统,可以是物理机或者是虚拟机。Node 是 Pod 运行的地方,运行的 Kubernetes 组件有 kubelet、kube-proxy 和 Pod 网络(例如 flannel)
- kubelet 直接跟容器引擎(Docker)交互实现容器的生命周期管理,同时负责Volume和网络的管理
- kube-proxy 负责写入规则至 IPTABLES, IPVS 实现服务映射访问。service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。service会为这个LB提供一个IP,一般称为cluster IP。kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问。
- Pod 网络 Pod 要能够相互通信,Kubernetes Cluster 必须部署 Pod 网络,flannel 是其中一个可选方案。
其他插件
COREDNS: 可以为集群中的 SVC 创建一个域名 IP 的对应关系解析
DASHBOARD:给 K8S 集群提供一个 B/S 结构访问体系
INGRESS CONTROLLER:K8S 官方只能实现四层代理, INGRESS 可以实现七层代理
FEDERATION: 提供一个可以跨集群中心多 K8S 统一管理功能
PROMETHEUS: 提供 K8S 集群的监控能力
ELK:提供 K8S 集群日志统一分析介入平台
Pod
Pod 是 Kubernetes 的最小工作单元。每个 Pod 包含一个或多个容器。每个 Pod 启动时都会启动一个 pause 的容器,Pod 中所有的容器都会共享该 pause 容器的网络栈和 volume。即 Pod 内的网络是互通的,若 下面 php-fpm 容器启的是 80端口,nginx 容器启的也是 80 端口,则会导致容器启动失败。
Pod 控制器类型
Kubernetes 通常不会直接创建 Pod,而是通过 Controller 来管理 Pod 的。Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等。为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet 、StatefuleSet、Job 等。
-
ReplicationController :用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod 来代替;而如果异常多出来的容器也会自动回收。在新版的 Kubernetes 中建议使用 ReplicaSet 来取代 ReplicationController 。
-
ReplicaSet :跟 ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector 。通常不需要直接使用 ReplicaSet。
-
Deployment :虽然 ReplicaSet 可以单独使用,但是一般建议使用 Deployment 来自动管理 ReplicaSet ,这样就无需担心跟其他机制的不兼容(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持)。
-
HPA (Horizontal Pod Autoscaling):仅适用于 Deployment 和 ReplicaSet,在 v1 版本中仅支持根据 Pod 的 CPU 利用率扩容,在 vlalpha 版本中,支持根据内存和用户自定义的 metric 扩缩容。
-
StatefuleSet:为了解决有状态服务的问题(对应 Deployment 和 ReplicaSet 是为了无状态服务而设计),其应用场景包括:① 稳定的持久化存储,即 Pod 重新调度后还是能访问到相同的持久化数据,基于PVC实现。② 稳定的网络标志,即 Pod 重新调度后其 PodName 和 HostName 不变,基于 Headless Service (即没有 Cluster IP 的 Service)来实现。③ 有序部署,有序扩展,即 Pod 是有顺序的,在部署或扩展的时候要依据定义的顺序依次进行(即从 0 到 N-1,在下一个 Pod 运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态),基于 init containers 来实现。④ 有序收缩,有序删除(即从 N-1 到 0)
-
DaemonSet :确保全部 (或者一些) Node 上运行一个 Pod 副本。当有 Node 加入集群时,也会为他们新增一个 Pod。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。使用 DaemonSet 的一些典型用法:①运行集群存储 daemon,例如在每个 node 上运行 glusterd, ceph。② 在每个 Node 上运行日志收集 daemon,例如 fluentd, logstash。③ 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter
-
Job : 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束
-
Cron Job :基于时间的 Job ,即:① 在给定时间点只运行一次 ②周期性地在给定时间点运行
Service
Deployment 可以部署多个副本,每个 Pod 都有自己的 IP,Pod IP 很可能会被频繁地销毁和重启,它们的 IP 会发生变化,用 IP 来访问不太现实。
这时候就需要使用 Service。Kubernetes Service 定义了外界访问一组特定 Pod 的方式。Service 有自己的 IP 和端口,Service 为 Pod 提供了负载均衡。
Kubernetes 运行容器(Pod)与访问容器(Pod)这两项任务分别由 Controller 和 Service 执行。
Namespace
Namespace 可以将一个物理的 K8S 集群逻辑上划分成多个虚拟 Cluster,每个 Cluster 就是一个 Namespace。不同 Namespace 里的资源是完全隔离的。
Kubernetes 默认创建了两个 Namespace。
default: 创建资源时如果不指定,将被放到这个 Namespace 中。
kube-system: Kubernetes 自己创建的系统资源将放到这个 Namespace 中。