1.什么是Deployment?
Deployment(简写为deploy)是kubernetes控制器的又一种实现,构建于ReplicasSet控制器之上,可以为Pod和ReplicaSet提供声明式更新。相比较而言,Pod和ReplicaSet很少用来直接使用,而是借助于控制器来使用。Deployment Controller核心功能也是保证Pod资源的正常使用,大部分功能调用ReplicaSet来实现。
1.2我们只需要描述Deployment中目标Pod期望状态,而Deployment控制器以控制更改为实际状态,使其变成期望状态。我们不需要直接使用Pod和ReplicaSet来实现,Deployment控制器在ReplicaSet的基础上增加了部分特性:
1.事件和状态查看: 可以通过特定的命令查看Deployment对象的更新进度和状态;
2.版本记录: 将Deployment对象的历史更新操作都进行保存,以便于后续执行回滚操作使用;
3.多种更新方案: Recreate重建,可以实现单批次更新所有的Pod。RollingUpdate可以实现多批次替换Pod至新版本。
2.Deployment的构成部分
Deployment是标准的k8s资源,Deployment构建于ReplicaSet之上,spec字段嵌套了包含了replicaset控制器支持的selector、replicas、template、minReadySeconds
2.1Selector: 标签选择器,匹配并关联Pod,并对其受控制的Pod进行管理;
2.2Replicas: 期望的Pod的副本数,期望在集群所运行的Pod对象的数量;
2.3template: Pod的模板;实际上定义了Pod的内容,相当于把一个Pod的描述信息以模板的方式嵌套在ReplicaSet;
3.Deployment的资源规范
apiVersion: apps/v1 # API群组及版本;
kind: Deployment # 资源类型;
metadata: # Pod元数据;
name: # 资源名称,在作用域中要唯一;
namespace: # 名称空间,Deployment隶属名称空间级别;
spec:
minReadySeconds: # Pod就绪后多少秒内任一容器无Crash方可为就绪;
replicas: # 期望的Pod副本数,默认为1;
selector:
4.Deployment的配置示例:
# 以Nginx应用为示例配置 root@kubernetes-master01:~# cat nginx-deployment-test.yaml apiVersion: apps/v1 # 资源群组 kind: Deployment # 资源类型 metadata: # 元数据 name: deployment-nginx-test # Pod名称 namespace: default # Pod所在的名称空间 spec: replicas: 2 # Pod的副本数 selector: # 标签选择器 matchLabels: app: nginx-deployment # Pod的标签 template: # 定义Pod的模板 metadata: # labels: # 标签同上要一致 app: nginx-deployment spec: # 定义容器的 containers: - name: nginx # 容器名称 image: nginx # 容器镜像 imagePullPolicy: IfNotPresent # 容器拉取策略 ports: # 定义容器的端口 - name: http containerPort: 80 # 容器端口为80 # root@kubernetes-master01:~# kubectl apply -f nginx-deployment-test.yaml deployment.apps/deployment-nginx-test created折叠
4.1查看Pod,Deployment的名称-Replicaset的名称-随机字符串hash值是由Deployment Controller自动生成。Pod对应的名称遵循ReplicaSet控制器的命名格式,它以Replicaset控制器的名称为签注,后跟5位随机字符。
root@kubernetes-master01:~/cloud-Native/deployment/replicas# kubectl get pods
NAME READY STATUS RESTARTS AGE
deployment-nginx-test-dd5bdc67f-b5dlz 1/1 Running 0 6m12s
deployment-nginx-test-dd5bdc67f-t94j7 1/1 Running 0 6m12s
# NAME: 列出了集群中Deployment的名称。
# READY: 显示应用程序的可用的"副本数"显示的模式是"就绪个数/期望个数"
# UP-TO-DATE: 标识已经达到期望状态的Pod的副本数量。
# AVAILABLE: 表示当前处于可用状态的Pod的数量。
4.2查看replicaset,Deployment控制器会自动创建相关的ReplicaSet控制器资源,并以[DEPLOYMENT-NAME]-[POD-TEMPLATE-HASH-VALUE]格式为其命名,其中的hash值由Deployment控制器自动生成,由Deployment创建的ReplicaSet对象会自动使用相同的标签选择器。
root@kubernetes-master01:~# kubectl get replicaset deployment-nginx-test-dd5bdc67f
NAME DESIRED CURRENT READY AGE
deployment-nginx-test-dd5bdc67f 2 2 2 9m34s
5.为Pod创建Service资源以实现负载均衡。
root@kubernetes-master01:~# cat nginx-service-test.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment-test
namespace: default
spec:
type: ClusterIP # 类型为ClusterIP
selector: # 标签选择器跟Pod的标签相匹配,才能被识别为后端端点。
app: nginx-deployment
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
#
root@kubernetes-master01:~# kubectl apply -f nginx-service-test.yaml
service/nginx-deployment-test created
6.进行访问测试
6.1我提前修改了Nginx的index文件。方便效果。
root@kubernetes-master01:~# echo "nginx-1-haitang.net" > /usr/share/nginx/html/index.html
root@kubernetes-master01:~# echo "nginx2-haitang.com" > /usr/share/nginx/html/index.html
6.2访问Service的IP,因为是ClusterIP,只能在集群内访问。也是没有问题的。
root@kubernetes-master01:~# curl 10.107.246.117
nginx2-haitang.com
root@kubernetes-master01:~# curl 10.107.246.117
nginx-1-haitang.net
root@kubernetes-master01:~# curl 10.107.246.117
nginx2-haitang.com
root@kubernetes-master01:~# curl 10.107.246.117
nginx-1-haitang.net
7.Pod的伸缩
7.1比如现在两个副本有点无法应对突发的流量,可以通过命令的方式修改replicas也可以通过修改配置文件的方式去修改。
1.1# 命令方式来伸缩
root@kubernetes-master01:~# kubectl scale deployment deployment-nginx-test --replicas=3
deployment.apps/deployment-nginx-test scaled
1.2# 缩容的话就是=多少副本数即可。 例如=2
root@kubernetes-master01:~# kubectl scale deployment deployment-nginx-test --replicas=2
1.3# 修改配置文件vim nginx-deployment-test.yaml 修改spec字段的replicas即可。
7.2伸缩完成后,Service就会发现带有同样标签的Pod,Pod就绪后加入到后端的可用端点。
再次访问测试。也是没有问题。
root@kubernetes-master01:~# curl 10.107.246.117 nginx2-haitang.com root@kubernetes-master01:~# curl 10.107.246.117Welcome to nginx! Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.Thank you for using nginx.
root@kubernetes-master01:~# curl 10.107.246.117 nginx-1-haitang.net折叠
7.3也可以通过describe命令来查看Events事件。
root@kubernetes-master01:~# kubectl describe deploy deployment-nginx-test Pod Template: Labels: app=nginx-deployment Containers: nginx: Image: nginx Port: 80/TCP Host Port: 0/TCP Environment:Mounts: Volumes: Conditions: Type Status Reason ---- ------ ------ Progressing True NewReplicaSetAvailable Available True MinimumReplicasAvailable OldReplicaSets: NewReplicaSet: deployment-nginx-test-dd5bdc67f (3/3 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 36s deployment-controller Scaled up replica set deployment-nginx-test-dd5bdc67f to 3 折叠
8.故障测试。
8.1现在删除Pod会发生什么?
root@kubernetes-master01:~# kubectl delete pods deployment-nginx-test-dd5bdc67f-2vggw
pod "deployment-nginx-test-dd5bdc67f-2vggw" deleted
# 有控制器管理的Pod删除会自动重建,没有控制器管理的Pod删除就是删除了不可能会自动重建。我们创建的Pod受控于Deployment Controller。所以能重建。
root@kubernetes-master01:~# kubectl get pods
deployment-nginx-test-dd5bdc67f-2vggw 1/1 Running 0 4s
deployment-nginx-test-dd5bdc67f-lc6nm 1/1 Running 0 4s