命令记不住

登陆

k8s 使用 ConfigMap 和 Secret 示例

k8s使用ConfigMap和Secret示例

1.Configmap存储配置文件

应用场景:应用程序配置,将配置数据和应用程序代码分开

创建ConfigMap后,数据实际会存储在k8s中Etcd,然后通过创建Pod时引用该数据

Pod使用ConfigMap数据有两种方式

  • 变量注入
  • 数据卷挂载

两种数据类型:

  • 键值
  • 多行数据

ConfigMap在设计上不是用来保持大量数据的,在ConfigMap中保存的数据不可超过1Mib

2.ConfigMaps和Pods

Pod和ConfigMap必须要在同一个命名空间中

1.创建一个ConfigMap
# 类属性键
apiVersion: v1
kind: ConfigMap
metadata:
name: game-key-value
data:
player-initial_lives: "3"
ui_properties_file_name: "user-initerface.properties"
# 类文件键
apiVersion: v1
kind: ConfigMap
metadata:
name: game-key-value
data:
game.properties:
 enemy.types=aliens,monsters
 player.maxumum-lives=5
user-interface.properties: |
 color.good=purple
 color.bad=yellow
 allow.textmode=true
2.创建一个Pod

四种方式使用ConfigMap

  • 在容器命令和参数内
  • 容器的环境变量
  • 在只读卷里面添加一个文件,让应用来读
  • 编写代码在Pod中运行,使用Kubernetes API来读取ConfigMap
apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  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"
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # 类属性键;每一个键都映射到一个简单的值
  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    

定义了一个卷并将它作为 /config 文件夹挂载到 demo 容器内, 创建两个文件,/config/game.properties 和 /config/user-interface.properties, 尽管 ConfigMap 中包含了四个键。 这是因为 Pod 定义中在 volumes 节指定了一个 items 数组。 如果你完全忽略 items 数组,则 ConfigMap 中的每个键都会变成一个与 该键同名的文件,因此你会得到四个文

3.使用ConfigMap

ConfigMap 可以作为数据卷挂载,在Pod中将ConfigMap当作文件使用

  1. 创建一个 ConfigMap 对象或者使用现有的 ConfigMap 对象。多个 Pod 可以引用同一个 ConfigMap。
  2. 更改你的镜像或者命令行,以便程序能够从该目录中查找文件。ConfigMap 中的每个 data 键会变成 mountPath 下面的一个文件名

ConfigMap 以卷的形式进行挂载 Pod的yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    configMap:
      name: myconfigmap
被挂载的 ConfigMap 内容会被自动更新

4.基于目录创建 ConfigMap

使用 kubectl create configmap 基于同一目录中的多个文件创建 ConfigMap

# 创建本地目录
mkdir -p configure-pod-container/configmap/

# 将实例文件下载到 `configure-pod-container/configmap/` 目录
wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties
wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties

# 创建 configmap
kubectl create configmap game-config --from-file=configure-pod-container/configmap/

查看内容kubectl get configmaps game-config -o yaml

apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2016-02-18T18:52:05Z
name: game-config
namespace: default
resourceVersion: "516"
selfLink: /api/v1/namespaces/default/configmaps/game-config
uid: b4952dc3-d670-11e5-8cd0-68f728db1985
data:
game.properties: |
 enemies=aliens
 lives=3
 enemies.cheat=true
 enemies.cheat.level=noGoodRotten
 secret.code.passphrase=UUDDLRLRBABAS
 secret.code.allowed=true
 secret.code.lives=30    
ui.properties: |
 color.good=purple
 color.bad=yellow
 allow.textmode=true
 how.nice.to.look=fairlyNice    

.

5.基于文件创建 ConfigMap

使用 kubectl create configmap 基于单个文件或多个文件创建 ConfigMap

# 单个文件
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties
# 多个文件
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties

.

6.定义从文件创建 ConfigMap 时要使用的键

<my-key-name> 是你要在 ConfigMap 中使用的键名,<path-to-file> 是你想要键表示数据源文件的位置

kubectl create configmap game-config-3 --from-file=game-special-key=configure-pod-container/configmap/game.properties

查看configmap

apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2016-02-18T18:54:22Z
name: game-config-3
namespace: default
resourceVersion: "530"
selfLink: /api/v1/namespaces/default/configmaps/game-config-3
uid: 05f8da22-d671-11e5-8cd0-68f728db1985
data:
game-special-key: |
 enemies=aliens
 lives=3
 enemies.cheat=true
 enemies.cheat.level=noGoodRotten
 secret.code.passphrase=UUDDLRLRBABAS
 secret.code.allowed=true
 secret.code.lives=30    

.

7.Secret存储敏感数据

Secret主要存储敏感数据,所有的数据要经过bsae64编码

