k8s 配置管理

k8s 配置管理

ConfigMap

一般用于去存储 Pod 中应用所需的一些配置信息,或者环境变量,将配置于 Pod 分开,避免应为修改配置导致还需要重新构建 镜像与容器。

使用 kubectl create configmap -h 查看示例,构建 configmap 对象

常用创建configmap 方式

  # Create a new config map named my-config based on folder bar
  # 基于文件夹创建一个名为 my-config 的配置
  kubectl create configmap my-config --from-file=path/to/bar
  
  # Create a new config map named my-config with specified keys instead of file basenames on disk
  # 指定对应文件创建 --from-file=key1=/path/to/bar/file1.txt  key1 是重命名配置名
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
  
  # Create a new config map named my-config with key1=config1 and key2=config2
  # 使用key1=config1 方式配置   这种很少用
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
  
  # Create a new config map named my-config from the key=value pairs in the file
  # 从文件中的 key=value 方式创建配置 
  kubectl create configmap my-config --from-file=path/to/bar
  
  # Create a new config map named my-config from an env file
  # 从env文件创建一个名为my-config的新配置映射  
  kubectl create configmap my-config --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env
kubectl get cm  # 查看configmap 配置
kubectl describe cm config_name # 查看 config_name 的配置信息

pod 中使用

需要先创建 configmap 直接用上述命令创建或者通过yaml文件都行

apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: my-configmap  
data:  
  app_config.yml: |  
    database:  
      host: db.example.com  
      port: 5432  
      username: myuser  
      password: mypassword  
    other_setting: some_value  
   log_level: INFO

pod 中配置

# pod-using-configmap.yaml  
apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod  
spec:  
  containers:  
    - name: my-container  
      image: my-app-image  
      env:  
        # 使用 ConfigMap 中的单个值作为环境变量  
        - name: LOG_LEVEL  
          valueFrom:  
            configMapKeyRef:    
              name: my-configmap  
              key: log_level  
      volumeMounts:  
        # 将 ConfigMap 挂载为文件  
        - name: config-volume  
          mountPath: /etc/config  
      # 可以在命令中使用环境变量,或在应用中读取 /etc/config/app_config.yml  
      command: ["/bin/sh", "-c", "echo $LOG_LEVEL && cat /etc/config/app_config.yml"]  
  volumes:  
    - name: config-volume  
      configMap:  
        name: my-configmap  
        # 默认情况下,ConfigMap 中的所有 key 都会被挂载为文件,文件名与 key 相同  
        # 如果只想挂载部分 key,可以使用 items 字段来指定  
        # items:  
        #   - key: app_config.yml  
        #     path: app_config.yml

Secret

与 ConfigMap 类似,用于存储配置信息,但是主要用于存储敏感信息、需要加密的信息,Secret 可以提供数据加密、解密功能(默认基于base64)也可以配置加密。

在创建 Secret 时,要注意如果要加密的字符中,包含了有特殊字符,需要使用转义符转移,例如 $ 转移后为 $,也可以对特殊字符使用单引号描述,这样就不需要转移例如 1$289*-! 转换为 ‘1$289*-!’

使用 kubectl create secret -h 查看

Available Commands:
  docker-registry Create a secret for use with a Docker registry # 使用最多
  generic         Create a secret from a local file, directory, or literal value
  tls             Create a TLS secret   # 配置 https 加密

其中 kubectl create secret generic --help 查看示例,构建 secret 对象, 和configmap 几乎没啥区别, 只是value 是 base64 编码后的数据而已

Examples:
  # Create a new secret named my-secret with keys for each file in folder bar
  kubectl create secret generic my-secret --from-file=path/to/bar
  
  # Create a new secret named my-secret with specified keys instead of names on disk
  kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa
--from-file=ssh-publickey=path/to/id_rsa.pub
  
  # Create a new secret named my-secret with key1=supersecret and key2=topsecret
  kubectl create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret
  
  # Create a new secret named my-secret using a combination of a file and a literal
  kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa --from-literal=passphrase=topsecret
  
  # Create a new secret named my-secret from env files
  kubectl create secret generic my-secret --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env

docker-registry

通过docker-registry 来配置docker harbor 的账户密码, ip port 等信息

 # If you don't already have a .dockercfg file, you can create a dockercfg secret directly by using:
kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER
--docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
  
  # Create a new secret named my-secret from ~/.docker/config.json
  kubectl create secret docker-registry my-secret --from-file=.dockerconfigjson=path/to/.docker/config.json

SubPath

使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath

