Controller Manager 由 kube-controller-manager 和 cloud-controller-manager 组成, 是 Kubernetes 的大脑, 它通过 apiserver 监控整个集群的状态, 并确保集群处于预期的工作状态。
replication controller简称RC,是kubernetes系统中的核心概念之一,简单来说,它其实定义了一个期
望的场景,即声明某种pod的副本数量在任意时刻都复合某个预期值,所以RC的定义包含以下部分:
ReplicationController用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退 出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。
在新版本的Kubernetes中建议使用ReplicaSet来取代ReplicationController。ReplicaSet跟 ReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector。
虽然ReplicaSet可以独立使用,但一般还是建议使用 Deployment 来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling-update但Deployment支持)。
apiVersion: apps/v1
kind: ReplicaSet
#api版本定义 #定义资源类型为ReplicaSet
metadata: #元数据定义
name: myapp
namespace: default
spec: #ReplicaSet的规格定义
replicas: 2
selector:
#定义副本数量为2个 #标签选择器,定义匹配pod的标签
matchLabels:
app: myapp
release: canary #pod的模板定义
template:
metadata: #pod的元数据定义
name: myapp-pod #自定义pod的名称
labels: #定义pod的标签,需要和上面定义的标签一致,也可以多出其他标签
app: myapp
release: canary
environment: qa #pod的规格定义
spec:
containers: #容器定义
- name: myapp-container #容器名称
image: nginx:1.17.10-alpine #暴露端口
ports:
- name: http
containerPort: 80
可以通过kubectl命令行方式获取更加详细信息
kubectl explain rs
kubectl explain rs.spec
kubectl explain rs.spec.template.spec
运行ReplicaSet
运行ReplicaSet kubectl apply -f replicasetdemo.yml
查看rs控制器
kubectl get rs
查看pod信息
kubectl get pod
查看pod详细信息
kubectl describe pod replicasetdemo-7fdd7b5f67-5gzfg
测试controller控制器下的pod删除、重新被controller控制器拉起
kubectl delete pod --all
kubectl get pod
修改pod的副本数量:通过命令行方式
kubectl scale replicaset replicasetdemo --replicas=8
kubectl get rs
修改pod的副本数量:通过资源清单方式
kubectl edit replicasets.apps replicasetdemo
kubectl get rs
显示pod的标签
kubectl get pod --show-labels
修改pod标签(label)
kubectl label pod replicasetdemo-652lc app=xxx --overwrite=True
再次显示pod的标签:发现多了一个pod,原来的rs中又重新拉起一个pod,说明rs是通过label去管 理
pod kubectl get pod --show-labels
删除rs
kubectl delete rs replicasetdemo
最后,总结一下RC(ReplicaSet)的一些特性和作用:
Deployment是kubernetes在1.2版本中引入的新概念,用于更好的解决Pod的编排问题,为此,
Deployment在内部使用了ReplicaSet来实现目的,我们可以把Deployment理解为ReplicaSet的一次升级,两者的相似度超过90%
除了API生命与Kind类型有区别,Deployment的定义与Replica Set的定义很类似。
创建controller/deploymentdemo.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploymentdemo1
labels:
app: deploymentdemo1
spec:
replicas: 10
template:
metadata:
name: deploymentdemo1
labels:
app: deploymentdemo1
spec:
containers:
- name: deploymentdemo1
image: nginx:1.17.10-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
restartPolicy: Always
selector:
matchLabels:
app: deploymentdemo1
kubectl apply -f deploymentdemo.yml
查看
deployment kubectl get rs
查看rs:deployment名称+hashcode码组成
查看pod
kubectl get pod
命令行方式
升级nginx镜像版本为1.18.0
kubectl set image deployment deploymentdemo1 deploymentdemo1=nginx:1.18.0alpine
查看pod升级情况
kubectl get pods -w
进去某一个pod内部,查看nginx升级版本信息
kubectl exec -it deploymentdemo1-df6bc5d4c-flc7b
sh nginx -v
exit
yml文件方式
升级nginx镜像版本为1.19.2-alpine
kubectl edit deployments.apps deploymentdemo1
查看pod升级情况
kubectl get pods -w
进去某一个pod内部,查看nginx升级版本信息
kubectl exec -it deploymentdemo1-584f6b54dd-4l62t sh nginx -v
exit
命令行方式
kubectl scale deployment deploymentdemo1 --replicas=15
kubectl get pods
yml文件方式
kubectl edit deployments.apps deploymentdemo1
kubectl get pods
概述 微服务部署:蓝绿部署、滚动部署、灰度发布、金丝雀发布。
Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操 作。
比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用, 主体部分还是旧的版本。
然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳 定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布(Canary Release)
更新deployment的nginx:1.18.0-alpine版本,并配置暂停
deployment kubectl set image deployment deploymentdemo1 deploymentdemo1=nginx:1.18.0alpine && kubectl rollout pause deployment deploymentdemo1
观察更新状态
kubectl rollout status deployments deploymentdemo1
监控更新的过程,可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源,就是 因为使用了pause暂停命令
kubectl get pods -l app=deploymentdemo1 -w
确保更新的pod没问题了,继续更新
kubectl rollout resume deploy deploymentdemo1
查看最后的更新情况
kubectl get pods -l app=deploymentdemo1 -w
默认情况下,kubernetes 会在系统中保存前两次的 Deployment 的 rollout 历史记录,以便可以随 时回退(您可以修改revision history limit来更改保存的revision数)。
注意: 只要 Deployment 的 rollout 被触发就会创建一个 revision。也就是说当且仅当
Deployment 的 Pod template(如.spec.template)被更改,例如更新template 中的 label 和容器 镜像时,就会创建出一个新的 revision。其他的更新,比如扩容 Deployment 不会创建 revision
因此我们可以很方便的手动或者自动扩容。这意味着当您回退到历史 revision 时,只有 Deployment 中的 Pod template 部分才会回退。
history操作
kubectl rollout history deployment deploymentdemo1
status操作
kubectl rollout status deployment deploymentdemo1
回滚版本信息
kubectl rollout undo deployment deploymentdemo1
查看pod回滚情况
kubectl get pods -w
进去某一个pod内部,查看nginx回滚版本信息
kubectl exec -it deploymentdemo1-df6bc5d4c-flc7b sh
nginx -v
Deployment 可以保证在升级时只有一定数量的 Pod 是 down 的。默认的,它会确保至少有比期望的 Pod数量少
一个是up状态(最多一个不可用)
Deployment 同时也可以确保只创建出超过期望数量的一定数量的 Pod。
默认的,它会确保最多比期望 的Pod数 量多一个的 Pod 是 up 的(最多1个 surge )
Kuberentes 版本v1.17.5中,从1-1变成25%-25%
kubectl describe deployments.apps deploymentdemo1
查看到属性:
RollingUpdateStrategy: 25% max unavailable, 25% max surge
总结
Deployment为Pod和Replica Set(下一代Replication Controller)提供声明式更新。 只需要在 Deployment 中描述想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和 ReplicaSet 的实际状态改变到您的目标状态。
也可以定义一个全新的 Deployment 来创建 ReplicaSet或者删除已有的 Deployment 并创建一个新的来替换。
Replicas(副本数量):
.spec.replicas 是可以选字段,指定期望的pod数量,默认是1。
Selector(选择器):
.spec.selector是可选字段,用来指定 label selector ,圈定Deployment管理的pod范围。如果被指定, .spec.selector 必须匹配 .spec.template.metadata.labels,否则它将被API拒绝。
如果 .spec.selector 没有被指定, .spec.selector.matchLabels 默认是.spec.template.metadata.labels。 在Pod的template跟.spec.template不同或者数量超过了.spec.replicas规定的数量的情况下,Deployment会杀掉label跟selector不同的Pod。
Pod Template(Pod模板):
spec.template 是 .spec中唯一要求的字段。 .spec.template 是 pod template. 它跟 Pod有一模一样的schema,除了它是嵌套的并且不需要
apiVersion 和 kind字段。 另外为了划分Pod的范围,Deployment中的pod template必须指定适当的label(不要跟其他controller重复了,参考selector)和适当的重启策略。
.spec.template.spec.restartPolicy 可以设置为 Always , 如果不指定的话这就是默认配置。
strategy(更新策略):
.spec.strategy 指定新的Pod替换旧的Pod的策略。 .spec.strategy.type 可以是"Recreate"或者是"RollingUpdate"。
"RollingUpdate"是默认值。 Recreate: 重建式更新,就是删一个建一个。类似于ReplicaSet的更新方式,即首先删除现有的Pod对象,然后由控制器基于新模板重新创建新版本资源对象。
rollingUpdate:滚动更新,简单定义 更新期间pod最多有几个等。可以指定maxUnavailable和 maxSurge 来控制 rolling update 进程。扩容的同时进行缩容,设置最大数量
maxSurge:.spec.strategy.rollingUpdate.maxSurge 是可选配置项,用来指定可以超过期望的Pod数量的最大个数。该值可以是一个绝对值(例如5)或者是期望的Pod数量的百分比(例如10%)。当MaxUnavailable为0时该值不可以为0。通过百分比计算的绝对值向上取整。默认值是1。
例如,该值设置成30%,启动rolling update后新的ReplicatSet将会立即扩容,新老Pod的总数不 能超过期望的Pod数量的130%。旧的Pod被杀掉后,新的ReplicaSet将继续扩容,旧的ReplicaSet会进
一步缩容,确保在升级的所有时刻所有的Pod数量和不会超过期望Pod数量的130%。
DaemonSet 确保全部Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一 个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有Pod。
在每一个node节点上只调度一个Pod,因此无需指定replicas的个数,比如: 在每个node上都运行一个日志采集程序,负责收集node节点本身和node节点之上的各个Pod所产 生的日志在每个node上都运行一个性能监控程序,采集该node的运行性能数据
DaemonSet模板说明
可以通过kubectl命令行方式获取更加详细信息
kubectl explain daemonset
kubectl explain daemonset.spec
kubectl explain daemonset.spec.template.spec
部署DaemonSet
controller/daemonsetdemo.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: demonsetdemo
labels:
app: demonsetdemo
spec:
template:
metadata:
name: demonsetdemo
labels:
app: demonsetdemo
spec:
containers:
- name: demonsetdemo
image: nginx:1.17.10-alpine
imagePullPolicy: IfNotPresent
selector:
matchLabels:
app: demonsetdemo
运行DaemonSet
运行demonset kubectl
apply -f demonsetdemo.yml
查看pod详细信息:只有工作节点创建pod,master节点并不会创建。
kubectl get pod -o wide
DaemonSet有两种更新策略类型:
OnDelete:这是向后兼容性的默认更新策略。使用 OnDelete更新策略,在更新DaemonSet模板 后,只有在手动删除旧的DaemonSet pod时才会创建新的DaemonSet pod。这与Kubernetes 1.5或更早版本中DaemonSet的行为相同。
RollingUpdate:使用RollingUpdate更新策略,在更新DaemonSet模板后,旧的DaemonSet pod将被终止,并且将以受控方式自动创建新的DaemonSet pod。
一次性执行任务,类似Linux中的job 应用场景:如离线数据处理,视频解码等业务
使用镜像
docker pull perl:slim
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl:slim
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(6000)"]
restartPolicy: Never
backoffLimit: 4
backoffLimit: 设置job的容错次数,默认是6
运行Job
kubectl apply -f jobdemo.yml
查看pod日志
kubectl logs -f pi-7nrtv
删除job
kubectl delete -f jobdemo.yml
在kubernetes系统中,Pod的管理对象RC,Deployment,DaemonSet和Job都面向无状态的服务.
但现实中有很多服务时有状态的,比如一些集群服务,例如mysql集群,集群一般都会有这四个特点:
如果你通过RC或Deployment控制Pod副本数量来实现上述有状态的集群,就会发现第一点是无法满足 的,因为Pod名称和ip是随机产生的,并且各Pod中的共享存储中的数据不能都动.
因此StatefulSet在这种情况下就派上用场了,那么StatefulSet具有以下特性: