Kubernetes (简称 k8s)是 Google 基于其内部容器调度平台 Borg 的经验开发的一个开源的容器编排和管理平台。2014 年开源,并作为 CNCF(云原生计算基金会)的核心发起项目。旨在简化容器化应用的部署、扩展和管理。它提供了一种便捷的方式来组织、调度和管理容器化应用程序,并能够自动化地处理应用程序在集群中的部署、扩展、故障恢复和负载均衡等任务。

设计的目的是在主机集群之间提供一个能够自动部署、扩展、应用容器的可运营的平台。Kubernetes 通常结合 docker 容器一起工作。

Kubernetes 使用了一种称为 Pods 的抽象概念来组织应用程序的容器。Pod 是一个或多个相关容器的组合,它们共享同一个网络命名空间、存储卷以及其他资源。这样,它们可以共享网络配置、文件系统和其他依赖关系,从而更好地协同工作。

Kubernetes 还提供了一种称为 Replication Controller 的机制,用于自动扩展和管理 Pod 实例。Replication Controller 可以根据设置的规则自动复制和删除 Pod 实例,以适应负载变化,并确保应用程序始终处于所需的状态。

此外,Kubernetes 还提供了一种称为 Service 的机制,用于将后端 Pod 实例暴露给外部访问。Service 可以为后端 Pod 实例提供负载均衡、服务发现和稳定访问地址等功能。

Kubernetes 还支持水平扩展、滚动更新、故障恢复等功能,使得应用程序的部署和管理变得更加简单和可靠。它还提供了丰富的 API 和命令行工具,以便管理员和开发者可以方便地管理和监控集群中的应用程序。

功能:

  • 自动化容器部署、复制
  • 随时扩展或收缩容器规模
  • 组织容器成组,提供容器间的负载均衡
  • 更新和回滚容器版本

Terminology

  • API Server: 对外提供 RESTful 接口,系统管理指令的统一入口,对资源的操作都要交给 API Server 再提交给 etcd
  • schedule: 调度 pod 到 Node
  • controller manager: 每一个资源对应一个控制器
  • etcd: 高可用的 key-value 存储,k8s 用来存储各个资源的状态

Master

Kubernetes 中的 Master 节点指的是集群控制节点,负责整个集群管理和控制。

Master 节点上运行着关键进程:

  • Kubernetes API Server(kube-apiserver),提供 HTTP Rest 接口,所有资源的增删改查操作入口
  • Kubernetes Controller Manager(kube-controller-manager),所有资源对象的自动化控制中心
  • Kubernetes Scheduler(kube-scheduler),负责资源调度(Pod 调度)的进程

Node

Kubernetes 集群中除去 Master 之外的节点被叫做 Node 节点(Agent),工作负载节点,执行 Master 分配的工作。当 Node 节点宕机时,工作负载会自动转移到其他节点。

Node 节点运行的关键进程:

  • kubelet,负责 Pod 对应容器的创建、启动、停止等
  • kube-proxy, 实现 Kubernetes Service 的通信和负载均衡
  • Docker Engine(docker),Docker 引擎,负责本机容器创建和管理

可以使用如下命令查看集群中 Node:

kubectl get nodes

查看具体信息:

kubectl describe node kubernetes-minion1

Pods

k8s 最小调度单元,Pod 中运行业务相关的容器

  • Kubernetes 中最小的部署单元
  • 包含一个或多个容器,可以被一起编排(schedule)
  • 每一个 pod 都有一个唯一的 IP 地址
  • Pod 中的每一个容器可以通过 localhost 相互通信

Label

Label 是 key=value 键值对,附加到资源对象上,Node,Pod,Service,RC 等等。资源对象可以定义任意数量 Label,同一个 Label 也可以被添加到任意数量的资源对象上。

Replication Controller

Replication Controller(后简称 RC),定义了场景,声明某种 Pod 的副本数量在任意时刻都符合预期值。

定义包括几部分:

  • Pod 期待的副本数 (replicas)
  • 筛选目标 Pod 的 Label Selector
  • Pod 副本数量小于预期数量的时候,用于创建新 Pod 的模板(template)

Service

Service 就是「微服务」

  • Service 定义服务的访问入口
  • Service 与后端 Pod 副本集群之间通过 Label Selector 实现无缝对接
  • 服务之间通过 TCP/IP 通信,形成灵活的弹性网络
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  ports:
  - port: 8080
  selector:
    tier: frontend
  • 定义了名为 tomcat-service 的 Service
  • 端口 8080
  • Label 是 tier=frontend 的 Pod 实例都属于它

然后创建:

kubectl create -f tomcat-server.yaml

Namespace

Namespace 命名空间,用于实现多租户的资源隔离。

kubectl get namespace

在 Kubernetes 中,所有对象都使用 manifest(yaml 或 json)来定义,比如一个简单的 nginx 服务可以定义为 nginx.yaml,它包含一个镜像为 Nginx 的容器:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80