基础组件


上图是kubernetes的基本组成部分,以下将简单描述一下其组件及其功能。

Master

  • API Server:管理集群资源的唯一入口
  • Controller-Manager:一个资源对应一个控制器
    • Node Controller
    • Deployment Controller
    • Namespace Controller
    • ...
  • Scheduler:节点调度,选择Worker节点部署
    • Filter:选择符合Pod Spce描述的Node
    • Score:打分和排序
    • Reserve:缓存数据,表示这个Pod已经分配到这个Node上
  • etcd:用于存储集群相关的数据

Worker

身份验证

每一次的访问请求都需要进行合法性的检验,其中包括身份验证、操作权限验证以及操作规范验证等,需要通过一系列验证通过之后才能访问。

工作流程

  1. 认证:验证账号的有效性
  2. 鉴权:拥有哪些访问权限
  3. 准入控制:自定义插件,API请求拦截器,它可以更改请求对象,甚至完全拒绝请求。

认证

拥有三种认证方式,分别是:

  • Http Basic Authentication
  • 基于证书认证(CA)
  • 基于token认证

鉴权

基于RBAC,也就是角色访问控制。通俗的说,就是将权限赋予给角色,然后将角色绑定要用户主体上。

  • 主体
    • user
    • group
  • 角色
    • role:特定命名空间访问权限
    • ClusterRole:所有命名空间访问角色
  • 角色绑定
    • RoleBinding:角色绑定到主体
    • ClusterRoleBinding:集群角色绑定到主体

准入控制

我从网上扒了一个例子,供参考

去年曝光的 runC 漏洞(CVE-2019-5736),它被利用的原因之一就是容器内进程都是以 root 权限运行的。下面我们以这个问题为例,一起利用准入控制器 webhook 建立自定义安全策略。

为了解决上述问题,工程师可以使用自定义的变更准入控制器 Webhook 使默认设置变得更安全:除非明确要求,否则 webhook 将强制要求 Pod 以非 root 身份运行(示例中为分配 ID 1234)。

请注意,这个设置不会影响到集群中的工作负载,包括那些明确需要 root 权限的工作负载。

完整代码请见以下 admission-controller-webhook-demo

Pod 启动流程

最后给大家分享一下容器的完整创建流程,对此有一个大概的认知。