k8s(3)-容器运行应用(下)

16 篇文章 1 订阅
11 篇文章 0 订阅

7.DaemonSet分析

前面提到过,DaemonSet是一种Controller,适用于每个Node只能运行一个副本的应用。

DaemonSet 的典型应用场景有:

  1. 在集群的每个节点上运行存储 Daemon,比如 glusterd 或 ceph。

  2. 在每个节点上运行日志收集 Daemon,比如 flunentd 或 logstash。

  3. 在每个节点上运行监控 Daemon,比如 Prometheus Node Exporter 或 collectd。

注意,每个节点上就有DaemonSet系统组件,如kube-flannel和kube-proxy。在NameSpace为kube-system上运行。执行命令:

kubectl get daemonset --namespace=kube-system

DaemonSet kube-flannel-ds 和 kube-proxy 分别负责在每个节点上运行 flannel 和 kube-proxy 组件。因为 flannel 和 kube-proxy 属于系统组件,需要在命令行中通过 --namespace=kube-system 指定 namespace kube-system。如果不指定则只返回默认 namespace default 中的资源。

k8s默认会有default、kube-system两个NameSpace。

之前部署flannel网络命令:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

详细解析 kube-flannel.yaml

配置文件只保留了部分重要内容!

① DaemonSet 配置文件的语法和结构与 Deployment 几乎完全一样,只是将 kind 设为 DaemonSet

② hostNetwork 指定 Pod 直接使用的是 Node 的网络,相当于 docker run --network=host。考虑到 flannel 需要为集群提供网络连接,这个要求是合理的。

③ containers 定义了运行 flannel 服务的两个容器。

详细解析 kube-proxy

执行命令

kubectl edit daemonset kube-proxy --namespace=kube-system

可以查看配置

同样为了便于理解,这里只保留了最重要的信息。

① kind: DaemonSet 指定这是一个 DaemonSet 类型的资源。

② containers 定义了 kube-proxy 的容器。

③ status 是当前 DaemonSet 的运行时状态,这个部分是 kubectl edit特有的。其实 Kubernetes 集群中每个当前运行的资源都可以通过 kubectl edit 查看其配置和运行状态,比如 kubectl edit deployment nginx-deployment

 8.一次性任务Job

容器按照持续运行的时间可分为两类:服务类容器和工作类容器。工作类容器则是一次性任务,比如批处理程序,完成后容器就退出。工作类容器则是一次性任务,比如批处理程序,完成后容器就退出。

简单的 Job 配置文件 myjob.yml:

① batch/v1 是当前 Job 的 apiVersion

② 指明当前资源的类型为 Job

③ restartPolicy 指定什么情况下需要重启容器。对于 Job,只能设置为 Never 或者 OnFailure。对于其他 controller(比如 Deployment)可以设置为 Always 。

通过 kubectl apply -f myjob.yml 启动 Job。

kubectl get job 查看 Job 的状态:

DESIRED 和 SUCCESSFUL 都为 1,表示按照预期启动了一个 Pod,并且已经成功执行。

使用kubectl get pod查不到pod存在,因为pod运行完成后就已经关闭,我们需要使用kubectl get pod --show--all才能看到所有历史pod(包括已经关闭的pod)。

kubectl logs 可以查看 Pod 的标准输出:

job执行失败会如何? restartPolicy 设置为 Never 或者 OnFailure的区别:

假设myjob.yaml写错了,那么pod会怎么运行呢?这里故意引入错误。

 kubectl delete -f myjob.yml删除之前的yaml文件。此时restartPolicy 设置为Never,即为不重启。

运行新的 Job 并查看状态:

当前 SUCCESSFUL 的 Pod 数量为 0,查看 Pod 的状态:

这里都可以观察到desired为1,但是successful为0。为什么会这样呢?

原因是:当第一个 Pod 启动时,容器失败退出,根据 restartPolicy: Never,此失败容器不会被重启,但 Job DESIRED 的 Pod 是 1,目前 SUCCESSFUL 为 0,不满足,所以 Job controller 会启动新的 Pod,直到 SUCCESSFUL 为 1。对于我们这个例子,SUCCESSFUL 永远也到不了 1,所以 Job controller 会一直创建新的 Pod。为了终止这个行为,只能删除 Job。

