k8s资源对象
工作负载型资源(workload):Pod, ReplicaSet, Deployment, StatefulSet, DaemonSet, Job, Cronjob,...
服务发现及负载均衡资源: Service, Ingress, ...
配置与存储相关资源: 存储卷(Volume),CSI(容器存储接口);ConfigMap,Secret, DownwardAPI
集群级资源:NameSpace, Node, Role, ClusterRole, RoleBinding, ClusterRoleBinding
元数据型资源: HPA, PodTemplate, LimitRange
Pod资源配置格式
创建资源时apiserver仅接收JSON格式的资源定义,kubectl run
这种方式运行一个资源,这种方式kubectl会自动把各个参数转换为JSON格式,而在对k8s资源进行管理时直接使用JSON格式的数据不太让人容易维护和理解,所以使用yaml格式的方式来编写,yaml能无损的转换为JSON格式。
要想获取一个已有资源的yaml格式文件,只需要在获取资源信息时加上-o yaml
选项即可,如
# 获取一个pod资源的yaml格式的信息
k8s@node01:~$ kubectl get pod myapp-dep-c988cf69-2dps2 -o yaml
# 获取一个node资源的yaml格式的信息
k8s@node01:~$ kubectl get node node01 -o yaml
资源清单配置字段
大部分资源配置清单字段
apiVersion: group/version
表示使用apiServer的版本
apiVersion的版本分了许多组,每个组又有多个版本并存,如果省略"group",表示是核心组。`kubectl api-versions`可获取当前apiserver有哪些分组以及版本。
kind: <String>
资源类别
metadata: <Object>
元数据
object一般有以下对象:
name: 名称
namespace: 名称空间
labels: 标签
annotations: 注解
selfLink: 资源的自引用地址,格式为: /api/GROUP/VERSION/namespaces/NAMESPACE/TYPE/NAME,如:“selfLink: /api/v1/namespaces/default/pods/myapp-dep-c988cf69-2dps2”
spec: <Object>
定义用户对资源期望的目标状态
status: <Object>
资源的当前状态,该字段由k8s集群动态维护,用户不可定义该字段,对用户只读
资源配置帮助信息获取
资源配置清单中所用到的字段众多,能实现对资源的各种定义,帮助的获取对运维人员尤其重要,好在kubectl命令为我们提供了对各种资源定义时的帮助信息。
# 获取用户能定义哪些资源类型
k8s@node01:~$ kubectl api-resources
# 使用explain选项查看指定类型资源的定义帮助信息
k8s@node01:~$ kubectl explain --help
# 查看pods资源的帮助
k8s@node01:~$ kubectl explain pods
# 查看pods下spec字段的帮助,如果还有下一级,依此类推
k8s@node01:~$ kubectl explain pods.spec
自主式pod配置清单事例
k8s@node01:~/my_manifests$ pwd
/home/k8s/my_manifests
k8s@node01:~/my_manifests$ cat pods-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: app
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
- name: bbox
image: busybox:latest
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
yaml语法说明:
使用缩进表示层级关系,缩进的空格数不重要,只要相同层级的元素左对齐即可。如果是对象(Object),也叫映射(mapping)/哈希(hash)/字典(dictionary)。
对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格,key的值是一个对象,则使用 key:{key1: value1, key2: value2, ...},也可以使用缩进表示
key:
child-key: value
child-key2: value2
以 - 开头的行表示构成一个数组
- A
- B
事例中
labels:
app: myapp
tier: frontend
可以改写为
labels: {app: myapp, tier: frontend}
###########
containers:
- name: app
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
- name: bbox
image: busybox:latest
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
可改写为
containers: [{name: app, image: ikubernetes/myapp:v1, imagePullPolicy: IfNotPresent}, {name: bbox, image: busybox:latest, command: ["/bin/sh", "-c", "sleep 3600"]}]
但实际中缩写yaml文件都保持yaml的风格,不太会使用{}
和[]
。
应用yaml文件
k8s@node01:~/my_manifests$ kubectl create -f pods-demo.yaml # 根据资源清单创建相应资源
pod/pod-demo created
k8s@node01:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-dep-c988cf69-2dps2 1/1 Running 0 3h13m
myapp-dep-c988cf69-hjm8j 1/1 Running 0 3h14m
myapp-dep-c988cf69-j56hp 1/1 Running 0 3h13m
mynginx-deployment-646959f957-jqq67 1/1 Running 0 3h13m
pod-demo 2/2 Running 0 84s
k8s@node01:~/my_manifests$ kubectl delete -f pods-demo.yaml # 根据资源清单删除相应的资源
pod/pod-demo created