222 lines
11 KiB
Markdown
222 lines
11 KiB
Markdown
|
||
# K8S yaml文件详解
|
||
|
||
## K8S 创建资源的方式
|
||
|
||
K8S有两种创建资源的方式:kubectl 命令和 yaml 配置文件。
|
||
|
||
kubectl命令行:最为简单,一条命令就OK.
|
||
|
||
yaml配置文件:提供了一种让你知其然更知其所以然的方式。优势如下:
|
||
|
||
- 完整性:配置文件描述了一个资源的完整状态,可以很清楚地知道一个资源的创建背后究竟做了哪些事;
|
||
- 灵活性:配置文件可以创建比命令行更复杂的结构;
|
||
- 可维护性:配置文件提供了创建资源对象的模板,能够重复使用;
|
||
- 可扩展性:适合跨环境、规模化的部署。
|
||
|
||
## yaml 是什么?
|
||
|
||
yaml 是一种用来写配置文件的语言,没错,它是一门语言。如果你用过 json,那么对它就不会陌生,yaml 又被称为是 json 的超集,使用起来比 json 更方便。
|
||
结构上它有两种可选的类型:Lists 和 Maps。List 用 -(破折号) 来定义每一项,Map 则是一个 key:value 的键值对来表示。
|
||
YAML语法规则:
|
||
|
||
大小写敏感
|
||
使用缩进表示层级关系
|
||
缩进时不允许使用Tal键,只允许使用空格
|
||
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
|
||
"#"表示注释,从这个字符一直到行尾,都会被解析器忽略
|
||
"---"" 为可选的分隔符
|
||
|
||
在Kubernetes中,只需要知道两种结构类型即可:
|
||
- Lists
|
||
- Maps
|
||
|
||
### kubernetes yaml 文件模板:
|
||
|
||
yaml格式的pod定义文件完整内容:
|
||
|
||
```
|
||
apiVersion: v1 #必选,版本号,例如v1
|
||
kind: Pod #必选,Pod
|
||
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
|
||
```
|
||
|
||
### 实例文件
|
||
|
||
```
|
||
apiVersion: extensions/v1beta1 #接口版本
|
||
kind: Deployment #接口类型
|
||
metadata:
|
||
name: ptengine-demo #Deployment名称
|
||
namespace: ptengine-prd #namespace 名称
|
||
labels:
|
||
app: ptengine-demo #标签
|
||
spec:
|
||
replicas: 3
|
||
strategy:
|
||
rollingUpdate: ##由于replicas为3,则整个升级,pod个数在2-4个之间
|
||
maxSurge: 1 #滚动升级时会先启动1个pod
|
||
maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
|
||
template:
|
||
metadata:
|
||
labels:
|
||
app: ptengine-demo #模板名称必填
|
||
sepc: #定义容器模板,该模板可以包含多个容器
|
||
containers:
|
||
- name: ptengine-demo #镜像名称
|
||
image: reg.pt1.com/ptengine-prd/ptengine-demo:0.0.1-SNAPSHOT #镜像地址
|
||
CMD: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ] #启动CMD
|
||
args: #启动参数
|
||
- '-storage.local.retention=$(STORAGE_RETENTION)'
|
||
- '-web.external-url=$(EXTERNAL_URL)'
|
||
|
||
imagePullPolicy: IfNotPresent #如果不存在则拉取
|
||
livenessProbe: #表示container是否处于live状态。如果LivenessProbe失败,LivenessProbe将会通知kubelet对应的container不健康了。随后kubelet将kill掉container,并根据RestarPolicy进行进一步的操作。默认情况下LivenessProbe在第一次检测之前初始化值为Success,如果container没有提供LivenessProbe,则也认为是Success;
|
||
httpGet:
|
||
path: /health #如果没有心跳检测接口就为/
|
||
port: 8080
|
||
scheme: HTTP
|
||
initialDelaySeconds: 60 ##启动后延时多久开始运行检测
|
||
timeoutSeconds: 5
|
||
successThreshold: 1
|
||
failureThreshold: 5
|
||
readinessProbe:
|
||
readinessProbe:
|
||
httpGet:
|
||
path: /health #如果没有健康检测接口就为/
|
||
port: 8080
|
||
scheme: HTTP
|
||
initialDelaySeconds: 30 ##启动后延时多久开始运行检测
|
||
timeoutSeconds: 5
|
||
successThreshold: 1
|
||
failureThreshold: 5
|
||
resources: ##CPU内存限制
|
||
requests:
|
||
cpu: 2
|
||
memory: 2048Mi
|
||
limits:
|
||
cpu: 2
|
||
memory: 2048Mi
|
||
env: ##通过环境变量的方式,直接传递pod=自定义Linux OS环境变量
|
||
- name: LOCAL_KEY #本地Key
|
||
value: value
|
||
- name: CONFIG_MAP_KEY #local策略可使用configMap的配置Key,
|
||
valueFrom:
|
||
configMapKeyRef:
|
||
name: special-config #configmap中找到name为special-config
|
||
key: special.type #找到name为special-config里data下的key
|
||
ports:
|
||
- name: http
|
||
containerPort: 8080 #对service暴露端口
|
||
volumeMounts: #挂载volumes中定义的磁盘
|
||
- name: log-cache
|
||
mount: /tmp/log
|
||
- name: sdb #普通用法,该卷跟随容器销毁,挂载一个目录
|
||
mountPath: /data/media
|
||
- name: nfs-client-root #直接挂载硬盘方法,如挂载下面的nfs目录到/mnt/nfs
|
||
mountPath: /mnt/nfs
|
||
- name: example-volume-config #高级用法第1种,将ConfigMap的log-script,backup-script分别挂载到/etc/config目录下的一个相对路径path/to/...下,如果存在同名文件,直接覆盖。
|
||
mountPath: /etc/config
|
||
- name: rbd-pvc #高级用法第2中,挂载PVC(PresistentVolumeClaim)
|
||
|
||
#使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容,
|
||
volumes: # 定义磁盘给上面volumeMounts挂载
|
||
- name: log-cache
|
||
emptyDir: {}
|
||
- name: sdb #挂载宿主机上面的目录
|
||
hostPath:
|
||
path: /any/path/it/will/be/replaced
|
||
- name: example-volume-config # 供ConfigMap文件内容到指定路径使用
|
||
configMap:
|
||
name: example-volume-config #ConfigMap中名称
|
||
items:
|
||
- key: log-script #ConfigMap中的Key
|
||
path: path/to/log-script #指定目录下的一个相对路径path/to/log-script
|
||
- key: backup-script #ConfigMap中的Key
|
||
path: path/to/backup-script #指定目录下的一个相对路径path/to/backup-script
|
||
- name: nfs-client-root #供挂载NFS存储类型
|
||
nfs:
|
||
server: 10.42.0.55 #NFS服务器地址
|
||
path: /opt/public #showmount -e 看一下路径
|
||
- name: rbd-pvc #挂载PVC磁盘
|
||
persistentVolumeClaim:
|
||
claimName: rbd-pvc1 #挂载已经申请的pvc磁盘
|
||
```
|
||
|
||
## 参考文档
|
||
- [Kubernetes 笔记 05 yaml 配置文件详解](https://www.cnblogs.com/bakari/p/10509484.html)
|
||
- [详解Kubernetes Deployment的描述文件及相关配置](https://my.oschina.net/gibsonxue/blog/1840887)
|
||
|