Kubernetes

十、Kubernetes 进阶之核心组件篇

2020-05-04  本文已影响0人  Suny____

在K8S章节刚开始我们就介绍了里面的核心组件与架构图,但对于它们只是有一个很浅的认知,只知道它是干嘛的,对于它们都做了哪些事情比较模糊,本章节就对几个核心组件做个梳理介绍!

1、Master和Node

在正式梳理组件之前,再次回顾下Master节点和Node节点的功能,以及组件分配。

2、 Kubeadm

搭建K8S有很多种方式,Kubeadm只是其中一种方式,适合个人搭建集群使用,这里要介绍的也就是Kubeadm的工作流程。

Kubeadm分为2个步骤:

  + init完成之后我们还需要创建 .kube 文件夹,复制一个配置文件到该目录下,这个步骤就是让当前节点拥有与apiServer打交道的权限。
  + kubeconfig中包含了cluster、user和context信息。通过kubectl config view查看

+ control-plane

  + 为master生成Pod配置文件,这些组件会被master节点上的kubelet读取到,并且自动创建对应资源,Pod的文件目录:/etc/kubernetes/manifests/
  + 这些pod由kubelet直接管理,是静态pod,直接使用主机网络
  + kubelet读取manifests目录并管理各控制平台组件pod的启动与停止
    + 一旦这些 YAML 文件出现在被 kubelet 监视的/etc/kubernetes/manifests/目录下,kubelet就会自动创建这些yaml文件定义的pod,即master组件的容器。master容器启动后,kubeadm会通过检查localhost:6443/healthz这个master组件的健康状态检查URL,等待master组件完全运行起来
  + 要想修改这些pod,直接修改manifests下的yaml文件即可
  + 这个步骤会下载镜像,我们前面已经通过手动下载国内镜像然后打Tag的方式下载好了,所以这个步骤会进行的很快,否则直接从国外地址下会很慢

+ upload-config

  + 将ca.crt等 Master节点的重要信息,通过ConfigMap的方式保存在etcd中,供后续部署node节点使用

+ bootstrap-token

  + 为集群生成一个bootstrap token,设定当前node为master,master节点将不承担工作负载,当然也可以调整让Master承担工作负载。

+ addons

  + 安装默认插件,kubernetes默认kube-proxy和DNS两个插件是必须安装的,dns插件安装了会出于pending状态,要等网络插件安装完成,比如calico
    + 通过kubectl get daemonset -n kube-system
    + 可以看到kube-proxy和calico[或者其他网络插件]

3、kubectl

kubectl 是一个命令行接口,用于对 Kubernetes 集群运行命令。

kubectl 会在 $HOME/.kube 目录中寻找一个名为 config 的文件,通过它就可以与apiServer打交道了。

3.1 kubectl 语法

kubectl [command] [TYPE] [NAME] [flags]

其中 commandTYPENAMEflags 分别是:

在对多个资源执行操作时,可以按类型和名称指定每个资源,或指定一个或多个文件:

4、ApiServer

API Server 为 api 对象验证并配置数据,包括 pods、 services、 replicationcontrollers 和其它 api 对象。API Server 提供 REST 操作和到集群共享状态的前端,是集群内各个功能模块之间数据交互和通信的中心枢纽,是整个系统的数据总线和数据中心。所有其他组件通过它进行交互。

API Server通过kube-apiserver的进程提供服务,运行在master节点上

4.1 REST API设计

K8S交互实际是使用 REST API 进行的,kubectl 命令底层实际也是通过这种方式调用。

image.png

如果想要用 http 的方式调用 K8S 的服务,需要进行如下操作:

4.2 集群安全机制

对于k8s集群的访问操作,都是通过api server的rest api来实现的,难道所有的操作都允许吗?当然不行,这里就涉及到 认证、授权和准入控制 等操作。

请求到达 API 服务器后会经过几个阶段,具体说明如图:

image.png

4.2.1 传输层安全

