kubernetes是来自谷歌的容器自动化操作平台, 主要功能如下:

  • 服务发现和负载均衡

  • 弹性扩容

  • 故障自动恢复

一. 核心概念

基于集群的操作, 部署结构如下图:

kubernetes - 图1

  • pod: 负载应用

  • container: 容器

  • label:

  • replication controller:

  • service: 节点上的管理程序(kubelet, kube-proxy, container runtime)

  • node: 运行节点(VM或者物理机)

  • kubernetes master: 管理节点

核心组件:

  • master: 管理节点

    • apiserver: api接口服务, 面向用户

    • controller-manager: 控制器, 面向node

    • etcd: k-y存储

    • kube-scheduler: 部署调度

  • node: 应用承载节点

    • kubelet: node管理

    • kube-proxy: 网络抽象

    • container runtime: 容器运行时环境, 如docker

  • addon: 扩展插件

    • dns

    • web ui

    • container resource monitoring

    • cluster level logging

1.1 节点

节点状态:

  • Addresses

    • HostName: 主机名

    • ExternalIP: 外网ip

    • InternalIP: 内网ip

  • Condition: 运行节点的状态

    • OutOfDisk: 是否有空间运行新的pod

    • Ready: 节点状态是否健康

    • MemoryPressure: 内存压力

    • PIDPressure: 进程数压力

    • DiskPressure: 硬盘压力

    • NetworkUnavailable: 网络状态

  • Capacity: 节点资源()CPU, 内存, 最大pods数)

  • Info: 一般信息(内核版本, k8s版本, Docker版本等)

节点管理:

二. 对象

对象是kubernetes系统中的实体. k8s用其标识cluster状态, 包括:

  • 跑了什么应用

  • 有什么资源

  • 应用运行的策略

期望状态: 用户为k8s描述的负载状态

Spec 和 Status

每个k8s对象包含两个配置: spec和status. spec描述的是期望状态, status描述的是实际状态. k8s会尽量让对象的实际状态接近期望状态.

k8s通过yaml文件描述对象信息. yaml要包含的域包括:

  • apiVersion: api版本

  • kind: 类型

  • metadata: 元数据, 如name, namespace

    • name: 对象的唯一标识, 名字不能重复

    • namespace: 一个物理集群可以包含多个虚拟集群(virtual clusters), namespace是虚拟集群的标识

      • virtual clusters: 用于分配多个用户之间的资源
    • labels: 同一个命名空间中区分应用版本的标识

      • labels是一系列键值对

      • labels对于对象并没有语法上的含义

      • 对于每个对象, key必须是唯一的

      • 可以通过 label selectors 进行批量访问

    • annotations: 注释, 跟label格式相同, 但不能用来过滤对象

  • spec: 期望状态

类型

k8s对象主要有以下类型:

  • workload(负载)

    • Container

    • CronJob

    • DaemonSet

    • Deployment

    • Job

    • Pod

    • ReplicaSet

    • ReplicationController

    • StatefulSet

  • service(服务)

    • Endpoints

    • Ingress

    • Service

  • config(配置)

    • ConfigMap

  • storage(存储)

  • metadata(元数据)

  • cluster(集群)

使用kubectl进行对象管理

共有三种管理方法:

  • 命令行

    • 直接将配置信息写到命令中

    • 每次可以作用在多个对象

  • 命令式配置文件

    • 将配置信息写到配置文件中

    • 每次可以作用在1个对象

  • 声明式配置文件

    • 将配置信息写成文件夹

    • 每次可以作用在多个对象

1. 命令行

创建命令:

  • run: 创建Deployment, 用于在pod上运行container

  • expose: 创建Service, 用于在pod间负载均衡

  • autoscale: 创建Autoscaler来为控制器水平扩容

  • create: 创建指定类型对象

更新命令:

  • scale: 水平扩容或缩容

  • annotate: 增加或删除注释

  • label: 增加或删除标签

  • set: 增加切面

  • edit: 编辑配置文件

  • patch: 直接动态修改对象配置

删除命令:

  • delete

查看命令:

  • get: 查看对象信息

  • describe: 查看详情

  • logs: 打印stdout和stderr

2. 配置文件

3. 声明式