雄安智能网站建设方案/竞价推广方案
K8S之控制器详解#
简介#
在kubernetes中,按照Pod的创建方式可以将其分为两类:
自主式:kubernetes直接创建出来的Pod,这种Pod删除后就没有了,也不会重建。
控制器创建pod:通过Pod控制器创建的Pod,这种Pod删除之后还会自动重建。
Pod控制器是管理Pod的中间层,使用了Pod控制器之后,我们只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它就会创建出满足条件的Pod并确保每一个Pod处于用户期望的状态,如果Pod在运行中出现故障,控制器会基于指定的策略重启或重新创建pod
控制器种类#
在kubernetes中,有很多类型的Pod控制器,每种都有自己的适合的场景,常见的有下面这些:
ReplicationController:比较原始的Pod控制器,已经被废弃,由ReplicaSet替代。
ReplicaSet:保证指定数量的Pod运行,并支持Pod数量变更,镜像版本变更。
Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、版本回退。
Horizontal Pod Autoscaler:以根据集群负载自动调整Pod的数量,实现削峰填谷。
DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务。
Job:它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务。
CronJob:它创建的Pod会周期性的执行,用于执行周期性的任务。
StatefulSet:管理有状态的应用。
ReplicatSet#
简介#
ReplicaSet的主要作用是保证一定数量的Pod能够正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对Pod数量的扩缩容和版本镜像的升级。

资源清单文件#
CopyapiVersion:apps/v1# 版本号 kind:ReplicaSet# 类型 metadata:# 元数据 name:# rs名称namespace:# 所属命名空间 labels:#标签 controller:rsspec:# 详情描述 replicas:3# 副本数量 selector:# 选择器,通过它指定该控制器管理哪些pomatchLabels:# Labels匹配规则 app:nginx-podmatchExpressions:# Expressions匹配规则 - {key:app, operator:In, values: [nginx-pod]}
template:# 模板,当副本数量不足时,会根据下面的模板创建pod副本 metadata:labels:app:nginx-podspec:containers:-name:nginximage:nginx:1.17.1ports:-containerPort:80
在这里,需要新了解的配置项就是spec下面几个选项:
replicas:指定副本数量,其实就是当然rs创建出来的Pod的数量,默认为1.
selector:选择器,它的作用是建立Pod控制器和Pod之间的关联关系,采用了Label Selector机制(在Pod模块上定Label,在控制器上定义选择器,就可以表明当前控制器能管理哪些Pod了)。
template:模板,就是当前控制器创建Pod所使用的模板,里面其实就是前面学过的Pod的定
创建ReplicaSet#
Copycat > pc-replicaset.yaml << EOF
apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 类型
metadata: # 元数据name: pc-replicaset # rs名称namespace: dev # 命名类型
spec: # 详细描述replicas: 3# 副本数量selector: # 选择器,通过它指定该控制器可以管理哪些PodmatchLabels: # Labels匹配规则app: nginx-podtemplate: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本metadata:labels:app: nginx-podspec:containers:- name: nginx # 容器名称image: nginx:1.17.1# 容器需要的镜像地址ports:- containerPort: 80# 容器所监听的端口
EOF# 创建rs
[root@master k8s]# kubectl create -f pc-replicaset.yaml # 查看rs
[root@master k8s]# kubectl get -n dev rs pc-replicaset -o wide

扩缩容#
Copy# 编辑rs的副本数量,修改spec:replicas:6即可。
[root@master k8s]# kubectl edit -n dev rs pc-replicaset [root@master k8s]# kubectl get -n dev pod

Copy# --replicas=3指定pod数量
[root@master k8s]# kubectl scale -n dev rs pc-replicaset --replicas=3[root@master k8s]# kubectl get -n dev pod

镜像升级#
Copy# 编辑rs的容器镜像,修改spec:containers:image为nginx:1.17.2即可
[root@master k8s]# kubectl edit -n dev rs pc-replicaset [root@master k8s]# kubectl get -n dev rs -o wide

Copy# kubectl set image rs rs名称 容器名称=镜像版本 -n 命名空间
[root@master k8s]# kubectl set image -n dev rs pc-replicaset nginx=nginx:1.17.1[root@master k8s]# kubectl get -n dev rs -o wide

