7.1.配置容器化应用程序

7.2.向容器传递命令行参数

7.2.1.待Docker中定义命令与参数

1.了解ENTRYPOINT与CMD

  ENTRYPOINT定义容器启动时被调用的可以执行程序

  CMD指定传递给ENTRYP的参数

dockerfile 内容如下

FROM daocloud.io/centos:latestADD aaa /usr/local/aaaCMD ["-f","/var/log/aa.log"]
ENTRYPOINT ["tail"]

当启动镜像时,容器启动时执行如下命令:tail -f /var/log/aa.log

或者在docker run <images> <arguments> 中指定,arguments会覆盖CMD中内容

7.2.2.在kubernetes中覆盖命令行和参数

在k8s中定义容器时,镜像的ENTRYPOINT和CMD都可以被覆盖,仅需在容器定义中设置熟悉command和args的值

对应参数如下:

Docker kubernetes 描述
ENTRYPOINT command 容器中运行的可执行文件
CMD args 传给可执行文件的参数

相关yml代码如下:

kind: pod
spec:containers:- image: some/imagecommand: ["/bin/command"]args: ["args1","args2","args3"]

  

7.3.为容器设置环境变量

7.3.1.在容器定义中指定环境变量

与容器的命令和参数设置相同,环境变量列表无法在pod创建后被修改。

在pod的yml文件中设置容器环境变量代码如下:

kind: pod
spec:containers:- image: luksa/fortune:envenv:- name: INTERVALvalue: "30"name: value-test-yh

  

7.3.2.在环境变量值中引用其他环境变量

使用$( VAR )引用环境变量,

相关ym代码如下:

env:
- name: FIRST_VARvalue: "foo"
- name: SECOND_VARvalue: "$(FIRST_VAR)bar"   //最终变量值为foobar

7.4.利用ConfigMap解耦配置

7.4.1.ConfigMap介绍

kubernetes允许将配置选项分离到独立的资源对象ConfigMap中,本质上就是一个键/值对映射,值可以是短字面变量,也可以是完整的配置文件。

应用无须直接读取ConfigMap,甚至根本不需要知道其是否存在。

映射的内容通过环境变量或者卷文件的形式传递给容器,而并非直接传递给容器,命令行参数的定义中也是通过$(ENV_VAR)语法变量

7.4.2.创建ConfigMap

使用kubectl creat configmap创建ConfigMap中间不用加-f。

1.使用指令创建ConfigMap

#kubectl creat configmap configmap-yaohong --from-literal=foo=bar --from-literal=sleep-interval=25

2.从文件内容创建ConfigMap条目

#kubectl create configmap my-conf-yh --from-file=config-file.conf

使用如下命令,会将文件内容存储在自定义的条目下。与字面量使用相同

#kubectl create configmap my-conf-yh --from-file=customkey=config-file.conf 

3.从文件夹创建ConfigMap

#kubectl create configmap my-conf-yh --from-file=/path/to/dir

4.合并不同选项

#kubectl create configmap my-conf-yh --from-file=/path/to/dir/--from-file=bar=foobar.conf--from-literal=some=thing

  

5.获取ConfigMap

#kubectl -n <namespace> get configmap

  

7.4.3.给容器传递ConfigMap条目作为环境变量

引用环境变量中的参数值给当前变量

apiVersion: v1
kind: pod
metadata:name: fortune-env-from-configmap
spec:containers:- image: luksa/fortune:envenv:- name: INTERVAL                  //设置环境变量valueFrom:configMapkeyRef:name: fortune-configmap     key: sleep-interval         //变量的值取自fortune-configmap的slee-interval对应的值

  

7.4.4.一次性传递ConfigMap的所有条目作为环境变量

apiVersion: v1
kind: pod
metadata:name: fortune-env-from-configmap
spec:containers:- image: luksa/fortune:envenvFrom:- prefix: CONFIG_confgMapRef:name: my-confg-map    //引用my-config-map的ConfigMap并在变量前面都加上CONFIG_

  

7.4.5.使用ConfigMap卷将条目暴露为文件

