k8s的声明式资源管理

在k8s当中支持两种声明资源的方式:

1、 yaml格式:主要用于和管理资源对象

2、 json格式:主要用于在API接口之间进行消息传递

声明式管理方法(yaml)文件

1、 适合对资源的修改操作

2、 声明式管理依赖于yaml文件,所有的内容都在yaml文件当中。

3、 编辑好的yaml文件还是要靠陈述式命令发布到k8s集群当中。

分别有三种方式:

bash 复制代码
create
#只能创建,不能更新。从指定的yaml文件中读取配置。创建服务。不能更新服务。
apply -f
#既可以创建资源对象,也可以更新资源对象。如果yaml文件更改了,apply可以直接更新资源对象。(使用最多)
delete -f
#删除yaml文件中声明的资源对象。例如deployment、pod、service

如何生成yaml文件

1、 手动创建

2、 根据已有的资源直接生成

bash 复制代码
kubectl get deployments.apps nginx -o yaml > /opt/test.yaml
#基于已有资源直接创建yaml文件
kubectl apply -f test.yaml
#执行yaml文件
#只能运行一次。
#运行成功后如果还需要修改需要基于最新的deployment再创建yaml文件
bash 复制代码
kubectl apply -f test.yaml --force
#强制执行yaml文件
#如果不想使用最新的deployment再创建yaml文件可以使用--force强制执行

只要是基于yaml文件创建的的都可以导出

bash 复制代码
kubectl get svc nginx-service -o yaml > /opt/service.yaml
#基于已有的yaml文件生成

基于yaml文件创建的pod也都可以导出

bash 复制代码
kubectl get pod nginx-6fdbccbdbb-7lkzn -o yaml > /opt/service.yaml
#基于已有的yaml文件生成

常见的yaml类型

1、 deployment的yaml文件格式用于部署还有daemonset和statefulser

2、 service的yaml文件用于暴露服务端口

3、 不基于控制器的pod的yaml文件

deployment的yaml文件格式

bash 复制代码
kubectl explain deployment
#查看deployment详细信息
#只有deployment的API-VERSION版本是apps/v1

vim nginx1.yaml
#创建yaml文件

apiVersion: apps/v1
#声明api版本的标签
kind: Deployment
#定义资源的类型、角色或者是控制器.例如:service/pod/deployment/job/ingress/daemonset/statefulset
metadata:
  name: nginx1
#定义创建资源名称
  namespace: zyg
#定义命名空间
  labels:
    bqb: nginx1
#定义标签名称
#定义创建资源的元数据信息。例如:资源名称以及资源对象部署的命名空间也可以在这里声明、标签等等信息
spec:
#定义deployment资源需要的参数和属性
  replicas: 3
#定义副本数
  selector:
#定义标签选择器。属于哪个标签。满足哪个标签的资源定义副本数为3
    matchLabels:
      bqb: nginx1
#选择匹配的标签需要和上面定义的标签完全对应
  template:
#定义业务的模板。如果定义了多个副本,那么所有的副本属性都会按照模板的配置进行匹配。副本使用的配置是>哪些。
    metadata:
      labels:
        bqb: nginx1
#定义了pod的副本都使用元数据的标签和属性来进行匹配
  spec:
    containers:
    - name: nginx
      image: nginx:1.10
      ports:
      - containerPort: 80
#声明容器的相关参数。包括:容器的命名/容器的版本/容器的暴露端口号。
#虽然这里指定了暴露端口号是80,nginx镜像默认端口就是80.
#即使定义了别的端口,也不会改变容器的默认端口。
#如果不是默认端口,则需要在这里声明端口号
#      ports:
#      - containerPort: 80

service的yaml文件

bash 复制代码
kubectl explain service
#查看service详细信息

vim nginx-service.yaml

#定义API版本:
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: zyg
  labels:
    bqb: nginx1
#元数据信息包括:service的名称,所属的命名空间。以及要匹配的deployment的标签。要和之前的保持一致
spec:
  type: NodePort
  ports:
  - port: 80
#定义service内部暴露的端口
    targetPort: 80
#定义容器对外暴露的端口
    nodePort: 30000
#定义外部端口如果有需要可以直接定义
  selector:
    bqb: nginx1
#这里的标签是为了匹配所有的标签都是bqb: nginx1的pod的后端提供服务

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

pod的yaml文件

bash 复制代码
kubectl explain pod
#查看pod详细信息

vim nginx-pod.yaml

#定义pod的apiVersion
apiVersion: v1
#定义资源的类型
kind: Pod
#定义元数据信息,pod的名称/所属的命名空间/标签等信息
metadata:
  name: centos1
  namespace: zyg
#定义运行在哪个命名空间
spec:
  restartPolicy: Never
#pod内的容器如果启动失败或者有问题时的重启策略
#Always:永不重启/Never:从不重启/Onfailure:只有异常退出才会重启。状态码非0则重启.如果状态码是0则不重启
#restartPolicy:是容器的重启策略。
#如果资源类型定义为deployment这个容器的重启策略只能是Always。不写默认是Always
  containers:
  - name: centos
    image: centos:7
    
