命令记不住

登陆

k8s 的核心功能和命令

00.k8s的核心功能和命令

1.核心功能

  • 服务的发现与负载均衡
  • scheduling调度,会去做存储的编排,让存储的声明与容器的声明周期能有一个连接
  • 自动容器的恢复,对不可用容器进行恢复
  • 应用的自动发布与应用的回滚,以及应用相关的配置密文的管理
  • job类型任务,可以做批量的执行
  • 支持水平伸缩

1.调度

Kubernetes 可以把用户提交的容器放到 Kubernetes 管理的集群的某一台节点上去。Kubernetes 的调度器是执行这项能力的组件,它会观察正在被调度的这个容器的大小、规格。

比如说它所需要的 CPU以及它所需要的 memory,然后在集群中找一台相对比较空闲的机器来进行一次 placement,也就是一次放置的操作。在这个例子中,它可能会把这个容器放置到第二个空闲的机器上,来完成一次调度的工作。

2.自动修复

Kubernetes 有一个节点健康检查的功能,它会监测这个集群中所有的宿主机,当宿主机本身出现故障,或者软件出现故障的时候,这个节点健康检查会自动对它进行发现。

Kubernetes 会把运行在这些失败节点上的容器进行自动迁移,迁移到一个正在健康运行的宿主机上,来完成集群内容器的一个自动恢复。

3.水平伸缩

Kubernetes 有业务负载检查的能力,它会监测业务上所承担的负载,如果这个业务本身的 CPU 利用率过高,或者响应时间过长,它可以对这个业务进行一次扩容。

2.kubernetes的架构

Kubernetes 架构是一个比较典型的二层架构和 server-client 架构。Master 作为中央的管控节点,会去与 Node 进行一个连接。

所有 UI 的、clients、这些 user 侧的组件,只会和 Master 进行连接,把希望的状态或者想执行的命令下发给 Master,Master 会把这些命令或者状态下发给相应的节点,进行最终的执行。

Kubernetes 的 Master 包含四个主要的组件:API Server、Controller、Scheduler 以及 etcd

  • API Server:处理API操作,k8s中所有的组件都会和API Server进行连接,组件与组件之间一般不进行独立的连接,都依赖与API Server进行消息的传送
  • Controller:控制器,他用来完成对集群状态的一些管理,比如第一个自动对容器进行修复。第二个自动进行水平扩张,都是由Kubernetes中的Controller来进行完成的
  • Scheduler:调度器,完成调度的操作,把一个用户提交的Container,依据它对CPU,对memory请求大小,找一台合适的节点进行放置
  • ectd:是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中,etcd 本身是一个高可用系统,通过 etcd 保证整个 Kubernetes 的 Master 组件的高可用性。

1.Node

Kubernetes 的 Node 是真正运行业务负载的,每个业务负载会以 Pod 的形式运行。一个 Pod 中运行的一个或者多个容器,真正去运行这些 Pod 的组件的是叫做 kubelet,也就是 Node 上最为关键的组件,它通过 API Server 接收到所需要 Pod 运行的状态

Plugin,在 OS 上去创建容器所需要运行的环境,最终把容器或者 Pod 运行起来,也需要对存储跟网络进行管理。Kubernetes 并不会直接进行网络存储的操作,他们会靠 Storage Plugin 或者是网络的 Plugin 来进行操作。用户自己或者云厂商都会去写相应的 Storage Plugin 或者 Network Plugin,去完成存储操作或网络操作。

Kube-proxy,在 Kubernetes 自己的环境中,也会有 Kubernetes 的 Network,它是为了提供 Service network 来进行搭网组网的。真正完成 service 组网的组件的是 Kube-proxy,它是利用了 iptable 的能力来进行组建 Kubernetes 的 Network,就是 cluster network,以上就是 Node 上面的四个组件。

2.完成一次Pod的调度执行操作

用户可以通过 UI 或者 CLI 提交一个 Pod 给 Kubernetes 进行部署,这个 Pod 请求首先会通过 CLI 或者 UI 提交给 Kubernetes API Server,下一步 API Server 会把这个信息写入到它的存储系统 etcd,之后 Scheduler 会通过 API Server 的 watch 或者叫做 notification 机制得到这个信息:有一个 Pod 需要被调度。

这个时候 Scheduler 会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向 API Server report 说:“OK!这个 Pod 需要被调度到某一个节点上。”

这个时候 API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中,然后 API Server 会通知相应的节点进行这次 Pod 真正的执行启动。相应节点的 kubelet 会得到这个通知,kubelet 就会去调 Container runtime 来真正去启动配置这个容器和这个容器的运行环境,去调度 Storage Plugin 来去配置存储,network Plugin 去配置网络。

3.Kubernetes 的核心概念与它的 API

1.Pod

