一、K8S架构
- K8S 集群组成
- 分布式存储(Etcd)
- 控制节点(Master)
- 工作节点(Node)
- 只有 apiserver 与存储通信
- 用户直接访问 apiserver
- 内部进程,包括 kubelet, controller 均通过 apiserver 访问存储
- 出于安全考虑
- 配置管理操作声明式而非命令式
二、基础概念
1、Namespace与ResourceQuota
Namespace
- 物理集群上的虚拟集群
- 用户级别的资源限制,用户只需关注 namespace 上的资源情况
- 默认没有资源限制,需要通过 ResourceQuota 来配额
ResourceQuota: Namespace 资源配额
- 计算资源配额
- CPU,MEM
- k8s 元素数量配额
2、Resource
3、Label 和 Selector
Label
-
用于区分资源的 key/value 键值对
-
资源可以拥有多个 label
selector
- 根据 label 选择对应的资源
-
Equality-based 选择器
- kubectl get pods -l environment=production,tier=frontend
-
Set-based 选择器
- kubectl get pods -l ‘environment in (production),tier in (frontend)’
4、Master节点
5、Node
6、Pod
- 多个容器的集合
- 最小调度单位
- 共享 namespace
- PID 名字空间(同一 Pod 内的容器能看到其他容器的PID,Docker 容器暂不支持)
- 网络名字空间(共享 IP 和 localhost)
- IPC 名字空间(能够使用 SystemV IPC 或者POSIX 消息队列进行通信)
- UTS 名字空间(共享同一个主机名)
- Pod 的网络原则:一 Pod 一 IP
- 防止端口冲突
- 方便服务注册
7、Service
- 一个唯一指定的名字
- 一个虚拟 IP 和端口号
- 服务类型
- ClusterIP(default)
- Nodeport
- LoadBalancer
- 服务发现
- 环境变量
- DNS
8、ReplicationController
ReplicationController(简称RC)是确保用户定义的Pod副本数保持不变。
RC 替代方法:
ReplicaSet
ReplicaSet是支持新的set-based选择器要求的下一代ReplicationController 。
Deployment(推荐)
9、StatefulSets
Pod调度运行时,如果应用不需要任何稳定的标示、有序的部署、删除和扩展,则应该使用一组无状态副本的控制器来部署应用,例如 Deployment 或 ReplicaSet更适合无状态服务需求。
10、Volumes
- Pod 生命周期内一直可用
- Pod 内容器共享
- 当前支持的类型
- emptyDir:Pod 与 Node 绑定/解绑时创建/删除
- hostPath:挂载 Node 上的目录
- gcePersistentDisk
- nfs
Volumes(存储卷)是Pod中能够被多个容器访问的共享目录。Kubernetes的Volumes概念与Docker的Volumes比较类似,但并不完全相同。Kubernetes中的Volumes与Pod生命周期相同,而不与容器的生命周期相关。当容器终止或者重启时,Volumes中的数据也不会丢失。另外,Kubernetes支持多种类型的Volumes,并且一个Pod可以同时使用任意多个Volumes。
emptyDir:一个EmptyDir Volume是在Pod分配到Node时创建的。从它的名称就可以看出,它的初始内容为空。同一个Pod中所有容器可以读和写EmptyDir中的相同文件。当Pod从Node上移除时,EmptyDir中的数据也会永久删除。
EmptyDir的一些用途如下:
- 临时空间,例如用于某些应用程序运行时所需的临时目录,且无需永久保留;
- 长时间任务的中间过程CheckPoint临时保存目录;
- 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)。
hostPath:在Pod上挂载宿主机上的文件或目录。
hostPath通常可以用于:
- 容器应用程序生成的日志文件需要永久保存,可以使用宿主机的高速文件系统进行存储;
- 需要访问宿主机上Docker引擎内部数据结构的容器应用,可以通过定义hostPath为宿主机/var/lib/docker目录使得容器内部应用可以直接访问Docker的文件系统。
- 在不同Node上具有相同配置的Pod可能会因为宿主机上的目录和文件不同而导致对Volume上目录和文件的访问结果不一致;
11、ConfigMap
- 应用镜像和配置分离
- 数据类型为键值对
- Pod 使用 ConfigMap 的三种方式
- 命令行参数
- 环境变量
- 数据卷文件
12、Deployment
- 确保任意时间都有指定数量的Pod “副本”在运行
- 通过 Pod 选择器筛选出对应的Pod 实例并实时监控其状态和数量
- 提供 Pod 和 Replica Set 的声明式更新
- 把部署,滚动更新和回滚进行了自动化
- 创建 Deployment
- kubectl create -f docs/user-guide/nginx-deployment.yaml –record
- 更新 Deployment
- kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
- 查看 Deployment 的修订版本
- kubectl rollout history deployment/nginx-deployment
Deployment负责创建和更新应用。创建Deployment后,Kubernetes master 会将Deployment创建好的应用实例调度到集群中的各个节点。
应用实例创建完成后,Kubernetes Deployment Controller会持续监视这些实例。如果管理实例的节点被关闭或删除,那么 Deployment Controller将会替换它们,实现自我修复能力。
创建Deployment时,需要为应用程序指定容器镜像以及要运行的副本数,后续可以通过Deployment更新来更改该这些信息。
13、API group
- 每个 API group 中的资源可以单独的 enable/disable
- 每个 API group 有不同的版本,单独开发维护
14、PersistentVolume (PV)
- 集群中的一块网络存储
- 独立于 Pod 的生命周期
- 支持的 PV 类型
- GCEPersistentDisk
- AWSElasticBlockStore
- NFS
- Cinder
- iSCSI