删除ReplicaSet#
Copy# 在kubernetes删除ReplicaSet前,会将ReplicaSet的replicas调整为0,等到所有的Pod被删除后,再执行ReplicaSet对象的删除
[root@master k8s]# kubectl delete rs pc-replicaset -n dev[root@master k8s]# kubectl get rs,pod -n dev

Copy# 如果希望仅仅删除ReplicaSet对象(保留Pod),只需要在使用kubectl delete rs命令的时候添加--cascade=false选项(不推荐)
kubectl delete rs pc-replicaset -n dev --cascade=false
Deployment#
简介#
为了更好的解决服务编排的问题,kubernetes在v1.2版本开始,引入了Deployment控制器。值得一提的是,Deployment控制器并不直接管理Pod,而是通过管理ReplicaSet来间接管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment的功能比ReplicaSet强大。

Deployment的主要功能如下:
支持ReplicaSet的所有功能。
支持发布的停止、继续。
支持版本滚动更新和版本回退。
Deployment资源清单#
CopyapiVersion:apps/v1# 版本号 kind:Deployment# 类型 metadata:# 元数据 name:# rs名称 namespace:# 所属命名空间 labels:#标签 controller:deployspec:# 详情描述 replicas:3# 副本数量 revisionHistoryLimit:3# 保留历史版本,默认为10 paused:false# 暂停部署,默认是false progressDeadlineSeconds:600# 部署超时时间(s),默认是600 strategy:# 策略 type:RollingUpdate# 滚动更新策略 rollingUpdate:# 滚动更新 maxSurge:30%# 最大额外可以存在的副本数,可以为百分比,也可以为整数 maxUnavailable: 30% # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数 selector:# 选择器,通过它指定该控制器管理哪些pod matchLabels:# Labels匹配规则 app:nginx-podmatchExpressions:# Expressions匹配规则 - {key:app, operator:In, values: [nginx-pod]} template:# 模板,当副本数量不足时,会根据下面的模板创建pod副本 metadata:labels:app:nginx-podspec:containers:-name:nginximage:nginx:1.17.1ports:-containerPort:80
创建Deployment#
Copycat > pc-deployment.yaml << EOF
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据name: pc-deployment # deployment的名称namespace: dev # 命名类型
spec: # 详细描述replicas: 3# 副本数量selector: # 选择器,通过它指定该控制器可以管理哪些PodmatchLabels: # Labels匹配规则app: nginx-podtemplate: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本metadata:labels:app: nginx-podspec:containers:- name: nginx # 容器名称image: nginx:1.17.1# 容器需要的镜像地址ports:- containerPort: 80# 容器所监听的端口
EOF
# 创建Deploy
[root@master k8s]# kubectl create -f pc-deployment.yaml# 查看
[root@master k8s]# kubectl get -n dev deployments pc-deployment -o wide

扩缩容#
Copy# 编辑Deployment的副本数量,修改spec:replicas:6即可
[root@master k8s]# kubectl edit -n dev deployments pc-deployment [root@master k8s]# kubectl get pod -n dev

Copy# 使用命令进行修改
[root@master k8s]# kubectl scale -n dev deployment pc-deployment --replicas=3[root@master k8s]# kubectl get pod -n dev

镜像更新#
Deployment支持两种镜像更新的策略:重建更新和滚动更新(默认),可以通过strategy选项进行配置。
Copystrategy: 指定新的Pod替代旧的Pod的策略,支持两个属性type: 指定策略类型,支持两种策略Recreate:在创建出新的Pod之前会先杀掉所有已经存在的PodRollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的PodrollingUpdate:当type为RollingUpdate的时候生效,用于为rollingUpdate设置参数,支持两个属性:maxUnavailable:用来指定在升级过程中不可用的Pod的最大数量,默认为25%。maxSurge: 用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%。
重建更新
Copycat > pc-deployment.yaml << EOF
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据name: pc-deployment # deployment的名称namespace: dev # 命名类型
spec: # 详细描述replicas: 3# 副本数量strategy: # 镜像更新策略type: Recreate # Recreate:在创建出新的Pod之前会先杀掉所有已经存在的Podselector: # 选择器,通过它指定该控制器可以管理哪些PodmatchLabels: # Labels匹配规则app: nginx-podtemplate: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本metadata:labels:app: nginx-podspec:containers:- name: nginx # 容器名称image: nginx:1.17.1# 容器需要的镜像地址ports:- containerPort: 80# 容器所监听的端口
EOF# 加载yaml配文件
[root@master k8s]# kubectl apply -f pc-deployment.yaml# 版本更换
[root@master k8s]# kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev# 另起终端查看pod
[root@master k8s]# kubectl get pod -n dev -w