在典型的 Kubernetes 集群中,API 通过 443 端口提供服务。 API 服务器会提供一份证书。 该证书一般是自签名的, 所以用户机器上的 $USER/.kube/config 目录通常 包含该 API 服务器证书的根证书,用来代替系统默认根证书。 当用户使用 kube-up.sh 创建集群时,该证书通常会被自动写入用户的 $USER/.kube/config。 如果集群中存在多个用户,则创建者需要与其他用户共享证书。

4.2.2 认证(Authentication)

说白了,就是如何来识别客户端的身份,

认证可以分为两个维度来说

第一个维度

K8s集群提供了3种识别客户端身份的方式

第二个维度

系统组件要想和apiServer进行认证

4.2.3 授权(Authorization)

Kubernetes 使用 API 服务器 授权 API 请求。它根据所有策略评估所有请求属性来决定允许或拒绝请求。 一个 API 请求的所有部分必须被某些策略允许才能继续。这意味着默认情况下拒绝权限。

4.2.3.1 授权方式

我们主要看看最常用的 RBAC 授权方式即可

4.2.3.2 RBAC授权
image.png

Role和RoleBinding

ClusterRole和ClusterRoleBinding

4.2.4 准入控制(Admission Control)

准入控制 是能够修改或拒绝请求的软件模块。 作为授权模块的补充,准入控制模块会访问被创建或更新的对象的内容。 它们作用于对象的创建,删除,更新和连接(proxy)阶段,但不包括对象的读取。可以同时配置多个准入控制器,它们会按顺序依次被调用。

除了拒绝请求外,准入控制器还可以为对象设置复杂的默认值。

与认证和授权模块不同的是,如果任一个准入控制器拒绝请求,那么整个请求会立即被拒绝。

4.2.4.1 准入控制插件

准入控制器是一段代码,它会在请求通过认证和授权之后、对象被持久化之前拦截到达 API 服务器的请求。

准入控制器可以执行 “验证” 和/或 “变更” 操作。变更(mutating)控制器可以修改被其接受的对象;验证(validating)控制器则不行。

准入控制过程分为两个阶段。第一阶段,运行变更准入控制器。第二阶段,运行验证准入控制器。

5、Scheduler

Scheduler通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。

Scheduler会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。

对每一个新创建的 Pod 或者是未被调度的 Pod,kube-scheduler 会选择一个最优的 Node 去运行这个 Pod。然而,Pod 内的每一个容器对资源都有不同的需求,而且 Pod 本身也有不同的资源需求。所以Pod 在被调度到 Node 上之前,会根据这些特定的资源调度需求,需要对集群中的 Node 进行一次过滤。

5.1 kube-scheduler 调度流程

kube-scheduler 给一个 pod 做调度选择包含两个步骤:

5.2 Scheduler结构图

image.png

5.3 预选策略(Predicates)

预选策略会进行初步筛选,找出符合条件的节点

5.4 优选策略(Priorities)

5.5 演示

> 这里说没用匹配到,因为没有满足我们条件的节点

更多的内容可以到官网查看,这里不深入了

6、kubelet

7、kube-proxy

Kubernetes proxy在每个节点上运行。

proxy反映了每个节点上 Kubernetes API 中定义的服务,并且可以执行简单的 TCP、UDP 和 SCTP 流转发,或者在一组后端进行循环 TCP、UDP 和 SCTP 转发。

它是Service的透明代理兼负载均衡器,核心功能是将某个Service的访问请求转发到后端的多个Pod实例上

8、kube-controller-manager

Kubernetes 控制器管理器是一个守护进程,嵌入了 Kubernetes 附带的核心控制循环。控制回路是一个永不休止的循环,用于调节系统状态。

它通过 apiserver 监视集群的共享状态,并尝试进行更改以将当前状态转为所需状态。现今,Kubernetes 自带的控制器包括副本控制器,节点控制器,命名空间控制器和serviceaccounts 控制器。

上一篇下一篇

猜你喜欢

热点阅读