可以理解为对一种资源描述的文件,写清楚了才能达到我们的期望去创建集群
1.k8s中的资源
K8s 中所有的内容都抽象为资源, 资源实例化之后,叫做对象
资源:比如人类,植物,灌木之类的,Pod就是一个资源,里面包括一些main-C,pause等等
对象:比如人类里的张三,就是对象。对象是存在的实体,并且有着资源的一切特性
k8s中存在哪些资源
名称空间级别
-
工作负载型资源: Pod、ReplicaSet、Deployment ...
-
服务发现及负载均衡型资源: Service、Ingress...
-
配置与存储型资源:Volume、CSI ...
-
特殊类型的存储卷:ConfigMap、Secre ...
名称空间型:
这里是非物理性的空间隔离,不是真实的,比如100个同学是个小组。
在创建和使用的时候一定要指定名称空间
集群级资源
-
Namespace、Node、ClusterRole、ClusterRoleBinding
集群级资源:
比如校长就属于集群的,或者,县长,省长,主席
使用的时候不用指定
元数据型资源
-
HPA、PodTemplate、LimitRange
元数据型:
没有办法单独存在,必须要依附在别的资源上
HPA,自动扩容,依托于Pod
PodTemplate:Pod的模板
LimitRange:资源限制,也需要依附于Pod
2.资源清单
在 k8s 中,一般使用 yaml 格式的文件来创建符合我们预期期望的 pod或者各种资源 ,这样的 yaml 文件我们一般称为资源清单
资源清单格式
apiVersion: group/apiversion # 如果没有给定 group 名称,那么默认为 core,可以使用 kubectl api-versions # 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 )
kind: #资源类别
metadata: #资源元数据
name
namespace
lables
annotations # 主要目的是方便用户阅读查找
spec: # 期望的状态(disired state)
status:# 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义
配置清单主要有五个一级字段,其中status用户不能定义,有k8s自身维护
每个资源下都可以有实现对应功能的子目录,如果你想实现这些功能,那最起码要知道代码在那个目录下,也就是用的版本是哪个
V1就是核心组的V1版本,其他的组和版本都是对他的补充
资源清单的常用命令
获取 apiversion 版本信息
[root@k8s-master01 ~]# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
......(以下省略)
获取资源的 apiVersion 版本信息
[root@k8s-master01 ~]# kubectl explain pod
KIND: Pod
VERSION: v1
.....(以下省略)
[root@k8s-master01 ~]# kubectl explain Ingress
KIND: Ingress
VERSION: extensions/v1beta1
获取字段设置帮助文档
[root@k8s-master01 ~]# kubectl explain pod
KIND: Pod
VERSION: v1
DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is
created by clients and scheduled onto hosts.
FIELDS:
apiVersion <string>
........
........
字段配置格式
apiVersion <string> #表示字符串类型
metadata <Object> #表示需要嵌套多层字段
labels <map[string]string> #表示由k:v组成的映射
finalizers <[]string> #表示字串列表
ownerReferences <[]Object> #表示对象列表
hostPID <boolean> #布尔类型
priority <integer> #整型
name <string> -required- #如果类型后面接 -required-,表示为必填字段
通过定义清单文件创建 Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp-1
image: wangyanglinux/myapp:v1
- name: busybox-1
image: busybox:1.38.0
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
kubectl get pod xx.xx.xx -o yaml
<!--使用 -o 参数 加 yaml,可以将资源的配置以 yaml的格式输出出来,也可以使用json,输出为json格式-->
3.常用字段解释
扩展
golang语言的版本规则
x.x.x
比如目前的Kubernetes就是1.27.1
中间的27表示的是大版本的更新,而且27必须要兼容26或者兼容大部分。后面的1是小更新,而且在1.27.2里面必须能有1.27.1的全部功能
前面的1除非是有翻天覆地的变化才会改,比如可以直接在硬件上跑k8s了,当然,这目前只是设想
RPC协议
GRPC 远程过程调用(G就是谷歌开发的RPC)
和http协议的区别就是:rpc是二进制的数据传输。而且具备特殊编码,可以让传输数据更小
k8s中的缩写
在k8s中很多命令是可以缩写的,比如pod可以缩写为po,replicationController可以缩写为rc(复制控制器)
svc=service,configmap=cm
组件之间的交互
不是两个组件自己直接交互,而是写入etcd,由etcd帮着转发
这叫发布者和订阅者
所以实时交互的数据不是很快
Kubernetes更需要持久化,因为每次的pod都是重建,而不是重启,没有持久化的话数据就都没了,尤其是数据库的pod
如果当前的节点存储资源被占用80以上,Kubernetes会自动清空已死的容器和无用的镜像