Kubernetes 【二】 核心原理 下

三 kubelet 运行机制


在集群中,每个 Node 上都会运行一个 kubelet 服务进程,该进程的目的是负责处理由 Master 节点下发到本节点的任务,管理 Pod 以及 Pod 中的 container。每个 kubelet 都会 API Server 上注册自己的信息,定期的向 API Server 回报当前 Node 的资源使用情况,并通过 cAdvise 监控 container 和 Node 资源。

✨ Node 节点管理

节点通过设置 kubelet 的启动参数 --register-node 来决定是否向 API Server 注册自己,如果为 true 那么 kubelet 会试着向 API Server 注册自己。同时还需要包含以下参数:

  • --api-servers: API Server 的地址
  • --kubeconfig:用访问 API Server 的证书的位置
  • --cloud-provider:如何从云服务商那里读取到和自己相关的元数据

Kubelet 在注册成功后,会定期的向 API Server 发送节点信息,API Server 在接收到信息后会保存到 etcd 中,可以通过参数 --node-status-update-frequency 来设置更新间隔时间。

✨ Pod 管理

Kubelet 可以通过以下三种方式来获取当前 Node 上所要运行的 Pod 清单:

  • 文件:Kubelet 启动参数 --config 指定 Pod 清单的位置
  • HTTP 端点(URL):通过 --mainfest-url 参数设置
  • API Server:Kubelet 通过监听 API Server 来同步 Pod 清单

所有非 API Server 创建的 Pod 都是 static Pod。Kubelet 会将 static Pod 的状态汇报给 API Server,API Server 会创建一个 Mirror Pod,该 Mirror Pod 反映了该 Pod 的真实情况,当 Pod 被删除后,该 Mirror Pod 也直接被删除。

通过 API Sever 创建的 Pod,Kubelet 会监听所有对该 Pod 的操作,并通过相应 client 处理该变化。

✨container 健康检查

Pod 通过两种 probe 来检查 container 的健康状况:

LivenessProbe 探针
判断该 container 是否健康,如果发现该 container 不健康,那么 Kubelet 就会删除该 container ,并根据相应的重启策略来做相应的处理。如果没有设置 LivenessProbe 那么该值则一直为 Success。三种实现方式:

  • ExecAction:在 container 中执行一个命令,如果退出码为0,则表示健康
  • TCPSocketAction:通过 container 的 IP 和端口号来判断
  • HTTPGetAction:通过调用 container 中的接口来判断,如果返回的状态码大于等于200,小于400则健康

LivenessProbe 定义在 Pod 中的 spec.containers.{container} 域中:

livenessProbe:
  httpGet:
    path: /health
    port: 8080

readnessProbe
该探针用于判断该 container 是否启动成功,如果检测到失败,那么 Endpoint Controller 会从 Service 的 Endpoint 中删除该 Pod 和对应的 IP 地址的条目。

四 安全机制


✨ Authentication

Kubernetes 对 API 调用使用 CA(Client Authentication)、Token 和 HTTP Basic 来实现用户认证。分别可以通过在 API Server 启动参数上添加 --client-ca-file=FILE_LOCATION--client-auth-file=FILE_LOCATION--basic-auth-file=FILE_LOCATION 来实现。

✨ Authorization

在认证成功后,Kubernete 会对当前用户进行授权,授权的方式有三种,同样是在 API Server 的启动参数上(--authorization-mode=)进行设置,有三种选项 AlwaysDeny, AlwaysAllow, ABAC。前两种比较容易理解,主要解释下第三种 mode。

ABAC:Attribute-Base-Access-Control基于属性的访问控制。在 Kubernetes 中通过以下四种属性来实现访问控制:

  • 用户名 user:一个已经认证成功的用户名的字符串
  • 是否是只读操作 readonly
  • 被访问的是哪一类资源 resource(Pod、Service...)
  • 被访问对象所属的 Namespace

如果选用 ABAC mode 来实现 Authorization ,需要设置 API Server 的启动参数 --authorization_policy_file=FILE_LOCATION file 为授权策略文件,该文件每一行为一个 json 格式的字符串,每一行都是一条 “策略对象“,包含了 user、readonly、resource 和 namespace 的定义。

你可能感兴趣的:(Kubernetes 【二】 核心原理 下)