滚动更新
Copycat > pc-deployment.yaml << EOF
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据name: pc-deployment # deployment的名称namespace: dev # 命名类型
spec: # 详细描述replicas: 3# 副本数量strategy: # 镜像更新策略type: RollingUpdate # RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的PodrollingUpdate:maxUnavailable: 25%maxSurge: 25%selector: # 选择器,通过它指定该控制器可以管理哪些PodmatchLabels: # Labels匹配规则app: nginx-podtemplate: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本metadata:labels:app: nginx-podspec:containers:- name: nginx # 容器名称image: nginx:1.17.1# 容器需要的镜像地址ports:- containerPort: 80# 容器所监听的端口
EOF# 重新加载
[root@master k8s]# kubectl apply -f pc-deployment.yaml# 镜像升级
[root@master k8s]# kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev# 另起终端查看pod
[root@master k8s]# kubectl get pod -n dev -w

Copy# 查看rs,发现原来的rs依旧存在,只是Pod的数量变为0,而后又产生了一个rs,Pod的数量变为3# 其实这就是deployment能够进行版本回退的奥妙所在
[root@master k8s]# kubectl get rs -n dev

版本回退#
Deployment支持版本升级过程中的暂停、继续功能以及版本回退等诸多功能,下面具体来看:
Copy# 查看升级状态
[root@master k8s]# kubectl rollout status deployment pc-deployment -n dev

Copy# 查看升级历史记录
[root@master k8s]# kubectl rollout history deployment pc-deployment -n dev

Copy# 可以使用-to-revision=1回退到1版本,如果省略这个选项,就是回退到上个版本,即3版本
[root@master k8s]# kubectl rollout undo deployment pc-deployment --to-revision=3 -n dev

deployment之所以能够实现版本的回退,就是通过记录下历史的ReplicaSet来实现的,一旦想回滚到那个版本,只需要将当前版本的Pod数量降为0,然后将回退版本的Pod提升为目标数量即可。
金丝雀发布#
Deployment支持更新过程中的控制,如暂停更新操作(pause)或继续更新操作(resume)。
例如有一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求到新版本的Pod应用,继续观察能够稳定的按照期望的方式运行,如果没有问题之后再继续完成余下的Pod资源的滚动更新,否则立即回滚操作。
Copy[root@master k8s]# kubectl set image deployment pc-deployment nginx=nginx:1.17.4 -n dev && kubectl rollout pause deployment pc-deployment -n dev

Copy# 另起终端查看状态
[root@master k8s]# kubectl rollout status deployment pc-deployment -n dev

Copy# 查看rs# 监控更新的过程,可以看到已经新增了一个资源,但是并没有按照预期的状态去删除一个旧的资源,因为使用了pause暂停命令
[root@master k8s]# kubectl get -n dev rs

Copy# 查看pod
[root@master k8s]# kubectl get -n dev pod

Copy# 继续更新
[root@master k8s]# kubectl rollout resume deployment pc-deployment -n dev# 查看
[root@master k8s]# kubectl get -n dev rs,pod -o wide

### Horizontal Pod Autoscaler
简介#
我们已经可以通过手动执行kubectl scale命令实现Pod的扩缩容,但是这显然不符合kubernetes的定位目标–自动化和智能化。kubernetes期望可以通过监测Pod的使用情况,实现Pod数量的自动调整,于是就产生了HPA这种控制器。
HPA可以获取每个Pod的利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA和之前的Deployment一样,也属于一种kubernetes资源对象,它通过追踪分析目标Pod的负载变化情况,来确定是否需要针对性的调整目标Pod的副本数。

