k8s---声明式资源管理(yml文件)

在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.yaml


kubectl 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.yml

apiVersion: apps/v1
#声明api版本标签
kind: Deployment
#定义资源的类型:service/pod/deployment/job/ingress/daemonset/statfluset
metadata: 
  name: nginx1
  namespace: zzr
  labels: 
    zhaozirui: nginx1
#定义资源的元数据信息 ,比如资源的名称,资源对象部署的命名看空间也可以在这里声明,标签等等信息
spec: 
#定义deployment的资源需要的参数属性。
  replicas: 3
#定义副本数
  selector:
#定义标签选择器
    matchLabels:
      zhaozirui: nginx1
#选择匹配的标签
  template:
#定义业务模板:如果定义了多个副本,所有的副本属性都会按照模板的配置进行匹配。
  metadata: 
    labels: 
      zhaozirui: nginx1
#定义了pod的副本都是用来元数据的标签和属性来进行匹配
    spec:
      containers: 
      - name: nginx
        image: nginx:1.10
        posts:
        - containerPort: 80
#spec声明的是容器的相关参数,虽然制定了容器的暴露端口号-80,如果镜像默认的端口不是80,依然没用。

如何暴露服务--service的yaml

复制代码
vim nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: zzr
  labels:
    zhaozirui: nginx1
#元数据信息包括,service的名称,所属的命名空间,以及要匹配的deployment的标签。要和之前的保持一致。
spec: 
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    zhaozirui: nginx1
#匹配所有的标签都是zhaozirui:nginx1的pod的后端提供服务
wq

kubectl apply -f nginx-service.yaml
kubectl get svc -n zzr

创建pod的yaml文件

复制代码
vim pod.yaml

apiVersion: v1
kind: Pod
#定义元数据信息,pod的名称,命名空间,标签
metadata:
  name: centos1
  namespace: zzr
spec:
  restartPolicy: Never
#restartPolicy指的是pod内的容器启动失败或者有问题的重启策略:Always Nerver Onfailure(只有异常退出才会重启,状态非0,如果状态码是0,不重启。),restartPolicy指的是容器的重启策略,资源类型定义为deployment,容器的重启策略只能是always。

  containers: 
  - name: centos
    image: centos:7
    
wq
kubectl apply -f pod.yaml
kubectl pods -n zzr
kubectl describe pod centos1 -n zzr

kubectl 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: centos
    image: centos:7
    command: ["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
#多个命令要用分号隔开
wq

kubectl 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"]
    wq
    
kubectl apply -f pod.yml
kubectl get pods -n guoqi
kubectl exec -it centos1 -n guoqi --cat /opt/123.txt
直接查看容器内命令。

command写法

复制代码
 写法1:
   containers:
  - name: centos
    image: centos:7
    command: ["/bin/bash", "-c", "touch /opt/123.txt; echo 123 > /opt/123.txt; sleep 3600"]
#在一行定义多个内容需要用逗号隔开。多个命令需要用分号隔开
#执行多个命令必须要加"/bin/bash", "-c"
 
 写法2:
  containers:
  - name: centos
    image: centos:7
    command: ["/usr/bin/test", "-e", "/etc/passwd"]
#这样的格式只能执行单个命令。需要加上绝对路径

command和args的总结

同一个yaml文件内command和args只能存在一个表示容器启动时的命令

除非需要传参的时候command和args可以同时出现

无论是args或者是command都会覆盖CMD和entrypoint标准输出

建议写在一行提高可读性

相关推荐
我不会起名字3224 小时前
K8s Ingress 返回 502 但后端日志正常:4 类上游断连与排查链
kubernetes·k8s·ingress·502·keepalive
姜鱼问生7 小时前
每次开机手动检查 6 样东西?我写了个 2 秒自检脚本
运维·网络·nginx·docker·容器
wangqiaowq7 小时前
PostgresSQL server Docker 安装部署
运维·docker·容器
程序员阿明7 小时前
docker搭建视频流服务go2rtc,webRTC
docker·容器·webrtc
JavaPub-rodert9 小时前
Docker 容器为什么 stop 半天停不下来?讲透 PID 1、SIGTERM、SIGKILL、僵尸进程与 tini
运维·docker·容器
我不会起名字3229 小时前
Pod 一直 Pending:调度器 5 类失败原因与 kubectl describe 的正确读法
云原生·kubernetes·调度·排查
我不会起名字32212 小时前
K8s 服务 DNS 解析偶发 5 秒超时:conntrack 与 ndots 的 3 个坑
kubernetes·k8s·dns·conntrack·coredns
risc12345612 小时前
万变不离其宗
人工智能·低代码·云原生
EterNity_TiMe_13 小时前
Docker服务越装越多记不住端口?我用Fenrus把NAS里的常用入口整理成一个导航页
运维·人工智能·docker·ai·容器·cpolar
吴声子夜歌13 小时前
Docker入门与实战——libnetwork插件化网络功能
网络·docker·容器