一、Deployment控制器
Deployment是⼀个定义及管理多副本应⽤(即多个副本 Pod)的新⼀代对象,与Replication Controller相⽐,它提供了更加完善的功能,使⽤起来更加简单⽅便
如果Pod出现故障,对应的服务也会挂掉,所以Kubernetes提供了⼀个Deployment的概念 ,⽬的 是让Kubernetes去管理⼀组Pod的副本,也就是副本集 ,这样就能够保证⼀定数量的副本⼀直可 ⽤,不会因为某⼀个Pod挂掉导致整个服务挂掉。
1.deployment资源创建流程
2.对象的命名方式
子对象的名字=父对象名字+随机字符串或数字
二、示例
1.例一
1)编写yaml文件—在基础版本上添加了volume挂载
[root@k8s-master ~]# vim deployment.yaml
[root@k8s-master ~]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
selector: # 属性,选择器
matchLabels:
app: nginx
replicas: 2 # 管理的副本个数
template: # 模板属性
metadata:
labels:
app: nginx #与上述labels内容相同
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
volumeMounts: # 定义挂载卷
- mountPath: "/usr/share/nginx/html"
name: nginx-vol
volumes: # 定义共享卷
- name: nginx-vol
emptyDir: {} #空的volume,创建出来的容器相应挂载目录也是空的
2)创建Deployment并查看
[root@k8s-master ~]# kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment created
[root@k8s-master ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 0/2 2 0 7s
[root@k8s-master ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 95s[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-7fb966c8b7-6v4bq 1/1 Running 0 115s
nginx-deployment-7fb966c8b7-h9z8v 1/1 Running 0 115s
3)删除Deployment
[root@k8s-master ~]# kubectl delete -f deployment.yaml
deployment.apps "nginx-deployment" deleted或者kubectl delete deployment nginx-deployment
2.注意事项—解析
1)apiVersion:注意这⾥apiVersion对应的值是extensions/v1beta1或者apps/v1.这个版本号需要根据安装的Kubernetes版本和资源类型进⾏变化,此值必须在kubectl api-version中
2)kind:资源类型:这⾥指定为Deployment
3)metadata:指定⼀些meta信息,包括名字或标签之类的。每⼀个 API 对象都有⼀个叫作 Metadata 的字段,这个字段是 API 对象的"标识",即元数据,也是我们从 Kubernetes ⾥找到这个对象的主要依据
4)labels:Labels是最主要的字段,是⼀组 key-value 格式的标签,k8s中的所有资源都⽀持携带label,默认情况下,pod的label会复制rc的label;k8s使⽤⽤户⾃定义的key-value键值对来区分和标识资源集合(就像rc、pod等资源),这种键值对称为label
5)关于Annotations:在 Metadata 中,还有⼀个与 Labels 格式、层级完全相同的字段是Annotations,它专⻔⽤来携带 key-value 格式的内部信息。所谓内部信息,指的是对这些信息感兴趣的,是 Kubernetes 组件本身,⽽不是⽤户。所以⼤多数 Annotations,都是在 Kubernetes 运⾏过程中,被⾃动加在这个 API 对象上
6)selector:过滤规则的定义,是在 Deployment 的"spec.selector.matchLabels"字段。⼀ 般称之为:Label Selector;pod的label会被⽤来创建⼀个selector,⽤来匹配过滤携带这些label的pods
7)使用lables定位pods:kubectl get pods -l 标签(app=nginx) -o wide
8)检查pod的IPs:kubectl get pods -l app=nginx -o json | grep podIP
9)replicas:定义的 Pod 副本个数 (spec.replicas) 是:2
10)关于emptyDir 类型:等同于 Docker 的隐式 Volume 参数,即:不显式声明宿主机⽬录的 Volume。所以,Kubernetes 也会在宿主机上创建⼀个临时⽬录,这个⽬录将来就会被绑定挂载到容器所声明的 Volume ⽬录上。
11)volumeMounts:Pod 中的容器,使⽤的是 volumeMounts 字段来声明⾃⼰要挂载哪个 Volume,并通过 mountPath 字段来定义容器内的 Volume ⽬录,⽐如:/usr/share/nginx/html
12)hostPath:k8s 也提供了显式的 Volume 定义,它叫做 hostPath。⽐如下⾯的这个 YAML ⽂件;