但如果我们将restartPolicy 设置为OnFailure呢?

删除上面的myjob.yaml,下面我们实践一下,修改 myjob.yml 后重新启动。

Job 的 SUCCESSFUL Pod 数量还是为 0,看看 Pod 的情况:

这里只有一个 Pod,不过 RESTARTS 为 3,而且不断增加,说明 OnFailure 生效,容器失败后会自动重启。

9.并行启动job

parallelism表示同时并行运行Job的个数, completions 设置 Job 成功完成 Pod 的总数:该yaml文件表示运行6个名为myjob的Pod并且每次同时运行两个。

上面的例子只是为了演示 Job 的并行特性,实际用途不大。

10.定时启动Job

 类似于linux系统下的cron命令,任务调度,定时执行某个配置文件或者命令。k8s的CronJob提供了类似的功能

① batch/v2alpha1 是当前 CronJob 的 apiVersion

② 指明当前资源的类型为 CronJob

③ schedule 指定什么时候运行 Job,其格式与 Linux cron 一致。这里 */1 * * * * 的含义是每一分钟启动一次。

④ jobTemplate 定义 Job 的模板,格式与前面 Job 一致。

通过 kubectl apply 创建 CronJob。

 失败了。这是因为 Kubernetes 默认没有 enable CronJob 功能,需要在 kube-apiserver 中加入这个功能。方法很简单,修改 kube-apiserver 的配置文件 /etc/kubernetes/manifests/kube-apiserver.yaml:

 将此处改为true即可。

kube-apiserver 本身也是个 Pod。kubelet 会重启 kube-apiserver Pod。通过 kubectl api-versions 确认 kube-apiserver 现在已经支持 batch/v2alpha1。

再次使用 apply -f 创建CronJob即可。 

通过 kubectl get cronjob 查看 CronJob 的状态:

等待几分钟,然后通过 kubectl get jobs 查看 Job 的执行情况:

可以看到每隔一分钟就会启动一个 Job。执行 kubectl logs 可查看某个 Job 的运行日志:

自此,容器运行应用已经全部介绍完成,这一部分是k8s最重要的核心功能,需要经常复习浏览! 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes(简称K8s)是一个开源的容器编排平台,用于管理容器应用程序的部署、扩展和自动化操作。在Kubernetes中,我们可以通过将容器镜像部署到Kubernetes集群中的容器中来运行应用程序。 首先,我们需要创建一个Docker镜像,该镜像包含了我们想要运行应用程序及其依赖项。Docker镜像可以使用Dockerfile来定义,其中包含了构建这个镜像所需的步骤和命令。常见的构建步骤包括下载所需的软件包、设置环境变量、复制应用程序代码等。通过运行`docker build`命令,我们可以构建出一个可用的Docker镜像。 接下来,我们需要将这个Docker镜像上传到一个镜像仓库中,这样Kubernetes集群就可以拿到这个镜像并运行。常见的镜像仓库有Docker Hub、Google Container Registry等。我们可以使用`docker push`命令将镜像推送到镜像仓库中,并确保设置了适当的访问控制。 然后,在Kubernetes集群中创建一个容器部署。容器部署是一个由Kubernetes管理的逻辑单元,用于定义如何在集群中运行一个或多个同样的容器实例。我们可以使用Kubernetes配置文件(通常是YAML格式)来定义容器部署。在配置文件中,我们需要指定容器部署所使用的镜像、容器的资源要求和限制、容器之间的网络和存储配置等信息。 最后,我们可以使用Kubernetes命令行工具(如kubectl)来创建和管理容器部署。通过运行`kubectl apply -f`命令,我们可以将容器部署配置文件应用Kubernetes集群中。Kubernetes会根据配置文件中的定义,自动创建容器实例,并在集群的节点上运行这些容器。 总体而言,将Docker镜像运行Kubernetes容器中需要完成以下步骤:构建Docker镜像、上传到镜像仓库、创建容器部署配置文件、应用配置到Kubernetes集群。通过这些步骤,我们可以在Kubernetes集群中轻松地部署和管理容器应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值