Kubernetes学习之路(十一)之资源清单定义
_____egon新书来袭请看:https://egonlin.com/book.html
一 基本介绍
大部分资源的配置清单格式都由5个一级字段组成:
apiVersion: group/version 指明api资源属于哪个群组和版本,同一个组可以有多个版本 $ kubectl api-versions kind: 资源类别,标记创建的资源类型,k8s主要支持以下资源类别 Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob metadata:元数据,主要提供以下字段 name:同一类别下的name是唯一的 namespace:对应的对象属于哪个名称空间 labels:标签,每一个资源都可以有标签,标签是一种键值数据 annotations:资源注解,与label不同的地方在于,annotations不能用于挑选资源对象,仅用于为对象提供"元数据",没有键值长度限制。 每个的资源引用方式(selflink): /api/GROUP/VERSION/namespace/NAMESPACE/TYPE/NAME spec: 定义目标资源的期望状态(disired state),资源对象中最重要的字段 status: 显示资源的当前状态(current state),本字段由kubernetes进行维护
K8s存在内嵌的格式说明,可以使用kubectl explain 进行查看,如查看Pod这个资源的定义:
[root@master01 ~]# kubectl explain pods 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 defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources kind <string> Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds metadata <Object> Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata spec <Object> Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status status <Object> Most recently observed status of the pod. This data may not be up to date. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
从上面可以看到apiVersion,kind等定义的键值都是<string>,而metadata和spec看到是一个<Object>,当看到存在<Object>的提示,说明该字段可以存在多个二级字段,那么可以使用如下命令继续查看二级字段的定义方式:
kubectl explain pods.metadata
kubectl explain pods.spec
kubectl explain pods.spec.containers
kubectl explain pods.spec.containers.livenessProbe # 只要参数是object就可以点下去看详细参数
二级字段下,每一种字段都有对应的键值类型,常用类型大致如下:
<[]string>:表示是一个字串列表,也就是字串类型的数组
<Object>:表示是可以嵌套的字段
<map[string]string>:表示是一个由键值组成映射
<[]Object>:表示是一个对象列表
<[]Object> -required-:required表示该字段是一个必选的字段
二 使用配置清单创建自主式Pod资源
[root@k8s-master ~]# mkdir mainfests [root@k8s-master ~]# cd mainfrests [root@k8s-master mainfrests]# vim pod-demo.yaml apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: default labels: app: myapp tier: frontend spec: containers: - name:myapp image: ikubernetes/myapp:v1 - name: busybox image: busybox:latest command: - "/bin/sh" - "-c" - "sleep 3600" [root@k8s-master mainfrests]# kubectl create -f pod-demo.yaml [root@k8s-master mainfrests]# kubectl get pods [root@k8s-master mainfrests]# kubectl describe pods pod-demo #获取pod详细信息 [root@k8s-master mainfrests]# kubectl logs pod-demo myapp [root@k8s-master mainfrests]# kubectl exec -it pod-demo -c myapp -- /bin/sh
三 Pod资源下spec的containers必需字段解析
[root@k8s-master ~]# kubectl explain pods.spec.containers name <string> -required- #containers 的名字 image <string> #镜像地址 imagePullPolicy <string> #如果标签是latest 就是Always(总是下载镜像) IfNotPresent(先看本地是否有此镜像,如果没有就下载) Never (就是使用本地镜像) ports <[]Object> #是给对象列表 可以暴露多个端口 可以对每个端口的属性定义 例如:(名称(可后期调用)端口号 协议 暴露在的地址上) 暴露端口只是提供额外信息的,不能限制系统是否真的暴露 - containerPort 容器端口 hostIP 主机地址(基本不会使用) hostPort 节点端口 name 名称 protocol (默认是TCP) args <[]string> 传递参数给command 相当于docker中的CMD command <[]string> 相当于docker中的ENTRYPOINT
如果Pod不提供command
或args
使用Container,则使用Docker镜像中的cmd或者ENTRYPOINT。
如果提供了command
和args
,则Docker镜像中的ENTRYPOINT和CMD都将不会生效,Pod中的args
将作为参数给command运行
。
如果Pod提供command
但不提供args
,则仅使用提供 command
的。将忽略Docker镜像中定义EntryPoint和Cmd。
如果Pod中仅提供args
,则args
将作为参数提供给Docker镜像中EntryPoint。
四 标签及标签选择器
1、标签
key=value
- key:只能使用 字母 数字 _ - . (只能以字母数字开头,不能超过63给字符)
- value: 可以为空 只能使用 字母 数字开头
[root@k8s-master mainfests]# kubectl get pods --show-labels #查看pod标签 NAME READY STATUS RESTARTS AGE LABELS pod-demo 2/2 Running 0 25s app=myapp,tier=frontend
[root@k8s-master mainfests]# kubectl get pods -l app #过滤包含app的标签 NAME READY STATUS RESTARTS AGE pod-demo 2/2 Running 0 1m [root@k8s-master mainfests]# kubectl get pods -L app NAME READY STATUS RESTARTS AGE APP pod-demo 2/2 Running 0 1m myapp
[root@k8s-master mainfests]# kubectl label pods pod-demo release=canary #给pod-demo打上标签 pod/pod-demo labeled [root@k8s-master mainfests]# kubectl get pods -l app --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-demo 2/2 Running 0 1m app=myapp,release=canary,tier=frontend
[root@k8s-master mainfests]# kubectl label pods pod-demo release=stable --overwrite #修改标签 pod/pod-demo labeled [root@k8s-master mainfests]# kubectl get pods -l release NAME READY STATUS RESTARTS AGE pod-demo 2/2 Running 0 2m [root@k8s-master mainfests]# kubectl get pods -l release,app NAME READY STATUS RESTARTS AGE pod-demo 2/2 Running 0 2m
2、标签选择器
- 等值关系标签选择器:=, == , != (kubectl get pods -l app=test,app=dev)
- 集合关系标签选择器: KEY in (v1,v2,v3), KEY notin (v1,v2,v3) !KEY (kubectl get pods -l "app in (test,dev)")
许多资源支持内嵌字段
- matchLabels: 直接给定建值
- matchExpressions: 基于给定的表达式来定义使用标签选择器,{key:"KEY",operator:"OPERATOR",values:[V1,V2,....]}
- 操作符: in notin:Values字段的值必须是非空列表 Exists NotExists: Values字段的值必须是空列表
3、节点标签选择器
[root@k8s-master mainfests]# kubectl explain pod.spec nodeName <string> NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements. nodeSelector <map[string]string> NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
nodeSelector可以限定pod创建在哪个节点上,举个例子,给节点k8s-node01打上标签disktype=ssd,让pod-demo指定创建在k8s-node01上
(1)给k8s-node01节点打标签
[root@k8s-master mainfests]# kubectl label nodes k8s-node01 disktype=ssd node/k8s-node01 labeled [root@k8s-master mainfests]# kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELS k8s-master Ready master 10d v1.11.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=k8s-master,node-role.kubernetes.io/master= k8s-node01 Ready <none> 10d v1.11.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=k8s-node01 k8s-node02 Ready <none> 9d v1.11.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=k8s-node02
(2)修改yaml文件,增加标签选择器 [root@k8s-master mainfests]# cat pod-demo.yaml apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: default labels: app: myapp tier: frontend spec: containers: - name: myapp image: ikubernetes/myapp:v1 - name: busybox image: busybox:latest command: - "/bin/sh" - "-c" - "sleep 3600" nodeSeletor: disktype: ssd
(3)重新创建pod-demo,可以看到固定调度在k8s-node01节点上 [root@k8s-master mainfests]# kubectl delete -f pod-demo.yaml pod "pod-demo" deleted [root@k8s-master mainfests]# kubectl create -f pod-demo.yaml pod/pod-demo created [root@k8s-master mainfests]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE pod-demo 2/2 Running 0 20s 10.244.1.13 k8s-node01 [root@k8s-master mainfests]# kubectl describe pod pod-demo ...... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 42s default-scheduler Successfully assigned default/pod-demo to k8s-node01 ......
五 示例
apiVersion: v1 # 必选,指定api接口资源版本 kind: Pod # 必选,定义资源接口类型/角色。pod为容器资源 metadata: # 必选,定义资源的元数据信息 name: nginx # 必选,定义资源名称,在同一个namespace中必须是唯一的 namespace: web-testing # 可选,不指定默认为default,指定资源所在的命名空间 labels: # 可选,定义资源标签 - app: nginx annotations: # 可选,注释列表 - app: nginx spec: # 必选,用于定义容器的详细信息 containers: # 必选,容器列表 - name: nginx # 必选,符合RFC 1035规范的容器名称 image: nginx:v1 # 必选,容器所用的镜像的地址 imagePullPolicy: Always # 可选,镜像拉取策略 workingDir: /usr/share/nginx/html # 可选,容器的工作目录 volumeMounts: # 可选,存储卷配置 - name: webroot # 存储卷名称 mountPath: /usr/share/nginx/html # 挂载目录 readOnly: true # 只读 ports: # 可选,容器需要暴露的端口号列表 - name: http # 端口名称 containerPort: 80 # 端口号 protocol: TCP # 端口协议,默认TCP env: # 可选,环境变量配置 - name: TZ # 变量名 value: Asia/Shanghai #变量 - name: LANG value: en_US.utf8 resources: # 可选,资源限制和资源请求限制 limits: # 最大限制设置 cpu: 1000m memory: 1024MiB requests: # 启动所需的资源 cpu: 100m memory: 512MiB readinessProbe: # 可选,容器状态检查 httpGet: # 检测方式 path: / # 检查路径 port: 80 # 监控端口 timeoutSeconds: 2 # 超时时间 initialDelaySeconds: 60 # 初始化时间 livenessProbe: # 可选,监控状态检查 exec: # 检测方式 command: - cat - /health httpGet: # 检测方式 path: /_health port: 8080 httpHeaders: - name: end-user value: jason tcpSocket: # 检测方式 port: 80 initialDelaySeconds: 60 # 初始化时间 timeoutSeconds: 2 # 超时时间 periodSeconds: 5 # 检测间隔 successThreshold: 2 # 检查成功为2次表示就绪 failureThreshold: 1 # 检测失败1次表示未就绪 securityContext: # 可选,限制容器不可信的行为 provoleged: false restartPolicy: Always # 可选,默认为Always nodeSelector: # 可选,指定Node节点 region: subnet7 imagePullSecrets: # 可选,拉取镜像使用的secret - name: default-dockercfg-86258 hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口 volumes: # 共享存储卷列表 - name: webroot # 名称,与上述对应 emptyDir: {} # 共享卷类型,空 hostPath: # 共享卷类型,本机目录 path: /etc/hosts secret: # 共享卷类型,secret模式,一般用于密码 secretName: default-token-tf2jp # 名称 defaultMode: 420 # 权限 configMap: # 一般用于配置文件 name: nginx-conf defaultMode: 420