应用场景:凭据

kubectl create secret支持三种数据类型:

  • docker-registry:存储镜像仓库认证信息
  • generic:密码
  • tls:存储证书,例从文件、目录或者字符串创建,例如存储用户名如HTTPS证书

Pod可以用三种方式来使用Secret:

  • 作为挂载到一个或多个容器上的卷中文件
  • 由k8s在为Pod拉取镜像时使用
  • 作为容器的环境bian liang

支持的类型,针对这些类型,Kubernetes 所执行的合法性检查操作以及对其所实施的限制各不相同。

内置类型 用法
Opaque 用户定义的任意数据
kubernetes.io/service-account-token 服务账号令牌
kubernetes.io/dockercfg ~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson ~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth 用于基本身份认证的凭据
kubernetes.io/ssh-auth 用于 SSH 身份认证的凭据
kubernetes.io/tls 用于 TLS 客户端或者服务器端的数据
bootstrap.kubernetes.io/token 启动引导令牌数据

通过为 Secret 对象的 type 字段设置一个非空的字符串值,你也可以定义并使用自己 Secret 类型。如果 type 值为空字符串,则被视为 Opaque 类型。 Kubernetes 并不对类型的名称作任何限制。不过,如果你要使用内置类型之一, 则你必须满足为该类型所定义的所有要求。

8.创建Secret

创建一个空的 Opaque 类型 Secret 对象

kubectl create secret generic empty-secret
1.基本身份认证 Secret

键值都是 base64 编码的字符串。

也可以在创建 Secret 时使用 stringData 字段来提供明文形式的内容

#echo "admin" | base64 
YWRtaW4K

#echo "YWRtaW4K" | base64 -d
admin
apiVersion: v1
kind: Secret
metadata:
name: secret-basic-auth
type: kubernetes.io/basic-auth
stringData:
username: admin
password: t0p-Secret
2.SSH 身份认证 Secret
apiVersion: v1
kind: Secret
metadata:
name: secret-ssh-auth
type: kubernetes.io/ssh-auth
data:
# 此例中的实际数据被截断
ssh-privatekey: |
       MIIEpQIBAAKCAQEAulqb/Y ...
3.TLS Secret
apiVersion: v1
kind: Secret
metadata:
name: secret-tls
type: kubernetes.io/tls
data:
# 此例中的数据被截断
tls.crt: |
     MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
tls.key: |
     MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...

使用 kubectl 来创建 TLS Secret L

kubectl create secret tls my-tls-secret \
--cert=path/to/cert/file \
--key=path/to/key/file
4.启动引导令牌 Secret

清单文件形式

apiVersion: v1
kind: Secret
metadata:
name: bootstrap-token-5emitj
namespace: kube-system
type: bootstrap.kubernetes.io/token
data:
auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4=
expiration: MjAyMC0wOS0xM1QwNDozOToxMFo=
token-id: NWVtaXRq
token-secret: a3E0Z2lodnN6emduMXAwcg==
usage-bootstrap-authentication: dHJ1ZQ==
usage-bootstrap-signing: dHJ1ZQ==

.

9.存储方式使用 Secret

多个 Pod 可以引用同一个 Secret

# 全部映射
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret

控制 Secret 键名在存储卷中映射的的路径

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      items:
      - key: username
        path: my-group/my-username

.

10.环境变量方式使用Secret

使用来自环境变量中的 Secret 值

apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
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

.

11.包含 SSH 密钥的 Pod

创建一个包含 SSH 密钥的 Secret:

kubectl create secret generic ssh-key-secret \
--from-file=ssh-privatekey=/path/to/.ssh/id_rsa \
--from-file=ssh-publickey=/path/to/.ssh/id_rsa.pub

现在我们可以创建一个 Pod,令其引用包含 SSH 密钥的 Secret,并通过存储卷来使用它:

apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
labels:
 name: secret-test
spec:
volumes:
  - name: secret-volume
    secret:
      secretName: ssh-key-secret
  containers:
  - name: ssh-test-container
    image: mySshImage
    volumeMounts:
    - name: secret-volume
      readOnly: true
      mountPath: "/etc/secret-volume"

容器中的命令运行时,密钥的片段可以在以下目录找到:

/etc/secret-volume/ssh-publickey
/etc/secret-volume/ssh-privatekey

然后容器可以自由使用 Secret 数据建立一个 SSH 连接。

12.镜像仓库认证

将镜像仓库认证凭据保存在k8s Secret中

kubectl create secret docker-registry registry-auth --docker-username=admin --dcoker-password=Harbor12345  --docker-server=192.168.122.70

在yaml中使用这个认证凭据

kubectl create secret docker-registry registry-auth --docker-username=admin --docker-password=Harbor12345 --docker-server=192.168.122.70

.

推荐阅读