Kubernetes(k8s)YAML⽂件详解
⽂章⽬录
⼀、yaml⽂件简介
Kubernetes只⽀持YAML和JSON格式创建资源对象,JSON格式⽤于接⼝之间消息的传递,适⽤于开发;YAML格式⽤于配置和管理,适⽤于云平台管理,YAML是⼀种简洁的⾮标记性语⾔。
1)ya ml的语法规则:
⼤⼩写敏感
使⽤缩进表⽰层级关系
缩进时不允许使⽤Tal键,只允许使⽤空格
缩进的空格数⽬不重要,只要相同层级的元素左侧对齐即可
”#” 表⽰注释,从这个字符⼀直到⾏尾,都会被解析器忽略
注:- - - 为可选的分隔符 ,当需要在⼀个⽂件中定义多个结构的时候需要使⽤
2)在Kubernetes中,只需要知道两种结构类型即可:
2)在Kuber netes中,只需要知道两种结构类型即可:
Lists
Maps
2.1)YAML Maps
Map顾名思义指的是字典,即⼀个Key:Value 的键值对信息。例如:
---
apiVersion: v1
kind: Pod
上述内容表⽰有两个键apiVersion和kind,分别对应的值为v1和Pod。
Maps的value既能够对应字符串也能够对应⼀个Maps。例如:
-
--
apiVersion: v1
kind: Pod
metadata:
name: kube100-site
labels:
app: web
注:上述的YAML⽂件中,metadata这个KEY对应的值为⼀个Maps,⽽嵌套的labels这个KEY的值⼜是⼀个Map。实际使⽤中可视情况进⾏多层嵌套。
YAML处理器根据⾏缩进来知道内容之间的关联。上述例⼦中,使⽤两个空格作为缩进,但空格的数据量并不重要,只是⾄少要求⼀个空格并且所有缩进保持⼀致的空格数 。例如,name和labels是相同缩进级别,因此YAML处理器知道他们属于同⼀map;它知道app是lables的值因为app的缩进更⼤。
2.2)YAML Lists
List即列表,说⽩了就是数组,例如:
args
-beijing
-shanghai
-shenzhen
-guangzhou
可以指定任何数量的项在列表中,每个项的定义以破折号(-)开头,并且与⽗元素之间存在缩进。
当然Lists的⼦项也可以是Maps,Maps的⼦项也可以是List,例如:
---
apiVersion: v1
kind: Pod
metadata:
nodeselectorname: kube100-site
labels:
app: web
spec:
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)a piVersio n
查看当前所有可⽤的API版本
$ kubectl api-versions
1.6版本之前 apiVsersion:extensions/v1beta1
1.6版本到1.9版本之间:apps/v1beta1
1.9版本之后:apps/v1
常⽤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。
2)k ind
kind指定这个资源对象的类型,如 pod、deployment、statefulset、job、cronjob
3)meta da ta
metadata常⽤的配置项有 name,namespace,即配置其显⽰的名字与归属的命名空间。
4)spec
⼀个嵌套字典与列表的配置项,也是主要的配置项,⽀持的⼦项⾮常多,根据资源对象的不同,⼦项会有不同的配置。
如⼀个pod的spec配置:
apiVersion: v1 #必选,版本号,例如v1
kind: 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表⽰只有Po d以⾮0退出码退出才重启,Nerver表⽰不再重启该Pod
⼀个service 的 spec 的配置:
apiVersion: v1
kind: Service
metadata:
name: service-hello
labels:
name: service-hello
spec:
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可以访问到某个service
nodePort: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)deplo yment
ym ent
apiVersion: 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 nginx.yaml
2)po d
apiVersion: v1
kind: Pod
metadata:
name: pod-redis
labels:
name: redis
spec:
containers:
-
name: pod-redis
image: docker.io/redis
ports:
-containerPort:80#容器对外的端⼝
执⾏以下命令创建 pod 资源
$ kubectl create -f pod-redis.yaml
3)servic e
apiVersion: v1
kind: Service # 指明资源类型是 service
metadata:
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 httpd-svc.yaml
五、Label与Selector
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论