Kubernetes部署与运维09 Kubernetes API与Resources

189 阅读6分钟

Kubernetes目前大约每年发布三次,由于迭代速度快,目前市场上绝大部分的教程相对陈旧。更重要的是,从Kubernetes 1.20开始,Kubernetes官方宣布逐步弃用Docker作为容器运行时,并计划在Kubernetes 1.24版本中完全移除对Docker作为容器运行时的支持。这意味着,从Kubernetes 1.24版本开始,将不能使用Docker作为容器运行时来运行Kubernetes节点上的Pods。因此,市场上关于直接使用containerd容器运行时的新版Kubernetes教程几乎没有,更重要的是因为的Kubernetes涉及到镜像需要单独配置才能获取,这无疑拉高了初学者门槛。本教程采用互联网的形式进行发布,便于保持与Kubernetes最新版的同步,尽量自包含,便于读者学习、实践。

关键字Kubernetes 1.32; containerd; nerdctl; debain 12

整体规划

为方便后续内容学习,本部分将基于【Kubernetes部署与运维07 Helm部署】中的环境开展KubernetesAPIResources学习。整体规划如下:

虚拟机名称IP地址主机名域名CPU核心内存角色
k8s_Master1_2G192.168.152.200master1master.rz22GBmaster
K8s_Worker1_2G192.168.152.201worker1worker1.rz12GBworker
K8s_Worker2_2G192.168.152.202worker2worker2.rz12GBworker

参见【Kubernetes部署与运维02 Nerdctl Rootful部署】,Kubernetes基础环境各组件与版本信息如下:

- nerdctl: v1.7.7
- containerd: v1.7.22
- runc: v1.1.14
- CNI plugins: v1.5.1
- BuildKit: v0.15.2
- Stargz Snapshotter: v0.15.1
- imgcrypt: v1.1.11
- RootlessKit: v2.3.1
- slirp4netns: v1.3.1
- bypass4netns: v0.4.1
- fuse-overlayfs: v1.13
- containerd-fuse-overlayfs: v1.0.8
- Kubo (IPFS): v0.29.0
- Tini: v0.19.0
- buildg: v0.4.1

Kubernetes版本号为1.32

理论知识

Kubernetes API版本控制

【官方参考文档】

  •  https://kubernetes.io/zh/docs/concepts/overview/kubernetes-api/
  • https://kubernetes.io/zh/docs/reference/using-api/#api-groups

Kubernetes控制平面(Control Plane)的核心是API服务器(kube-apiserver)。API服务器负责提供HTTP API,以供用户、集群中的不同部分和集群外部组件相互通信。Kubernetes API使用户可以查询和操纵Kubernetes API中对象(例如:PodNamespaceConfigMapEvent)的状态。大部分操作都可以通过kubectl命令行接口或类似kubeadm这类命令行工具来执行,这些工具在背后也是调用Kubernetes API。不过,也可以使用REST调用来访问这些Kubernetes API

REST APIKubernetes的基本结构。所有操作和组件之间的通信及外部用户命令都是调用Kubernetes API服务器处理的REST API。因此,Kubernetes平台视一切皆为Kubernetes API对象,且它们在Kubernetes API中有相应的定义。

不同的Kubernetes API版本代表着不同的稳定性和支持级别:

  • Alpha: a)版本名称包含alpha(例如,v1alpha1); b)软件可能会有Bug。启用某个特性可能会暴露出Bug。某些特性可能默认禁用; c)对某个特性的支持可能会随时被删除,恕不另行通知; d)API可能在以后的软件版本中以不兼容的方式更改,恕不另行通知; e)由于缺陷风险增加和缺乏长期支持,建议该软件仅用于短期测试集群。

  • Beta: a)版本名称包含beta(例如,v2beta3); b)软件被很好的测试过。启用某个特性被认为是安全的。特性默认开启; c)尽管一些特性会发生细节上的变化,但它们将会被长期支持; d)后续发布版本可能会有不兼容的变动,因此该版本的软件不建议生产使用。

  • Stable: a)版本名称如vX,其中X为整数; b)特性的稳定版本会出现在后续很多版本的发布软件中。

Kubernetes API组

Kubernetes API组能够简化对Kubernetes API的扩展。Kubernetes API组信息出现在REST路径中,也出现在序列化对象的apiVersion字段中。

