写点什么

云原生(二十四) | Kubernetes 篇之 Kubernetes 配置

作者:Lansonli
  • 2022 年 8 月 24 日
    广东
  • 本文字数:2540 字

    阅读完需:约 8 分钟

云原生(二十四) | Kubernetes篇之Kubernetes 配置

Kubernetes 配置

配置最佳实战:


  • 云原生 应用 12 要素 中,提出了配置分离。



  • 在推送到集群之前,配置文件应存储在版本控制中。 这允许您在必要时快速回滚配置更改。 它还有助于集群重新创建和恢复。

  • 使用 YAML 而不是 JSON 编写配置文件。虽然这些格式几乎可以在所有场景中互换使用,但 YAML 往往更加用户友好。

  • 建议相关对象分组到一个文件。比如 guestbook-all-in-one.yaml

  • 除非必要,否则不指定默认值:简单的最小配置会降低错误的可能性。

  • 将对象描述放在注释中,以便更好地进行内省。

一、Secret

  • Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者容器镜像来说更加安全和灵活。

  • Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。用户可以创建 Secret,同时系统也创建了一些 Secret。

1、Secret 种类


  • 细分类型


2、Pod 如何引用

要使用 Secret,Pod 需要引用 Secret。 Pod 可以用三种方式之一来使用 Secret:


  • 作为挂载到一个或多个容器上的卷中的文件。(volume 进行挂载)

  • 作为容器的环境变量(envFrom 字段引用)

  • 由 kubelet 在为 Pod 拉取镜像时使用 (此时 Secret 是 docker-registry 类型的)


Secret 对象的名称必须是合法的 DNS 子域名 。 在为创建 Secret 编写配置文件时,你可以设置 data 与/或 stringData 字段。 datastringData 字段都是可选的。data 字段中所有键值都必须是 base64 编码的字符串。如果不希望执行这种 base64 字符串的转换操作,你可以选择设置 stringData 字段,其中可以使用任何字符串作为其取值。

3、实验

3.1、创建 Secret


generic 类型


## 命令行#### 1、使用基本字符串kubectl create secret generic dev-db-secret \  --from-literal=username=devuser \  --from-literal=password='S!B\*d$zDsb='  ## 参照以下yamlapiVersion: v1kind: Secretmetadata:  name: dev-db-secret  data:  password: UyFCXCpkJHpEc2I9  ## base64编码了一下  username: ZGV2dXNlcg==

#### 2、使用文件内容echo -n 'admin' > ./username.txtecho -n '1f2d1e2e67df' > ./password.txt
kubectl create secret generic db-user-pass \ --from-file=./username.txt \ --from-file=./password.txt


# 默认密钥名称是文件名。 你可以选择使用 --from-file=[key=]source 来设置密钥名称。如下kubectl create secret generic db-user-pass-02 \ --from-file=un=./username.txt \ --from-file=pd=./password.txt
复制代码


使用 yaml dev-db-secret yaml 内容如下



  • 获取 Secret 内容


kubectl get secret dev-db-secret -o jsonpath='{.data}'
复制代码


3.2、使用 Secret


环境变量引用


apiVersion: v1kind: Podmetadata:  name: secret-env-podspec:  containers:  - name: mycontainer    image: redis    env:      - name: SECRET_USERNAME        valueFrom:          secretKeyRef:            name: mysecret            key: username      - name: SECRET_PASSWORD        valueFrom:          secretKeyRef:            name: mysecret            key: password  restartPolicy: Never
复制代码


环境变量引用的方式不会被自动更新


卷挂载


apiVersion: v1kind: Podmetadata:  name: mypodspec:  containers:  - name: mypod    image: redis    volumeMounts:    - name: foo      mountPath: "/etc/foo"      readOnly: true  volumes:  - name: foo    secret:      secretName: mysecret
复制代码


挂载方式的 secret 在 secret 变化的时候会自动更新(子路径引用除外)

二、ConfigMap

  • ConfigMap 来将你的配置数据和应用程序代码分开。

  • ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。


apiVersion: v1kind: ConfigMapmetadata:  name: game-demodata:  # 类属性键;每一个键都映射到一个简单的值  player_initial_lives: "3"  ui_properties_file_name: "user-interface.properties"
# 类文件键 game.properties: | enemy.types=aliens,monsters player.maximum-lives=5 user-interface.properties: | color.good=purple color.bad=yellow allow.textmode=true
复制代码


你可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:


  • 在容器命令和参数内

  • 容器的环境变量

  • 在只读卷里面添加一个文件,让应用来读取

  • 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap


apiVersion: v1kind: Podmetadata:  name: configmap-demo-podspec:  containers:    - name: demo      image: alpine      command: ["sleep", "3600"]      env:        # 定义环境变量        - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的          valueFrom:            configMapKeyRef:              name: game-demo           # 这个值来自 ConfigMap              key: player_initial_lives # 需要取值的键        - name: UI_PROPERTIES_FILE_NAME          valueFrom:            configMapKeyRef:              name: game-demo              key: ui_properties_file_name      volumeMounts:      - name: config        mountPath: "/config"        readOnly: true  volumes:    # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中    - name: config      configMap:        # 提供你想要挂载的 ConfigMap 的名字        name: game-demo        # 来自 ConfigMap 的一组键,将被创建为文件        items:        - key: "game.properties"          path: "game.properties"        - key: "user-interface.properties"          path: "user-interface.properties"
复制代码

1、使用挂载 ConfigMap

apiVersion: v1kind: Podmetadata:  name: mypodspec:  containers:  - name: mypod    image: redis    volumeMounts:    - name: foo      mountPath: "/etc/foo"      readOnly: true  volumes:  - name: foo    configMap:      name: myconfigmap
复制代码


ConfigMap 的修改,可以触发挂载文件的自动更新


发布于: 刚刚阅读数: 3
用户头像

Lansonli

关注

微信公众号:三帮大数据 2022.07.12 加入

CSDN大数据领域博客专家,华为云享专家、阿里云专家博主、腾云先锋(TDP)核心成员、51CTO专家博主,全网六万多粉丝,知名互联网公司大数据高级开发工程师

评论

发布
暂无评论
云原生(二十四) | Kubernetes篇之Kubernetes 配置_云原生_Lansonli_InfoQ写作社区