当前位置: 首页 > 图灵资讯 > 技术篇> kubernetes yaml文件详解

kubernetes yaml文件详解

来源:图灵教育
时间:2023-05-29 14:06:16

k8syaml配置分为四部分

apiVersion,kind,metadata,spec

apiVersion

指定api版本,目前大部分都是写v1,这个值不是写死的,这个值可以在本机上执行kubectl api-versions命令查看。

apiversion常用

只要记住6个常用的apiversion,一般就够了。

  • v1: Kubernetes 稳定版API包含许多核心对象:pod、service等。
  • apps/v1: api组合包含一些通用应用层,如:Deployments, RollingUpdates, and ReplicaSets。
  • batch/v1: 包括与批处理和类似操作相关的对象,如:job、cronjob。
  • autoscaling/v1: 容器可根据不同的资源使用指标自动调整。
  • networking.k8s.io/v1: 用于Ingress。
  • rbac.authorization.k8s.io/v1:用于RBAC。

以下是官方原文链接。有兴趣的同学可以看看。页面可以选择语言,但是中文翻译有问题。建议用中文和英文比较。https://kubernetes.io/docs/reference/using-api/

kind

表示yaml定义的资源类型,k8s中有很多种资源,包括Pod,Deployment,Job,Services等等。

在Kubernetes(K8s)在YAML语法中,kind是指定kubernetes资源类型的重要关键词。根据kubernetes的官方文件,以下是kind的可能值:

Deployment:声明式更新用于定义应用程序。

StatefulSet:声明更新和管理有状态应用程序。

DaemonSet:用于在集群中运行pod的声明更新和管理。

Job:声明更新和管理用于在集群上运行一次性任务。

CronJob:声明更新和管理用于在集群上运行定期操作。

Service:用于定义一组pod的逻辑集合,并访问这些pod。

Pod:Kubernetes中最基本的资源类型,用于定义一个或多个容器的共同运行环境。

ReplicaSet:声明式更新和管理,用于确保指定数量的pod在集群中运行。

ConfigMap:声明更新和管理用于存储非敏感数据(如配置文件)。

Secret:声明更新和管理用于存储敏感数据(如密码和密钥)。

ServiceAccount:用于定义pod的身份验证信息,以及与Kubernetess API Server交互的权限。

Ingress:定义从外部访问Kubernetes集群中服务的方式。

PersistentVolume:用于定义持久存储卷,并在Kubernetes集群中使用。

StorageClass:用于定义云存储、本地存储等不同类型的存储,并为这些存储类型指定默认参数和策略。

Namespace:用于在Kubernetes集群中创建逻辑分区,从而隔离资源,提高安全性和可维护性。

ServiceMonitor:在Kubernetes集群中自动发现和监控运行的服务。

HorizontalPodAutoscaler:自动调整Kubernetes集群中的pod副本数量,根据当前负载需求实现自动扩展或收缩。

NetworkPolicy:用于定义网络访问策略,控制pod之间的网络流量。

CustomResourceDefinition:定义自定义资源,扩展Kuberneteses API和CRD操作。

PodDisruptionBudget:为保证Kubernetes集群的高可用性,定义维护期间可以安全中断的pod的最小数量。

Role:定义Kubernetes资源的操作权限,如阅读、写作、更新、删除等。

ClusterRole:类似Role,但可用于整个Kubernetes集群

metadata

一些元数据表示创建的资源,这是一种包含名称的对象类型namespace、标签等信息。

spec

这也是对象类型,包括一些container,storage,volume等

这四部分是k8syaml必须存在的配置项,如果没有,k8s是不允许执行的。

pod.yaml 配置

# yaml格式pod定义文件的完整内容:apiVersion: v1     #必选版本号,如v1kind: Pod       #必须选择,指定创建资源的角色/类型  metadata:        #必须选择资源元数据/属性   name: string       #必选,资源名称,在同一个namespace中,必须是唯一的    namespace: string     #必选,Pod命名空间  labels:      #在service网络中自定义标签备案,以便被获知    - name: string   #自定义标签名称  annotations:       #设置自定义注释列表      - name: string   #设置自定义注释名称  spec:         #设置资源的详细定义是必要的  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内容器健康检查的设置,当检测几次无响应时,容器将自动重启。检查方法包括execec、httpget和tcpSocket,一个容器只需要设置其中一种方法      exec:      #将Pod容器的内部检查方法设置为exec        command: [string]  #Exec模式需要制定的命令或脚本      httpGet:       #Htttpget设置了Pod内容器的健康检查方法,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:    #Pulll镜像中使用的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          path: string

Deployment.yaml 配置

