Kubernetes-资源清单
1-基本格式
apiVersion: group/version 指明api资源属于哪个群组和版本,同一个组可以有多个版本
$ kubectl api-versions
kind: 资源类别,标记创建的资源类型,k8s主要支持以下资源类别
Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
metadata:元数据,主要提供以下字段
name:同一类别下的name是唯一的
namespace:对应的对象属于哪个名称空间
labels:标签,每一个资源都可以有标签,标签是一种键值数据
spec: 定义目标资源的期望状态,资源对象中最重要的字段
containers:定义容器信息
2-示例
2.1-pod
2.1.1-pod清单
1-运行单个容器
# API的版本号
apiVersion: v1
# 部署的资源类型
kind: Pod
# 元数据信息
metadata:
# 资源的名称
name: nginx01
# 自定义Pod资源的配置
spec:
# 定义容器相关信息
containers:
# 定义容器的名称
- name: nginx01_c1
# 定义容器基于哪个镜像启动
image: nginx:1.18
2-运行多个容器
# API的版本号
apiVersion: v1
# 部署的资源类型
kind: Pod
# 元数据信息
metadata:
# 资源的名称
name: nginx+alpine
# 自定义Pod资源的配置
spec:
# 定义容器相关信息
containers:
# 定义容器的名称
- name: nac01
# 定义容器基于哪个镜像启动
image: nginx:1.18
- name: nac02
image: alpine
# 为终端分配一个标准输入,目的是为了阻塞容器,阻塞容器后,容器将不退出。
stdin: true
2.1.2-标签
标签就是附加到k8s对象上的键值对标识,支持高效的查找和监听。作用就是字面意思,给k8s对象打上标签,我们可以使用标签来选择对象。
# API的版本号
apiVersion: v1
# 部署的资源类型
kind: Pod
# 元数据信息
metadata:
# 资源的名称
name: nginx02
# 为资源配置标签,KEY和VALUES都是有用户自定义的
labels: #//新增内容
apps: web #//新增内容
middleware: nginx #//新增内容
address: wuhan #//新增内容
# 自定义Pod资源的配置
spec:
# 定义容器相关信息
containers:
# 定义容器的名称
- name: nginxc1
# 定义容器基于哪个镜像启动
image: nginx:1.18
2.1.3-覆盖容器启动命令
args和command
apiVersion: v1
kind: Pod
metadata:
name: args-command
labels:
apps: web02
spec:
containers:
- name: args-c1
image: nginx:1.18
# command会覆盖镜像的ENTRYPOINT
command:
- "tail"
# args会覆盖镜像的CMD指令
args:
- "-f"
- "/etc/hosts"
2.1.4-资源限制
资源上限限制
apiVersion: v1
kind: Pod
metadata:
name: resources-limits
labels:
apps: myweb
spec:
containers:
- name: c1
image: nginx:1.18
# 配置容器的资源限制
resources:
# 设置资源的上线
limits:
# 配置内存限制
memory: "200Mi"
# 配置CPU的显示,CPU的换算公式: 1core = 1000m
cpu: "500m"
预期资源限制
apiVersion: v1
kind: Pod
metadata:
name: resources-requests
labels:
apps: myweb
spec:
containers:
- name: c1
image: nginx:1.18
# 配置容器的资源限制
resources:
# 配置容器期望的资源,如果所有节点不符合期望的资源,则无法完成调度
requests:
memory: "100Mi"
cpu: "500m"
2.1.5-环境变量
apiVersion: v1
kind: Pod
metadata:
name: env01
spec:
containers:
- name: c1
image: nginx:1.18
# 向容器传递环境变量,多组变量使用"-"来区分
env:
# 指定变量的名称
- name: hostname
# 指定变量对应的值。
value: nginx001
- name: user
value: root
- name: pod-name
# 值引用自其他位置
valueFrom:
# 基于字段的方式引用
fieldRef:
# 指定字段路径
fieldPath: metadata.name #pod名称
- name: pods_nodeName
valueFrom:
fieldRef:
fieldPath: spec.nodeName #节点名称
- name: c2
image: alpine
stdin: true
env:
- name: address
value: hi,world
2.2-存储卷
2.2.1-emptyDir
emptyDir是临时存储卷,与Pod的生命周期绑定到一起,如果Pod被删除了,这意味着数据也被随之删除
kind: Pod
apiVersion: v1
metadata:
name: volume01
labels:
apps: myweb
spec:
# nodeName:
# 声明存储卷类型和名称
volumes:
- emptyDir: {}
name: data01
- name: data02
emptyDir: {}
- name: data03
emptyDir: {}
containers:
- name: c1
image: nginx:1.20.1
# 挂载指定的存储卷
volumeMounts:
# 指定存储卷的名称
- name: data01
# 指定容器的挂载点.
mountPath: /data
- name: c2
image: alpine
stdin: true
volumeMounts:
- name: data01
mountPath: /data
2.2.2-hostPath
挂载宿主机文件或者目录到Pod中的容器。如果Pod删除了,宿主机的数据并不会被删除。
apiVersion: v1
kind: Pod
metadata:
name: volume-hostpath-01
labels:
apps: myweb
spec:
# nodeName:
# 声明存储卷类型和名称
volumes:
- name: data01
hostPath:
# 指定宿主机的路径,如果源数据是文件
path: /root/pods/config/nginx.conf
containers:
- name: c1
image: nginx:1.20.1
command: ["sleep","3600"]
volumeMounts:
- name: data01
# 挂载点也必须是文件
mountPath: /etc/nginx/nginx.conf
# 以只读的方式挂载,默认值是false。
# readOnly: true
如果源数据是文件,挂载点也必须是文件
源数据是目录,挂载点也必须是目录
2.2.3-nfs
apiVersion: v1
kind: Pod
metadata:
name: volume-nfs
labels:
apps: myweb
spec:
# nodeName:
volumes:
- name: nfs01
# 配置NFS挂载
nfs:
server: 10.0.0.201
path: /data/kubernetes
containers:
- name: c1
image: nginx:1.20.1
volumeMounts:
- name: nfs01
mountPath: /usr/share/nginx/html
2.2.4-ConfigMap
ConfigMap数据会存储在etcd数据库,其应用场景主要在于应用程序配置
# 声明api的版本号
apiVersion: v1
# 声明资源的类型
kind: ConfigMap
# 声明资源的元数据信息
metadata:
name: config
# 数据信息
data:
# 单行数据
name: "ke"
age: "18"
# 多行数据
my.conf: |
host: 10.0.0.201
port: 13306
socket: /tmp/mysql.sock
username: root
password: 1
redis.conf: |
host: 10.0.0.293
port: 6379
在pod中使用
kind: Pod
apiVersion: v1
metadata:
name: volume-configmap-v2
labels:
apps: myweb
spec:
# nodeName:
volumes:
- name: db
# 定义数据卷类型是configMap.
configMap:
# 引用configMap的名称.
name: config
# 引用configMap的具体的Key相关信息.
items:
# 指定configmap的key名称,该名称必须在cm资源中存在.
- key: my.cnf
# 可以暂时理解为挂载到容器的名称.
path: my.cnf
- name: web
configMap:
name: config
items:
- key: nginx.conf
path: nginx.conf
containers:
- name: c1
image: nginx:1.20.1
volumeMounts:
- name: web
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
- name: db
mountPath: /etc/my.cnf
# 当subPath的值与CM的path相同时,mountPath的路径为文件
subPath: my.cnf
2.3-名称空间
1.名称空间是用来隔离K8S集群的资源
2.有的资源是不支持名称空间的,我们将其称为全局资源,而支持名称空间的资源我们称之为局部资源
3.我们可以通过"kubectl api-resources"命令来判断一个资源是否支持名称空间
4.删除名称空间时,会将该名称空间下的所有资源删除
2.3.1-基本管理
若创建/查看资源时,未使用"-n"选项显式指定名称空间,则默认使用"default"名称空间
kubectl get namespaces //查看名称空间
kubectl create namespace kaike // 创建名称空间
kubectl delete namespaces kaike //删除名称空间
kubectl get pods,cm,secret -n ke // 查看ke名称空间的所有pod,cm,secret等信息。
kubectl get pods,cm,secret -A //查看所有名称空间的pod,cm,secret等信息
2.3.2-清单
apiVersion: v1
kind: Namespace
metadata:
name: kaike