介 绍 Deployment 相 关 概 念 , 包 括 什 么 是 控 制 器 , 如 何 创 建Deployment,什么是kubectl,如何进行deployment的扩容和升级等。deployment是最常用的控制器。
描述kubernetes中各种控制器
创建和使用deployment
使用kubectl命令行工具
1. Kubernetes管理对象
Kubernetes管理对象 (1)
- Pod(k8s管理的最小单元)
Kubernetes基本管理单元,每个Pod是一个或多个容器的一组集合。
一个Pod作为一个整体运行在一个节点(node)上。
Pod内的容器共享存储和网络
注:企业中很少通过直接建立pod来进行管理。因为无法单独对pod进行管理,通常利用建立控制器来管理,可以监控pod状态。
- ReplicationController(简称RC,用于控制副本数量,弹性扩展处理的能力。现在已经不怎么使用了,现在通常使用新一代的rc即RS)
Kubernetes需要管理大量的Pod,而显而易见的是通常情况下一个应用不会以单独的一个Pod完成。比较常见的情况是使用大量的Pod组成一个简单应用。管理这些大量的Pod的一个方式就是RC。
RC可以指定Pod的副本数量,并且在其中有Pod故障时可以自动拉起新的Pod,大大简化了管理
难度。
Kubernetes管理对象 (2)
- ReplicaSet(简称RS)
ReplicaSet是新一代的RC,主要功能和RC一样,维持Pod的数量稳定,指定Pod的运行位置等,使用方法也相似,主要区别是更新了api,支持更多功能。
ReplicaSet不建议直接使用,而是用更上层的概念Deployment调用ReplicaSet。 - Deployment
目前最常用的控制器就是Deployment,创建Deployment时也会自动创建ReplicaSet。
Deployment可以管理一个或多个RS,并且通过RS来管理Pod。
注意:创建多个pod时候,1.先创建deployment。2.deployment自动创建RS。3.RS管理POD的副本数量。
不适用RS直接控制POD的原因在于,RS不仅可以控制POD的数量,还可以对POD版本进行升级和回退。
Kubernetes管理对象 (3)
- 从小到大的管理逻辑
容器<Pod<ReplicaSet<Deployment -
通常情况下
Pod中包含一个容器,或关系特别紧密的几个容器。
一个ReplicaSet中包含多个相同的Pod。
Deployment中包含一个或几个不同的RS
image.png
2. 创建Deployment
两种方法:1命令创建 2yaml文件创建
1)命令行接口 - Kubectl
- 在 Kubernetes 中的操作很多都是用 kubectl 来完成 , 通过其命令可以管理
Deployment,Replicaset,ReplicationController,Pod等,进行操作,扩容,
删除等等全生命周期操作。同时可以对管理对象进行查看或者监控资源使用情况。 - Kubectl的语法
kubectl [command] [TYPE] [NAME] [flags]
Command:指定你希望进行的操作,如create,get,describe,delete等。
TYPE:指定操作对象的类型,如deployment,RS,Pod等
通过 kubectl api-resources命令可以查看资源类型
NAME:指定对象的名字
Flags: 可选的标志位 (如 : -o wide -n cube-system等)
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 23h v1.14.1
k8s-node1 Ready <none> 22h v1.14.1
k8s-node2 Ready <none> 22h v1.14.1
[root@k8s-master ~]# kubectl get nodes k8s-master
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 23h v1.14.1
[root@k8s-master ~]# kubectl get nodes k8s-master -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master Ready master 23h v1.14.1 192.168.227.10 <none> CentOS Linux 7 (Core) 3.10.0-693.el7.x86_64 docker://18.6.2
[root@k8s-master ~]# kubectl get nodes k8s-master -w //试试监控状态变化 w=watch
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 23h v1.14.1
Kubectl
kubectl create deployment mydep --image=nginx
Command:Create | TYPE:deployment | NAME:mydep | flags:--image=nginx |
---|---|---|---|
创建资源 | 资源类型是deployment | 资源名称是mydep | 创建资源使用的镜像是nginx |
- 常用Command:
Create:创建资源
Apply:应用资源的配置变更,也可以代替create创建新的资源
Get:查看资源
Describe:查看资源的详细描述
Delete:删除资源
示例:展示的deployment的创建,验证了会同事创建rs和pod
[root@k8s-master ~]# kubectl create deployment mydep --image=nginx
deployment.apps/mydep created
[root@k8s-master ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
mydep 1/1 1 1 52s
[root@k8s-master ~]# kubectl get deployments -owide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mydep 1/1 1 1 79s nginx nginx app=mydep
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
mydep-65bbdb4c9f 1 1 1 108s
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mydep-65bbdb4c9f-swgvz 1/1 Running 0 113s
[root@k8s-master ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mydep-65bbdb4c9f-swgvz 1/1 Running 0 2m33s 10.244.1.2 k8s-node1 <none> <none>
[root@k8s-master ~]#
2)使用yaml文件创建Deployment (1)
规范***
- yaml文件对大小写敏感
- 使用缩进表示层级关系(严格)
- 缩进时候不能使用tab键,必须使用空格表示缩进(空格数量没有限制,但一般习惯一个层级空2格)
- 用“#”号进行注释
- 字符可以不用引号括起来
- 一般用键值对描述,用冒号空格来分割“: ”
- 减号+空格 "- "表示列表项
apiVersion: apps/v1 //通过 api-resources查到
kind: Deployment //通过 api-resources查到
metadata:
name: nginx-deployment //deployment的名字
labels:
app: nginx //给deployment打一个标签
spec:
replicas: 3 //3)创建3个nginx同样的pod
selector:
matchLabels:
app: nginx //2)挑选出 nginx这个标签
template:
metadata:
labels:
app: nginx //1) 给pod 打上标签 交nginx
spec: //当前的规范
containers: // POD中跑的是容器
- name: nginx //容器的名字是nginx
image: nginx:1.14.2 //容器的版本是 1.14.2
ports:
- containerPort: 80 //容器使用的端口是80端口
编辑一个yaml文件
[root@k8s-node1 ~]# cat > /root/deployment.yaml << EOF
> apiVersion: apps/v1
> kind: Deployment
> metadata:
> name: nginx-deployment
> labels:
> app: nginx
> spec:
> replicas: 3
> selector:
> matchLabels:
> app: nginx
> template:
> metadata:
> labels:
> app: nginx
> spec:
> containers:
> - name: nginx
> image: nginx:1.7.9
> ports:
> - containerPort: 80
> EOF
2)使用yaml文件创建Deployment (2)
[root@k8s-master ~]# kubectl apply -f deploy.yaml
deployment.apps/nginx-deployment created
[root@k8s-master ~]# k get rs
NAME DESIRED CURRENT READY AGE
mydep-65bbdb4c9f 1 1 1 33m
nginx-deployment-6dd86d77d 3 3 0 10s
[root@k8s-master ~]# k get pods
NAME READY STATUS RESTARTS AGE
mydep-65bbdb4c9f-swgvz 1/1 Running 0 34m
nginx-deployment-6dd86d77d-74gql 1/1 Running 0 27s
nginx-deployment-6dd86d77d-cs4l9 0/1 ContainerCreating 0 27s
nginx-deployment-6dd86d77d-jsf2g 0/1 ContainerCreating 0 27s
[root@k8s-master ~]# k get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mydep-65bbdb4c9f-swgvz 1/1 Running 0 34m 10.244.1.2 k8s-node1 <none> <none>
nginx-deployment-6dd86d77d-74gql 1/1 Running 0 35s 10.244.1.3 k8s-node1 <none> <none>
nginx-deployment-6dd86d77d-cs4l9 0/1 ContainerCreating 0 35s <none> k8s-node2 <none> <none>
nginx-deployment-6dd86d77d-jsf2g 1/1 Running 0 35s 10.244.2.2 k8s-node2 <none> <none>
[root@k8s-master ~]#
2)Yaml文件格式 (1)
- apiVersion:版本号,固定为apps/v1,如果使 用 1.9.0 以 前 版 本 的 kubernetes , 填 写apps/v1beta2
- Kind: 类型,选择创建资源类型,可以填写pod,replicaset等
- Metadata:元数据,其中name项指定了名称,label项指定标签。
- Spec:deployment规格,其中replicas指定pod副本数量,选择器选择标签匹配为app:nginx
3 Deployment升级和弹性伸缩
3.1弹性伸缩2种方式:1)命令2)yaml文件
命令
[root@k8s-master ~]# kubectl scale deployment mydep --replicas=3
deployment.extensions/mydep scaled
[root@k8s-master ~]# k get pods
NAME READY STATUS RESTARTS AGE
mydep-65bbdb4c9f-bvwmp 1/1 Running 0 26s
mydep-65bbdb4c9f-sswdr 1/1 Running 0 26s
mydep-65bbdb4c9f-swgvz 1/1 Running 0 3h48m
nginx-deployment-6dd86d77d-74gql 1/1 Running 0 3h14m
nginx-deployment-6dd86d77d-cs4l9 1/1 Running 0 3h14m
nginx-deployment-6dd86d77d-jsf2g 1/1 Running 0 3h14m
yaml文件
扩:修改/root/deploy.yaml, replicas: 3修改为 replicas: 5。重新apply
缩:修改/root/deploy.yaml, replicas: 5修改为 replicas: 2。重新apply
[root@k8s-master ~]# k get pods
NAME READY STATUS RESTARTS AGE
mydep-65bbdb4c9f-bvwmp 1/1 Running 0 26s
mydep-65bbdb4c9f-sswdr 1/1 Running 0 26s
mydep-65bbdb4c9f-swgvz 1/1 Running 0 3h48m
nginx-deployment-6dd86d77d-74gql 1/1 Running 0 3h14m
nginx-deployment-6dd86d77d-cs4l9 1/1 Running 0 3h14m
nginx-deployment-6dd86d77d-jsf2g 1/1 Running 0 3h14m
[root@k8s-master ~]# vi /root/deploy.yaml
[root@k8s-master ~]# kubectl apply -f deploy.yaml
deployment.apps/nginx-deployment configured
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mydep-65bbdb4c9f-bvwmp 1/1 Running 0 4m16s
mydep-65bbdb4c9f-sswdr 1/1 Running 0 4m16s
mydep-65bbdb4c9f-swgvz 1/1 Running 0 3h52m
nginx-deployment-6dd86d77d-46kmj 1/1 Running 0 23s
nginx-deployment-6dd86d77d-4hq4w 1/1 Running 0 23s
nginx-deployment-6dd86d77d-74gql 1/1 Running 0 3h18m
nginx-deployment-6dd86d77d-cs4l9 1/1 Running 0 3h18m
nginx-deployment-6dd86d77d-jsf2g 1/1 Running 0 3h18m
[root@k8s-master ~]# vi deploy.yaml
[root@k8s-master ~]# kubectl apply -f deploy.yaml
deployment.apps/nginx-deployment configured
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mydep-65bbdb4c9f-bvwmp 1/1 Running 0 5m3s
mydep-65bbdb4c9f-sswdr 1/1 Running 0 5m3s
mydep-65bbdb4c9f-swgvz 1/1 Running 0 3h53m
nginx-deployment-6dd86d77d-74gql 1/1 Running 0 3h19m
nginx-deployment-6dd86d77d-jsf2g 1/1 Running 0 3h19m
缩的动作时机就是杀pod的动作,可以设置执行缩(kill)的时间,比如30秒后进行缩的动作。保证存量进程可以在这段时间内继续执行。
- delete掉一个pod以验证rs对pod数量的监控和维护的功能
1)由于rs设置了nginx-deployment·的副本数量是2,所以当一个delete掉后rs会自动启动以保证pod数据量满足rs要求。
2)POD的名字和ip以及node都会放生变化。因为恢复pod的动作相当于重建pod的动作。pod是不稳定的,ip node 名字,可变化。
3)控制器(deployment)保持副本数量的要求。
总结:rs保证了弹性伸缩的能力的
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mydep-65bbdb4c9f-bvwmp 1/1 Running 0 13m 10.244.1.4 k8s-node1 <none> <none>
mydep-65bbdb4c9f-sswdr 1/1 Running 0 13m 10.244.2.4 k8s-node2 <none> <none>
mydep-65bbdb4c9f-swgvz 1/1 Running 0 4h1m 10.244.1.2 k8s-node1 <none> <none>
nginx-deployment-6dd86d77d-74gql 1/1 Running 0 3h27m 10.244.1.3 k8s-node1 <none> <none>
nginx-deployment-6dd86d77d-jsf2g 1/1 Running 0 3h27m 10.244.2.2 k8s-node2 <none> <none>
[root@k8s-master ~]# kubectl delete pod nginx-deployment-6dd86d77d-74gql
pod "nginx-deployment-6dd86d77d-74gql" deleted
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mydep-65bbdb4c9f-bvwmp 1/1 Running 0 13m 10.244.1.4 k8s-node1 <none> <none>
mydep-65bbdb4c9f-sswdr 1/1 Running 0 13m 10.244.2.4 k8s-node2 <none> <none>
mydep-65bbdb4c9f-swgvz 1/1 Running 0 4h2m 10.244.1.2 k8s-node1 <none> <none>
nginx-deployment-6dd86d77d-h7n7j 1/1 Running 0 5s 10.244.1.6 k8s-node1 <none> <none>
nginx-deployment-6dd86d77d-jsf2g 1/1 Running 0 3h28m 10.244.2.2 k8s-node2 <none> <none>
[root@k8s-master ~]#
3.2升级
将nginx的版本由1.7.9升级到1.8.1
[root@k8s-master ~]# kubectl get deployments -owide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mydep 3/3 3 3 4h10m nginx nginx app=mydep
nginx-deployment 2/2 2 2 3h37m nginx nginx:1.7.9 app=nginx
[root@k8s-master ~]#
利用yaml文件 :
deploy2.yaml 升级至 1.8.1 。
升级采取滚动升级的方式进行(down1个up1个,down第2个up第2个),从下面get rs 命令可以看到多出了一个nginx current是0的记录,该记录为原始的rs记录,数量已经变成了0,新版本以由新的nginx-deployment-59988f74c7替代。后面可利用在升级至1.9.1验证再一次的滚动操作。
image: nginx:1.8.1
[root@k8s-master ~]# kubectl apply -f deploy2.yaml --record
--record :通常加上此参数,用以记录该命令。日后知道升级的时候执行过哪条命令。
[root@k8s-master ~]# kubectl apply -f deploy2.yaml
deployment.apps/nginx-deployment configured
[root@k8s-master ~]# kubectl get deployments.
NAME READY UP-TO-DATE AVAILABLE AGE
mydep 3/3 3 3 4h21m
nginx-deployment 2/2 2 2 3h47m
[root@k8s-master ~]# kubectl get deployments. -owide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mydep 3/3 3 3 4h21m nginx nginx app=mydep
nginx-deployment 2/2 2 2 3h47m nginx nginx:1.8.1 app=nginx
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
mydep-65bbdb4c9f 3 3 3 4h21m
nginx-deployment-59988f74c7 2 2 2 51s
nginx-deployment-6dd86d77d 0 0 0 3h47m
[root@k8s-master ~]# kubectl describe deployments nginx-deployment
。。。。。。。。。。。。。。。。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 34m deployment-controller Scaled up replica set nginx-deployment-6dd86d77d to 5
Normal ScalingReplicaSet 33m deployment-controller Scaled down replica set nginx-deployment-6dd86d77d to 2
Normal ScalingReplicaSet 5m45s deployment-controller Scaled up replica set nginx-deployment-59988f74c7 to 1
Normal ScalingReplicaSet 5m18s deployment-controller Scaled down replica set nginx-deployment-6dd86d77d to 1
Normal ScalingReplicaSet 5m18s deployment-controller Scaled up replica set nginx-deployment-59988f74c7 to 2
Normal ScalingReplicaSet 5m7s deployment-controller Scaled down replica set nginx-deployment-6dd86d77d to 0
deploy3.yaml 升级至 1.9.1
image: nginx:1.9.1
利用deploy3.yaml文件升级,验证再一次的滚动操作
[root@k8s-master ~]# kubectl apply -f deploy3.yaml
deployment.apps/nginx-deployment configured
[root@k8s-master ~]# k get deployments. -owide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mydep 3/3 3 3 4h33m nginx nginx app=mydep
nginx-deployment 2/2 2 2 3h59m nginx nginx:1.9.1 app=nginx
[root@k8s-master ~]# k get rs
NAME DESIRED CURRENT READY AGE
mydep-65bbdb4c9f 3 3 3 4h35m
nginx-deployment-59988f74c7 0 0 0 15m
nginx-deployment-6dd86d77d 0 0 0 4h2m
nginx-deployment-784b7cc96d 2 2 2 2m32s
[root@k8s-master ~]# kubectl describe deployments. nginx-deployment
。。。。。。。。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 44m deployment-controller Scaled up replica set nginx-deployment-6dd86d77d to 5
Normal ScalingReplicaSet 43m deployment-controller Scaled down replica set nginx-deployment-6dd86d77d to 2
Normal ScalingReplicaSet 16m deployment-controller Scaled up replica set nginx-deployment-59988f74c7 to 1
Normal ScalingReplicaSet 16m deployment-controller Scaled down replica set nginx-deployment-6dd86d77d to 1
Normal ScalingReplicaSet 16m deployment-controller Scaled up replica set nginx-deployment-59988f74c7 to 2
Normal ScalingReplicaSet 15m deployment-controller Scaled down replica set nginx-deployment-6dd86d77d to 0
Normal ScalingReplicaSet 3m48s deployment-controller Scaled up replica set nginx-deployment-784b7cc96d to 1
Normal ScalingReplicaSet 3m32s deployment-controller Scaled down replica set nginx-deployment-59988f74c7 to 1
Normal ScalingReplicaSet 3m32s deployment-controller Scaled up replica set nginx-deployment-784b7cc96d to 2
Normal ScalingReplicaSet 2m17s deployment-controller Scaled down replica set nginx-deployment-59988f74c7 to 0
查看升级历史,没有使用--record 所以没有记录信息(none),可以通过--revision=编号进行查看。
[root@k8s-master ~]# kubectl rollout history deployment nginx-deployment
deployment.extensions/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
[root@k8s-master ~]# kubectl rollout history deployment nginx-deployment --revision=2
deployment.extensions/nginx-deployment with revision #2
Pod Template:
Labels: app=nginx
pod-template-hash=59988f74c7
Containers:
nginx:
Image: nginx:1.8.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
[root@k8s-master ~]#
回滚操作
[root@k8s-master ~]# kubectl rollout undo deployment nginx-deployment --to-revision=2
deployment.extensions/nginx-deployment rolled back
[root@k8s-master ~]# k get deployments. -owide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mydep 3/3 3 3 5h16m nginx nginx app=mydep
nginx-deployment 2/2 2 2 4h42m nginx nginx:1.8.1 app=nginx
删除deployment(控制器)
因为无法直接删除pod(删除后rs会自动重建),要想删除POD只能通过删除控制器(deployment)来实现(删除deployment引出删除rs进而删除容器)
[root@k8s-master ~]# kubectl delete deployments. nginx-deployment
deployment.extensions "nginx-deployment" deleted
[root@k8s-master ~]# k get rs
NAME DESIRED CURRENT READY AGE
mydep-65bbdb4c9f 3 3 3 5h27m
[root@k8s-master ~]# k get pod
NAME READY STATUS RESTARTS AGE
mydep-65bbdb4c9f-bvwmp 1/1 Running 0 99m
mydep-65bbdb4c9f-sswdr 1/1 Running 0 99m
mydep-65bbdb4c9f-swgvz 1/1 Running 0 5h27m
[root@k8s-master ~]#