3.Kubernetes YAML资源编排

Kubernetes YAML资源编排

使用YAML用于K8s的定义带来的好处包括:

  • 便捷性:不必添加大量的参数到命令行中执行命令
  • 可维护性:YAML文件可以通过源头控制,跟踪每次操作
  • 灵活性:YAML可以创建比命令行更加复杂的结构

语法格式

空格、缩进表示层级关系;不支持tab缩进,开头缩进2个空格

字符串后缩进1个空格,如冒号、逗号

字符后缩进1个空格,如冒号、逗号

“---”表示YAML格式,一个文件的开始

“#”注释

在Kubernetes中,两种结构类型:

  • Lists
  • Maps

YAML Maps

Map顾名思义指的是字典,即一个Key:Value 的键值对信息。例如

---
apiVersion: v1
kind: Pod

---可选的分隔符 ,当需要在一个文件中定义多个结构的时候需要使用。上述内容表示有两个键apiVersion和kind,分别对应的值为v1和Pod。

YAML Lists

List即列表,说白了就是数组,例如

args
 -beijing
 -shanghai
 -shenzhen
 -guangzhou

YAML内容

在K8S部署一个应用的YAML内容大致分为两部分:

控制器定义:定义控制器属性

被控制对象:Pod模板,定义容器属性

字段意义

#可以通过explain查看更详细的帮助文档获得
kubectl explain pods.spec.containers
一级字段 字段含义
apiVersion API版本
kind 资源类型
metadata 资源元数据
spec 定义目标状态
status 当前状态

apiVersion

这个版本号需要根据安装的Kubernetes版本和资源类型进行变化。

# 查看kubernetes(1.16)支持api类型
# kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

kind

kind:根据实际情况,此处资源类型可以是Pod、Deployment、Job、Ingress、Service等

#查询可使用kind类型
kubectl api-resources
NAME                              SHORTNAMES   APIGROUP                       NAMESPACED KIND
bindings                                                                      true       Binding
componentstatuses                 cs                                          false        ComponentStatus
configmaps                        cm                                          true       ConfigMap
endpoints                         ep                                          true       Endpoints
events                            ev                                          true       
......

metadata

包含Pod的一些meta信息,例如

二级字段 字段含义
name 资源名称
namespace 名称空间
labels 标签
annotations 注释
selfLink 资源引用路径(/api/$GROUP/$VERSION/$namespaces/$NAMESPACE/$TYPE/$NAME)

spec

由用户定义目标状态、即期望状态,包括一些container,storage,volume以及其他Kubernetes需要的参数,以及诸如是否在容器失败时重新启动容器的属性。可在特定Kubernetes API找到完整的Kubernetes Pod的属性。

status

status字段来记录对象在系统上的当前状态,因此status字段仅对活动对象才有意义,用户不能手动定义,由Kubernetes集群维护。与spec不符时,无限向spec定义字段靠近

编写YAML技巧

#用run命令生成部署模板
kubectl create deployment nginx --image=nginx:1.14 -o yaml --dry-run> my-deploy.yaml 
#用get命令将已有部署的应用yaml导出
kubectl get my-deploy/nginx -o=yaml --export  > my-deploy.yaml

YAML创建过程

1、编写

# vim pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-number 			#而且这个位置的名字好像不支持大写字母
  namespace: default
  labels:					#这个位置可以使用{key:value,key:value.....}kv之间逗号隔开
    app: myweb				#注意这个位置的名字和下面创建image的时候的名字一致
    tier: Not outside
spec:
  containers:
  - name: myweb
  image: ikubernetes/myapp:v1
  - name: busybox			#如果有多个容器,还可以多定义几个
  image: busybox:latest 	#因为busybox默认是启动的sh命令,我们可以给shell命令传递些参数。
  command: (["/bin/sh","-c","sleep 20"]) 传递的参数可以使用[]来写,也可以用下面的形式来定义)
  - "/bin/sh"
  - "-c"
  - "sleep 3600"
  

2、创建

kubectl create -f pod-test.yaml
kubectl get pods
NAME         READY   STATUS             RESTARTS   AGE
pod-web       1/1     Running            0         88s
pod-number    2/2     Running            0         5m59s

3、查看

kubectl describe pods pod-number

4、查询日志

kubectl logs pod-number busybox

5、进入pod操作

kubectl exec --help  可以使用exec命令来操作命令行格式
Usage:
  kubectl exec POD [-c CONTAINER] -- COMMAND [args...] [options]
#注意command前面的--是固定格式
kubectl exec -it pod-number -c myweb -- /bin/sh 
/ #

6、删除pod

kubectl delete -f pod-test.yaml

详细示例(Pod):

apiVersion: v1       			#必选API版本号,例如v1
kind: Pod       				#必选类型,(Pod、deployment、service)
metadata:       				#必选元数据类型
  name: string       			#必选,Pod名称
  namespace: string    			#必选,Pod所属的命名空间
  labels:      					#自定义标签
    - name: string     			#自定义标签名字
  annotations:       			#自定义注释列表
    - name: string
spec:         					#必选,Pod中容器的详细定义
  containers:      				#必选,Pod中容器列表
  - name: string     			#必选,容器名称
    image: string    			#必选,容器的镜像名称
    imagePullPolicy: [Always | Never | IfNotPresent] 		#获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
    command: [string]    		#容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]     			#容器的启动命令参数列表
    workingDir: string     		#容器的工作目录
    volumeMounts:    			#挂载到容器内部的存储卷配置
    - name: string     			#引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string    		#存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean    		#是否为只读模式
    ports:       				#需要暴露的端口库号列表
    - name: string     			#端口号名称
      containerPort: int   		#容器需要监听的端口号
      hostPort: int    			#容器所在主机需要监听的端口号,默认与Container相同
      protocol: string     		#端口协议,支持TCP和UDP,默认TCP
    env:       					#容器运行前需设置的环境变量列表
    - name: string     			#环境变量名称
      value: string    			#环境变量的值
    resources:       			#资源限制和请求的设置
      limits:      				#资源限制的设置
        cpu: string    			#Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string     		#内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests:      			#资源请求的设置
        cpu: string    			#Cpu请求,容器启动的初始可用数量
        memory: string     		#内存清楚,容器启动的初始可用数量
    livenessProbe:     			#对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
      exec:      				#对Pod容器内检查方式设置为exec方式
        command: [string]  		#exec方式需要制定的命令或脚本
      httpGet:       			#对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     			#对Pod内个容器健康检查方式设置为tcpSocket方式
         port: number
       initialDelaySeconds: 0  	#容器启动完成后首次探测的时间,单位为秒
       timeoutSeconds: 0   		#对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
       periodSeconds: 0    		#对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged:false
    restartPolicy: [Always | Never | OnFailure]			#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
    nodeSelector: obeject  #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
    imagePullSecrets:    		#Pull镜像时使用的secret名称,以key:secretkey格式指定
    - name: string
    hostNetwork:false      		#是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
    volumes:       				#在该pod上定义共享存储卷列表
    - name: string     			#共享存储卷名称 (volumes类型有很多种)
      emptyDir: {}     			#类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
      hostPath: string     		#类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
        path: string     		#Pod所在宿主机的目录,将被用于同期中mount的目录
      secret:      				#类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
        scretname: string  
        items:     
        - key: string
          path: string
      configMap:     			#类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
        name: string
        items:
        - key: string
posted @ 2020-05-23 18:18  Gmiao  阅读(596)  评论(0编辑  收藏  举报