Kubernetes 对象描述文件
Kubernetes 对象描述文件(通常称为 manifest 文件)是用于定义和配置 Kubernetes 资源的 YAML 或 JSON 文件。这些文件描述了应用程序的期望状态,包括 Pods、Services、Deployments 等资源。
基本结构
一个典型的 Kubernetes YAML 描述文件包含以下主要部分:
yaml
apiVersion: apps/v1 # 与k8s集群版本有关,使用kubectl api-versions即可查看当前集群支持的版本
kind: Deployment # 资源类型
metadata: # 资源的元数据,即Deployment的一些基本属性和信息
name: nginx-deployment # 资源名称
labels: # 标签,可以灵活定位一个或多个资源
app: nginx # 为该资源设置key为app,value为nginx的标签
spec: # 这是关于资源的描述,即期待该Deployment在k8s中如何使用
replicas: 1 # 使用该资源创建一个应用程序实例。副本数
selector: # 标签选择器,与上面的标签共同作用
matchLabels: # 选择包含标签app:nginx的资源
app: nginx
template: # 这是选择或创建的Pod的模板
metadata: # Pod的元数据
labels: # Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: # 期望Pod实现的功能(即在pod中部署)
containers:
- name: nginx
image: nginx:1.7.9 # 使用的镜像
ports:
- name: nginx-port # 端口的名字
protocol: TCP # 协议类型 TCP/UDP
port: 80 # 集群内的其他容器组可通过 80 端口访问 Service
nodePort: 32600 # 通过任意节点的 32600 端口访问 Service
targetPort: 80 # 将请求转发到匹配 Pod 的 80 端口
type: NodePort # Serive的类型,ClusterIP/NodePort/LoaderBalancer常见资源类型
- Pod - 最基本的部署单元
- Deployment - 管理 Pod 的副本集
- Service - 定义如何访问应用程序
- ConfigMap - 存储配置数据
- Secret - 存储敏感数据
- Namespace - 逻辑上隔离集群资源
- PersistentVolume/PersistentVolumeClaim - 存储管理
- StatefulSet - 管理有状态应用
- DaemonSet - 确保所有节点运行一个 Pod 副本
- Job/CronJob - 运行一次性或定时任务
编写最佳实践
- 使用有意义的名称:资源名称应描述其用途
- 添加标签和注释:便于组织和查询
- 指定资源限制:为容器设置 CPU 和内存限制
- 使用 ConfigMap 和 Secret:避免将配置硬编码在描述文件中
- 版本控制:将描述文件存储在版本控制系统中
- 模板化:使用 Helm 或 Kustomize 管理复杂配置
- 验证文件:使用
kubectl apply --dry-run=client -f file.yaml验证
常用命令
- 应用配置:
kubectl apply -f filename.yaml - 查看资源:
kubectl get <resource-type> - 删除资源:
kubectl delete -f filename.yaml - 编辑资源:
kubectl edit <resource-type>/<name>
yaml 创建资源
创建一个命令空间
yaml
apiVersion: v1
kind: Namespace
metadata:
name: demo
labels:
app: nginx创建一个Service暴露应用
yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx-service
namespace: demo
spec:
selector:
app: nginx
type: ClusterIP
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80与Deployment 绑定
Service 通过 selector 字段选择具有特定标签的 Pod,而 Deployment 通过 template.metadata.labels 为创建的 Pod 打上标签,从而实现间接绑定。
yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app # 必须与Deployment中Pod的标签匹配
ports:
- protocol: TCP
port: 80 # Service对外暴露的端口
targetPort: 80 # 容器暴露的端口(与containerPort一致)
type: ClusterIP # Service类型
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app # 选择器标签
template:
metadata:
labels:
app: my-app # Pod标签(必须与selector.matchLabels匹配)
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80验证绑定
bash
kubectl describe service my-app-service部署nginx应用
yaml
# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
name: demo
labels:
app: nginx
spec: {}
---
# 创建暴露信息
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx-service
namespace: demo
spec:
selector:
app: nginx
type: ClusterIP
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
---
# 创建无状态应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: demo
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx-container
ports:
- name: http
containerPort: 80
protocol: TCP
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "100m"
memory: "128Mi"创建一个pod声明环境变量
当创建pod的时候我们可以为pod声明一些环境变量,有利于我们对pod的管理和调用,设置环境变量,配置文件里面包含env或者envFrom两个字段。通过yaml文件创建的时候声明环境变量
yaml
# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
name: mysql
labels:
app: mysql
---
# 创建pod
apiVersion: v1
kind: Pod
metadata:
name: my-mysql
namespace: mysql
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_DATABASE
value: "yunjisuan"