先了解一个概念,yaml叫做资源,由yaml创建的实例叫做对象,yaml文件内apiVersion、kind、metadata、spec包括但不限于这部分、定义资源的功能,叫字段

1、资源的分类

资源类别大致概括为三种(以下包括但不限于,举例记录)

名称空间 ,不是namespace,就是个称呼。就像某某大学,下面的介绍就类似专业,名称起到分割作用

  1. 工作负载性资源:pod、replicaset、deployment。。。

  2. 服务发现及负载均衡型资源:service、ingress。。。

  3. 配置与存储型资源:volume、CSI。。。

  4. 特殊类型的存储卷:configmap、secre。。。

 集群级资源

  1. namespace

  2. node

  3. clusterrole

  4. clasterrolebinding

 元数据型资源

  1. HPA

  2. PodTemplate

  3. LimitRange

2、资源清单的编写

Kubernetes 中,资源清单(Resource Manifest)是用来描述和配置 Kubernetes 资源的 YAML 或 JSON 文件。这些清单文件定义了 Kubernetes 中各种资源对象(如 Pods、Deployments、Services 等)以及它们的属性和行为。通常,资源清单用于声明式地创建和管理 Kubernetes 对象。一个典型的 Kubernetes 资源清单文件通常由以下几个部分组成

  1. apiVersion:定义资源对象使用的 Kubernetes API 版本

  2. kind:指定资源类型(例如 Pod、Deployment、Service等)

  3. metadata:包含资源的元数据,如名称、命名空间、标签等。

  4. spec:资源的具体规格或配置,定义了资源的详细行为和属性

2.1写个初级的pod

apiVersion: v1                   # API 版本,指定该资源的 API 版本为 `v1`,适用于 Pod 资源。
kind: Pod                         # 资源类型,表示这是一个 `Pod` 资源。
metadata:                          # 元数据,包含关于资源的基本信息。
  name: pod-demo                  # Pod名称,Kubernetes 中唯一标识 Pod 的名称。
  namespace: default              # Pod所在命名空间,不指定的话默认default,加上便于理解
  labels:                          # 标签,用于组织和筛选资源。这里给Pod加上一个标签app:myapp
    app: myapp                     # 标签,标识该 Pod 属于 `myapp` 应用,方便进行选择和管理。
spec:                              # 规格,定义了 Pod 的具体配置和容器的行为。
  containers:                      # 容器定义,Pod 可以包含多个容器。
  - name: myapp-1
    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/bitnami/nginx:latest
  - name: myapp-2
    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/centos:7
    command:                       # 指定容器的启动命令,覆盖镜像的默认命令。
    - "/bin/bash"                  # 启动 `bash` shell。
    - "-c"                         # `bash` 选项,告诉 `bash` 执行后续的命令。
    - "sleep 3600"                 # 容器启动后执行 `sleep 360`

注意一点:apiVersion:v1这个写法是缩写,正常写清单时候指定api完整写法是接口组:版本,上面严格来写是core:v1,core是核心组,从k8s立项就存在了,还有别的组。

可以通过kubectl api-versions查看所有的接口组。如下图

apiVersion、kind、metadata和sepc四个字段。这几个基本字段下还包含了许多子字段。可以用下面命令来进行查询,遇到多层级字段可以用“.”当作分隔符进行查询

#查询资源信息
kubectl explain 字段
#查询属性字段如果在多个层级下可用.做分隔符,如pod.spec.cotnainers.image

会用到的命令,排错三兄弟
kubectl describe pod <pod-name>    #查看资源详情,常用

kubectl logs <pod-name> -c <container-name>    #查看容器日志,常用

kubectl exec -it <pod-name> -c <container-name> -- /bin/sh    #进入容器

2.2启动资源对象

kubectl apply -f 1-pod.yaml
kubectl get pod <pod-name> -o wide    #查看pod对象详细信息,查看pod分配节点,pod分配ip

可以使用curl 10.244.36.66进行访问,可以看到nginx的默认主页

然后去对应节点docker exec -it cname /bin/bash进入容器内部修改ngixn主页。但使用k8s来管理容器运行时,可以用

#pod内只有一个容器时可以不加-c指定容器名称
kubectl exec -it <pod-name> -c <container-name> -- /bin/bash

进入容器内部操作,如下

2.3写个错误的pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo-1
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-1
    image: nginx
  - name: myapp-2
    image: nginx

上面的代码pod启动会报错,用命令查看pod启动过程中的事件记录

kubectl describe <resource-kind> <resource-name>

从pod创建过程中发现了报错来自于第二个容器,查看容器日志,找出报错原因

 kubectl logs <pod-name> -c <container-name>

如下图,报错是地址被使用,但不是很准确,应该是端口被使用才对。所以出问题排错的话先看创建过程,再看容器日志

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