3、直接编辑部署的 YAML 文件,然后重新 Apply
$ kubectl apply -f nginx-deployment.yaml -n study-k8sdeployment.apps/nginx-deployment configured$ kubectl get pods -n study-k8sNAMEREADYSTATUSRESTARTSAGEnginx-deployment-6bcf8f4884-dxxxg1/1Running038snginx-deployment-6bcf8f4884-plbkh0/1ContainerCreating013snginx-deployment-cc4b758d6-lzlxl1/1Running07m25snginx-deployment-cc4b758d6-r5rkb1/1Running07m11s
回滚 deployment了解了如何更新 deployment , 那么当部署出现问题 , 如果回滚呢 , 下面来详细介绍下
查看之前部署的版本
$ kubectl rollout history deployment/nginx-deployment -n study-k8sdeployment.apps/nginx-deploymentREVISIONCHANGE-CAUSE1<none>2<none>3<none>4<none>5<none>6<none>7image updated to 1.21.1
REVISION:就是之前部署的版本信息;
CHANGE-CAUSE:变动的备注信息 。
$ kubectl apply -f nginx-deployment.yaml -n study-k8s --record
加上 --record
,或者每次部署完之后,使用
$ kubectl annotate deployment/nginx-deployment kubernetes.io/change-cause="image updated to 1.21.1" -n study-k8s
CHANGE-CAUSE 信息就会被记录
查看历史版本的详细详细
$ kubectl rollout history deployment/nginx-deployment --revision=6 -n study-k8sdeployment.apps/nginx-deployment with revision #6Pod Template:Labels: app=nginx pod-template-hash=d985dd8bfContainers:nginx:Image: nginx:1.20.3Port: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts: <none>Volumes: <none>
回滚
# 回滚到上一个版本$ kubectl rollout undo deployment/nginx-deployment -n study-k8s# 回滚到指定的版本$ kubectl rollout undo deployment/nginx-deployment --to-revision=5 -n study-k8s
缩放 Deployment
$ kubectl scale deployment/nginx-deployment --replicas=10 -n study-k8s$kubectl get pods -n study-k8sNAMEREADYSTATUSRESTARTSAGEnginx-deployment-66b6c48dd5-5scbj1/1Running044snginx-deployment-66b6c48dd5-7nmtp1/1Running044snginx-deployment-66b6c48dd5-f5xsg1/1Running012mnginx-deployment-66b6c48dd5-fnpnb1/1Running012mnginx-deployment-66b6c48dd5-gg4ng1/1Running044snginx-deployment-66b6c48dd5-qd5z71/1Running044snginx-deployment-66b6c48dd5-qqh4m1/1Running044snginx-deployment-66b6c48dd5-xww491/1Running044snginx-deployment-66b6c48dd5-zndlh1/1Running044snginx-deployment-66b6c48dd5-zp45g1/1Running012m
关于使用 deployment 实现 k8s 中的几种部署策略,可参见Kubernetes 部署策略详解
StatefulSetStatefulSet 用来管理有状态的应用 。
在 Pods 管理的基础上,保证 Pods 的顺序和一致性 。与 Deployment一样,StatefulSet 也是使用容器的 Spec 来创建Pod,与之不同 StatefulSet 创建的 Pods 在生命周期中会保持持久的标记(例如Pod Name) 。
StatefulSet 适用于具有以下特点的应用:
1、稳定的、唯一的网络标识符;
2、稳定的、持久的存储;
3、有序的、优雅的部署和扩缩;
4、有序的、自动的滚动更新 。
那么什么是有状态服务什么是无状态服务呢?
无状态服务
无状态服务不会在本地存储持久化数据 。多个服务实例对于同一个用户请求的响应结果是完全一致的 。这种多服务实例之间是没有依赖关系,比如web应用,在k8s控制器 中动态启停无状态服务的pod并不会对其它的pod产生影响 。
有状态服务
有状态服务需要在本地存储持久化数据 , 典型的是分布式数据库的应用,分布式节点实例之间有依赖的拓扑关系 。
比如,主从关系 。如果 K8S 停止分布式集群中任 一实例 pod,就可能会导致数据丢失或者集群的 crash 。
来个栗子
cat <<EOF >./pod-statefulSet.yamlapiVersion: v1kind: Servicemetadata:name: nginxlabels:app: nginxspec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx---apiVersion: apps/v1kind: StatefulSetmetadata:name: webspec:selector:matchLabels:app: nginx # 必须匹配 .spec.template.metadata.labelsserviceName: "nginx"replicas: 3 # 默认值是 1template:metadata:labels:app: nginx # 必须匹配 .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1GiEOF
DaemonSetDaemonSet:主要是用来保证集群中的每个节点只运行一个 Pod , 且保证只有一个 Pod,这非常适合一些系统层面的应用,例如日志收集、资源监控等,这类应用需要每个节点都运行,且不需要太多实例,一个比较好的例子就是 Kubernetes 的 kube-proxy 。
当有节点加入集群时, 也会为他们新增一个 Pod。当有节点从集群移除时,这些 Pod 也会被回收 。
推荐阅读
- 世界银行的两条贫困线 世界贫困线标准
- 内增高鞋十大品牌是哪些呢。 中国鞋垫十大排名
- mapboxgl加载tiff
- 是否还能在我怀中叫我一声老公 叫我一声老公
- 中国移动大众卡最新收费标准 中国移动资费一览表
- 高铁行驶途中李易峰广告被紧急撤换的简单介绍
- 上 git-secret:在 Git 存储库中加密和存储密钥
- 在王者荣耀游戏中,怎么破解上官婉儿的连招
- 目前世界上肥胖人口是多少 中国肥胖人口数据
- 中国阶层等级划分 中国收入阶层划分图