- 管理多个资源对象清单文件常用方法:
- 使用 sed 流式编辑器批量修改脚本键值进行资源清单的创建,有助于日常测试工作:
for i in {
1..5}
do
sed 's,web,&$i,' app.yaml | kubectl apply -f - # - 为标准输入占位符,表示上一个命令的输出
done
- -f 指定应用多个资源对象清单创建,有启动顺序:
kubectl apply -f
清单1 -f 清单2 -f 清单3 - -f 还可以应用文件夹内所有 yaml 清单: kubectl apply -f yaml/ # 无法保证 Pod 启动的顺序
- 合并多个资源对象管理文件,用于多个资源清单文件测试完毕后,统一合并使用:
cat app/* > app.yaml # 先读取目录下所有文件后再重定向进行合并
- 资源对象清单配置模板获取方式:
- 常用模板使用创建命令获取:
kubectl create service --dry-run=client -o yaml > template.yaml
- 官方文档获取:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/
- 使用“解释”命令查询每一个子字段的解释与应用:
kubectl explain Pod.spec.containers.ports.
- 使用 AI 编写资源清单模板,再修改。
1、Pod 容器集合
Pod 的主要特点:
-
共享网络:Pod 中的所有容器共享同一个网络命名空间,这意味着它们能够访问相同的IP地址和端口范围,并且能够相互通信。
-
共享存储:Pod 中的容器能够访问相同的存储卷(Volumes),这使得它们可以共享数据和文件。
-
协同工作:Pod 中的容器设计为协同工作,它们可能是一个应用的不同组件,例如,一个容器处理用户请求,而另一个容器处理数据存储。
-
生命周期管理:Pods 拥有自己的生命周期,它们可以被创建、启动、停止和删除。Kubernetes 会保证 Pod 按照声明的状态运行。
-
重启策略:Pods 可以配置重启策略,以确定在容器崩溃时是否需要重启。
-
易于部署:通过定义Pod 的配置,可以很容易地部署和管理容器化应用。
-
不可变性:Pods 是短暂的,它们不应该被修改。如果需要更新 Pod ,应该创建一个新的 Pod ,并通过更新控制器(如Deployment)替换旧的Pod。
-
扩展性:虽然 Pods 可以包含多个容器,但它们通常用于运行单个应用程序或服务。对于需要水平扩展的应用,通常会使用多个 Pod 副本,并通过 Kubernetes 的控制器(如Deployment、StatefulSet或DaemonSet)来管理。
-
健康检查: Kubernetes 可以对Pod执行健康检查,以确保它们正常运行,并在检测到问题时进行适当的响应。
---
kind: Pod # 资源对象类型
apiVersion: v1 # api 版本,通过 kubectl api-resources 查看
metadata: # 元数据信息
name: web # 资源对象命名
namespace: work # 所属名称空间
labels: # <map> go 语言的 map 无序键值对集合数据类型
app: apache
type: web
spec:
activeDeadlineSeconds: 30
# Pod 最大生命周期,即使容器重启也不会重置,从 kubelet 通过 API-server
# 收到 scheduler 调度时,为 Pod 拉取容器镜像之前计时。到达时间 Pod 不会重启
terminationGracePeriodSeconds: 0
# 宽限期,Pod 停止前进行清理工作,比如保存状态、完成本地事务、结束服务的预留时间。
# nodeName: node-0002 # Pod 调度方式 1: 指定节点进行调度
nodeSelector:
kubernetes.io/hostname: node-0001
# <map> Pod 调度方式 2: 标签选择运算符,指定标签节点过滤进行调度
restartPolicy: OnFailure
#
# initContainers: # 在主容器之前运行,可进行依赖检查、资源准备、执行脚本
hostname: myweb # 指定 Pod 的主机名
hostAliases: # 写入 Pod 内容器的 hosts 文件映射,Pod 设置 hostNetwork 后不生效
- ip: 192.168.1.100 # IP 列表
hostnames: # IP 映射的主机名列表
- web
- nginx
containers:
- name: nginx
image: myos:nginx
imagePullPolicy: IfNotPresent
# Always 只拉取镜像仓库镜像,Nerver 只使用本地镜像,IfNotPresent 优先拉取本地镜像,无则拉取镜像仓库
env: # 传入一个环境变量列表
- name: TZ
value: "Asia/Shanghai" # 方式 1:指定传入单个确定值
# valueFrom:
# configMapKeyRef: # 方式 2: 通过配置映射的方式引用单个键值
# name: timezone # 可传入加密的键值对象,使用 secretKeyRef
# key: timezone
# envFrom: # 方式 3: 使用 configMap 或 secret 方式引入一组环境变量
# - configMapRef:
# name: timezone
command: ["/bin/sh"]
args:
- -c
- |
sleep 3
exit $((RANDOM%10))