安装metrics-server#
Copy# 下载
wget https://github.com/kubernetes-sigs/metrics-server/archive/v0.3.6.tar.gz# 解压
tar -zxvf v0.3.6.tar.gz# 切换目录
cd metrics-server-0.3.6/deploy/1.8+/# 备份配置文件
cp metrics-server-deployment.yaml metrics-server-deployment.bak.yaml# 修改配置文件
vim metrics-server-deployment.yaml
# 按图中添加下面选项
hostNetwork: true
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
args:- --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

Copy# 安装metrics-server
kubectl apply -f ./# 查看metrics-server生成的Pod
[root@master 1.8+]# kubectl get pod -n kube-system

Copy# 查看资源使用情况
[root@master 1.8+]# kubectl top node

Copy[root@master 1.8+]# kubectl top pod -n kube-system

配置Deployment控制器#
Copycat > nginx.yaml << EOF
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据name: nginx # deployment的名称namespace: dev # 命名类型
spec: # 详细描述selector: # 选择器,通过它指定该控制器可以管理哪些PodmatchLabels: # Labels匹配规则app: nginx-podtemplate: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本metadata:labels:app: nginx-podspec:containers:- name: nginx # 容器名称image: nginx:1.17.1# 容器需要的镜像地址ports:- containerPort: 80# 容器所监听的端口resources: # 资源限制requests:cpu: "100m"# 100m表示100millicpu,即0.1个CPU
EOF# 创建控制器
[root@master k8s]# kubectl create -f nginx.yaml# 查看
[root@master k8s]# kubectl get pods,deploy -o wide -n dev

创建service#
Copy# 创建service
[root@master k8s]# kubectl expose deployment nginx --name=nginx --type=NodePort --port=80 --target-port=80 -n dev[root@master k8s]# kubectl get svc -n dev -o wide

部署HPA#
Copycat > pc-hpa.yaml << EOF
apiVersion: autoscaling/v1 # 版本号
kind: HorizontalPodAutoscaler # 类型
metadata: # 元数据name: pc-hpa # deployment的名称namespace: dev # 命名类型
spec:minReplicas: 1# 最小Pod数量maxReplicas: 10# 最大Pod数量targetCPUUtilizationPercentage: 3# CPU使用率指标scaleTargetRef: # 指定要控制的Nginx的信息apiVersion: apps/v1kind: Deploymentname: nginx
EOF# 创建
[root@master k8s]# kubectl create -f pc-hpa.yaml[root@master k8s]# kubectl get hpa -n dev

压力测试#
Copy# 另起终端动态查询deploy
[root@master k8s]# kubectl get deployment -n dev -w

Copy# 另起终端查询pod
[root@master k8s]# kubectl get pod -n dev -w

Copy# 另起终端查询hpa
[root@master k8s]# kubectl get -n dev hpa -w
Copy# ab进行压力测试
ab -n 1000 -c 1000 http://10.1.1.2:31742/index.html

正常流量的hpa

正常流量pod

正常流量deployment

### DaemonSet
简介#
DaemonSet类型的控制器可以保证集群中的每一台(或指定)节点上都运行一个副本,一般适用于日志收集、节点监控等场景。也就是说,如果一个Pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建
DaemonSet控制器的特点:
每向集群中添加一个节点的时候,指定的Pod副本也将添加到该节点上。
当节点从集群中移除的时候,Pod也会被垃圾回收。
资源清单#
CopyapiVersion:apps/v1# 版本号kind:DaemonSet# 类型metadata:# 元数据name:# 名称namespace:#命名空间labels:#标签controller:daemonsetspec:# 详情描述revisionHistoryLimit:3# 保留历史版本updateStrategy:# 更新策略type:RollingUpdate# 滚动更新策略rollingUpdate:# 滚动更新maxUnavailable:1# 最大不可用状态的Pod的最大值,可用为百分比,也可以为整数selector:# 选择器,通过它指定该控制器管理那些PodmatchLabels:# Labels匹配规则app:nginx-podmatchExpressions:# Expressions匹配规则-key:appoperator:Invalues:-nginx-podtemplate:# 模板,当副本数量不足时,会根据下面的模板创建Pod模板metadata:labels:app:nginx-podspec:containers:-name:nginximage:nginx:1.17.1ports:-containerPort:80
创建DaemonSet#
Copycat > pc-daemonset.yaml << EOF
apiVersion: apps/v1 # 版本号
kind: DaemonSet # 类型
metadata: # 元数据name: pc-damonset # 名称namespace: dev #命名空间
spec: # 详情描述selector: # 选择器,通过它指定该控制器管理那些PodmatchLabels: # Labels匹配规则app: nginx-podtemplate: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80
EOF# 创建DS
[root@master k8s]# kubectl create -f pc-daemonset.yaml [root@master k8s]# kubectl get -n dev ds -o wide