apiVersion: v1
kind: pod
metadata:name: configmap-volume-yh
spec:containers:- image: nginx:aplinname: web-servervolumeMounts:...- name: config      defaultMode: "6600"     //设置文件的权限为rw-rwmountPath: /etc/nginx/con.conf      subPath: my.conf        //subPath字段可以用于挂载卷中某个独立的文件或者文件夹,而且不覆盖该卷下其他文件...volume:...- name: configconfigMap:name: fortune-config     //引用fortune-config configMap的卷,然后挂载在/etc/nginx/conf.d

  可以使用如下命令查看到/etc/nginx/conf.d文件下面包含fortune-config

#kubectl exec config-volume-yh -c web-server ls /etc/nginx/conf.d

  

7.5.使用Secert给容器传递敏感数据

7.5.1.介绍Secert

Secret结构和ConfigMap类似,均是键/值对的映射。

使用方法也和ConfigMap一样,可以:

  1.将Secret条目作为环境变量传递给容器,

  2.将Secret条目暴露为卷中文件

ConfigMap存储非敏感的文本配置数据,采用Secret存储天生敏感的数据

7.5.2.默认令牌Secret

1.查看secret

# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-x9cjb   kubernetes.io/service-account-token   3      78d

2.描述secret

# kubectl describe secrets default-token-x9cjb
Name:         default-token-x9cjb
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: defaultkubernetes.io/service-account.uid: 64a41a09-98ce-11e9-9fa5-fa163e6fdb6bType:  kubernetes.io/service-account-tokenData
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5lduaW8vc2VydmljZTxCv6HdtP-ZW3ZC2IKKR5YBhaokFIl35mix79pU4Ia2pJ_fuPTBGNyrCHyNQYH4ex5DhND3_b2puQmn8RSErQ
ca.crt:     1298 bytes
namespace:  7 bytes

7.5.3.创建Secret

1.创建一个名为https-yh的generic secret

#kubectl create secret generic https-yh --from-file=https.key  --from-file=https.cert  --from-file=foo

2.创建一个secret.yaml文件,内容用base64编码

$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm

yaml文件内容:

apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rm

创建:

$ kubectl create -f ./secret.yaml
secret "mysecret" created

解析Secret中内容

$ kubectl get secret mysecret -o yaml
apiVersion: v1
data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rm
kind: Secret
metadata:creationTimestamp: 2016-01-22T18:41:56Zname: mysecretnamespace: defaultresourceVersion: "164619"selfLink: /api/v1/namespaces/default/secrets/mysecretuid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque

base64解码:

$ echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
1f2d1e2e67df

  

7.5.4.对比ConfigMap与Secret

Secret的条目内容会进行Base64格式编码,而ConfigMap直接以纯文本展示。

1.为二进制数据创建Secret

  Base64可以将二进制数据转换为纯文本,并以YAML或Json格式进行展示

  但要注意Secret的大小限制是1MB

2.stringDate字段介绍

  Secret可以通过StringDate字段设置条目的纯文本

kind: Secret
apiVersion: v1
stringDate:foo: plain txt
date:https.cert: HGIOPUPSDF63456BJ3BBJL34563456BLKJBK634563456BLBKJBLKJ63456BLK3456LKhttp.key: OHOPGPIU42342345OIVBGOI3456345OVB6O3456BIPO435B6IPU345UI

  

7.5.5.在pod中使用Secret

secret可以作为数据卷挂载或者作为环境变量暴露给Pod中的容器使用,也可以被系统中的其他资源使用。比如可以用secret导入与外部系统交互需要的证书文件等。

在Pod中以文件的形式使用secret

  1. 创建一个Secret,多个Pod可以引用同一个Secret
  2. 修改Pod的定义,在spec.volumes[]加一个volume,给这个volume起个名字,spec.volumes[].secret.secretName记录的是要引用的Secret名字
  3. 在每个需要使用Secret的容器中添加一项spec.containers[].volumeMounts[],指定spec.containers[].volumeMounts[].readOnly = truespec.containers[].volumeMounts[].mountPath要指向一个未被使用的系统路径。
  4. 修改镜像或者命令行使系统可以找到上一步指定的路径。此时Secret中data字段的每一个key都是指定路径下面的一个文件名

