K8S学习之操作Deployment常用命令
前言
-
内容介绍
Deployment为Pod和Replica Set提供声明式更新。
注意:Deployment是通过replicaset来管理pod的,您不该手动管理由 Deployment 创建的 Replica Set,否则您就篡越了 Deployment controller 的职责
-
作用
-
定义一组Pod期望数量,Controller会维持Pod数量与期望数量一致;
-
配置Pod的发布方式,controller会按照给定的策略更新Pod,保证更新过程中不可用Pod维持在限定数量范围内;
-
如果发布有问题支持回滚
-
原理
控制器模型
-
内容介绍
在Kubernetes架构中,有一个叫做kube-controller-manager的组件。这个组件,是一系列控制器的集合。其中每一个控制器,都以独有的方式负责某种编排功能。而Deployment正是这些控制器中的一种。它们都遵循Kubernetes中一个通用的编排模式,即:控制循环
for { 实际状态 := 获取集群中对象X的实际状态 期望状态 := 获取集群中对象X的期望状态 if 实际状态 == 期望状态 { 什么都不做 }else{ 执行编排动作,将实际状态调整为期望状态 } }
在具体实现中,实际状态往往来自于Kubernetes集群本身。如:
- Kubelet通过心跳汇报的容器状态和节点状态;
- 监控系统中保存的应用监控数据;
- 控制器主动收集的它感兴趣的信息,这些都是常见的实际状态的来源;
期望状态一般来自用户提交的YAML文件,这些信息都保存在Etcd中
-
Deployment控制器实现
-
Deployment Controller从Etcd中获取到所有携带 “app:nginx” 标签的Pod,然后统计它们的数量,这就是实际状态;
-
Deployment对象的replicas的值就是期望状态;
-
Deployment Controller将两个状态做比较,然后根据比较结果,确定是创建Pod,还是删除已有Pod
-
滚动更新
-
内容介绍
Deployment滚动更新的实现,依赖的是Kubernetes中的ReplicaSet,因为Deployment控制器实际操纵的,就是Replicas对象,而不是Pod对象。
Pod被ReplicaSet管理,ReplicaSet控制pod的数量;ReplicaSet被Deployment管理,Deployment控制pod应用的升级、回滚,当然也能控制pod的数量。Service提供一个统一固定入口,负责将前端请求转发给Pod。
-
ReplicaSet
ReplicaSet负责通过“控制器模式”,保证系统中Pod的个数永远等于指定的个数。这也正是Deployment只允许容器的restartPolicy=Always的主要原因:只有容器能保证自己始终是running状态的前提下,ReplicaSet调整Pod的个数才有意义。
-
Deployment
Deployment同样通过控制器模式,操作ReplicaSet的个数和属性,进而实现“水平扩展/收缩”和“滚动更新”两个编排动作,对于“水平扩展/收缩”的实现,Deployment Controller只需要修改replicas的值即可。用户执行这个操作的指令如下:
kubectl scale deployment nginx-deployment --replicas=4
常用命令
启动minikube
minikube start
定义yaml文件
-
文件内容
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.12.2 ports: - containerPort: 80 # 在一个yaml文件中通过 --- 分割多个资源对象
-
注意事项
您必须在部署中指定适当的选择器和 Pod 模板标签(在本例中为app: nginx)。
不要将标签(labels)或选择器(selectors)与其他控制器(包括其他Deployments 和 StatefulSet)重叠。Kubernetes 不会阻止您重叠,如果多个控制器具有重叠的选择器,这些控制器可能会发生冲突并出现意外行为。
在一个yaml文件中可以通过 — 分割多个资源对象
创建deployment
# 基于yaml创建deployment资源
kubectl apply -f nginx.yml
kubectl create -f deployment.yaml
# 基于命令创建 deployment(通过 kuectl run 命令来创建一个 deployment)
## nginx-deploy 创建 deployment 的名字
## --image : 指定使用的镜像
## --port=80 :容器暴露的端口,该端口只能在 K8S 集群中访问
## --dry-run=true : 检测语法是否错误,不会正在创建
kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --dry-run=true
kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80
# 创建并验证
kubectl create -f deployment_nginx.yml
kubectl get deployment
kubectl get rs
kubectl get pods
查看deployment
# 查看deployment资源
## 查看名为 nginx-deployment 的 deployment 的状态(由粗 -> 细)
kubectl get deployment
kubectl get deployment -o wide
kubectl describe deployment nginx-deployment
升级deployment
# 更新名称为nginx-deployment的deloyment的镜像版本
kubectl set image deployment nginx-deployment nginx=nginx:1.13
kubectl get deployment
kubectl get deployment -o wide
kubectl get pods
查看历史deployment
kubectl rollout history deployment nginx-deployment
kubectl rollout status deployment nginx-deployment
回滚deployment
# 通过--to-revision指定回滚到特定的修订如:--to-revision=2
kubectl rollout undo deployment nginx-deployment
扩缩容deployment
# 扩容
kubectl scale deployment nginx-deployment --replicas=5
# 如果是缩容,把对应的副本数设置的比当前的副本数小即可
# 另外,还可以针对当前的副本数目做条件限制,比如当前副本数是5则进行缩容至副本数目为3
kubectl scale --current-replicas=5 --replicas=3 deployment nginx-deployment
# 基于CPU的使用率创建3-10个pod
kubectl autoscale deployment nginx-deployment --min=3 --max=10 --cpu_percent=80
暴露deployment
-
内容介绍
其实就是把端口暴露在minikube上
-
操作命令
kubectl get node kubectl get node -o wide kubectl expose deployment nginx-deployment --type=NodePort # 然后通过kubectl get services -o wide来查看被随机映射的端口 ## 查看node节点暴露的端口30960 kubectl get svc #进入minikube查看ip地址192.168.99.100 minikube ssh
浏览器输入192.168.99.100:30960验证响应结果
删除deployment
# 删除deployment资源(基于yaml)
kubectl delete -f nginx.yml
参数解释
Name deployment 名
Namespace 命名空间
CreationTimestamp 创建时间
Labels 标签
Annotations 注释
Selector 调度规则
Replicas 副本
StrategyType 策略类型
MinReadySeconds 最小准备时间
RollingUpdateStrategy 滚动更新策略
Pod Template pod模板
Conditions 条件
OldReplicaSets 旧的副本数
NewReplicaSets 新的副本数
Events: Deployment的执行日志
参考链接
-
Deployments
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
-
k8s之Deployment详解
https://blog.csdn.net/lixinkuan328/article/details/103993274
-
K8s常用命令合集
https://zhuanlan.zhihu.com/p/88994751
-
Kubernetes资源对象Pod、ReplicaSet、Deployment、Service之间的关系
https://blog.csdn.net/u010606397/article/details/90752262