在笔者心里安装DaemonSet如果没有配置Node-Selector应该会在所有的节点都会生成DaemonSet控制器,但是在此处我只有node2节点生成控制器,而node1节点没有生成,但是笔者所有node节点都是处于正常状态,至于为什么产生这样的原因没有排查成功,如果有大佬看到该文章麻烦告知一下排查思路,另外笔者只是一个本科生如果有错误的地方也请大家不要喷。
Job#
概述#
Job可以保证指定数量的pod批量完成一次性的任务
job创建的Pod成功结束的时候,job会记录pod的数量
当记录的pod达到一定数量的时候,job执行完成
资源清单#
CopyapiVersion:batch/v1# 版本号kind:Job# 类型metadata:# 元数据name:# 名称namespace:#命名空间labels:# 标签controller:jobspec:# 详情描述completions:1# 指定Job需要成功运行Pod的总数量,默认为1 parallelism:1# 指定Job在任一时刻应该并发运行Pod的数量,默认为1activeDeadlineSeconds:30# 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止backoffLimit:6# 指定Job失败后进行重试的次数,默认为6manualSelector:true# 是否可以使用selector选择器选择Pod,默认为falseselector:# 选择器,通过它指定该控制器管理那些PodmatchLabels:# Labels匹配规则app:counter-podmatchExpressions:# Expressions匹配规则-key:appoperator:Invalues:-counter-podtemplate:# 模板,当副本数量不足时,会根据下面的模板创建Pod模板metadata:labels:app:counter-podspec:restartPolicy:Never# 重启策略只能设置为Never或OnFailurecontainers:-name:counterimage:busybox:1.30command: ["/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 20;done"]
创建job#
Copycat > pc-job.yaml << EOF
apiVersion: batch/v1
kind: Job
metadata:name: namenamespace: dev
spec:# 是否使用标签选择器manualSelector: trueselector:matchLabels:app: counter-pod# pod模板template:metadata:labels:app: counter-podspec:# 配置容器containers:- name: counterimage: busybox:1.30command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 3;done" ]# 由于是一次性任务因此不需要重启restartPolicy: NeverEOF# 创建
[root@master k8s]# kubectl create -f pc-job.yaml # 查看
[root@master k8s]# kubectl get pod -n dev -w

Copy# 查看job
[root@master k8s]# kubectl get job -n dev -w

### Cronjob
概述#
CronJob控制器以Job控制器为其管控对象,并借助它管理Pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似Linux操作系统的周期性任务作业计划的方式控制器运行时间点及重复运行的方式,换言之,CronJob可以在特定的时间点反复去执行Job任务。