apiVersion: apps/v1   # 1.9.0 使用之前的版本 apps/v1beta2,可通过命令 kubectl api-versions 查看#apiVersion: extensions/v1beta1kind: Deploymentmetadata: ----------------------------------------#元数据  annotations: -------------------------------------#注释信息    deployment.kubernetes.io/revision: '1'    k8s.kuboard.cn/ingress: 'false'    k8s.kuboard.cn/service: NodePort    k8s.kuboard.cn/workload: nextcloud  labels:-------------------------------------------#标签信息    k8s.kuboard.cn/layer: ''                k8s.kuboard.cn/name: nextcloud  name: nextcloud-----------------------------------#名称  namespace: nextcloud------------------------------#命名空间 spec:-----------------------------------------------#定义容器模板,该模板可以包含多个容器   replicas: 3---------------------------------------#副本数量  selector:-----------------------------------------#标签选择器    matchLabels:      k8s.kuboard.cn/layer: ''      k8s.kuboard.cn/name: nextcloud  strategy:-----------------------------------------#滚动升级策略    type: RollingUpdate-----------------------------#类型    rollingUpdate:----------------------------------#因为replicas是3,整个升级,pod的数量在2-4之间          maxSurge: 25%-#滚动升级将首先启动25%pod        maxUnavailable: 25%-#滚动升级时允许最大Unavailable的pod数量  template:                     #镜像模板                       metadata: ------------------------------------#元数据      labels:---------------------------------------#标签        k8s.kuboard.cn/layer: ''        k8s.kuboard.cn/name: nextcloud    spec: ------------------------------------------#定义容器模板,该模板可以包含多个容器      containers: ----------------------------------#容器信息    - name: nextcloud --------------------------#容器名称          image: '172.16.20.100/library/nextcloud:yan' #镜像名称          imagePullPolicy: Always ------------------#镜像下载策略           ports:            - name: http              containerPort: 80              protocol: TCP          env          resources: -------------------------------#CPU内存限制        limits: --------------------------------#限制cpu内存                                    cpu: 200m              memory: 200m            requests: ------------------------------#cpu内存请求              cpu: 100m              memory: 100m          securityContext: -------------------------#安全设定            privileged: true -----------------------#开始享有特权          volumeMounts: ----------------------------#在volumes中定义的磁盘        - name: html ---------------------------#挂载容器1              mountPath: /var/www/html             - name: session ------------------------#挂载容器1              mountPath: /var/lib/图灵/session             volumes:  ------------------------------------#在pod上定义共享存储卷列表        - name: html -------------------------------#共享存储卷的名称 (volumes有很多种类型)          persistentVolumeClaim: -------------------#pvcccccolumes类型            claimName: html  -----------------------#关联pvc名称        - name: session          persistentVolumeClaim:            claimName: session              restartPolicy: Always ------------------------#Pod重启策略                               #Always表示,无论以何种方式终止运行,所有kubelet都将重启,                              #OnFailure表示,只有Pod以非0退出码退出才重启,                              #Nerver表示将不再重启Pod      schedulerName: default-scheduler -------------#指定pod调度到节点

Service.yaml 配置

apiVersion: v1kind: Servicemetadata:  ---------------------------------#元数据  annotations: -----------------------------#注释信息    k8s.kuboard.cn/workload: nextcloud  labels: ----------------------------------#标签信息    k8s.kuboard.cn/layer: ''    k8s.kuboard.cn/name: nextcloud  name: nextcloud --------------------------#名称  namespace: nextcloud ---------------------#命名空间spec: --------------------------------------#Service模板定义  clusterIP: 10.0.181.206 ------------------#指定svcip地址 如果没有指定,则是随机的    =================================================================================================  #NodePort类型:集群外网络  type: NodePort ---------------------------#NodePortt类型    ports:    - name: mnwwwp      nodePort: 30001 ----------------------#当type = NodePort时,指定的口号映射到物理机的端口号      port: 80 -----------------------------#服务监控的端口号      protocol: TCP ------------------------#支持TCP和UDP的端口协议,默认TCP      targetPort: 80 -----------------------#需要转发到后端Pod的端口号    ==================================================================================================  #ClusterIP类型: 集群内网络  type: ClusterIP --------------------------#  ports:    - name: mnwwwp      port: 80      protocol: TCP      targetPort: 80    - name: j5smwx      port: 22      protocol: TCP      targetPort: 22        selector:  -------------------------------#这里定义的selector应该与deployment定义的selector相同。#service依靠标签选择器检索提供服务的nodes#label selector配置,选择带有label标签的Pod作为管理     k8s.kuboard.cn/layer: ''    k8s.kuboard.cn/name: nextcloud  sessionAffinity: None --------------------#是否支持sessionn?

port详解
  • port:port是k8s集群内访问service的端口,即通过clusterIP: port可以访问servicee
  • nodePort:通过nodeIPort,nodePort是外部访问k8s集群中service的端口: nodePort可以从外部访问service。
  • targetPort:targetport是pod的端口,通过kube-proxy从port和nodeport流入后端podtargetport,最后进入容器。
  • containerPort:containerPort是pod内容器的端口,targetPort映射到containerPort。

kubernetes  yaml文件详解_k8s