Kubernetes介绍
K8S 是什么
Kubernetes,又称为 k8s(首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 k8s)或者简称为 “kube”。一个开源平台,用来干嘛的?用来自动化部署,缩扩容和管理容器应用的。下面这张图是 K8S 集群的架构图。
基本概念和术语
预期状态管理(Desired State Management)
K8S API 对象(声明预期状态)
ConfigMap
- why
解耦配置文件和容器 - 典型用法
- 作为环境变量,为容器所使用
- 设置容器启动命令的启动参数(需要设置为环境变量)
- 以 Volume 的形式挂载为容器内部的文件或者目录
- 创建
- yaml 文件,
kubectl create -f configmap.yaml
- 命令行
格式:kubectl create configmap --from-file=[key=]source --from-file=[key=]source
(1)–from-file=文件名,就是从文件中创建
(2)–from-file=文件夹名,就是目录中创建
(3)–from-file=key=value 键值对,就是直接从 key-value 键值对创建
- yaml 文件,
- 使用
- 通过环境变量的方式使用
- 通过
volumeMount
的方式使用
- 限制
必须在 pod 创建之前完成
- why
K8S Control Plane
确保集群当前状态匹配预期状态
工作负载
- Pod
最小的调度和计算单位,由一个或者多个 container 组成,Pod 中的所有 container 共享存储,网络空间和 cgroup 的资源 - 工作负载资源(Controllers)
Deployment & ReplicaSet
Deployment 部署无状态应用,可以 rollout、update、rollback ReplicaSet。 ReplicaSet 保证特定数量的 Pod 副本始终保持运行状态,ReplicaSet 并不是直接部署,而是通过 Deployment 来部署。StatefulSet
StatefulSet 部署有状态的应用,StatefulSet 要求一个 headlessService
搭配使用。为什么要用 headless service + StatefulSet 部署有状态应用?
- headless service会为关联的Pod分配一个域
<service name>.$<namespace name>.svc.cluster.local - StatefulSet会为关联的Pod保持一个不变的Pod Name
statefulset中Pod的hostname格式为$(StatefulSet name)-$(pod序号) - StatefulSet会为关联的Pod分配一个dnsName
$<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local
- headless service会为关联的Pod分配一个域
DaemonSet
保证所有或者部分 Nodes 运行 Pod 的副本。使用场景在集群存储进程,日志收集进程,节点监控进程Job & CronJob
Job 和 CronJob 都是任务,前者是直到特定数量的 Job 被成功执行,后者是重复间隔执行一次。
- Pod
核心组件的运行机制
K8S Master
kube-apiserver (API Server)
- 对外提供各种对象的CRUD REST接口
- 对外提供Watch机制,通知对象变化
- 将对象存储到 Etcd 中
kube-controller-mamager (守护进程)
通过 apiserver 监视集群的状态,并做出相应更改,以使得集群的当前状态向预期状态靠拢,通过 Controller 会尝试将状态调整为期望的状态。Controller 包括:Replication Controller
,Node Controller
,ResourceQuota Controller
,Namespace Controller
,ServiceAccount Controller
,Token Controller
,Service Controller
,Endpoint Controller
。kube-scheduler (调度器)
将待调度的 Pod 按照特定的调度算法和调度策略绑定到集群中某个适合的 Node 上,并将绑定信息写入到 etcd 中,调度需要考虑的因素有:资源需求,服务治理要求,硬件/软件/策略限制,亲和以及反亲和要求,数据局域性,负载间的干扰等。
Work Node
共享存储原理
PV(PersistentVolume)
它是对底层网络存储的抽象,由管理员创建和配置,挂载到 node 上。PV 的生命周期:- available
资源的产生来源:- 静态模式
管理员手动创建许多 PV - 动态模式
通过 StorageClass 的设置对后端存储进行描述,标记为某种类型
- 静态模式
- Bound
- Released
- Failed
- available
PVC(PersistentVolumeClaim)
对 PV 的 一个申请,就像 pod 消费 node 资源一样,PVC StorageClass 生命为 “”,说明PVC禁止使用动态模式,多个 pod 可以挂载同一个 PVCStorageClass
管理员定义储存资源为某种类别,用户根据 storage class 直观了解存储资源的特性CSI 机制 (Container Storage Interface)容器存储接口
- why ?
上面的方式都是 in-tree,耦合太重 - what ?
与容器对接的存储接口标准,存储提供方只需要基于接口标准进行存储插件的实现,就能使用K8S 的原生存储机制为容器提供存储
- why ?
动态存储
安全机制
基础概念
User类型:
Authentication — 客户端认证
- 最严格的 HTTPS 正数认证: 基于 CA 根证书签名的双向数字证书认证方式
- HTTP token 认证: 通过一个 Token 来识别用户
- HTTP base 认证: 通过用户名 + 密码的方式认证
Authorization — 授权
- RBAC
- Namespace Scope
- Role
- RoleBinding:把一个角色绑定到一个目标上 User,Group,Service Account
- Cluster Scope
- ClusterRole
- CluseterRoleBinding:只对集群级别角色生效
- Namespace Scope
- 授权策略来决定一个 API 调用是否合法
- API Server 授权策略
- AlawaysDeny: 拒绝所有请求,用于测试
- AlawaysAllow: K8S 默认设置,允许接收所有请求,集群不需要授权流程,可以采用
- ABAC (Attribute-Based Access Control): 基于属性的访问控制,使用用户配置的授权规则对用户请求进行匹配和控制
- RBAC (Role-Base Access Control): 基于角色的访问控制
- Node: 专用模式,对 kubelet 发出的请求进行访问控制
- Webhook: 调用外部 REST 服务对用户进行授权
鉴权的流程,可以通过命令看详细的请求,kubectl --v=8 version
,流程如下图:
- RBAC
Admission Control — 准入控制
准入控制器的插件列表中的每个准入控制器检查请求,插件举例:LimitRanger,ServiceAccount 等
Service Account — 服务账户
不是给用户用的,给运行在 Pod 中的进程提供必要的身份证明,与API Server 交互流程为:
- Pod 访问 API Server 的服务时,以 service 方式调用名为 Kubernetes 的这个服务的,而 Kubernetes 服务只在HTTPS 安全端口 443 上提供
- 请求时,类似于 HTTP Token,Header 中加了 token 字符串,来自于
/run/secrets/kubernetes.io/serviceaccount/token
- 建立链接时,用 Pod 里指定路径下的一个 CA 证书 (
/run/secrets/kubernetes.io/serviceaccount/ca.rt
),验证 API Server 发来的证书 - API Server 在收到这个 Token,会对这个 token 进行合法性验证
/run/secrets/kubernetes.io/serviceaccount/namespace
会作为参数调用 Kubernetes API
每个 Namespace 下都有个 default 的默认 Service Account 对象,名为 Tokens 的可以当作 Volume 被挂载到 Pod 里的 Secret,Pod 启动时挂载,协助进程访问 API Server 时的鉴权。
Secret — 私密凭据
保管私密凭据,从属于 Service Account,一旦 Secret 的使用方式:
- 创建 Pod 时,为 Pod 指定 Service Account 自动使用改 Secret
- 挂载该 Secret 到 Pod 使用,执行
ls /etc/{secret name}
可以看到 Secret 的 data 域中的 key 值作为目录中文件 - 在 Docker image 下载时,指定 Pod 的 spec.ImagePullSecrets
网络原理
K8S 的网络原理比较复杂,基于 Docker 的网络之上有封装很多东西,深入了解还需要时间。
基础概念
需要了解网络里面的一些概念和原理
- Linux Network Virtualization, Linux Tun/Tap
- Linux Network Namespace
- Veth Pair
- Linux Bridge
- Vlan
- VxlAN
- Routing Protocol
Distance Vector Protocol,BGP
Link-State Protocol,OSPF
K8S Network
- Service
- Cluster IP
- Headless
- NodePort
- LoadBalancer
- Ingress
- K8S Ingress
- lstio Ingress Gateway
- Ingress
- API Gateway + Service Mesh
- Kubernetes CNI 插件, Calico
- Service
Kubernetes介绍