资源清单#
CopyapiVersion:batch/v1beta1# 版本号kind:CronJob# 类型metadata:# 元数据name:# 名称namespace:#命名空间labels:controller:cronjobspec:# 详情描述schedule:# cron格式的作业调度运行时间点,用于控制任务任务时间执行concurrencyPolicy:# 并发执行策略failedJobsHistoryLimit:# 为失败的任务执行保留的历史记录数,默认为1successfulJobsHistoryLimit:# 为成功的任务执行保留的历史记录数,默认为3jobTemplate:# job控制器模板,用于为cronjob控制器生成job对象,下面其实就是job的定义metadata: {}spec:completions:1# 指定Job需要成功运行Pod的总次数,默认为1parallelism:1# 指定Job在任一时刻应该并发运行Pod的数量,默认为1activeDeadlineSeconds:30# 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止backoffLimit:6# 指定Job失败后进行重试的次数,默认为6template:# 模板,当副本数量不足时,会根据下面的模板创建Pod模板spec:
concurrencyPolicy:并发执行策略
Allow:运行job并发执行(默认)
Forbid:禁止并发执行,如果上次任务没有执行完毕会跳过下一次任务
Replace:新的任务代替旧的任务
创建Cronjob#
Copy# 创建cronjob
cat > pc-cronjob.yaml << EOF
apiVersion: batch/v1beta1 # 版本号
kind: CronJob # 类型
metadata: # 元数据name: pc-cronjob # 名称namespace: dev #命名空间
spec: # 详情描述schedule: "*/1 * * * * "# cron格式的作业调度运行时间点,用于控制任务任务时间执行jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象,下面其实就是job的定义metadata: {}spec:template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板spec:restartPolicy: Never # 重启策略只能设置为Never或OnFailurecontainers:- name: counterimage: busybox:1.30command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 2;done" ]
EOF
[root@master k8s]# kubectl create -f pc-cronjob.yaml [root@master k8s]# kubectl get -n dev cj -o wide

Copy# 另起终端查看cronjob
[root@master k8s]# kubectl get cronjob -n dev -w

Copy# 另起终端查看job
[root@master k8s]# kubectl get job -n dev -w

Copy# 另起终端查看pod
[root@master k8s]# kubectl get pod -n dev -w

### StatefulSet
概述#
无状态应用
认为pod都是一样的
随意进行伸缩扩展
不用考虑在那个node运行
没有顺序要求
有状态应用
有顺序要求
pod是独立不一样的,保证pod启动顺序和唯一性
需要考虑在哪个pod进行运行
需要安装顺序进行伸缩和扩展
StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器。
StatefulSet部署需要HeadLinessService(无头服务)
使用HeadLinessService(无头服务)
在使用Deployment的时候,每一个Pod名称是没有顺序的,是通过随机字符串拼凑而成的,因此此时的pod是无顺序的,但是在StatefulSet中要求pod是有序的每一个pod不能被随意取代,pod重建后pod名称保持不变
Pod的P是变化的,所以是以pod名称来识别,pod名称是pod唯一识别码,无头服务可以给每一个pod一个唯一的名称
创建StatefulSet#
Copycat > pc-stateful.yaml << EOF
apiVersion: v1
kind: Service
metadata:name: service-headlinessnamespace: dev
spec:selector:app: nginx-podclusterIP: None# 将clusterIP设置为None,即可创建headliness Servicetype: ClusterIPports:- port: 80# Service的端口targetPort: 80# Pod的端口
---apiVersion: apps/v1
kind: StatefulSet
metadata:name: pc-statefulsetnamespace: dev
spec:replicas: 3serviceName: service-headlinessselector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80
EOF[root@master k8s]# kubectl create -f pc-stateful.yaml [root@master k8s]# kubectl get statefulset pc-statefulset -n dev -o wide

Copy# 查看pod
[root@master k8s]# kubectl get pod -n dev -o wide

Deployment和StatefulSet的区别#
Deployment和StatefulSet的区别:Deployment没有唯一标识而StatefulSet有唯一标识。
StatefulSet的唯一标识是根据主机名+一定规则生成的。
StatefulSet的唯一标识是主机名.无头Service名称.命名空间.svc.cluster.local
StatefulSet的金丝雀发布#
CopyupdateStrategy:rollingUpdate: # 如果更新的策略是OnDelete,那么rollingUpdate就失效partition: 2 # 表示从第2个分区开始更新,默认是0type: RollingUpdate /OnDelete # 滚动更新
StatefulSet支持两种更新策略:OnDelete和RollingUpdate(默认),其中OnDelete表示删除之后才更新,RollingUpdate表示滚动更新
Copycat > pc-statefulset.yaml << EOF
apiVersion: v1
kind: Service
metadata:name: service-headlinessnamespace: dev
spec:selector:app: nginx-podclusterIP: None# 将clusterIP设置为None,即可创建headliness Servicetype: ClusterIPports:- port: 80# Service的端口targetPort: 80# Pod的端口
---apiVersion: apps/v1
kind: StatefulSet
metadata:name: pc-statefulsetnamespace: dev
spec:replicas: 3serviceName: service-headlinessselector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80updateStrategy:rollingUpdate:partition: 0type: RollingUpdate
EOF[root@master k8s]# kubectl apply -f pc-stateful.yaml # 修改镜像
[root@master k8s]# kubectl set image -n dev statefulset pc-statefulset nginx=nginx:1.17.2

