kubernetes(k8s)从入门到精通--pod控制器-第一章-第五节【入门篇】
一、pod控制器概要Pod控制器是什么呢?简单的来说Pod控制器就是用来管理pod的。大量部署过docker的同学,有一点会感同身受,难针对、难管理而,今天我们学习的核心组件pod就可以解决这个问题。官方点来说Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。那么pod控制器包含哪...
一、pod控制器概要
Pod控制器是什么呢?简单的来说Pod控制器就是用来管理pod的。大量部署过docker的同学,有一点会感同身受,难针对、难管理而,今天我们学习的核心组件pod就可以解决这个问题。官方点来说Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。那么pod控制器包含哪些呢?如下|:
- ReplicationController:1.2以前的老版本管理工具,后续会被Replicaset取代,这里我们就了解一下,有这样一个东西即可。
- Replicaset:用作pod 创建、删除和更新,ReplicaSet能确保运行指定数量的pod ,通过label selector来确定pod数量是否满足用户指定的副本数量。(管理副本)
- Deployment:将 Pod 和ReplicaSet 的实际状态改变到用户的目标状态。支持扩容、回滚、更新等功能;管理无状态应用最好的控制器;守护进程类(作用于replicaset上,支持回滚等操作)
- Daemonset:确保每个节点上运行一个Pod副本。无状态服务;守护进程类
- Job: 执行一次性运行任务。不需要持续运行
- Cronjob: 周期性运行任务。不需要持续运行
- StatefulSet: 管理有状态应用,每一个应用都被单独管理。管理比较麻烦
二、Replicaset
replicaset用作pod 创建、删除和更新,ReplicaSet能确保运行指定数量的pod ,通过label selector来确定pod数量是否满足用户指定的副本数量。(管理副本)
那么它是如何定义的呢?请参考下文yaml文件。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rsdemo
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: rsdemo
release: can
template:
metadata:
name: rsdemo1
labels:
app: rsdemo
release: can
spec:
containers:
- name: resdemocontainers
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
三、Deployment(重点)
Pod 和ReplicaSet 的实际状态改变到用户的目标状态。支持扩容、回滚、更新等功能;管理无状态应用最好的控制器;守护进程类(作用于replicaset上,支持回滚等操作),定义的yaml文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploymentdemo
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
version: v1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
版本更新和回滚
版本更新修策略改:(少用)
如果您要选择更新策略,如您希望更新时 不停止原容器,可以修改maxUnavailable参数为0,具体如何使用可在master节点上执如下命令,查看解释:
kubectl explain deployment.spec.strategy.rollingUpdate
查看回滚版本:
kubectl rollout history deploy myapp-deploy
回滚到上一个版本:
kubectl rollout undo deployment/nginx-test
kubectl rollout undo deployment myapp
也可以使用 --revision参数指定某个历史版本:
kubectl rollout undo deployment/nginx-test --to-revision=2
kubectl rollout undo deployment myapp --to-revision=1
当您回滚到第一个版本时,再选择回滚一个版本 就会回滚到最后一个修改的版本。
资源更新
当您需要修改镜像时,最简单的方式是选择修改yaml文件,然后apply -f 重新加载文件,deployment会自动读取滚动升级。但如果您要通过脚本等方式来实现修改deployment,修改配置文件就不是明智的选择了,我们可以使用patch命令:
kubectl patch
语法
$ patch (-f FILENAME | TYPE NAME) -p PATCH
示例
使用patch更新Node节点。
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
更新容器的镜像
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
更新deployment
kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1, "maxUnavailable":0}}}}'
当然,如果只是修改容器的话 ,我们可以使用更简单的命令 set image
kubectl set image
更新现有的资源对象的容器镜像。
可使用资源对象包括(不区分大小写):
pod (po)、replicationcontroller (rc)、deployment (deploy)、daemonset (ds)、job、replicaset (rs)
语法
$ image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N
示例
将deployment中的nginx容器镜像设置为“nginx:1.9.1”。
kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
所有deployment和rc的nginx容器镜像更新为“nginx:1.9.1”
kubectl set image deployments,rc nginx=nginx:1.9.1 --all
将daemonset abc的所有容器镜像更新为“nginx:1.9.1”
kubectl set image daemonset abc *=nginx:1.9.1
从本地文件中更新nginx容器镜像
kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml
四、Daemonset
本部分参考:https://www.cnblogs.com/breezey/p/6582519.html
在有种场景下,我们需要在所有的kubernetes节点上都运行同一个应用的一个副本,比如在后续我们会说如何收集kubernetes中的pod日志,在收集日志的时候,需要在每个k8s node节点上运行一个收集日志的进程 ,如fluentd。我们知道在通常情况下,kubernetes基于它内部的调度算法来自动分配pod运行在哪个节点上,没有办法保证在每个node上运行一个fluentd pod。这个时候,daemonsets的调度方式就派上了用场。简单来说,daemonsets就是让一个应用在所有的k8s集群节点上都运行一个副本。
我们直接看下面的示例,在所有节点上都启动一个busybox:
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: busybox
spec:
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: myhub.mingyuanyun.com/library/busybox
command:
- sleep
- "3600"
我们通过kubectl get daemonset可以看到启动了6个busybox的pod,因为我们有6个kubernetes节点。而事实上,我们并没有指定复制的个数,这就是daemonsets的作用:
NAME DESIRED CURRENT READY NODE-SELECTOR AGE busybox 6 6 6 <none> 1m
您还可以参考:https://www.cnblogs.com/xzkzzz/p/9553321.html (启动一个redis配置一下filebeat)
此部分 后续还会更新,
更多推荐
所有评论(0)