kubernetes是来自谷歌的容器自动化操作平台, 主要功能如下:
服务发现和负载均衡
弹性扩容
故障自动恢复
…
一. 核心概念
基于集群的操作, 部署结构如下图:
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