相关文章:

Pod控制器
K8S之控制器详解#简介#在kubernetes中,按照Pod的创建方式可以将其分为两类:自主式:kubernetes直接创建出来的Pod,这种Pod删除后就没有了,也不会重建。控制器创建pod:通过Pod控制器创建的Pod,这种Pod删除之后还会自动重…...

微服务到云原生
微服务到云原生 微服务 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各…...

Spring Security 实现自定义登录和认证(1):使用自定义的用户进行认证
1 SpringSecurity 1.1 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>1.2 编写配置类 在spring最新版中禁用了WebSecurityConfigurerAdapter…...

Spring Cloud(微服务)学习篇(七)
Spring Cloud(微服务)学习篇(七) 1.使用代码的方式实现流量限制规则 1.1 变更SentinelController类 1.1.1 加入的代码 //流控限制 (一个或多个资源限流), postConstruct注解的作用是保证项目一启动就会加载,// 一个rule就是一个规则PostConstructpublic void FlowRule(){Li…...

嵌入式安防监控项目——前期知识复习
目录 一、概述 二、C语言 三、数据结构 四、IO进程 五、网络 六、ARM体系结构和接口技术 七、系统移植 八、内核驱动 一、概述 我再报班之前学过51和32,不过都是自学的。报班开始先从应用层入手的,C语言和数据结构。只要是个IT专业的大学这都是必…...

SpringAOP——基础知识
AOP AOP全称是Aspect Oriented Programming 即面向切面编程,是对一类统一事务的集中处理 例如,我们的网页许多地方都需要进行登陆验证,这时就需要在很多地方添加重复的验证代码,而AOP可以集中配置需要登陆验证的地方,…...