kubectl apply -f nginx-pod.yaml
kubectl get pods -n zyg

restartPolicy的三种状态码

pod内的容器如果启动失败或者有问题时的重启策略

Always:一直重启

Never:从不重启

Onfailure:只有异常退出才会重启。状态码非0则重启.如果状态码是0则不重启

command和args

command、args定义容器运行的命令参数。类似于docker中的CMD和entrypoint

command、arges只能存在一个。args可以给command传参

bash 复制代码
  containers:
  - name: centos
    image: centos:7
    command: ["echo"]
    args: ["hello,world!"]
#启动时候默认执行的命令
#args可以给command传参类似于(CMD和entrypoint)
#如果在yaml文件中定义了输出内容,就会覆盖掉原来容器内部的标准输出

command和args都会覆盖原容器的标准输出(CMD和entrypoint)

args的写法

例如:

bash 复制代码
写法1:
containers:
  - name: centos
    image: centos:7
    args: 
    - /bin/bash
#默认执行的shell
    - -c
#表示命令行
    - while true; do sleep 3600; done
#执行的命令,多个命令需要用分号隔开

写法2:
  containers:
  - name: centos
    image: centos:7
    args: ["/bin/bash", "-c", "touch /opt/123.txt; echo 123 > /opt/123.txt; sleep 3600"]
#在一行定义多个内容需要用逗号隔开。多个命令需要用分号隔开
#执行多个命令必须要加"/bin/bash", "-c"
#-c:表示输出命令的格式

kubectl exec -it centos1 -n zyg -- cat /opt/123.txt
#使用--可以直接在容器外部查看容器内部的信息

command写法

bash 复制代码
 写法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标准输出

建议写在一行提高可读性

总结

1、 三种发布方式

蓝绿发布、灰度发布(目前最常用)、滚动发布(基于deployment默认的发布模式)

灰度发布(目前最常用):基于deployment的滚动发布,使用了暂停的机制。pause(暂停)/resume(继续)。只有所有升级完毕之后才可以回滚

2、 三种yaml文件类型

1、 deployment的yaml文件格式用于部署还有daemonset和statefulser

2、 service的yaml文件用于暴露服务端口

3、 不基于控制器的pod的yaml文件

yaml文件内的模板模块:

deployment类型

apiVersion模块:apps/v1。只有deployment是apps/v1

kind模块:所有的类型都是由kind声明

在kind之后生成

kind之后的第一个字母需要大写

metadata模块:这一部分中namespace(命名空间)需要已经存在,否则不会自动创建。需要手动创建。

spec模块:定义副本数、标签选择器等信息

template模块:定义了业务模板需要和之前的标签保持一致

spec模块:这里的spec属于业务模板模块。这里定义的是容器的信息。定义容器名称,定义镜像版本。也可以指定容器的暴露端口。

但是需要注意。如果容器的默认端口没有修改。yaml文件中定义暴露端口不会生效。所以如果是默认的服务可以不加定义端口

service类型

apiVersion模块:v1

spec模块:中port是service的暴露端口,targetPort是容器的暴露端口。

tpye模块:的类型

pod类型

apiVersion模块:v1

spec模块:这一模块中的 restartPolicy定义pod内的容器如果启动失败或者有问题时的重启策略 Always:一直重启

Never模块:从不重启

Onfailure:只有异常退出才会重启。状态码非0则重启.如果状态码是0则不重启

restartPolicy:是容器的重启策略。

如果资源类型定义为deployment这个容器的重启策略只能是Always。不写默认是Always

command和args

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

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

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

建议写在一行提高可读性

相关推荐
再战300年40 分钟前
docker快速部署kafka集群
docker·容器·kafka
春天的菠菜1 小时前
【私服】一步部署 Docker 私服
java·docker·容器
栀椩1 小时前
Docker 命令速查手册
spring cloud·docker
眷蓝天2 小时前
Kubernetes etcd 技术指南
容器·kubernetes·etcd
梦梦代码精2 小时前
深度拆解:上门按摩系统如何成为本地生活“到家时代”的新引擎?
docker·小程序·uni-app·开源·生活·开源软件
再战300年2 小时前
通过docker实现mysql一主多从
mysql·docker·容器
万里侯2 小时前
GitLab CI/CD流水线优化实战:从龟速到飞速的蜕变
微服务·容器·k8s
云游牧者3 小时前
K8S控制器全解-从RS到DaemonSet实战完全指南
云原生·容器·kubernetes·控制器
成为你的宁宁3 小时前
【基于 K8S+NFS 动态存储实战部署 Redis-Cluster 集群(含三主三从配置与访问配置)】
redis·容器·kubernetes
刘一说3 小时前
Ubuntu 系统上安装 Docker
linux·ubuntu·docker