配置方式:

  1. 定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始
  2. 在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同
containers:
  ......
  volumeMounts:
  - mountPath: /etc/nginx/nginx.conf # 挂载到哪里
    name: config-volume # 使用哪个 configmap 或 secret
    subPath: etc/nginx/nginx.conf # 与 volumes.[0].items.path 相同
volumes:
- configMap:
  name: nginx-conf # configMap 名字
  items: # subPath 配置
    key: nginx.conf # configMap 中的文件名

配置热更新

我们通常会将项目的配置文件作为 configmap 然后挂载到 pod,那么如果更新 configmap 中的配置,会不会更新到 pod 中呢?

这得分成几种情况:

  • 默认方式:会更新,更新周期是更新时间 + 缓存时间
  • subPath:不会更新
  • 变量形式:如果 pod 中的一个变量是从 configmap 或 secret 中得到,同样也是不会更新的

对于 subPath 的方式,我们可以取消 subPath 的使用,将配置文件挂载到一个不存在的目录,避免目录的覆盖,然后再利用软连接的形式,将该文件链接到目标位置

但是如果目标位置原本就有文件,可能无法创建软链接,此时可以基于前面讲过的 postStart 操作执行删除命令,将默认的文件删除即可

使用方案

使用edit 修改

kubectl edit cm  configmap_name   # 修改后需要一定时间更新

通过replace替换

由于 configmap 我们创建通常都是基于文件创建,并不会编写 yaml 配置文件,因此修改时我们也是直接修改配置文件,而 replace 是没有 --from-file 参数的,因此无法实现基于源配置文件的替换,此时我们可以利用下方的命令实现

# 该命令的重点在于 --dry-run 参数,该参数的意思打印 yaml 文件,但不会将该文件发送给 apiserver,再结合 -oyaml 输出 yaml 文件就可以得到一个配置好但是没有发给 apiserver 的文件,然后再结合 replace 监听控制台输出得到 yaml 数据即可实现替换

# 修改原配置文件后执行
kubectl create cm --from-file=nginx.conf --dry-run -o yaml | kubectl replace -f-   

不可变Secret 和 ConfigMap

对于一些敏感服务的配置文件,在线上有时是不允许修改的,此时在配置 configmap 时可以设置 immutable: true 来禁止修改(常量)

apiVersion: v1
data:
  application.yaml: "spring:\n  application:\n    name: test-app\nserver:\n  port:
    8080\n  \n"
kind: ConfigMap
metadata:
  creationTimestamp: "2024-05-13T02:27:22Z"
  name: app-config
  namespace: default
immutable: true
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Java开发中,IDEA是一款非常流行的集成开发环境,而K8s(Kubernetes)是一种用于容器编排和管理的开源平台。下面是Java IDEA与K8s配置的相关介绍: 1. Java IDEA配置: - 安装IDEA:首先,你需要下载并安装IntelliJ IDEA。你可以从JetBrains官网下载适合你操作系统的版本。 - 创建项目:打开IDEA后,选择创建一个新的Java项目。在创建项目时,你可以选择项目类型、项目名称和存储位置等。 - 配置JDK:在项目创建完成后,你需要配置Java Development Kit(JDK)。在IDEA的设置中,找到"Project Structure"(项目结构)选项,然后选择合适的JDK版本。 - 导入依赖:如果你的项目需要使用第三方库或框架,你可以在项目的配置文件(如pom.xml或build.gradle)中添加相应的依赖项。 - 编写代码:在IDEA中,你可以创建Java类、编写代码、调试程序等。IDEA提供了丰富的功能和工具,可以提高开发效率。 2. K8s配置: - 安装Kubernetes:首先,你需要在你的机器上安装Kubernetes。你可以选择使用Minikube(用于本地开发和测试)或者在云平台上创建Kubernetes集群。 - 配置Kubectl:Kubectl是Kubernetes的命令行工具,用于与Kubernetes集群进行交互。你需要在你的机器上安装并配置Kubectl,以便能够管理和操作Kubernetes集群。 - 创建Kubernetes资源:使用Kubectl或者Kubernetes的API,你可以创建和配置各种Kubernetes资源,如Pod、Deployment、Service等。这些资源定义了你的应用程序的部署和运行方式。 - 部署应用程序:将你的Java应用程序打包成Docker镜像,并将其部署到Kubernetes集群中。你可以使用Kubectl或者Kubernetes的API来创建和管理应用程序的部署。 以上是Java IDEA和K8s配置的简要介绍,如果你有具体的问题或者需要更详细的配置步骤,请提供更多的信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go&Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值