使用vault管理Kubernetes Secret

vault+k8s
vault-agent workflow

我们通过vault的secret(version1 kv)backend来进行管理secret中的key/value,通过我们的vault-agent来动态(每隔SECRET_REFRESH_TIME秒来获取这些既定路径的secret,并写到K8S的secret中。
比如我们写入以下key/value

vault write secret/projects/georgesreinc-test/services/foo/defaults/test1 value=value1
vault write secret/projects/georgesreinc-test/services/bar/defaults/test1 value=value1
vault write secret/projects/georgesreinc-test/services/bar/defaults/test2 value=value2
vault write secret/projects/georgesreinc-test/services/baz/namespaces/ops/apikey value=secret

kubectl create namespace ops
kubectl create namespace stable
kubectl create namespace all-apps
kubectl create namespace foo
kubectl create namespace wrong
kubectl apply -f - <<-EOF
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: vault-agent.app-config
  namespace: ops
data:
  apps: |-
    - baz
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: vault-agent.app-config
  namespace: all-apps
data:
  apps: ALL
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: vault-agent.app-config
  namespace: foo
data:
  apps: foo
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: vault-agent.app-config
  namespace: wrong
data:
  apps: |-
    - baz
    - ALL
EOF

我们的k8s中自动创建出来的secret条目如下所示:

kubectl get secret --all-namespaces | grep service-secrets should yield something that looks like:

all-apps      bar.service-secrets               Opaque                                2         19m
all-apps      foo.service-secrets               Opaque                                1         19m
foo           foo.service-secrets               Opaque                                1         19m
ops           baz.service-secrets               Opaque                                1         19m
stable        bar.service-secrets               Opaque                                2         19m
stable        foo.service-secrets               Opaque                                1         19m
wrong         bar.service-secrets               Opaque                                2         19m
wrong         foo.service-secrets               Opaque                                1         19m

vault-agent基本上可以实现:

  • 控制某个secret只能创建在某个/些指定的namespaces中
  • 动态更新secret中的key/value值
  • 每隔SECRET_REFRESH_TIME秒更新一次secret

先决条件

  • 已经存在了一个k8s(本文用docker for mac自带的Kubernetes,设置的教程见https://docs.docker.com/docker-for-mac/#kubernetes
  • k8s已经安装集成helm
  • 已经存在了一个vault(我们会在mac本地系统起一个测试vault)

设置用于测试的vault server

符合生产环境的vault搭建会写在以后的文章中,本文直接在mac上启动一个dev版本的vault server并且做最简单的设置

我们按照官方的学习文档来启动一个dev vault server,简单的步骤如下:
https://learn.hashicorp.com/vault/getting-started/dev-server

  • 安装vault server
    brew install vault

  • 启动vault server

 georgehe@Sha-51664-Mbp  ~  vault server -dev -dev-listen-address=0.0.0.0:8200
==> Vault server configuration:

             Api Address: http://0.0.0.0:8200
                     Cgo: disabled
         Cluster Address: https://0.0.0.0:8201
              Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
               Log Level: info
                   Mlock: supported: false, enabled: false
                 Storage: inmem
                 Version: Vault v1.1.2
             Version Sha: 0082501623c0b704b87b1fbc84c2d725994bac54

WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
and starts unsealed with a single unseal key. The root token is already
authenticated to the CLI, so you can immediately begin using Vault.

You may need to set the following environment variable:

    $ export VAULT_ADDR='http://0.0.0.0:8200'

The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.

Unseal Key: x4np0Bh3/h5xfxw1hqV0JCdz7QUbpVu90G4YJZ1GdSo=
Root Token: s.w8c22AWPXvyqS7d9cZDdw9Lu

Development mode should NOT be used in production installations!

==> Vault server started! Log data will stream in below:
  • 访问vault server
    我们要得到mac的IP地址(DHCP)
ifconfig en0 | grep "inet "
    inet 192.168.31.185 netmask 0xffffff00 broadcast 192.168.31.255

我们的vault访问地址为:http://192.168.31.185:8200

  • 测试vault的可用性,及写入两个用于测试的k/v
$ export VAULT_ADDR=http://192.168.31.185:8200
$ vault status
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    1
Threshold       1
Version         1.1.2
Cluster Name    vault-cluster-79c802fc
Cluster ID      26bef5d1-febd-0319-6170-07808889b9b7
HA Enabled      false

$ vault login token=s.w8c22AWPXvyqS7d9cZDdw9Lu

$ vault secrets disable secret
$ vault secrets enable -path=secret kv

$ vault write secret/projects/georgeinc/services/test-app/defaults/key1 value=value1

$ vault list secret/projects/georgeinc/services/test-app/defaults/

Keys
----
key1

$ vault read secret/projects/georgeinc/services/test-app/defaults/key1

Key                 Value
---                 -----
refresh_interval    768h
value               value1

Using dev mode with KV v1 by default #111
我们用的dev模式,默认secret是version2版本,所以我们先disable secret再重新启用version1的secret backend

后面我们期待生成的secret名字为test-app.service-secrets,里面有key1=value1的内容,此secret将默认出现在所有的namespaces下。

使用helm安装vault

  • 加载george-sre helm repo
helm repo add george-sre 'https://raw.githubusercontent.com/george-sre/helm-repo-in-github/master/'
helm repo update
helm search vault-agent
  • 安装vault-agent Chart
helm install --debug george-sre/vault-agent                  \
  --name vault-agent                                         \
  --set project=georgeinc                                    \
  --set vault_addr=http://192.168.31.185:8200                \
  --set vault_token=s.w8c22AWPXvyqS7d9cZDdw9Lu
  • 验证helm的安装
helm list
NAME        REVISION    UPDATED                     STATUS      CHART               APP VERSION NAMESPACE
vault-agent 1           Mon May 27 15:39:56 2019    DEPLOYED    vault-agent-0.1.0   1.0         default

kubectl get pod
NAME                           READY     STATUS    RESTARTS   AGE
vault-agent-77964b9fbb-xfbkt   1/1       Running   0          34s
  • 验证secret的创建
kubectl get secret --all-namespaces | grep test-app
docker        test-app.service-secrets                         Opaque                                1         14m

kubectl get secret test-app.service-secrets -n docker -o yaml --export
apiVersion: v1
data:
  key1: dmFsdWUx
kind: Secret
metadata:
  creationTimestamp: null
  labels:
    app: test-app
  name: test-app.service-secrets
  selfLink: /api/v1/namespaces/docker/secrets/test-app.service-secrets
type: Opaque

更多关于vault-agent的用法,请移步https://github.com/george-sre/vault-agent

链接

云平台开发运维解决方案@george.sre

个人主页:https://geekgoogle.com

GitHub: https://github.com/george-sre

Mail: george.sre@hotmail.com

简书: georgesre - 简书

欢迎交流~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342