- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
我们前面讲了很多关于Pod的使用,但是在实际应用中,我们不会去直接创建Pod,我们一般通过Kubernetes提供的工作负载(Deployment、DeamonSet、StatefulSet、Job等)完成对一组Pod全生命周期的控制,本节开始我们来看看这些工作负载是如何使用的。
一、Deployments
Deployments可以自动部署一个容器应用的多个副本,监控其副本数量并始终维持这一数量。我们来创建一个Deployments看看:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3template:
metadata:
labels:
app: nginx
spec:
containers:
-name: nginx
image: nginx:latest
ports:
- containerPort: 80
我们的Deployment会创建并维持三个nginx副本,我们通过kubectl create创建此Deployment:
[root@kubevm1 workspace] kubectl create -f demo_deployment.yml
[root@kubevm1 workspace] kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 32m40s
[root@kubevm1 workspace] kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-585449566-b6v88 1/1 Running 02m4s
nginx-deployment-585449566-p4vb7 1/1 Running 02m4s
nginx-deployment-585449566-s95sr 1/1 Running 0 2m4s
我们看到三个nginx的Pod豆启动完毕了,当我们手动杀掉一个Pod,Deployment会自动将其恢复:
[root@kubevm1 workspace] kubectl delete pod nginx-deployment-585449566-b6v88
[root@kubevm1 workspace] kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-585449566-b6v88 0/1 Terminating 07m23s
nginx-deployment-585449566-nbrdm 0/1 ContainerCreating 06s
nginx-deployment-585449566-p4vb7 1/1 Running 07m23s
nginx-deployment-585449566-s95sr 1/1 Running 0 7m23s
我们前面说过Deployment是自动启动并调度Pod的,这三个Pod最终在哪些节点上运行,完全由master的Scheduler来控制,我们通过-o wide来看看这三个Pod都分布在哪里:
[root@kubevm1 workspace] kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-585449566-nbrdm 1/1 Running 0 3m12s 10.244.1.8 kubevm2 <none> <none>nginx-deployment-585449566-p4vb7 1/1 Running 0 10m 10.244.2.5 kubevm3 <none> <none>nginx-deployment-585449566-s95sr 1/1 Running 0 10m 10.244.1.7 kubevm2 <none> <none>
二、DaemonSet
DaemonSet是kubernetes 1.2新增的资源对象,它可以确保在每个Node上仅运行一份Pod的副本,DaemonSet可用于以下场景:
我们创建一个DaemonSet看看效果,我们还是以Nginx为例,下面的例子定义的Daemon将会为每个Node都启动一个Nginx容器:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
labels:
app: nginx
spec:
selector:
matchLabels:
name: nginx-daemonset
template:
metadata:
labels:
name: nginx-daemonset
spec:
containers:
-name: nginx
image: nginx:latest
ports:
- containerPort: 80
我们创建此DaemonSet看看:
[root@kubevm1 workspace] kubectl create -f demo_daemonset.yml
daemonset.apps/nginx-daemonset created
[root@kubevm1 workspace] kubectl get DaemonSet
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-daemonset 2 2 2 2 2 <none>11m
[root@kubevm1 workspace] kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-daemonset-49tcp 1/1 Running 0 14m 10.244.1.13 kubevm2 <none> <none>nginx-daemonset-w2xc2 1/1 Running 0 14m 10.244.2.11 kubevm3 <none> <none>
与Deployment不同的是,我们在yaml中没有指定replicas,但是DaemonSet自动为除Master节点外每一个Node都创建了一个副本,这里大家可能会问:为什么Master没有Pod副本呢?这个因为缺省状态下,DaemonSet只会在Node中创建副本,如果需要在Master中也启动Pod,则需要设置容忍度:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
labels:
app: nginx
spec:
selector:
matchLabels:
name: nginx-daemonset
template:
metadata:
labels:
name: nginx-daemonset
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
-name: nginx
image: nginx:latest
ports:
- containerPort: 80
我们重新创建DaemonSet,看看效果:
[root@kubevm1 workspace] kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-daemonset-45z95 1/1 Running 0 46s 10.244.2.13 kubevm3 <none> <none>nginx-daemonset-9z2lt 1/1 Running 0 46s 10.244.0.5 kubevm1 <none> <none>nginx-daemonset-cjf6k 1/1 Running 0 46s 10.244.1.15 kubevm2 <none> <none>
关于容忍度的内容我们后续会详细介绍。
三、Jobs
我们使用Jobs可以定义并启动一个批处理任务,处理完成后,整个批处理任务结束。下面我们创建一个Job,此Job会输出一段文本:
apiVersion: batch/v1
kind: Job
metadata:
name: echospec:
template:
spec:
containers:
- name: echoimage: busybox
command: ["sh", "-c", "echo this a job"]
restartPolicy: Never
我们创建Job看一下效果:
[root@kubevm1 workspace] kubectl get job
NAME COMPLETIONS DURATION AGE
echo 1/114s 7h3m
[root@kubevm1 workspace] kubectl get pods
NAME READY STATUS RESTARTS AGE
echo-c5kmf 0/1 Completed 07h3m
[root@kubevm1 workspace] kubectl logs echo-c5kmf
this a job
我们设置Job运行完毕后不会重启,所以最终其Pod状态为Complated。
上面的例子只是起了一个Pod比较简单,在实际应用中,我们往往会启动多个Pod并行处理任务,因此Job的使用有以下三种常见模式:
限于篇幅,关于Job的后两种模式,后面会有专门讲解。
四、CronJob
CronJob其实就是具有定时功能的Job,可以设置Job定时执行或者周期性执行,CronJob使用Cron表达式配置执行周期。我们修改下上面Job定义文件:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: echospec:
schedule: "*/1 * * * *"jobTemplate:
spec:
template:
spec:
containers:
- name: echoimage: busybox
command: ["sh", "-c", "echo this a job"]
restartPolicy: OnFailure
我们设置每一分钟执行一次,这里也能看出来,在Kubernetes中,CronJob最小调度间隔为分钟级。
[root@kubevm1 workspace] kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
echo */1 * * * * False 029s 4m48s
[root@kubevm1 workspace] kubectl get pods
NAME READY STATUS RESTARTS AGE
echo-1655768220-m5p9x 0/1 Completed 02m34s
echo-1655768280-m7gsj 0/1 Completed 093s
echo-1655768340-h2n6n 0/1 Completed 0 33s
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
var urlsearch = "http://192.168.10.113:8080/collective-intellegence/StoreClicks?userid=" + userId +
我有一个非常奇怪的问题,过去两天一直让我抓狂。 我有一个我试图控制的串行设备(LS 100 光度计)。使用设置了正确参数的终端(白蚁),我可以发送命令(“MES”),然后是定界符(CR LF),然后我
我目前正试图让无需注册的 COM 使用 Excel 作为客户端,使用 .NET dll 作为服务器。目前,我只是试图让概念验证工作,但遇到了麻烦。 显然,当我使用 Excel 时,我不能简单地使用与可
我开发了简单的 REST API - https://github.com/pavelpetrcz/MandaysFigu - 我的问题是在本地主机上,WildFly 16 服务器的应用程序运行正常。
我遇到了奇怪的情况 - 从 Django shell 创建一些 Mongoengine 对象是成功的,但是从 Django View 创建相同的对象看起来成功,但 MongoDB 中没有出现任何数据。
我是 flask 的新手,只编写了一个相当简单的网络应用程序——没有数据库,只是一个航类搜索 API 的前端。一切正常,但为了提高我的技能,我正在尝试使用应用程序工厂和蓝图重构我的代码。让它与 pus
我的谷歌分析 JavaScript 事件在开发者控制台中运行得很好。 但是当从外部 js 文件包含在页面上时,它们根本不起作用。由于某种原因。 例如; 下面的内容将在包含在控制台中时运行。但当包含在单
这是一本名为“Node.js 8 the Right Way”的书中的任务。你可以在下面看到它: 这是我的解决方案: 'use strict'; const zmq = require('zeromq
我正在阅读文本行,并创建其独特单词的列表(在将它们小写之后)。我可以使它与 flatMap 一起工作,但不能使它与 map 的“子”流一起工作。 flatMap 看起来更简洁和“更好”,但为什么 di
我正在编写一些 PowerShell 脚本来进行一些构建自动化。我发现 here echo $? 根据前面的语句返回真或假。我刚刚发现 echo 是 Write-Output 的别名。 写主机 $?
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我将一个工作 View Controller 类从另一个项目复制到一个新项目中。我无法在新项目中加载 View 。在旧项目中我使用了presentModalViewController。在新版本中,我
我对 javascript 很陌生,所以很难看出我哪里出错了。由于某种原因,我的功能无法正常工作。任何帮助,将不胜感激。我尝试在外部 js 文件、头部/主体中使用它们,但似乎没有任何效果。错误要么出在
我正在尝试学习Flutter中的复选框。 问题是,当我想在Scaffold(body :)中使用复选框时,它正在工作。但我想在不同的地方使用它,例如ListView中的项目。 return Cente
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我有一个组合框,其中包含一个项目,比如“a”。我想调用该组合框的 Action 监听器,仅在手动选择项目“a”完成时才调用。我也尝试过 ItemStateChanged,但它的工作原理与 Action
你能看一下照片吗?现在,一步前我执行了 this.interrupt()。您可以看到 this.isInterrupted() 为 false。我仔细观察——“这个”没有改变。它具有相同的 ID (1
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我正在尝试在我的网站上设置一个联系表单,当有人点击发送时,就会运行一个作业,并在该作业中向所有管理员用户发送通知。不过,我在失败的工作表中不断收到此错误: Illuminate\Database\El
我是一名优秀的程序员,十分优秀!