kafka3.0安装使用
一:定义 Kafka传 统定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 Kafka最 新定义 : Kafka是 一个开源的 分 布式事件流平台 (Event St…...

Centos7(阿里云)_安装Mysql8.0
1.安装MySQL 新人可以试用一个月的阿里云,centos7的 一开始可能确实会自带mariadb,所以可以在网上随便找个教程开始尝试安装MySQL,当然大概率出错,然后此时你的rpm下面已经有了一个版本的mysql安装包。 以我为例,随便…...

【Java】JVM
一、介绍 1.什么是JVM? JVM是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。JVM包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。JVM屏…...

Linux 和数据库笔记-06
今日内容介绍全天内容无需立马掌握MySQL 的高级功能应用数据库设计ER模型定义: E 代表实体(数据表), R 代表联系(数据表之间对应的字段)关系常见分类一对一一对多多对多外键如果…...

MySQL面试题-事务篇
1.事务的特性(ACID) 事务(Transaction)是指一组操作被看作是一个不可分割的工作单元,这组操作要么全部执行成功,要么全部执行失败。事务的特性通常用 ACID 四个单词来描述,它们分别代表原子性&…...

Linux嵌入式开发 | 汇编驱动LED(1)
文章目录🚗 🚗Linux嵌入式开发 | 汇编驱动LED(1)🚗 🚗初始化IO🚗 🚗STM32🚗 🚗使能GPIO时钟🚗 🚗设置IO复用🚗 Ƕ…...

什么是EventLoop?怎么测试Node或页面的性能
Event Loop 机制大家应该都有了解。本文利用 EventLoop 去做一个有趣的检测node或页面性能的代码,顺便介绍了一下EventLoop,希望对大家有所帮助! Event Loop Event Loop 机制大家应该都有了解。我先重复总结一下。 Node.js 和 Javascript 的…...

1018 锤子剪刀布 1025 反转链表
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。 输入格式: 输入第 1 行给出正整数 N(≤10 5 ),即双方交锋的次数。随后 N 行,每行给出一次交锋的信…...

卷积神经网络的原理及实现
专栏:神经网络复现目录 卷积神经网络 本章介绍的卷积神经网络(convolutional neural network,CNN)是一类强大的、为处理图像数据而设计的神经网络。 基于卷积神经网络架构的模型在计算机视觉领域中已经占主导地位,当今…...

【C++知识点】重载
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…...

apscheduler三种定时触发方式
#第一种# date: 特定的时间点触发# 2019-01-01 00:00:00 准时执行# import time # from apscheduler.schedulers.blocking import BlockingScheduler # # def my_job(): # print(time.strftime(%Y-%m-%d %H:%M:%S, time.localtime(time.time()))) # sched BlockingSchedu…...

802.11 service服务类型
802.11 serviceservice定义service分类按照模块分为两类按照功能分为六类数据传输相关服务分布式服务DS(Distribution Service)整合服务IS(Integration Service)关联(association)重关联(reasso…...

pytest测试框架——allure报告
文章目录一、allure的介绍二、allure的运行方式三、allure报告的生成方式一、在线报告、会直接打开默认浏览器展示当前报告方式二、静态资源文件报告(带index.html、css、js等文件),需要将报告布置到web服务器上。四、allure中装饰器1、实现给…...

SQLI-Labs(3)8-14关【布尔盲注和时间盲注】
目录 第八关 第九关: 第十关 第十一关 第十二关 第十三关 第十四关 第八关 我们用测试语句来测试是否为注入点 从上图中得知存在注入点,那么接下来就是爆列 一共有三列,接下来用union select 和报错注入都试一下发现没有回显点&…...

ESP32学习笔记03-日志打印
ESP32日志 日志分为5个等级 ESP_LOGE - error (lowest)ESP_LOGW - warningESP_LOGI - infoESP_LOGD - debugESP_LOGV - verbose (highest)API 0.头文件 #include "esp_log.h"1.给一个日志标签设置等级...

mongoTemplate非string类型模糊查询
需求 为方便使用人员对任务Task的搜索,需要根据number实现模糊搜索。 背景 之前设计的number是long类型,但是mongodb只支持string类型的正则匹配。 方案 修改number为string类型;新增一个冗余字段,用于模糊查询;在…...

Redis是单线程还是多线程?Redis的10种数据类型,有哪些应用场景?
目录专栏导读一、同样是缓存,用map不行吗?二、Redis为什么是单线程的?三、Redis真的是单线程的吗?四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…...

到底什么才是幻读?
💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…...

RPC重试机制和控制方案
重试机制 因为网络抖动等原因导致 RPC 调用失败,这时候使用重试机制可以提高请求的最终成功率,减少故障影响,让系统运行更稳定。 重试简易实现方案 在重试的过程中,为了能够在约定的时间内进行安全可靠地重试,在每次…...

【无标题】动态给结构体赋值
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int id; char name[20]; double score; } Student; int main() { Student *p (Student *)malloc(sizeof(Student)); if (p NULL) { printf(“Memory allocation failed.”…...

centos7 soft raid每周自动同步的问题
之前redhat老版本时也遇到过这样的问题https://blog.csdn.net/jolly10/article/details/108768360centos7解决的办法略有不同,记录一下:centos7默认是每周日凌晨1点进行raid检查,有点太频繁了[oracleqht117 data]$ ls /etc/cron*/etc/cron.de…...

嵌入式Linux内核代码风格
这是一个简短的文档,描述了linux内核的首选代码风格。代码风格是因人而异的,而且我 不愿意把我的观点强加给任何人,不过这里所讲述的是我必须要维护的代码所遵守的风格, 并且我也希望绝大多数其他代码也能遵守这个风格。请在写代码…...

Andorid:关于Binder几个面试问题
1.简单介绍下binderbinder是一种进程间通讯的机制进程间通讯需要了解用户空间和内核空间每个进程拥有自己的独立虚拟机,系统为他们分配的地址空间都是互相隔离的。如两个进程需要进行通讯,则需要使用到内核空间做载体,内核空间是所有进程共享…...

【剑指Offer-Java】包含min函数的栈?
题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 MinStack minStack new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min()…...