Pod 是 Kubernetes 的一个最小调度以及资源单元。用户可以通过 Kubernetes 的 Pod API 生产一个 Pod,让 Kubernetes 对这个 Pod 进行调度,也就是把它放在某一个 Kubernetes 管理的节点上运行起来。一个 Pod 简单来说是对一组容器的抽象,它里面会包含一个或多个容器。

  • 最小的调度以及资源单位
  • 由一个或者多个容器组成
  • 定义容器运行的方式,Command,环境变量等
  • 提供给容器共享的运行环境,网络、进程空间

在 Pod 里面,我们也可以去定义容器所需要运行的方式。比如说运行容器的 Command,以及运行容器的环境变量等等。Pod 这个抽象也给这些容器提供了一个共享的运行环境,它们会共享同一个网络环境,这些容器可以用 localhost 来进行直接的连接。而 Pod 与 Pod 之间,是互相有 isolation 隔离的。

2.Volume

Volume 就是卷的概念,它是用来管理 Kubernetes 存储的,是用来声明在 Pod 中的容器可以访问文件目录的,一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。而 Volume 本身是一个抽象的概念,一个 Volume 可以去支持多种的后端存储。

  • 声明在Pod中的容器可以访问的文件目录
  • 可以被挂载pod中一个容器的指定路径下
  • 支持多种后端存储的抽象

3.deployment

Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组 Pod 的副本数目、以及这个 Pod 的版本。一般大家用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。

Kubernetes 是通过 Controller,也就是我们刚才提到的控制器去维护 Deployment 中 Pod 的数目,它也会去帮助 Deployment 自动恢复失败的 Pod。

比如说我可以定义一个 Deployment,这个 Deployment 里面需要两个 Pod,当一个 Pod 失败的时候,控制器就会监测到,它重新把 Deployment 中的 Pod 数目从一个恢复到两个,通过再去新生成一个 Pod。通过控制器,我们也会帮助完成发布的策略。比如说进行滚动升级,进行重新生成的升级,或者进行版本的回滚。

  • 定义一组Pod的副本数目、版本等
  • 通过控制器维护Pod的数目
  • 自动恢复失败的Pod
  • 通过控制器以指定的策略控制版本
  • 滚动升级、重新生成、回滚等

4.Service

service 提供了一个或者多个 Pod 实例的稳定访问地址。实现 Service 有多种方式,Kubernetes 支持 Cluster IP, kuber-proxy 的组网,它也支持 nodePort、 LoadBalancer 等其他的一些访问的能力。

  • ClusterIP
  • NodePort
  • LoadBalancer

5.namespace

Namespace 是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。

  • 一个集群内部的逻辑隔离机制,鉴权、资源额度
  • 每个资源都属于一个Namespace中的资源明明唯一
  • 不同Namespace中的资源可以重名

6.Kubernetes 的 API

API 从 high-level 上看,Kubernetes API 是由 HTTP+JSON 组成的:用户访问的方式是 HTTP,访问的 API 中 content 的内容是 JSON 格式的。

资源实例的content 内容都是用 JSON 或者是 YAML 表达的。

  • kind 如果是 pod,在 Metadata 中,就写上这个 Pod 的名字
  • 在 Metadata 中,有时候也会去写 annotation,也就是对资源的额外的一些用户层次的描述。
  • Spec 也就是我们希望 Pod 达到的一个预期的状态。比如说它内部需要有哪些 container 被运行;比如说这里面有一个 nginx 的 container,它的 image 是什么?它暴露的 port 是什么?
  • status,它表达了这个资源当前的状态;比如说一个 Pod 的状态可能是正在被调度、或者是已经 running、或者是已经被 terminates,就是被执行完毕了。
  • label 是一个非常核心的 kubernetes API 的概念,通过 label,kubernetes 的 API 层就可以对这些资源进行一个筛选,那这些筛选也是 kubernetes 对资源的集合所表达默认的一种方式。

4.集群与组件

Master组件

kube-apiserver

Kubernetes Api,集群的统一入口,各组件协调则,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

kube-controller-manager

处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManafer就是负责这些控制器的。例如Deployment,Service

Kube-scheduler

根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上

etcd

分布式键值存储系统。用于保存集群状态数据,例如Pod、Service等对象信息

Node组件

kubelet

kubelet是master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载数据卷、下载secret、获取容器和节点状态等工作。Kubelet将每个Pod转换成一组容器

kube-proxy

在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作

第三方容器引擎

例如docker containerd podman容器引擎,运行容器

4.基本资源概念

1.基本资源

Pod:

k8s最小部署单元,一组容器的集合

Deployment:

最常见的控制器,用于更高级别部署和管理Pod

Service:

为一组Pod提供负载均衡,对外提供统一访问入口

Label:

标签,附加到某个资源上,用于关联对象、查询和筛选

Namespace:

命名空间,将对象逻辑上隔离,也利于权限控制

2.查看集群状态

查看master组件状态

kubectl get cs

查看所有资源

kubectl api-resources

查看node状态

kubectl get node

查看APIserver代理的URL

kubectl cluster-info

查看集群的详细信息

kubectl cluster-info dump

查看资源的详细信息

kubectl describe <资源类型> <资源明显>

查看资源信息

kubectl get <资源类型> -o wide -o yaml

推荐阅读