2023年6月30日发(作者:)
Kubernetes(k8s)YAML⽂件详解⽂章⽬录⼀、yaml⽂件简介Kubernetes只⽀持YAML和JSON格式创建资源对象,JSON格式⽤于接⼝之间消息的传递,适⽤于开发;YAML格式⽤于配置和管理,适⽤于云平台管理,YAML是⼀种简洁的⾮标记性语⾔。1)yaml的语法规则:⼤⼩写敏感使⽤缩进表⽰层级关系缩进时不允许使⽤Tal键,只允许使⽤空格缩进的空格数⽬不重要,只要相同层级的元素左侧对齐即可”#” 表⽰注释,从这个字符⼀直到⾏尾,都会被解析器忽略注:- - - 为可选的分隔符 ,当需要在⼀个⽂件中定义多个结构的时候需要使⽤2)在Kubernetes中,只需要知道两种结构类型即可:2)在Kubernetes中,只需要知道两种结构类型即可:ListsMaps2.1)YAML MapsMap顾名思义指的是字典,即⼀个Key:Value 的键值对信息。例如:---apiVersion: v1kind: Pod上述内容表⽰有两个键apiVersion和kind,分别对应的值为v1和Pod。Maps的value既能够对应字符串也能够对应⼀个Maps。例如:---apiVersion: v1kind: Podmetadata: name: kube100-site labels: app: web注:上述的YAML⽂件中,metadata这个KEY对应的值为⼀个Maps,⽽嵌套的labels这个KEY的值⼜是⼀个Map。实际使⽤中可视情况进⾏多层嵌套。YAML处理器根据⾏缩进来知道内容之间的关联。上述例⼦中,使⽤两个空格作为缩进,但空格的数据量并不重要,只是⾄少要求⼀个空格并且所有缩进保持⼀致的空格数 。例如,name和labels是相同缩进级别,因此YAML处理器知道他们属于同⼀map;它知道app是lables的值因为app的缩进更⼤。2.2)YAML ListsList即列表,说⽩了就是数组,例如:args -beijing -shanghai -shenzhen -guangzhou可以指定任何数量的项在列表中,每个项的定义以破折号(-)开头,并且与⽗元素之间存在缩进。当然Lists的⼦项也可以是Maps,Maps的⼦项也可以是List,例如:---apiVersion: v1kind: Podmetadata: name: kube100-site labels: app: webspec: containers: - name: front-end image: nginx ports: - containerPort: 80 - name: flaskapp-demo image: jcdemo/flaskapp ports: 8080如上述⽂件所⽰,定义⼀个containers的List对象,每个⼦项都由name、image、ports组成,每个ports都有⼀个KEY为containerPort的Map组成。⼆、yaml常见语法1)apiVersion查看当前所有可⽤的API版本$ kubectl api-versions1.6版本之前 apiVsersion:extensions/v1beta11.6版本到1.9版本之间:apps/v1beta11.9版本之后:apps/v1常⽤apiversion只要记住6个常⽤的apiversion⼀般就够⽤了。v1: Kubernetes API的稳定版本,包含很多核⼼对象:pod、service等。apps/v1: 包含⼀些通⽤的应⽤层的api组合,如:Deployments, RollingUpdates, and ReplicaSets。batch/v1: 包含与批处理和类似作业的任务相关的对象,如:job、cronjob。autoscaling/v1: 允许根据不同的资源使⽤指标⾃动调整容器。/v1: ⽤于Ingress。/v1:⽤于RBAC。2)kindkind指定这个资源对象的类型,如 pod、deployment、statefulset、job、cronjob3)metadatametadata常⽤的配置项有 name,namespace,即配置其显⽰的名字与归属的命名空间。4)spec⼀个嵌套字典与列表的配置项,也是主要的配置项,⽀持的⼦项⾮常多,根据资源对象的不同,⼦项会有不同的配置。如⼀个pod的spec配置:apiVersion: v1 #必选,版本号,例如v1kind: Pod #必选,Pod
metadata: #必选,元数据
name: nginx #必选,Pod名称
labels: #⾃定义标签
app: nginx #⾃定义标签名字
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表,⼀个pod⾥会有多个容器
- name: nginx #必选,容器名称
image: nginx #必选,容器的镜像名称
imagePullPolicy: IfNotPresent # [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表⽰下载镜像 IfnotPresent表⽰优先使⽤本地镜像,否则下载镜像,Nerver表⽰仅使⽤本地镜像
ports: #需要暴露的端⼝库号列表
- containerPort: 80 #容器需要监听的端⼝号
restartPolicy: Always # [Always | Never | OnFailure]#Pod的重启策略,Always表⽰⼀旦不管以何种⽅式终⽌运⾏,kubelet都将重启,OnFailure表⽰只有Pod以⾮0退出码退出才重启,Nerver表⽰不再重启该Pod
⼀个service 的 spec 的配置:apiVersion: v1kind: Servicemetadata: name: service-hello labels: name: service-hellospec: type: NodePort #这⾥代表是NodePort类型的,另外还有ingress,LoadBalancer ports: - port: 80 #这⾥的端⼝和clusterIP(kubectl describe service service-hello中的IP的port)对应,即在集群中所有机器上curl 10.98.166.242:80可访问发布的应⽤服务。 targetPort: 8080 #端⼝⼀定要和container暴露出来的端⼝对应,nodejs暴露出来的端⼝是8081,所以这⾥也应是8081 protocol: TCP nodePort: 31111 #
所有的节点都会开放此端⼝30000--32767,此端⼝供外部调⽤。 selector: run: hello #这⾥选择器⼀定要选择容器的标签,之前写name:kube-node是错的。这⾥是将nginx映射到外⽹,访问地址就是本机ip:31111三、port详解port:port是k8s集群内部访问service的端⼝,即通过clusterIP: port可以访问到某个servicenodePort:nodePort是外部访问k8s集群中service的端⼝,通过nodeIP: nodePort可以从外部访问到某个service。targetPort:targetPort是pod的端⼝,从port和nodePort来的流量经过kube-proxy流⼊到后端pod的targetPort上,最后进⼊容器。containerPort:containerPort是pod内部容器的端⼝,targetPort映射到containerPort。四、yaml简单⽰例接下来就是看看deployment、pod、service 这三种资源的说明书例⼦1)deploymentymentapiVersion: apps/v1 # 1.9.0
之前的版本使⽤ apps/v1beta2,可通过命令 kubectl api-versions
查看kind: Deployment #指定创建资源的⾓⾊/类型metadata: #资源的元数据/属性 name: nginx-deployment #资源的名字,在同⼀个namespace中必须唯⼀spec: replicas: 2 #副本数量2 selector: #定义标签选择器 matchLabels: app: web-server template: #这⾥Pod的定义 metadata: labels: #Pod的label app: web-server spec: #
指定该资源的内容
containers:
- name: nginx #容器的名字
image: nginx:1.12.1 #容器的镜像地址
ports:
- containerPort: 80 #容器对外的端⼝执⾏以下命令创建 deployment 资源$ kubectl create -f 2)podapiVersion: v1kind: Pod
metadata:
name: pod-redis labels: name: redisspec:
containers: - name: pod-redis image: /redis
ports: - containerPort: 80 #容器对外的端⼝执⾏以下命令创建 pod 资源$ kubectl create -f 3)serviceapiVersion: v1
kind: Service #
指明资源类型是 servicemetadata:
name: httpd-svc # service
的名字是 httpd-svc labels:
name: httpd-svc
spec:
ports: #
将 service 8080
端⼝映射到 pod
的 80
端⼝,使⽤ TCP
协议 - port: 8080 targetPort: 80
protocol: TCP
selector:
run: httpd #
指明哪些 label
的 pod
作为 service
的后端执⾏以下命令创建 service 资源$ kubectl create -f 五、Label与Selector1)LabelLabel是Kubernetes系列中另外⼀个核⼼概念。是⼀组绑定到K8s资源对象上的key/value对。同⼀个对象的labels属性的key必须唯⼀。label可以附加到各种资源对象上,如Node,Pod,Service,RC等。通过给指定的资源对象捆绑⼀个或多个不⽤的label来实现多维度的资源分组管理功能,以便于灵活,⽅便地进⾏资源分配,调度,配置,部署等管理⼯作。⽰例如下:版本标签:“release” : “stable” , “release” : “canary”…环境标签:“environment” : “dev” , “environment” : “production”架构标签:“tier” : “frontend” , “tier” : “backend” , “tier” : “middleware”分区标签:“partition” : “customerA” , “partition” : “customerB”…质量管控标签:“track” : “daily” , “track” : “weekly”2)SelectorLabel selector是Kubernetes核⼼的分组机制,通过label selector客户端/⽤户能够识别⼀组有共同特征或属性的资源对象。符合这个标签的 Pod 会作为这个 Service 的 backend。apiVersion: v1kind: Servicemetadata: name: hello labels: app: hellospec: ports: - port: 80 targetPort: 80 selector: app: hello六、kubectl create还是 kubectl replace⼆者区别kubectl create -f 还是 kubectl replace -f 都可以创建资源,但是有什么区别呢,请细品下⾯讲解。kubectl create:kubectl create命令可创建新资源。 因此,如果再次运⾏该命令,则会抛出错误,因为资源名称在名称空间中应该是唯⼀的。kubectl apply:kubectl apply命令将配置应⽤于资源。 如果资源不在那⾥,那么它将被创建。 kubectl apply命令可以多次运⾏,因为它只是应⽤如下所⽰的配置。 在这种情况下,配置没有改变。 所以,pod没有改变。简单来说,如果在单个⽂件上运⾏操作以创建资源,则create和apply基本相同。 但是, apply允许您在⽬录下的多个⽂件上同时创建和修补。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688056118a72192.html
评论列表(0条)