一个 Kubernetes 的 API 对象的定义,大多可以分为 Metadata 和 Spec 两个部分。前者存放的是这个对象的元数据,对所有 API 对象来说,这一部分的字段和格式基本上是一样的;而后者存放的,则是属于这个对象独有的定义,用来描述它所要表达的功能。
kubernetes推荐使用YAML文件的方式,即:将容器的定义、参数、配置统统记录在一个YAML文件中。然后使用如下命令运行
kubectl apply -f app.yaml
部署nginx应用
配置文件 nginx-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.8
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-vol
volumes:
- name: nginx-vol
hostPath:
path: "/var/data"
运行并查看状态
kubectl apply -f nginx-deployment.yaml
kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-74d45d987d-lwbzn 1/1 Running 0 75s
nginx-deployment-74d45d987d-phqt4 1/1 Running 0 52s
kubectl get 命令检查这个 YAML 运行起来的状态,
-l
参数,即获取所有匹配 app: nginx 标签的 Pod
查看POD的描述
kubectl describe pod nginx-deployment-5bf87f5f59-chlc4
进入POD,即容器的namespace
kubectl exec -it nginx-deployment-74d45d987d-lwbzn -- /bin/bash
测试nginx
root@kubernetes-master:~# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESSGATES
nginx-deployment-c9766564f-2f9rk 1/1 Running 0 12m 192.168.237.10 kubernetes-master <none> <none>
nginx-deployment-c9766564f-f9h75 1/1 Running 0 12m 192.168.237.14 kubernetes-master <none> <none>
root@kubernetes-master:~# curl 192.168.237.10
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.8.1</center>
</body>
</html>
删除POD
kubectl delete -f nginx-deployment.yaml
Deployment,是一个定义多副本应用(即多个副本 Pod)的对象,曾经简单提到过它的用法。此外,Deployment 还负责在 Pod 定义发生变化时,对每个副本进行滚动更新(Rolling Update)。
推荐使用replica=1而不使用单独pod的主要原因是:pod所在的节点出故障的时候 pod 可以调度到健康的节点上,单独的pod只能在节点健康的情况下由kubelet保证pod的健康状况。