理解Kubernetes对象

Kubernetes Objects 是kubernetes系统的持久实体。Kubernetes使用这些实体来表述集群的状态。特别是,Kubernetes对象可以描述:

  • 哪些容器化应用正在运行(以及在哪个节点运行)

  • 应用程序的可用资源

  • 应用程序特性相关的策略,例如重启策略,更新以及故障恢复侧露

Kubernetes对象是一种”声明的记录” – 一旦创建对象,Kubernetes系统将持续确保对象存在。即创建对象就是要求集群持续照看对象,确保集群的终态正确。

对象规格和状态

每个kubernetes对象包含两个嵌套对象字段决定了对象配置:

  • object spec(对象规格):描述对象的终态,即你需要对象具有的特性

  • object status(对象状态):描述对象当前实际状态,这个状态是通过kubernetes系统提供更新

任何时刻 ,Kubernetes管控平台(Kubernetes Control Plane)将实时管理对象的状态(object status)以符合你指定的状态(object spec)。例如,设置deployment spec指定运行的应用程序采用3副本,则Kubernetes系统会读取部署规格并启动3个指定应用程序实例以更新状态符合你的spec。任何实例故障(即状态变化),kubernetes就会对比两个spec差异并修正状态 – 也就是启动一个替代实例,使得最终状态依然保持3个应用程序运行实例。

描述Kubernetes对象

在创建Kubernetes对象时,需要提供 obejct spec 描述对象的终态。这样,在使用 Kuernetes API创建对象(或者通过 kubectl ),API请求中必须包含使用JSON作为请求内容的信息。 通常是通过一个 .yaml 文件提供信息给 kubectl ,而 kubectl 会将yaml数据转换成JSON然后发出API请求。

kubernetes官方提供的案例 deployment.yaml 可以帮助我们理解如何完成一个部署:

kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record

执行后提示信息:

deployment.apps/nginx-deployment created
  • application/deployment.yaml

 1apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
 2kind: Deployment
 3metadata:
 4  name: nginx-deployment
 5spec:
 6  selector:
 7    matchLabels:
 8      app: nginx
 9  replicas: 2 # tells deployment to run 2 pods matching the template
10  template:
11    metadata:
12      labels:
13        app: nginx
14    spec:
15      containers:
16      - name: nginx
17        image: nginx:1.7.9
18        ports:
19        - containerPort: 80
  • 解析 application/deployment.yaml - apiVersion: apps/v1 设置创建对象时使用的Kubernetes API版本 - kind: Deployment 创建对象的类型 - metadata - 元数据唯一标识对象,包括 name 字符串, UID 和可选的 namespace - 需要提供对象 spec 字段,对象 spec 的清晰格式对于每个Kubernetes对象都是不同的,并且包含嵌套字段来描述对象。

执行上述创建后,kubernetes将根据模版(标签是 app: nginx )采用指定镜像 image: nginx:1.7.9 创建容器,采用端口 containerPort: 80 共创建2个pod( replicas: 2 ),并且这个容器的模版具备了标签 app: nginx

../../../_images/deployment_pod_example.png
  • 检查部署:

    kubectl get deployments
    

输出:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           91m

可以进一步检查这个部署:

kubectl get deployments nginx-deployment -o yaml

kubectl describe deployments nginx-deployment

则可以看到详细的部署信息

  • 检查pod:

    kubectl get pods
    

输出:

NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-6dd86d77d-lmg92   1/1     Running   0          90m
nginx-deployment-6dd86d77d-zr9c4   1/1     Running   0          90m

备注

虽然已经启动了pod,但是此时还没有把部署输出到外部网络,所以此时还无法访问nginx的页面。请参考 输出Kubernetes应用服务 完成服务输出。

在kubernetes中展示的pod命名和运行主机上的docker容器命名相关,在物理主机上使用 docker ps 可以看到 XXXX_nginx-deployment-6dd86d77d-lmg92_YYYY 命名的容器。

参考