下面是一个Pod中引用Secret的列子:

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"readOnly: truevolumes:- name: foosecret:secretName: mysecret

每一个被引用的Secret都要在spec.volumes中定义

如果Pod中的多个容器都要引用这个Secret那么每一个容器定义中都要指定自己的volumeMounts,但是Pod定义中声明一次spec.volumes就好了。

映射secret key到指定的路径

可以控制secret key被映射到容器内的路径,利用spec.volumes[].secret.items来修改被映射的具体路径

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"readOnly: truevolumes:- name: foosecret:secretName: mysecretitems:- key: usernamepath: my-group/my-username

发生了什么呢?

  • username被映射到了文件/etc/foo/my-group/my-username而不是/etc/foo/username
  • password没有变

Secret文件权限

可以指定secret文件的权限,类似linux系统文件权限,如果不指定默认权限是0644,等同于linux文件的-rw-r--r--权限

设置默认权限位

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"volumes:- name: foosecret:secretName: mysecretdefaultMode: 256

上述文件表示将secret挂载到容器的/etc/foo路径,每一个key衍生出的文件,权限位都将是0400

由于JSON不支持八进制数字,因此用十进制数256表示0400,如果用yaml格式的文件那么就很自然的使用八进制了

同理可以单独指定某个key的权限

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"volumes:- name: foosecret:secretName: mysecretitems:- key: usernamepath: my-group/my-usernamemode: 511

从volume中读取secret的值

值得注意的一点是,以文件的形式挂载到容器中的secret,他们的值已经是经过base64解码的了,可以直接读出来使用。

$ ls /etc/foo/
username
password
$ cat /etc/foo/username
admin
$ cat /etc/foo/password
1f2d1e2e67df

被挂载的secret内容自动更新

也就是如果修改一个Secret的内容,那么挂载了该Secret的容器中也将会取到更新后的值,但是这个时间间隔是由kubelet的同步时间决定的。最长的时间将是一个同步周期加上缓存生命周期(period+ttl)

特例:以subPath形式挂载到容器中的secret将不会自动更新

以环境变量的形式使用Secret

  1. 创建一个Secret,多个Pod可以引用同一个Secret
  2. 修改pod的定义,定义环境变量并使用env[].valueFrom.secretKeyRef指定secret和相应的key
  3. 修改镜像或命令行,让它们可以读到环境变量
apiVersion: v1
kind: Pod
metadata:name: secret-env-pod
spec:containers:- name: mycontainerimage: redisenv:- name: SECRET_USERNAMEvalueFrom:secretKeyRef:name: mysecretkey: username- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: passwordrestartPolicy: Never

容器中读取环境变量,已经是base64解码后的值了:

$ echo $SECRET_USERNAME
admin
$ echo $SECRET_PASSWORD
1f2d1e2e67df

使用imagePullSecrets

创建一个专门用来访问镜像仓库的secret,当创建Pod的时候由kubelet访问镜像仓库并拉取镜像,具体描述文档在 这里

设置自动导入的imagePullSecrets

可以手动创建一个,然后在serviceAccount中引用它。所有经过这个serviceAccount创建的Pod都会默认使用关联的imagePullSecrets来拉取镜像,

转载于:https://www.cnblogs.com/yaohong/p/11505670.html

