在k8s当中支持两种声明资源的方式:
1、 yaml格式:主要用于和管理资源对象
2、 json格式:主要用于在API接口之间进行消息传递
声明式管理方法(yaml)文件
1、 适合对资源的修改操作
2、 声明式管理依赖于yaml文件,所有的内容都在yaml文件当中。
3、 编辑好的yaml文件还是要靠陈述式命令发布到k8s集群当中。
有三种方式:
create -f:只能创建,不能更新。从指定yml文件读取配置,创建服务,不能更新。apply -f:即可以创建资源对象也可以更新资源对象。如果yml文件更改了,apply可以直接更新资源对象。delete -f:删除yml文件中声明的资源对象
yml文件如何生成:
1.手动书写
2.可以根据已有的资源,成功生成。
kubectl get deplotment deployment.apps nginx -o yaml > /opt/test.yamlkubectl apply -f test.yaml --force
#强制执行yaml文件
#如果不想使用最新的deployment再创建yaml文件可以使用--force强制执行
kubectl get svc nginx-service -o yaml > /opt/service.yaml
常见的yaml类型
1、 deployment的yaml文件格式用于部署还有daemonset和statefulser
2、 service的yaml文件用于暴露服务端口
3、 不基于控制器的pod的yaml文件
k8s当中支持两种声明式的资源管理方式:
1.yml格式,用于配置和管理资源对象
2.json格式:主要用于在api接口之间消息的传递
如何查看deployment的格式模板
kubectl explain deployment
如何用yaml文件编写
cd /opt
vim nginx1.ymlapiVersion: apps/v1
#声明api版本标签
kind: Deployment
#定义资源的类型:service/pod/deployment/job/ingress/daemonset/statfluset
metadata: name: nginx1namespace: zzrlabels: zhaozirui: nginx1
#定义资源的元数据信息 ,比如资源的名称,资源对象部署的命名看空间也可以在这里声明,标签等等信息
spec:
#定义deployment的资源需要的参数属性。replicas: 3
#定义副本数selector:
#定义标签选择器matchLabels:zhaozirui: nginx1
#选择匹配的标签template:
#定义业务模板:如果定义了多个副本,所有的副本属性都会按照模板的配置进行匹配。metadata: labels: zhaozirui: nginx1
#定义了pod的副本都是用来元数据的标签和属性来进行匹配spec:containers: - name: nginximage: nginx:1.10posts:- containerPort: 80
#spec声明的是容器的相关参数,虽然制定了容器的暴露端口号-80,如果镜像默认的端口不是80,依然没用。
如何暴露服务--service的yaml
vim nginx-service.yamlapiVersion: v1
kind: Service
metadata:name: nginx-servicenamespace: zzrlabels:zhaozirui: nginx1
#元数据信息包括,service的名称,所属的命名空间,以及要匹配的deployment的标签。要和之前的保持一致。
spec: type: NodePortports:- port: 80targetPort: 80selector:zhaozirui: nginx1
#匹配所有的标签都是zhaozirui:nginx1的pod的后端提供服务
wqkubectl apply -f nginx-service.yaml
kubectl get svc -n zzr
创建pod的yaml文件
vim pod.yamlapiVersion: v1
kind: Pod
#定义元数据信息,pod的名称,命名空间,标签
metadata:name: centos1namespace: zzr
spec:restartPolicy: Never
#restartPolicy指的是pod内的容器启动失败或者有问题的重启策略:Always Nerver Onfailure(只有异常退出才会重启,状态非0,如果状态码是0,不重启。),restartPolicy指的是容器的重启策略,资源类型定义为deployment,容器的重启策略只能是always。containers: - name: centosimage: centos:7wq
kubectl apply -f pod.yaml
kubectl pods -n zzr
kubectl describe pod centos1 -n zzrkubectl get pod -n zzr
restartPolicy的三种状态码
pod内的容器如果启动失败或者有问题时的重启策略 Always:永不重启
Never:从不重启
Onfailure:只有异常退出才会重启。状态码非0则重启.如果状态码是0则不重启
command和args
command,args:定义容器运行的命令参数(类似于docker中的CMD和entrypoint)
args:可以理解为docker中的CMD,给command传参
command和args都会覆盖原容器的标准输出(CMD和entrypoint)
containers:- name: centosimage: centos:7command: ["echo"]args: ["hello,world!"]
#启动时候默认执行的命令
#args可以给command传参类似于(CMD和entrypoint)
#如果在yaml文件中定义了输出内容,就会覆盖掉原来容器内部的标准输出
command和args都会覆盖原容器的标准输出(CMD和entrypoint)
args的书写
metadata:containers:args:- /bin/bash- -c- while true; do sleep 3600; done
#多个命令要用分号隔开
wqkubectl apply -f pod.yaml
kubectl get pods -n guoqi
kubectl logs -f centos1 -n guoqi
kubectl describe pod centos1 -n zzr换个写法:
metadata:containers:args: ["/bin/bash","-c","touch /opt/123.txt; echo 123 > /opt/123.txt; sleep 3600"]wqkubectl apply -f pod.yml
kubectl get pods -n guoqi
kubectl exec -it centos1 -n guoqi --cat /opt/123.txt
直接查看容器内命令。
command写法
写法1:containers:- name: centosimage: centos:7command: ["/bin/bash", "-c", "touch /opt/123.txt; echo 123 > /opt/123.txt; sleep 3600"]
#在一行定义多个内容需要用逗号隔开。多个命令需要用分号隔开
#执行多个命令必须要加"/bin/bash", "-c"写法2:containers:- name: centosimage: centos:7command: ["/usr/bin/test", "-e", "/etc/passwd"]
#这样的格式只能执行单个命令。需要加上绝对路径
command和args的总结
同一个yaml文件内command和args只能存在一个表示容器启动时的命令
除非需要传参的时候command和args可以同时出现
无论是args或者是command都会覆盖CMD和entrypoint标准输出
建议写在一行提高可读性