Kubernetes 中 Secrets 对象的使用

最近在抽取微服务配置信息时,调研了 K8s Secrets 对象 ,在此与大家分享。
Kubernetes(以下简称 K8s) Secrets 官方文档:
kubernetes.io/docs/user-g…

Secrets 概述

K8s 中 Secrets 是一个包含少量敏感信息如密码,令牌,或秘钥的对象。这些信息可能被保存在 pod 定义或者 docker 镜像中,把这些信息保存在 Secrets 对象中,可以在这些信息被使用时加以控制,并可以降低信息泄露的风险。点击 Secret 设计文档 查看更多信息。

下面我们以 blog-service 为例,实现把 db 信息保存在 K8s Secrets 对象中,并在 blog-service 中读取 Secrets 对象中的 db 信息。

1. 创建 K8s secret 对象

K8s Secrets 中保存的数据都必须经过 base64加密,我们可以通过 echo 命令为数据加密:

root@ubuntu:~/Carrotzpc/devops/yamls#  echo -n "carrot" | base64
Y2Fycm90
root@ubuntu:~/Carrotzpc/devops/yamls#  echo -n "192.168.5.1" | base64
MTkyLjE2OC41LjE=
root@ubuntu:~/Carrotzpc/devops/yamls# echo -n "3306" | base64
MzMwNg==复制代码

建立如下 secret.yaml 文件,db 相关配置信息填写在 data 字段中:

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
  namespace: carrot
type: Opaque
data:
  # base64
  carrot-db-name: Y2Fycm90
  carrot-db-username: Y2Fycm90
  carrot-db-password: Y2Fycm90
  carrot-db-host: MTkyLjE2OC41LjE=
  carrot-db-port: MzMwNg==复制代码

创建 Secrets 对象 db-secret

root@ubuntu:~/Carrotzpc/devops/yamls# kubectl create -f secret.yaml
secret "db-secret" created
root@ubuntu:~/Carrotzpc/devops/yamls# kubectl get secret db-secret --namespace=carrot -o yaml
apiVersion: v1
data:
  carrot-db-host: MTkyLjE2OC41LjE=
  carrot-db-name: Y2Fycm90
  carrot-db-password: Y2Fycm90
  carrot-db-port: MzMwNg==
  carrot-db-username: Y2Fycm90
kind: Secret
metadata:
  creationTimestamp: 2016-08-03T10:45:19Z
  name: db-secret
  namespace: carrot
  resourceVersion: "10186771"
  selfLink: /api/v1/namespaces/carrot/secrets/db-secret
  uid: 5f11a472-5967-11e6-8bc6-005056852444
type: Opaque复制代码

2. 创建 rc 并且在环境变量中引入 Secret 对象

建立 rc.yaml 文件如下:

kind: ReplicationController
apiVersion: v1
metadata:
  name: devops
  namespace: carrot
  labels:
    name: devops
spec:
  replicas: 1
  selector:
    name: devops
  template:
    metadata:
      labels:
        name: devops
    spec:
      containers:
      - name: devops
        image: 192.168.5.1/carrot/devops:v1
        ports:
        - containerPort: 8090
          protocol: TCP
        # 从secret对象中引入数据到环境变量中
        env:
        - name: SECRET_DB_NAME
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: carrot-db-name
        - name: SECRET_DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: carrot-db-username
        - name: SECRET_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: carrot-db-password
        - name: SECRET_DB_HOST
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: carrot-db-host
        - name: SECRET_DB_PORT
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: carrot-db-port
        resources:
          limits:
            cpu: 60m
            memory: 256Mi
        imagePullPolicy: Always
        volumeMounts:
        - name: tenxcloud-time-zone
          mountPath: "/etc/localtime"
          readOnly: true
      # nodeSelector:
      volumes:
      - name: tenxcloud-time-zone
        hostPath:
          path: "/etc/localtime"复制代码

从上面 yaml 文件中可以看出,在声明环境变量时,引入了 db-secret 对象,并且把 db-secret 对象中每个元素都放在了环境变量中,当然还可以通过引入 volume 等方式引入 db-secret 对象,这里就不做介绍了,有兴趣的童鞋可以看下官方文档。下面创建 rc devops:

root@ubuntu:~/Carrotzpc/devops/yamls# kubectl create -f rc.yaml
replicationcontroller "devops" created
root@ubuntu:~/Carrotzpc/devops/yamls# kubectl get pod --namespace=carrot
NAME           READY     STATUS    RESTARTS   AGE
devops-xws9a   1/1       Running   0          2m
root@ubuntu:~/Carrotzpc/devops/yamls# kubectl exec -it devops-xws9a --namespace=carrot bash
root@devops-xws9a:/opt/nodejs# env
NODE_VERSION=4.2.2
DEVOPS_PORT_8090_TCP_ADDR=10.0.0.117
SECRET_DB_PASSWORD=tenxcloud
HOSTNAME=devops-xws9a
KUBERNETES_PORT=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
DEVOPS_SERVICE_PORT=8090
SECRET_DB_USERNAME=tenxcloud
DEVOPS_PORT_8090_TCP_PORT=8090
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_HOST=10.0.0.1
NPM_CONFIG_LOGLEVEL=info
DEVOPS_PORT_8090_TCP_PROTO=tcp
SECRET_DB_HOST=192.168.5.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/opt/nodejs
SECRET_DB_NAME=tenxcloud
DEVOPS_PORT=tcp://10.0.0.117:8090
DEVOPS_SERVICE_PORT_DEVOPS=8090
SECRET_DB_PORT=3306
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
DEVOPS_PORT_8090_TCP=tcp://10.0.0.117:8090
KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
DEVOPS_SERVICE_HOST=10.0.0.117
KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
AUTHORIZED_KEYS=**None**
_=/usr/bin/env复制代码

我们使用 exec 命令进入容器内部,可以看到我们声明的环境变量,说明我们已经成功引入了 Secrets 对象 db-secret 到环境变量中。现在容器还不能被访问到,下面我们还需要建立一个service

3.创建 Service

建立如下 service.yaml 文件:

kind: Service
apiVersion: v1
metadata:
  name: devops
  namespace: carrot
  labels:
    name: devops
  annotations:
    devops: tcp
spec:
  ports:
  - name: devops
    protocol: TCP
    port: 8090
    targetPort: 8090
  selector:
    name: devops
  # publicIPs:
  # - 192.168.5.2
  deprecatedPublicIPs:
  - 192.168.5.2
  externalIPs:
  - 192.168.5.2复制代码

创建 Service 对象 devops

root@ubuntu:~/Carrotzpc/devops/yamls# kubectl create -f service.yaml
service "devops" created
root@ubuntu:~/Carrotzpc/devops/yamls# kubectl get service devops --namespace=carrot -o yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    devops: tcp
  creationTimestamp: 2016-08-03T11:07:45Z
  labels:
    name: devops
  name: devops
  namespace: carrot
  resourceVersion: "10187506"
  selfLink: /api/v1/namespaces/carrot/services/devops
  uid: 8166f211-596a-11e6-8bc6-005056852444
spec:
  clusterIP: 10.0.0.13
  deprecatedPublicIPs:
  - 192.168.5.2
  externalIPs:
  - 192.168.5.2
  ports:
  - name: devops
    port: 8090
    protocol: TCP
    targetPort: 8090
  selector:
    name: devops
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}复制代码

blog-service 数据库配置文件 db.js 中读取这些环境变量:

'use strict'
const env = process.env
const database = {
  db: env.SECRET_DB_NAME,
  username: env.SECRET_DB_USERNAME,
  password: env.SECRET_DB_PASSWORD,
}

module.exports = database复制代码

小结

这样一个完整的使用 K8s Secrets 对象存储 db 配置信息的 blog-service 就建好了,db-secret 这个Secrets 对象可以同时被多个容器使用,这样可以解决数据库在不同服务中的配置问题。当 Secrets 对象被更新,重建使用 Secrets 对象的 pod 后,环境变量里面的对应信息会被更新。上面我们提到可以通过引入 volume 的方式引入 Secrets 对象,这样做有一个好处就是当 Secrets 对象更新后,引入 pod 中的 Secrets 对象也会同步更新,当然更新时间取决于 K8s 的同步周期。

原文请移步我的博客 noder.xyz/simple-use-…

转载于:https://juejin.im/post/586cd4e9128fe10058368e4d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值