kubernetes ConfigMap和Secret:配置应用程序相关推荐

  1. kubernetes—ConfigMap 与 Secret

    目录 一.ConfigMap(配置地图)介绍 1.开发中的困难 2.ConfigMap 的功能 3. 创建ConfigMap - 从目录创建 4.查看ConfigMap 5.创建ConfigMap - ...

  2. Kubernetes笔记(8) - ConfigMap和Secret

    ConfigMap 创建ConfigMap对象 基于字面值创建 基于文件创建 基于目录创建 使用配置清单创建 通过环境变量传递ConfigMap数据 envFrom 通过ConfigMap存储卷传递数 ...

  3. kubernetes系列12—二个特色的存储卷configmap和secret

    本文收录在容器技术学习系列文章总目录 1.configmap 1.1 认识configmap ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件.ConfigMa ...

  4. 零代码变更,巧用 Reloader 快速实现 Kubernetes 的 Configmap 和 Secret 热更新

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 1背景 1.1 配置中心问题 在云原生中配置中心,例如:Configmap和Secret对象,虽然可以进行直接更新 ...

  5. Kubernetes 中的 Secret加密存储

    目录 前言 sealed-secrets是什么 安装部署 安装kubeseal 安装控制器 测试 安装web-ui web-ui官网地址 使用helm直接安装 缺点 前言 在使用Kubernetes的 ...

  6. .NET Core开发实战(第10课:环境变量配置提供程序)--学习笔记

    10 | 环境变量配置提供程序:容器环境下配置注入的最佳途径 环境变量的配置提供程序主要适应场景: 1.在 Docker 中运行时 2.在 Kubernetes 中运行时 3.需要设置 ASP.NET ...

  7. 容器编排技术 -- Kubernetes kubectl create secret generic 命令详解

    容器编排技术 -- Kubernetes kubectl create secret generic 命令详解 1 kubectl create secret generic 2 语法 3 示例 4  ...

  8. 小程序 移植 云开发_使用Kubernetes探索跨云的应用程序可移植性

    小程序 移植 云开发 本文与Lindsey Tulloch共同撰写. 在一个快速迁移到云的世界中,投资者,客户和开发人员正在屏息地注视着"云战争". 随着云巨头的崛起以及新型基础架 ...

  9. 自定义Kubernetes调度程序来编排高可用性应用程序

    自定义Kubernetes调度程序来编排高可用性应用程序 只要愿意遵守规则,在Kubernetes上进行部署和乘飞机旅行就可以很愉快.通常,事情会"正常工作".但是,如果有兴趣与必 ...

最新文章

  1. Educational Codeforces Round 93 (Rated for Div. 2) 题解
  2. 挑战极限--有本事拿.Net+SQL SERVER试试4秒极限!
  3. 数据库的这些性能优化,你做了吗
  4. libsvm中数据归一化的重要性
  5. OAuth 2.0 授权码请求
  6. 前端性能优化—回流与重绘
  7. 机器学习系列-AdaBoost
  8. CentOS5.2下安装yum
  9. 微信小程序底部导航栏未读消息出现小红点的实现
  10. 一次PHP网站木马查杀记录
  11. iOS开发者的一些前端感悟
  12. Swift上写百度地图记录
  13. 图解Adobe Flash Player 浏览器插件安装
  14. JAVA创建一个Box类(长方体),在Box类中定义三个变量,分别表示长方体的长(length)、宽(width)和高(heigth)
  15. 《Microduino实战》——3.5 I/O操作——现学现用
  16. 吴忌寒入选福布斯2019最年轻亿万富豪榜;黑客已将价值近千万EOS偷跑 | 1分钟链圈...
  17. 2009年必看十大动漫游戏改编电影
  18. 2017年由Unity员工打造的最爱
  19. 京东一面+京东物流二面+京东秋招一二面
  20. 及其简单的一种获得提取码的方法

热门文章

  1. JavaScript字符串判断某个字符是否存在
  2. 4.8 迁移数据,添加根路径
  3. Yii 2 —— Backend自动出现登录页
  4. MVC Controller中View(model)如何在 View中的index页面获得?
  5. 分布式文件系统之MogileFS的使用
  6. ubuntu使用ssh登入不执行.bashrc解决方法
  7. python四大高阶函数_Python里的高阶函数
  8. php accept-length,php中Accept-Length获取不到下载文件的大小
  9. extjs 按钮小箭头展开panel_汽车按钮都是英文看不懂?视频教你认清车内所有按钮,看完秒懂...
  10. batchplot 3.6.2 插件_直播插件体系设计