Kubernetes是什么?
首先必须要知道的是官网地址:https://kubernetes.io
Kubernetes 最开始是由 Google 的工程师设计开发的。Google 作为 Linux 容器技术的早期贡献者之一,曾公开演讲介绍 Google 如何将一切都运行于容器之中(这是 Google 的云服务背后的技术)。Google 一周内的容器部署超过 20 亿次,全部的工作都由内部平台 Borg 支撑。Borg 是 Kubernetes 的前身,几年来开发 Borg 的经验教训也成了影响 Kubernetes 中许多技术的主要因素。
Kubernetes是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes拥有一个庞大且快速增长的生态系统。Kubernetes的服务、支持和工具广泛可用。
Kubernetes,简称 k8s(k,8 个字符,s——明白了?)或者 “kube”,它消除了容器化应用程序在部署、伸缩时涉及到的许多手动操作。换句话说,你可以将多台主机组合成集群来运行 Linux 容器,而 Kubernetes 可以帮助你简单高效地管理那些集群。构成这些集群的主机还可以跨越公有云、私有云以及混合云。
Kubernetes特性
自我修复
在节点故障时,杀死健康检查失败的容器,重启部署启动新的容器,保证预期的副本数量,并且在容器未完全启动之前不会处理客户端请求,确保线上服务不中断。
弹性伸缩
使用命令、UI管理页或者自动基于资源使用情况进行快速的扩容或者缩容应用程序实例,保证应用业务高峰并发时的高可用,业务低峰时,回收资源以最小成本运行服务。
自动部署和回滚
K8S默认采用滚动更新的方式,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将立即进行回滚,确保升级不影响业务。
服务发现和负载均衡
- 服务发现:由于 Kubernetes 的调度机制,在 Kubernetes 中,Pod 的 IP 不是固定的。如果其它程序需要访问这个 Pod,要怎么知道这个 Pod 的 IP 呢?
- 负载均衡:由于 Deployment 管理着多个 Pod 的副本,如果其它程序需要访问这些 Pod,显然需要一个 proxy 为这些 Pod 做负载均衡。
K8S提供了Service和Deployment两种资源对象,Service 通常会和 Deployment 结合在一起使用,首先通过 Deployment 部署应用程序,然后再使用 Service 为应用程序提供服务发现、负载均衡。
机密和配置管理
应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥。将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret。
Secret 会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息。Secret 会以 Volume 的形式被 mount 到 Pod,容器可通过文件的方式使用 Secret 中的敏感数据;此外,容器也可以环境变量的方式使用这些数据。
存储编排
挂载外部存储系统,无论是来自本地存储、公有云(如:AWS)、网络存储(如:NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大的提供了存储使用的灵活性。
批处理
提供了一次性任性、定时任务的执行,满足批量数据处理和分析的场景。
Kubernetes集群架构与组件
Master组件
kube-apiserver
Kubernetes API, 集群的统一入口,各组件的协调者,以RestFul API方式提供服务,所有对象资源的增删查改和监听操作都交给APIServer处理。提供其他模块之间的数据交互和通信的枢纽(其他模块通过 API Server 查询或修改数据,只有 API Server 才直接操作 etcd)。
kube-controller-manager
kube-controller-manager是 Kubernetes 的大脑,它通过 apiserver 监控整个集群的状态,并确保集群处于预期的工作状态。
kube-scheduler
kube-scheduler 负责分配调度 Pod 到集群内的节点上,它监听 kube-apiserver,查询还未分配 Node 的 Pod,然后根据调度策略为这些 Pod 分配节点(更新 Pod 的 NodeName
字段)。
调度器需要充分考虑诸多的因素:
- 公平调度
- 资源高效利用
- QoS
- affinity 和 anti-affinity
- 数据本地化(data locality)
- 内部负载干扰(inter-workload interference)
- deadlines
etcd
Etcd 是 CoreOS 基于 Raft 开发的分布式 key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。
Etcd 主要功能:
- 基本的 key-value 存储
- 监听机制
- key 的过期及续约机制,用于监控和服务发现
- 原子 CAS 和 CAD,用于分布式锁和 leader 选举
Node组件
节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。
kubelet
一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。
kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。
kube-proxy
kube-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分。
kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
如果操作系统提供了数据包过滤层并可用的话,kube-proxy会通过它来实现网络规则。否则,kube-proxy 仅转发流量本身。
容器运行环境(Container Runtime)
容器运行环境是负责运行容器的软件。
Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI (容器运行环境接口)。
Kubernetes核心概念
Pod
- 最小部署单元
- 一组容器的组合
- 一个Pod中的容器共享网络命名空间
- Pod是短暂的
Controller
- ReplicaSet: 确保预期的Pod副本数量
- Deployment: 无状态的应用部署
- StatefulSet: 有状态的应用部署
- DaemonSet: 确保所有Node运行同一个Pod
- Job: 一次性任务
- Cronjob: 定时任务
Service
- 防止Pod失联
- 定义一组Pod的访问策略
Label
- 标签,附加到某个资源上,用于关联对象、查询和筛选
Namespace
- 命名空间,将对象逻辑上隔离