以下是Kubernetes中的几个组:

  • 核心(也叫legacy)组的REST路径为/api/v1。核心组并不作为apiVersion字段的一部分,例如,apiVersion: v1
  • 指定的组位于REST路径/apis/$GROUP_NAME/$VERSION,并且使用apiVersion: $GROUP_NAME/$VERSION(例如,apiVersion: batch/v1)表示。可以在Kubernetes API参考文档中查看全部的API组。

Kubernetes API参考文档:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/

资源和Kubernetes API组是在默认情况下被启用的。可以通过在Kubernetes API服务器上设置--runtime-config参数来启用或禁用它们。--runtime-config参数接受逗号分隔的<key>[=<value>]对,以描述Kubernetes API服务器的运行时配置。如果省略了=<value>部分,那么视其指定值为=true。例如:

  • 禁用batch/v1,对应参数设置--runtime-config=batch/v1=false
  • 启用batch/v2alpha1,对应参数设置--runtime-config=batch/v2alpha1

启用或禁用Kubernetes API组或资源时,需要重启Kubernetes API服务器和控制器管理器以使--runtime-config生效。

案例实践

前期准备

同时开启K8s_Master1_2GK8s_Worker1_2GK8s_Worker2_2G三台虚拟机。

Kubernetes API版本查看

【实践01-Kubernetes API版本查看】

查看Kubernetes API版本,并了解核心组与命名组。

可使用kubectl api-version命令查看含有Kubernetes API组的Kubernetes API版本:

root@master1:~# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2
batch/v1
certificates.k8s.io/v1
coordination.k8s.io/v1
crd.projectcalico.org/v1
discovery.k8s.io/v1
events.k8s.io/v1
flowcontrol.apiserver.k8s.io/v1
metrics.k8s.io/v1beta1
networking.k8s.io/v1
node.k8s.io/v1
policy.networking.k8s.io/v1alpha1
policy/v1
rbac.authorization.k8s.io/v1
scheduling.k8s.io/v1
storage.k8s.io/v1
v1

/之前的是Kubernetes API组名,/之后的是版本。该命令列出了当前Kubernetes所支持的API组及版本; 除了最后的一项v1之外,其他都是命名组,v1是核心组。

Kubernetes API Resources查看

【实践02-Kubernetes API Resources查看】

查看Kubernetes API Resources,并了解各资源对应的缩写、KIND列等信息。

1)可使用kubectl api-resources命令查看含有Kubernetes API资源:

root@master1:~# kubectl api-resources
NAME         SHORTNAMES   APIVERSION                     NAMESPACED   KIND
...
namespaces   ns           v1                             false        Namespace
nodes        no           v1                             false        Node
...
pods         po           v1                             true         Pod
...
roles                     rbac.authorization.k8s.io/v1   true         Role
...

2)SHORTNAMES列表示对应的API资源可以采用的相应的缩写。例如,nodes的缩写为no,因此在查看节点(nodes)的简略信息时,除了之前一直使用的kubectl get nodes命令之外,还可以使用kubectl get no命令:

root@master1:~# kubectl get no
NAME      STATUS   ROLES                  AGE     VERSION
master1   Ready    control-plane,master   25h     v1.32.1
worker1   Ready    worker                 9h      v1.32.1
worker2   Ready    worker                 7h51m   v1.32.1

本教程中如无特殊说明,在kubectl命令中对API资源均不采用缩写形式表示。

  • NAMESPACED列为trueAPI资源可归属到某个特定的命名空间namespace,而为false的则为集群资源(不属于任何特定的namespace)。例如,nodes便是属于集群资源。
  • KIND列为类型,在【Kubernetes部署与运维04 Kubernetes集群创建-控制平面创建】中所生成的init-defaults.yaml文件中,就含有kind字段。KIND字段是区分大小写的,因此,在编写yaml格式的配置文件时,要注意大小写区分,并且其kind取值要与kubectl api-resources命令输出中KIND列值一致。

收尾工作

1)使用poweroff命令,关闭三台虚拟机。

2)AI时代背景之下,运维将从传统CPU服务器切入到GPU服务器与端边设备,对于运维开发人员,技术玩家而言,也同步需要跟上新的技术栈。本学习内容涉及到的软件包、配置文件等资源,可以直接从百度网盘下载获取:

  • 百度网盘分享文件:Kubernetes1.32
  • 链接:https://pan.baidu.com/s/18XeGQ28BDPjHh8JKj0uZFQ?pwd=6x17 提取码:6x17