返回介绍

4.1 配置文件

发布于 2024-09-23 22:52:23 字数 9979 浏览 0 评论 0 收藏 0

每个 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.yamlNamespace 配置name, labelskubectl get namespace
xxx_deploy.yamlDeployment 配置selector, template,strategy, containerskubectl get deploy
xxx_pod.yamlPod 配置nodeSelector, containers, volumeskubectl get pod
xxx_service.yamlService 配置ports, selectorkubectl get svc

说明:

  1. yaml 文件操作命令
# 创建资源对象命令
$ kubectl create -f xxx.yaml

# 更新 yaml 文件
$ kubectl apply -f xxx.yaml

# 通过 yaml 文件删除此文件对应的资源对象,也可不用 yaml 文件删除资源对象
$ kubectl delete -f xxx.yaml
  1. 查看资源命令:资源支持简写, 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文