一个 Kubernetes 的 API 对象的定义,大多可以分为 Metadata 和 Spec 两个部分。前者存放的是这个对象的元数据,对所有 API 对象来说,这一部分的字段和格式基本上是一样的;而后者存放的,则是属于这个对象独有的定义,用来描述它所要表达的功能。

kubernetes推荐使用YAML文件的方式,即:将容器的定义、参数、配置统统记录在一个YAML文件中。然后使用如下命令运行

  1. kubectl apply -f app.yaml

部署nginx应用

配置文件 nginx-deployment.yaml

  1. ---
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: nginx-deployment
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: nginx
  10. replicas: 2
  11. template:
  12. metadata:
  13. labels:
  14. app: nginx
  15. spec:
  16. containers:
  17. - name: nginx
  18. image: nginx:1.8
  19. ports:
  20. - containerPort: 80
  21. volumeMounts:
  22. - mountPath: "/usr/share/nginx/html"
  23. name: nginx-vol
  24. volumes:
  25. - name: nginx-vol
  26. hostPath:
  27. path: "/var/data"

运行并查看状态

  1. kubectl apply -f nginx-deployment.yaml
  2. kubectl get pods -l app=nginx
  3. NAME READY STATUS RESTARTS AGE
  4. nginx-deployment-74d45d987d-lwbzn 1/1 Running 0 75s
  5. nginx-deployment-74d45d987d-phqt4 1/1 Running 0 52s

kubectl get 命令检查这个 YAML 运行起来的状态,-l 参数,即获取所有匹配 app: nginx 标签的 Pod

查看POD的描述

  1. kubectl describe pod nginx-deployment-5bf87f5f59-chlc4

进入POD,即容器的namespace

  1. kubectl exec -it nginx-deployment-74d45d987d-lwbzn -- /bin/bash

测试nginx

  1. root@kubernetes-master:~# kubectl get pod -owide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESSGATES
  3. nginx-deployment-c9766564f-2f9rk 1/1 Running 0 12m 192.168.237.10 kubernetes-master <none> <none>
  4. nginx-deployment-c9766564f-f9h75 1/1 Running 0 12m 192.168.237.14 kubernetes-master <none> <none>
  5. root@kubernetes-master:~# curl 192.168.237.10
  6. <html>
  7. <head><title>403 Forbidden</title></head>
  8. <body bgcolor="white">
  9. <center><h1>403 Forbidden</h1></center>
  10. <hr><center>nginx/1.8.1</center>
  11. </body>
  12. </html>

删除POD

  1. kubectl delete -f nginx-deployment.yaml

Deployment,是一个定义多副本应用(即多个副本 Pod)的对象,曾经简单提到过它的用法。此外,Deployment 还负责在 Pod 定义发生变化时,对每个副本进行滚动更新(Rolling Update)。

推荐使用replica=1而不使用单独pod的主要原因是:pod所在的节点出故障的时候 pod 可以调度到健康的节点上,单独的pod只能在节点健康的情况下由kubelet保证pod的健康状况。