Kubernetes(k8s)-Job介绍

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

图片

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

我们前面介绍了很多工作负载,那些都是需要持续运行的的任务,但是实际运维当中有些任务是一次性的,哪针对这些需求我们应该用什么方式呢?Kubernetes给我们提供了一个资源是Job,下面我们就来介绍这个资源。

Kubernetes Job 是 Kubernetes 中的一种工作负载资源,用于管理批量处理任务。Job 的主要目的是确保指定数量的 Pod 成功终止。一旦达到这个目标,Job 就被认为完成了。

以下是一些关于 Kubernetes Job 的关键点:

任务完成:Job 负责创建一个或多个 Pods,并将继续替换它们,直到指定数量的 Pods 成功终止(即退出码为0)。成功完成后,不会创建更多的 Pods。

并行性:你可以配置 Job 来控制其并行度,也就是同时运行的 Pod 数量。对于非并行 Jobs,默认情况下只有一个 Pod 会被创建。

重启策略:对于 Job 中的 Pods,通常使用的重启策略是 OnFailure 或者 Never。这是因为 Job 的目标是让 Pod 完成而不是无限期地保持运行。

生命周期:一旦 Job 创建的 Pod 完成了它们的工作并且成功退出,Job 将不再创建新的 Pod。然而,Job 对象本身和它所创建的 Pod 仍然会保留在集群中,除非你明确删除它们或者设置 TTL 控制器来自动清理已完成的 Jobs。

apiVersion: batch/v1
kind: Job
metadata:
  name: simple-job-example
spec:
  completions: 3
  parallelism: 2
  backoffLimit: 4
  activeDeadlineSeconds: 7200
  ttlSecondsAfterFinished: 3600
  template:
    spec:
      containers:
      - name: job-container
        image: busybox
        command: ["sh", "-c", "echo Hello, Kubernetes Job! && sleep 30"]
      restartPolicy: OnFailure

这个简化的例子包括了以下关键 Job 参数:

completions:指定了 Job 需要完成的成功 Pod 数量,总共需要运行的pod数量,比如有些任务就是一次性,不需要多个。该参数默认数字是1。

parallelism:定义了可以同时运行的 Pod 数量,如果总pod数量大于2才有意义,该参数默认数字是1。

activeDeadlineSeconds:设定了 Job 的最大运行时间,超过该时间 Job 将被终止,也就是如果达到这个的时间,它没执行完成,则会被认为失败。如果未配置参数,则该pod会一直执行,不会主动退出。

backoffLimit:设置了 Job 在被认为失败之前可以尝试的次数,该任务会被重新触发(比如是容器以非0代码退出,并且restartPolicy参数是Never),才会执行重新执行。

ttlSecondsAfterFinished:指定 Job 完成后多长时间自动删除,有助于集群资源管理,正常执行完成的pod会显示下面的状态,这个是正常退出状态的容器,设置这个时间,它会把这个退出状态的pod删除(退出状态的pod也会占用部分主机资源)。

restartPolicy:决定了容器出现意外故障的pod策略,如果是OnFailure则会重启pod,不会触发job重试。下图是正常执行job退出的pod状态(后面我们也会单独来出一期来讲解这个pod状态)。

