资源

Namespace

并非所有对象都在名字空间中,大多数 kubernetes 资源(例如 Pod、Service、deployment 等)都位于某些 Namespace 中。 但是 Namespace 资源本身并不在 Namespace 中。而且底层资源,例如 Node 和 persistentVolumes 不属于任何名字空间

查看哪些资源在 Namespace 中,哪些不在 Namespace 中:

1
2
3
4
5
# 位于名字空间中的资源
kubectl api-resources --namespaced=true

# 不在名字空间中的资源
kubectl api-resources --namespaced=false

Pod

以应用(Pod)为中心:

  • pop 是容器集,是 k8s 的最小运行单元,一个 pop 中的所有容器必须运行在同一 node 上
  • 运行多个容器的话,这些容器是一起被调度的
  • Pod 的生命周期是短暂的,不会自愈,是用完就销毁的实体
  • 一般通过 Controller 来创建和管理 pod

建立 pod

p83,4.5.2 pod 的创建过程

一个 pod 就像是一个虚拟机:

pause 是 pod 的基础设施容器,这个容器的作用是给 pod 内部容器提供可被加入和共享的 net、ipc、uts、namespace,同时我们向一个 pod 附加 volume 时,也是附加在 pause 之上,从而可以被共享给一个 pod 内的多个容器

Pod 的生命周期

初始化容器、启动前操作、就绪探针、存活探针、删除 pod 操作

livenessProb

存活探针,检测应用是否发生故障,检测失败重启 pod

readinessProbe

就绪探针,检测 pod 启动之后应用是否就绪,是否可以提供服务,检测成功,pod 才开始接收流量

控制器(controller)

控制器有数十种,最常用的是 deployment:无状态应用编排工具

控制器 简写 简述
ReplicationController rc 第一代 pod 副本控制器
ReplicaSet rs 第二代 pod 副本控制器
Deployment deploy 第三代 pod 控制器

ReplicationController

https://kubernetes.io/zh/docs/concepts/workloads/controllers/replicationcontroller/
https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/labels/

副本控制器 selector =、!=

ReplicaSet

https://kubernetes.io/zh/docs/concepts/workloads/controllers/replicaset/

副本控制集,和副本控制器的区别是:selector 还支持 in、notin

Deployment

https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/

比 rs 更高一级的控制器,除了有 rs 的功能之外,还有很多高级功能,,比如说最重要的:滚动升级、回滚等

DaemonSet

DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod

DaemonSet 的一些典型用法:

  • 在每个节点上运行集群守护进程
  • 在每个节点上运行日志收集守护进程
  • 在每个节点上运行监控守护进程

一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。 一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet;每个具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求

Service

pod 重建之后 ip 就变了,pod 之间直接访问会有问题,service 就是用来解决这个问题

service 解耦了服务和应用

一般常用的有两种:

  1. k8s 集群内的 service:selector 指定 pod,自动创建 Endpoints
  2. k8s 集群外的 service:手动创建 Endpoints,指定外部服务的 ip,端口和协议

kube-proxy 和 service 的关系:
kube-proxy 监听着 k8s-apiserver,一旦 service 资源发生变化(调 k8s-api 修改 service 信息),kube-proxy 就会生成对应的负载调度的调整,这样就保证 service 的最新状态

卷(volume)

volume:https://kubernetes.io/zh/docs/concepts/storage/volumes/
emptydir:https://kubernetes.io/zh/docs/concepts/storage/volumes/#emptydir
hostpath:https://kubernetes.io/zh/docs/concepts/storage/volumes/#hostpath
nfs:https://kubernetes.io/zh/docs/concepts/storage/volumes/#nfs
configmap:https://kubernetes.io/zh/docs/concepts/storage/volumes/#configmap

卷类型          简介
emptyDir 挂载一个空目录,pod 删除时,卷也会被删除
hostPath docker -v 实现一样的效果
挂载文件或目录挂载,pod 删除的时候,卷不会被删除,但是 Pod 和 node 是绑定的,nfs 等共享存储可以解决这个问题
nfs 等共享存储 挂载 NFS(网络文件系统),当删除 Pod 时,nfs 卷被卸载,但是内容保留
NFS 可以被多个 Pod 同时挂载
Configmap Why:配置信息和镜像解耦,避免每次更新配置都得重新打镜像
What:将配置信息放到 configmap 对象中,然后在 pod 的对象中导入 configmap 对象,实现导入配置的操作
How:声明一个 ConfigMap 的对象,作为 Volume 挂载到 pod 中

PV / PVC

https://kubernetes.io/zh/docs/concepts/storage/persistent-volumes/

存储的管理是一个与计算实例的管理完全不同的问题。PersistentVolume 子系统为用户和管理员提供了一组 API,将存储如何供应的细节从其如何被使用中抽象出来。 为了实现这点,我们引入了两个新的 API 资源:PersistentVolume 和 PersistentVolumeClaim

1
2
PV:PersistentVolume,持久卷
PVC:PersistentVolumeClaim,持久卷申领

对于有状态服务,例如 MySQL、zookeeper,搭建集群的时候,因为不能共享存储,所以可以给每个节点挂载一个 nfs 存储,但是更推荐在 nfs 上再封装一层 PV / PVC

PV / PVC 用于有状态的服务,例如 MySQL、zookeeper,nfs 用于无状态的服务,例如 nginx、tomcat

PV / PVC 通常和 Statefulset 搭配使用

Statefulset -> Operator

https://kubernetes.io/zh/docs/concepts/workloads/controllers/statefulset/

deployment 是无状态应用编排工具,而 statefulset 是有状态应用编排工具

statefulset 本质上是 Deployment 的一种变体,为了解决有状态服务的问题,statefulset 管理的 Pod 拥有固定的 Pod 名称,主机名,启停顺序,在 statefulset 中,Pod 名字称为网络标识(hostname),还必须要用到共享存储

在 deployment 中,与之对应的服务是 service,而在 statefulset 中与之对应的是 headless service,即无头服务,与 service 的区别就是它没有 Cluster IP,解析它的名称时将返回该 headless service 对应的全部 Pod 的 Endpoint 列表

StatefulSet 特点:

  • 给每个 pdo 分配固定且唯一的网络标识符
  • 每个pod 分配固定且持久化的外部存储
  • 对 pod 进行有序的部署和扩展
  • 对 pod 进有序的删除和终止
  • 对 pod 进有序的自动滚动更新

StatefulSet 的组成部分:

  • Headless Service:用来定义 Pod 网络标识( DNS domain)
  • StatefulSet:定义具体应用,有多少个 Pod 副本,并为每个 Pod 定义了一个域名
  • volumeClaimTemplates: 存储卷申请模板,创建 PVC,指定 pvc 名称大小,将自动创建 pvc,且 pvc 必须由存储类供应

Operator

https://kubernetes.io/zh/docs/concepts/extend-kubernetes/operator/

不同的有状态应用的运维操作过程差别巨大,因此 StatefulSet 控制器本身几乎无法为此种类型的应用提供完善的通用管理控制机制,现实中的各种有状态应用通常是使用专用的自定义控制器专门封装特定的运维操作流程,这些自定义控制器统称为 Operator

Operator 是 kubernetes 的扩展软件,Operator 是 Kubernetes API 的客户端,充当 定制资源 的控制器