kind: ConfigMap apiVersion: v1 metadata: name: example-config namespace: default data: example.property.1: hello #key-value形式,key规则必须知足dns域名规则。value为字符串。 example.property.2: world example.property.file: |- #配置文件使用方式,直接把文件内容放入value便可 property.1=value-1 property.2=value-2 property.3=value-3
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: example-config #须要使用的ConfigMap名称,必须已经存在 key: example.property.1 #对应ConfigMap data 的key restartPolicy: Never
设置结果redis
SPECIAL_LEVEL_KEY=hello
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: example-config key: example.property.1 - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: example-config key: example.property.2 restartPolicy: Never
运行结果:docker
hello world
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh","-c","ls -l /etc/config/path/" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: example-config items: - key: example.property.1 path: path/one/example.property.1 - key: example.property.2 path: path/two/example.property.2 - key: example.property.file path: path/file/example.property.file restartPolicy: Never
建立的文件以下:json
└── path ├── file │ └── example.property.file ├── one │ └── example.property.1 └── two └── example.property.2 #cat example.property.1 hello #cat example.property.2 world #cat example.property.file property.1=value-1 property.2=value-2 property.3=value-3
注意:ubuntu
假设个人项目结构以下(项目路径为/usr/local):api
. ├── Dockerfile ├── Makefile ├── app.conf ├── controllers │ └── pod.go └── main.go
我只想把app.conf文件从ConfigMap挂载进来,其余文件保持不变,如今应该怎么作呢? 好,咱们开始。bash
假设个人ConfigMap以下:app
apiVersion: v1 kind: ConfigMap metadata: name: test-cfgmap data: app.conf: file data
可使用下面的定义文件使用ConfigMap:ssh
apiVersion: v1 kind: Pod metadata: name: test-pd-plus-cfgmap spec: containers: - image: ubuntu name: bash volumeMounts: - mountPath: /usr/local/app.conf name: cfgmap subPath: app.conf volumes: - name: cfgmap configMap: name: test-cfgmap
注意,这种方式使用ConfigMap, ConfigMap的key、 volumeMounts.mountPath和volumeMounts.subPath名称必定要保持一致,不然会挂载不成功。google
apiVersion: v1 kind: Pod metadata: name: test-pd-plus-cfgmap spec: containers: - image: ubuntu name: bash volumeMounts: - mountPath: /usr/local/app.conf name: cfgmap subPath: app.conf volumes: - name: cfgmap configMap: name: test-cfgmap items: - key: app.conf path: app.conf
注意,这种方式使用ConfigMap,就再也不要求 ConfigMap的key跟挂载的文件名必须一致,但须要在items指定key和path对应关系。加密
固然,若是你愿意,你也能够挂载ConfigMap到一个其它路径,而后经过软链接的方式连接到你须要的文件。
例如当咱们须要按照以下配置来启动Redis
maxmemory 2mb maxmemory-policy allkeys-lru
首先,让咱们来建立一个ConfigMap:
apiVersion: v1 data: redis-config: | maxmemory 2mb maxmemory-policy allkeys-lru kind: ConfigMap metadata: name: example-redis-config namespace: default
下面咱们来建立一个Pod来使用它:
apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: kubernetes/redis:v1 env: - name: MASTER value: "true" ports: - containerPort: 6379 volumeMounts: - mountPath: /redis-master name: config volumes: - name: config configMap: name: example-redis-config items: - key: redis-config path: redis.conf #指定生成的配置文件名称
当咱们建立完Pod后,进入它: 生成的配置文件以下:
redis-master `-- redis.conf -> ..data/redis.conf
咱们发如今redis-master 目录下生成了一个文件redis.conf ,对应咱们上面path定义的文件名。输出一下redis.conf内容:
maxmemory 2mb maxmemory-policy allkeys-lru
下面咱们看一下redis的配置:
$ kubectl exec -it redis redis-cli 127.0.0.1:6379> CONFIG GET maxmemory 1) "maxmemory" 2) "2097152" 127.0.0.1:6379> CONFIG GET maxmemory-policy 1) "maxmemory-policy" 2) "allkeys-lru"
符合咱们的预期。
注意: 虽然使用configMap能够很方便的把咱们配置文件放入到容器中,但必定注意配置文件的大小,(尽可能控制在1M之内)更不能滥用ConfigMap,不然可能会给apiserver和etcd形成较大压力,影响整个集群。
当须要使用一些敏感的配置,好比密码,证书等信息时,建议使用Secret。
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm
注意: Secret 的value必须通过base64, 以上明文为: username: admin password: 1f2d1e2e67df ,能够直接使用 echo -n "1f2d1e2e67df" | base64 进行base64,或者到这里能够进行base64加密解密
apiVersion: v1 kind: Pod metadata: name: mypod namespace: default spec: containers: - image: redis name: mypod volumeMounts: - mountPath: /etc/foo name: foo readOnly: true volumes: - name: foo secret: defaultMode: 420 #0644默认文件权限,因为json文件不支持八进制,使用json时应使用十进制 secretName: mysecret
运行结果:在/etc/foo/目录下生成两个文件username和password
foo/ |-- password -> ..data/password `-- username -> ..data/username #cat username admin #cat password 1f2d1e2e67df
注意: 自动更新: 当Secrets被更新时,已经挂载的pod不会当即更新,而要等待kubelete检查周期,kubelet会按期检查secret变化并更新它。
apiVersion: v1 kind: Pod metadata: name: secret-env-pod spec: containers: - name: mycontainer image: redis env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret #指定secret名称 key: username #要使用的key - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password
$ echo $SECRET_USERNAME admin $ echo $SECRET_PASSWORD 1f2d1e2e67df
apiVersion: v1 kind: Secret metadata: name: image-test-secret namespace: default type: kubernetes.io/dockerconfigjson data: .dockerconfigjson: ew0KCSJhdXRocyI6IHsNCgkJImltYWdlLXRlc3QiOiB7DQoJCQkiYXV0aCI6ICJjbTl2ZERweWIyOTAiLA0KCQkJImVtYWlsIjogIiINCgkJfQ0KCX0NCn0=
加密部分的明文为:
{ "auths": { "image-test": { "auth": "cm9vdDpyb290", # 密文为"root:rootbase64"的结果 "email": "" } } }
部署文件使用以下:
apiVersion: v1 kind: Pod metadata: name: foo namespace: default spec: containers: - name: foo image: janedoe/awesomeapp:v1 imagePullSecrets: - name: image-test-secret
kind: Secret apiVersion: v1 metadata: name: client-certs namespace: default data: ca.pem: *** #实际使用请替换成通过base64加密后的内容 kubernetes.pem: *** kubernetes-key.pem: ***
使用deployment部署:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: redis spec: replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis ports: - containerPort: 8080 volumeMounts: - mountPath: /etc/kubernetes/certs name: my-certs volumes: - name: my-certs secret: secretName: client-certs items: - key: ca.pem path: ca.pem - key: kubernetes.pem path: kubernetes.pem - key: kubernetes-key.pem path: kubernetes-key.pem imagePullSecrets: - name: image-test-secret