(七)Kubernetes资源清单
Kubernetes资源清单就相当于电视剧的剧本,里面定义好了每一步,k8s按照每一步去执行。
定义:K8s中所有的内容都抽象为资源,资源实例化之后,叫做对象。
一、资源清单-资源类型
1、k8s中的资源
① 集群资源分类:
a、名称空间级别:仅在此名称空间生效
工作负载型资源(workload):Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、CronJob(ReplicationController 在V1.11版本被废弃)
服务发现及负载均衡型资源(ServiceDiscovery LoadBalance):Service、Ingress....
配置与存储型资源:Volime(存储卷)、CSI(容器存储接口,可以扩展各种各样的第三方存储卷)
特殊类型的存储卷:ConfigMap(当配置中心来使用的资源类型)、Secret(保存敏感数据)、DownwardAPI(把外部环境中的信息输出给容器)
b、集群级别:Namespace、Node、Role、ClusterRoleBinding
c、元数据型:HPA、PodTemplate、LomitRange
2、资源清单
在k8s中,一般使用yaml格式的文件来创建符合我们预期期望的Pod,这样的yaml文件我们一般称为资源清单
3、常用字段解释说明
① 必须存在的属性
② 主要对象
③ 额外的参数项
可以用 kubectl explain pod 命令查看更多的配置讲解。
执行yaml文件:kubectl apply -f pod.yaml
查看Pod信息:
kubectl describe pod myapp-pod
查看pod中容器启动日志:
kubectl log myapp-pod -c test
4、容器生命周期
① Init C(Init容器)
Pod能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的Init容器。
Init 容器与普通容器非常像,除了一下两点:
· Init 容器总是运行到成功完成为止
· 每个Init 容器都必须在下一个Init 容器启动之前成功完成
如果Pod的Init容器失败,Kubernates会不断地重启该Pod,直到Init容器成功为止。然而,如果Pod对应的restartPolicy为Never,它不会重新启动。
② Init 容器的作用
因为Init容器具有与应用程序容器分离的单独镜像,所以它们的启动相关代码具有如下优势:
· 它们可以包含并运行实用工具,但是出于安全考虑,是不建议在应用程序容器镜像中包含这些实用工具的
· 它们可以包含使用工具和定制化代码来安装,但是不能出现在应用程序镜像中。例如,创建镜像没必要FROM另一个镜像,只需要在安装过程中使用类似sed、awk、python或dig这样的工具。
· 应用程序镜像可以分离出创建和部署的角色,而没有必要联合他们构建一个单独的镜像
· Init容器使用Linux Namespace,所以相对应用程序容器来说具有不同的文件系统视图。因此,它们能够具有访问Secret的权限,而应用程序容器则不能。
· 它们必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以Init容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法,直到满足了一组先决条件。
③ Init 模板
创建一个Pod:创建一个ini-pod.yaml文件,将上面的内容输入到这个脚本文件中,然年执行命令:kubectl create - f ini-pod.yaml
查询Pod命令: kubectl get pod
删除所有pod:
kubectl delete deployment --all
kubectl delete pod --all
查询svc命令:kubectl get svc
进入pod查看内部信息:kubectl describe pod
④ 创建svc脚本
⑤ InitC 特殊说明
· 在Pod启动过程中,Init 容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出
· 如果由于运行时或失败退出,将导致容器启动失败,它会根据Pod 的restartPolicy制定的策略进行重试。然而,如果Pod 的restartPolicy设置为Always,Init容器失败时会使用RestartPolicy策略
· 在所有的Init容器没有成功之前,Pod将不会变成Ready状态。Init容器的端口将不会在Service中进行聚集。正在初始化中的Pod处于Pending状态,但应该会将Initializing状态设置为true
·如果Pod重启,所有Init容器必须重新执行
· 对Init容器spec的修改被限制在容器image字段,修改其他字段都不会生效。更改Init容器的image 字段,等价于重启该Pod
· Init容器具有应用容器的所有字段。除了readinessProbe,因为Init容器无法定义不同于完成(completion)的就绪(readiness)之外的其他状态。这会在验证过程中强制执行
· 在Pod中的每个app和Init容器的名称必须唯一;与任何其他容器共享同一个名称,会在验证时抛出错误