Replication Controller为Kubernetes的一个核心内容,应用托管到Kubernetes之后,Replication Controller需要保证应用能够持续的运行,主要的功能如下:
1)确保pod数量:它会确保Kubernetes中有指定数量的Pod在运行。如果少于指定数量的pod,Replication Controller会创建新 的,反之则会删除掉多余的以保证Pod数量不变。
2)确保pod健康:当pod不健康,运行出错或者无法提供服务时,Replication Controller也会杀死不健康的pod,重新创建新的。
3)弹性伸缩 :在业务高峰或者低峰期的时候,可以通过Replication Controller动态的调整pod的数量来提高资源的利用率。同时,配置相应的监控功能(Hroizontal Pod Autoscaler),会定时自动从监控平台获取Replication Controller关联pod的整体资源使用情况,做到自动伸缩。
4)滚动升级:滚动升级为一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定,在初始化升级的时候就可以及时发现和解决问题,避免问题不断扩大。
Deployment同样为Kubernetes的一个核心内容,主要职责同样是为了保证pod的数量和健康,90%的功能与Replication Controller完全一样,可以看做新一代的Replication Controller。但是,它又具备了Replication Controller之外的新特性:
1)Deployment继承了Replication Controller的全部功能。
2)可以查看Deployment的升级详细进度和状态。
3)回滚:当升级pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本。
4)版本记录: 每一次对Deployment的操作,都能保存下来,给予后续可能的回滚使用。
5)暂停和启动:对于每一次升级,都能够随时暂停和启动。
6)多种升级方案:Recreate:删除所有已存在的pod,重新创建新的; RollingUpdate:滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等。
apiVersion: apps/v1 #当前格式的版本
kind: Deployment #当前创建资源的类型, 当前类型是Deployment
metadata: #当前资源的元数据
name: docker-project #当前资源的名字 是元数据必须的项
annotations:
kubernetes.io/change-cause: "初始化版本v1" #记录到revision中的内容
spec:
selector:
matchLabels:
app: web_server #是当前Deployment的规格说明
replicas: #指当前创建的副本数量 默认不填 默认值就为‘1’
template: #定义pod的模板
metadata: #当前pod的元数据
labels: #至少顶一个labels标签,可任意创建一个 key:value
app: web_server
spec: #当前pod的规格说明
containers: #容器
- name: my-docker-project #是容器的名字容器名字是必须填写的
image: 192.168.214.128:5000/docker-project:v1 #镜像 镜像的名字和版本
imagePullPolicy: Always #拉取策略: Always--总是拉取 IfNotPresent--默认值,本地有则使用本地镜像,不拉取 Never--只使用本地镜像,从不拉取
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: api/heathy
port: 8080
---
kind: Service
apiVersion: v1
metadata:
name: docker-project-service
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 31000
selector:
app: web_server
kubectl apply -f docker-project.yaml
kubectl get deployment
kubectl get pod
kubectl get services;
kubectl get pods --show-labels
1)升级策略:
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
2)参数含义
minReadySeconds:
Kubernetes在等待设置的时间后才进行升级
如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了
如果没有设置该值,在某些极端情况下可能会造成服务服务正常运行
maxSurge:
升级过程中最多可以比原先设置多出的POD数量
例如:maxSurage=1,replicas=5,则表示Kubernetes会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个POD。
maxUnavaible:
升级过程中最多有多少个POD处于无法提供服务的状态
当maxSurge不为0时,该值也不能为0
例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态。
3)修改后的文件:
apiVersion: apps/v1 #当前格式的版本
kind: Deployment #当前创建资源的类型, 当前类型是Deployment
metadata: #当前资源的元数据
name: docker-project #当前资源的名字 是元数据必须的项
annotations:
kubernetes.io/change-cause: "将v1版本升级到v2" #记录到revision中的内容
spec:
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
selector:
matchLabels:
app: web_server #是当前Deployment的规格说明
replicas: #指当前创建的副本数量 默认不填 默认值就为‘1’
template: #定义pod的模板
metadata: #当前pod的元数据
labels: #至少顶一个labels标签,可任意创建一个 key:value
app: web_server
spec: #当前pod的规格说明
containers: #容器
- name: my-docker-project #是容器的名字容器名字是必须填写的
image: 192.168.214.128:5000/docker-project:v2 #镜像 镜像的名字和版本
imagePullPolicy: Always #拉取策略: Always--总是拉取 IfNotPresent--默认值,本地有则使用本地镜像,不拉取 Never--只使用本地镜像,从不拉取
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: api/heathy
port: 8080
---
kind: Service
apiVersion: v1
metadata:
name: docker-project-service
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 31000
selector:
app: web_server
4)执行docker-project.yaml文件
kubectl apply -f docker-project.yaml
kubectl rollout status deployment docker-project
kubectl rollout pause deployment <deployment>
7)继续升级
kubectl rollout resume deployment <deployment>
kubectl rollout history deployment docker-project
kubectl describe deployment docker-project
kubectl rollout undo deployment docker-project
kubectl rollout undo deployment docker-project --to-revision=1
kubectl delete deployment docker-project