图片

    #job状态是这的,正常执行完成的job
    NAME                           COMPLETIONS   DURATION   AGE
    job.batch/simple-job-example   3/3           67s        79s

    作者以前的工作经验这个Job主要用于业务的数据库的DDL操作,把DDL操作封装在一个Job,这样我们就可以把很多操作封装在Kubernetes的标准api里面,通过Kubernetes来管理所有的业务。

    运维小路

    一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

    关注微信公众号《运维小路》获取更多内容。

    <think>我们正在处理用户关于在Kubernetes环境下配置XXL-Job的查询。根据之前的对话历史,用户之前询问了Java连接Dubbo+Nacos的问题,现在转向了Kubernetes部署XXL-Job。 我们有两个引用: 引用[1]:提到使用Kubernetes部署xxl-job-admin及执行器,以2.4.0版本为例,基于官方Dockerfile,并指出配置文件不是关键,示例使用官方Demo文件。 引用[2]:具体提到了k8s部署xxl-job时,由于jar包内有application.properties,需要指定使用本地配置文件,通过环境变量PARAMS来指定配置文件路径。 用户当前问题:查找在Kubernetes环境下配置XXL-Job的方法。 我们将结合这两个引用,提供在Kubernetes上配置XXL-Job的步骤,包括部署admin和执行器。 注意:XXL-Job有两个核心组件: 1. admin:调度中心,提供管理界面和调度功能。 2. executor:执行器,负责执行任务。 部署步骤: 1. 准备Docker镜像:使用官方Dockerfile构建镜像,或从官方仓库获取镜像。 2. 配置Kubernetes部署文件(YAML),包括ConfigMap(用于配置文件)、Deployment和Service。 3. 特别注意:引用[2]中提到,由于jar包内有默认配置文件,我们需要通过环境变量指定外部配置文件路径。 具体步骤: 步骤1:准备配置文件 对于xxl-job-admin,我们需要一个外部的application.properties(或application.yml)来覆盖默认配置。同样,执行器也需要配置文件。 我们可以将配置文件存储在ConfigMap中,然后挂载到容器内。 步骤2:创建ConfigMap 例如,创建admin的ConfigMap: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: xxl-job-admin-config data: application.properties: | # XXL-JOB Admin 配置 xxl.job.admin.addresses=http://xxl-job-admin:8080/xxl-job-admin spring.datasource.url=jdbc:mysql://mysql-service:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=your_password # 其他配置... ``` 注意:这里的数据源配置需要根据实际情况修改。 步骤3:部署xxl-job-admin 创建Deployment和Service。在Deployment中,将ConfigMap挂载到容器内的某个目录(比如`/config`),然后通过环境变量PARAMS指定配置文件路径(如`--spring.config.location=/config/application.properties`)。 示例Deployment片段: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: xxl-job-admin spec: replicas: 1 selector: matchLabels: app: xxl-job-admin template: metadata: labels: app: xxl-job-admin spec: containers: - name: xxl-job-admin image: xuxueli/xxl-job-admin:2.4.0 ports: - containerPort: 8080 env: - name: PARAMS value: "--spring.config.location=/config/application.properties" volumeMounts: - name: config-volume mountPath: /config volumes: - name: config-volume configMap: name: xxl-job-admin-config --- apiVersion: v1 kind: Service metadata: name: xxl-job-admin spec: selector: app: xxl-job-admin ports: - protocol: TCP port: 8080 targetPort: 8080 type: ClusterIP # 也可以使用NodePort或LoadBalancer,根据需求 ``` 步骤4:部署执行器(xxl-job-executor) 执行器的部署方式类似admin,也需要配置文件(通常为xxl-job-executor.properties或application.properties)。同样创建ConfigMap,然后在Deployment中挂载并指定配置路径。 执行器的ConfigMap示例: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: xxl-job-executor-config data: application.properties: | # XXL-JOB Executor配置 xxl.job.admin.addresses=http://xxl-job-admin:8080/xxl-job-admin xxl.job.executor.appname=xxl-job-executor xxl.job.executor.port=9999 # 其他配置... ``` 执行器的Deployment片段(注意:执行器可能有多个,每个执行器可以有不同的appname): ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: xxl-job-executor spec: replicas: 1 selector: matchLabels: app: xxl-job-executor template: metadata: labels: app: xxl-job-executor spec: containers: - name: xxl-job-executor image: your_executor_image:tag # 执行器镜像需要自己构建或使用官方提供的示例 ports: - containerPort: 9999 env: - name: PARAMS value: "--spring.config.location=/config/application.properties" volumeMounts: - name: config-volume mountPath: /config volumes: - name: config-volume configMap: name: xxl-job-executor-config ``` 步骤5:初始化数据库 在部署admin之前,需要确保数据库已经初始化(执行官方提供的SQL脚本)。 注意事项: 1. 数据库服务:需要确保admin能够访问MySQL数据库,数据库服务可以是集群内的,也可以是外部的。 2. 网络:确保admin的服务名(如上面的xxl-job-admin)可以被执行器访问。 3. 执行器镜像:官方可能没有直接提供执行器镜像,需要根据业务项目构建包含执行器的镜像。执行器通常和业务代码在一起,所以需要用户自己构建。 验证部署: 1. 访问admin的web界面:通过Service暴露的方式(如NodePort或Ingress)访问admin的Web界面(默认用户名admin,密码123456)。 2. 在admin控制台查看执行器是否自动注册。 通过以上步骤,我们可以在Kubernetes环境中配置XXL-Job。 生成相关问题: 1. 如何为XXL-Job执行器构建Docker镜像? 2.Kubernetes中如何为XXL-Job配置MySQL数据库? 3. XXL-JobKubernetes环境下如何实现高可用? </think>### Kubernetes环境下XXL-Job配置指南 在Kubernetes中部署XXL-Job需重点关注**配置注入**和**环境变量管理**,以下是核心步骤及示例: --- ### **1. 核心配置原理** XXL-Job的配置依赖`application.properties`文件,在Kubernetes中需通过两种方式管理: - **外部配置文件挂载**:覆盖Jar包内默认配置 - **环境变量注入**:动态传递参数(如数据库连接串)[^2] --- ### **2. 关键配置步骤** #### **步骤1:准备配置文件** 创建`application.properties`并存储到ConfigMap: ```yaml # xxl-job-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: xxl-job-config data: application.properties: | # 调度中心配置 xxl.job.admin.addresses=http://xxl-job-admin-svc:8080/xxl-job-admin spring.datasource.url=jdbc:mysql://mysql-svc:3306/xxl_job?useUnicode=true spring.datasource.username=admin spring.datasource.password=@DB_PASSWORD@ # 敏感数据通过Secret注入 # 执行器配置 xxl.job.executor.appname=xxl-job-executor xxl.job.executor.port=9999 ``` #### **步骤2:注入敏感数据(Secret)** ```yaml # xxl-job-secret.yaml apiVersion: v1 kind: Secret metadata: name: xxl-job-secrets type: Opaque stringData: DB_PASSWORD: "your_mysql_password" # 实际密码 ``` #### **步骤3:部署Admin调度中心** ```yaml # xxl-job-admin-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: xxl-job-admin spec: replicas: 1 selector: matchLabels: app: xxl-job-admin template: metadata: labels: app: xxl-job-admin spec: containers: - name: admin image: xuxueli/xxl-job-admin:2.4.0 ports: - containerPort: 8080 env: - name: PARAMS # 关键!指定外部配置文件路径 value: "--spring.config.location=/config/application.properties" - name: DB_PASSWORD # 从Secret注入 valueFrom: secretKeyRef: name: xxl-job-secrets key: DB_PASSWORD volumeMounts: - name: config-volume mountPath: /config # 挂载配置文件目录 volumes: - name: config-volume configMap: name: xxl-job-config # 关联ConfigMap --- # Service暴露Admin apiVersion: v1 kind: Service metadata: name: xxl-job-admin-svc spec: selector: app: xxl-job-admin ports: - protocol: TCP port: 8080 targetPort: 8080 ``` #### **步骤4:部署执行器(Executor)** ```yaml # xxl-job-executor-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: xxl-job-executor spec: replicas: 3 # 多副本实现高可用 selector: matchLabels: app: xxl-job-executor template: metadata: labels: app: xxl-job-executor spec: containers: - name: executor image: your_custom_executor_image:latest # 需自建镜像 env: - name: PARAMS value: "--spring.config.location=/config/application.properties" volumeMounts: - name: config-volume mountPath: /config volumes: - name: config-volume configMap: name: xxl-job-config # 复用同一ConfigMap ``` --- ### **3. 验证部署** 1. **检查Pod日志**: ```bash kubectl logs -l app=xxl-job-admin --tail=50 # 输出应包含:Started XxlJobAdminApplication in X seconds ``` 2. **访问Admin控制台**: - 通过Ingress或Port-forward访问`http://<node-ip>:30080/xxl-job-admin` - 默认账号:admin/123456 3. **查看执行器注册**: - 在Admin控制台 → "执行器管理" 确认执行器状态为"在线"[^1] --- ### **4. 动态配置技巧** - **热更新配置**:修改ConfigMap后触发Pod滚动更新 ```bash kubectl rollout restart deployment/xxl-job-admin ``` - **多环境管理**:使用Kustomize或Helm区分`dev/test/prod`配置 - **敏感数据安全**:Always use Secrets (not ConfigMap) for passwords[^2] --- ### **典型问题分析** > **问题**:执行器无法注册到Admin > **排查**: > 1. 检查Admin的`xxl.job.admin.addresses`是否指向正确Service名称 > 2. 验证网络连通性:`kubectl exec -it <executor-pod> -- curl http://xxl-job-admin-svc:8080` > 3. 确认执行器与Admin使用相同命名空间
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值