4.1 配置文件
每个 K8S 资源对象都可以通过 YAML 或 JSON 格式的 Manifest 文件表示。K8S 的配置文件是 YAML 格式,其内容可以分为如下四个部分:(一级标签通常包括 apiVersion, kind, metadata, spce, status)
- typeMeta:对象类型的元信息,声明对象使用哪个 API 版本-apiVersion,哪个类型的对象 kind。
- objectMeta:对象的元信息 metadata,包括对象名称 name、使用的标签 labels 等。
- spec:对象的期望状态,例如对象使用什么镜像、有多少副本等。
- status:对象的实际状态,只能在对象创建后看到,创建对象时无需指定。
namespace 就好比是一个大的分组,一个 k8s 集群内可以创建多个 namespace ,在它之下才能创建 deployment ,然后在 deployment 之下可以启动多个名字一样的 pod(名字一样,id 不同,pod 全名是 pod 名加 id 组成的) ,在一个 pod 内可以启动多个 container ,一般情况下,一个 pod 内只跑一个容器,有些特殊的场景才会在 pod 内启动多个容器;创建了 service 可以将 pod 对 k8s 集群内进行 dns 解析,并且提供负载均衡能力,同一个 namespace 下的 service 可以直接使用 service 名字进行解析,不同 namespace 执行的 service 需要加上 servicename.namespace 才能解析,并且,要解析 service 的话,只能在 pod 的容器内进行,容器之外无法解析。
关系: namespace - deployment - pod - container
文件 | 说明 | 配置关键信息 | 资源查看命令 |
---|---|---|---|
xx_namespace.yaml | Namespace 配置 | name, labels | kubectl get namespace |
xxx_deploy.yaml | Deployment 配置 | selector, template,strategy, containers | kubectl get deploy |
xxx_pod.yaml | Pod 配置 | nodeSelector, containers, volumes | kubectl get pod |
xxx_service.yaml | Service 配置 | ports, selector | kubectl get svc |
说明:
- yaml 文件操作命令
# 创建资源对象命令
$ kubectl create -f xxx.yaml
# 更新 yaml 文件
$ kubectl apply -f xxx.yaml
# 通过 yaml 文件删除此文件对应的资源对象,也可不用 yaml 文件删除资源对象
$ kubectl delete -f xxx.yaml
查看资源命令:资源支持简写, ns 等同 namespace/namespaces,svc 等同 service/services,deploy 同 deployment,pod 同 pods。
kubectl get [namespace/deploy/pod/svc/rc/...] -n $namespace_name
资源 YAML 文件示例
Namespace 示例
apiVersion: v1
kind: Namespace
metadata:
name: product
labels:
name: product
Pod 示例
apiVersion: v1 #指定 api 版本,此值必须在 kubectl apiversion 中
kind: Pod #指定创建资源的角色/类型,如 Pod、Deployment、Namespace
metadata: #资源的元数据/属性
name: web04-pod #资源的名字,在同一个 namespace 中必须唯一
labels: #设定资源的标签,详情请见 http://blog.csdn.net/liyingke112/article/details/77482384
k8s-app: apache
version: v1
kubernetes.io/cluster-service: "true"
annotations: #自定义注解列表
- name: String #自定义注解名字
spec: #specification of the resource content 指定该资源的内容
restartPolicy: Always #表明该容器一直运行,默认 k8s 的策略,在此容器退出后,会立即创建一个相同的容器
nodeSelector: #节点选择,先给主机打标签 kubectl label nodes kube-node1 zone=node1
zone: node1
containers:
- name: web04-pod #容器的名字
image: web:apache #容器使用的镜像地址
imagePullPolicy: Never #三个选择 Always、Never、IfNotPresent,每次启动时检查和更新(从 registery)images 的策略,
# Always,每次都检查
# Never,每次都不检查(不管本地是否有)
# IfNotPresent,如果本地有就不检查,如果没有就拉取
command: ['sh'] #启动容器的运行命令,将覆盖容器中的 Entrypoint,对应 Dockefile 中的 ENTRYPOINT
args: ["$(str)"] #启动容器的命令参数,对应 Dockerfile 中 CMD 参数
env: #指定容器中的环境变量
- name: str #变量的名字
value: "/etc/run.sh" #变量的值
resources: #资源管理,请求请见 http://blog.csdn.net/liyingke112/article/details/77452630
requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 0.1 #CPU 资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为 0.001 核(1m)
memory: 32Mi #内存使用量
limits: #资源限制
cpu: 0.5
memory: 32Mi
ports:
- containerPort: 80 #容器开发对外的端口
name: httpd #名称
protocol: TCP
livenessProbe: #pod 内容器健康检查的设置,详情请见 http://blog.csdn.net/liyingke112/article/details/77531584
httpGet: #通过 httpget 检查健康,返回 200-399 之间,则认为容器正常
path: / #URI 地址
port: 80
#host: 127.0.0.1 #主机地址
scheme: HTTP
initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 #检测的超时时间
periodSeconds: 15 #检查间隔时间
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为 0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: //通过 tcpSocket 检查健康
# port: number
lifecycle: #生命周期管理
postStart: #容器运行之前运行的任务
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop: #容器关闭之前运行的任务
exec:
command: ['service httpd stop']
volumeMounts: #详情请见 http://blog.csdn.net/liyingke112/article/details/76577520
- name: volume #挂载设备的名字,与 volumes[*].name 需要对应
mountPath: /data #挂载到容器的某个路径下
readOnly: True
volumes: #定义一组挂载设备
- name: volume #定义一个挂载设备的名字
#meptyDir: {}
hostPath:
path: /opt #挂载设备类型为 hostPath,路径为宿主机下的/opt,这里设备类型支持很多种
Deployment 示例
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: aas
namespace: product
labels:
app: aas
spec:
selector:
matchLabels: #定义 pod 启动在 labels 为 aas 的 Deployment 内
app: aas
revisionHistoryLimit: 5
replicas: 2
minReadySeconds: 60
strategy: #策略:回滚、升级
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template: #定义 pod 模板:如标签、详细启动参数
metadata:
labels:
app: aas
spec: #
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- aas
topologyKey: kubernetes.io/hostname
terminationGracePeriodSeconds: 60
imagePullSecrets:
- name: resecret-product
nodeSelector:
apptype: memnode
containers:
- name: aas
readinessProbe:
httpGet:
path: /aas/
port: 8080
scheme: HTTP
initialDelaySeconds: 80
timeoutSeconds: 20
livenessProbe:
httpGet:
path: /aas/
port: 8080
scheme: HTTP
initialDelaySeconds: 80
timeoutSeconds: 20
env:
- name: JAVA_OPTS
value: "-Xms1024M -Xmx1024M -server -Duser.timezone=GMT+08"
image: registry.test.com/appimage/aas:AAS.01.00.001.release
resources:
limits:
cpu: "600m"
memory: 2048Mi
requests:
cpu: "300m"
memory: 1280Mi
volumeMounts:
- mountPath: /etc/localtime
readOnly: false
name: localtime
- mountPath: /home/gooagoo/config
readOnly: false
name: appconfig
- mountPath: /home/gooagoo/resource
readOnly: false
name: appresource
- mountPath: /home/gooagoo/log
readOnly: false
name: log
- mountPath: /opt/tomcat/logs
readOnly: false
name: tomcatlog
- mountPath: /mnt/mfs
readOnly: false
name: mnt
volumes:
- name: "localtime"
hostPath:
path: "/etc/localtime"
type: File
- name: "tomcatlog"
hostPath:
path: "/home/app/log/aas/tomcatlogs"
- name: "log"
hostPath:
path: "/home/app/log/aas"
- name: "appconfig"
hostPath:
path: "/home/app/config"
- name: "appresource"
hostPath:
path: "/home/app/resource"
- name: "mnt"
flexVolume:
driver: "alicloud/nas"
options:
server: "15123496df-bee90.cn-beijing.nas.aliyuncs.com"
path: "/"
vers: "4.0"
Service 示例
apiVersion: v1
kind: Service
metadata:
name: aas
namespace: product
spec:
ports:
- port: 8080
selector:
app: aas
YAML 文件检测
YAML 文件检测是确保 YAML 文件格式正确的重要步骤。错误的格式可能导致应用程序解析失败。以下是一些常用的方法和工具来检测 YAML 文件的正确性:
1. 使用在线工具
有很多在线工具可以用来验证 YAML 文件的语法。例如:
只需将你的 YAML 内容粘贴到这些工具中,它们会告诉你是否有语法错误。
2. 使用命令行工具
Yamllint
一个常用的命令行工具,可以检测 YAML 文件的语法和格式。
安装 :
# 使用 pip 安装 pip install yamllint
使用 :
yamllint yourfile.yaml
PyYAML
Python 的 PyYAML 库可以用于加载和验证 YAML 文件。
安装 :
pip install PyYAML
使用 :
import yaml with open('yourfile.yaml') as file: try: yaml.safe_load(file) print("YAML 文件格式正确") except yaml.YAMLError as e: print(f"YAML 文件格式错误: {e}")
3. IDE/编辑器插件
很多现代的代码编辑器和 IDE(如 VSCode、Sublime Text、JetBrains 系列)都提供了 YAML 语法高亮和格式检查的插件,可以在编辑时实时检测错误。
4. Kubernetes YAML 校验
如果你是在编写 Kubernetes 配置文件,可以使用 kubectl
命令进行基本的验证:
kubectl apply --dry-run=client -f yourfile.yaml
这条命令会检查 YAML 文件的语法,并告诉你是否存在任何问题。
总结
选择合适的工具来检测 YAML 文件的格式,能有效避免解析错误。如果需要进一步的帮助,请告诉我!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论