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/php/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。