K8S学习----存储Secret/volume

学习目标:

1、掌握secret
2、学会volume卷的挂载

学习内容:

Secret存在意义

secret解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中,Secret可以以Volume或者环境变量的方式使用

Secret有三种类型:

  1. Service Account:用来访问kubernetes API,有kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kunernetes.io/serviceaccount目录中
  2. Opaque:base64编码格式的Secret,用来存储密码、密钥等
  3. kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息

Service Account

在这里插入图片描述

Opaque Secret

  1. 创建说明
    opaque类型的数据是一个map类型,要求value是base64编码格式
[root@paas-core01 paas]# echo -n  "admin" | base64
YWRtaW4=
[root@paas-core01 paas]# echo -n "1f2d1e2e67df" | base64
MWYyZDFlMmU2N2Rm

Secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=
  1. 使用方式
    将Secret挂载到Volume中
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: secret-test
  name: secret-test
spec:
  volumes:
    - name: secrets
      secret:
        secretName: mysecret
  containers:
   - image: hub.atguigu.com/library/myapp:v1
     name: db
     volumeMounts:
       - name: secrets
         mountPath: "/etc/secrets"
         readOnly: true

将Secret导出到环境变量中

apiVsersion: extensions/v1beta1
kind: Deployment
metadata:
  name: pod-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: pod-deployment
    spec:
      containers:
      - name: pod-1
        image: hub.atguigu.com/library/myapp:v1
        ports:
        - containerPort: 80
        env:
        - name: TEST_USER
          valumeFrom:
            secretKeyRef:
              name: mysecret
              key: username
        -name: TEST_PASSWORD
          valumeFrom:
            secretKeyRef:
              name: mysecret
              key: password
  1. kubernetes.io/dockerconfigjson
    使用kubectl创建docker registry认证的secret
$ kubectl create secret docker-registry myregistryKey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL 
secret "*****" created

在创建Pod的时候,通过imagePullSecrets来引用刚刚创建的myregistryKey

apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
    - name: foo
      image: myapp:v1
  imagePullSecrets:
    - name: myregistryKey

Volume

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet会重启它,但是容器中的文件将丢失—容器以干净的状态(镜像最初的状态)重新启动,其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件,Kubernetes中的volume抽象就很好的解决了这些问题

背景

kubernetes中的卷有明确的寿命----与封装它的Pod相同,所以,卷的生命比Pod中的所有容器都长,当这个容器重启时数据任然得以保存,当然,当Pod不再存在时,卷也将不再存在,kubernetes支持多种类型的卷,Pod可以使用任意数量的卷

卷的类型

在这里插入图片描述

  1. emptyDir
    当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的,Pod中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点删除Pod时,emptyDir中的数据将永久删除
    ##注意:容器崩溃不会从节点中移除pod,因此emptyDir卷中的数据在容器崩溃时是安全的##

empthDir的用法有:

  • 暂存空间,例如用于磁盘的合并排序
  • 用作长时间计算崩溃恢复时的检查点
  • web服务器容器提供数据时,保存内容管理器容器提取的文件
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    empthDir: {}
  1. hostPath
    hostPath卷将主机节点的文件系统中的文件或目录挂载到集群中

hostPath的用途如下:

  • 运行需要访问docker内部的容器,使用/var/lib/docker的hostPath
  • 在容器中运行cAdvisor,使用/dev/cgroups的hostPath

除了所需的path属性之外,用户还可以为hostPath卷指定type
在这里插入图片描述
使用这些卷类型时请注意,因为:

  • 由于每个节点上的文件都不同,具有相同配置(例如从podTemplate创建的)的pod在不同节点上的行为可能会有所不同
  • 当kubernetes按照计划添加资源感知调度时,将无法考虑hostpath使用的资源
  • 在底层主机上创建的文件或目录只能由root写入,你需要在特权容器中以root身份运行进程,或修改主机上的文件权限以便写入hostpath卷
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - images: k8s.grc.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data
      type: Directory
<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-Job在Kubernetes环境下如何实现高可用? </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、付费专栏及课程。

余额充值