Kubernetes 中 Secrets 對象的使用

最近在抽取微服務配置信息時,調研了 K8s Secrets 對象 ,在此與你們分享。
Kubernetes(如下簡稱 K8s) Secrets 官方文檔:
kubernetes.io/docs/user-g…javascript

Secrets 概述

K8s 中 Secrets 是一個包含少許敏感信息如密碼,令牌,或祕鑰的對象。這些信息可能被保存在 pod 定義或者 docker 鏡像中,把這些信息保存在 Secrets 對象中,能夠在這些信息被使用時加以控制,並能夠下降信息泄露的風險。點擊 Secret 設計文檔 查看更多信息。java

下面咱們以 blog-service 爲例,實現把 db 信息保存在 K8s Secrets 對象中,並在 blog-service 中讀取 Secrets 對象中的 db 信息。node

1. 建立 K8s secret 對象

K8s Secrets 中保存的數據都必須通過 base64加密,咱們能夠經過 echo 命令爲數據加密:git

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 字段中:github

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-secretdocker

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:ubuntu

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 到環境變量中。如今容器還不能被訪問到,下面咱們還須要創建一個serviceapi

3.建立 Service

創建以下 service.yaml 文件:bash

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-…

相關文章
相關標籤/搜索