本文收录在容器技术学习系列文章总目录

1、configmap

1.1 认识configmap

  ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。ConfigMap跟secret很类似,但它可以更方便地处理不包含敏感信息的字符串。

1.2 创建configmap

1.2.1 通过命令行

创建一个名为nginx-config的configmap,指定端口和server name

[root@master ~]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=myapp.along.com
configmap/nginx-config created
[root@master ~]# kubectl get cm
NAME DATA AGE
nginx-config 2 11s
[root@master ~]# kubectl describe cm nginx-config
Name: nginx-config
Namespace: default
Labels: <none>
Annotations: <none> Data
====
nginx_port:
----
80
server_name:
----
myapp.along.com
Events: <none>

  

1.2.2 通过文件

(1)准备文件

[root@master ~]# mkdir configmap
[root@master ~]# cd configmap
[root@master configmap]# vim www.conf
server {
server_name myapp.along.com;
listen 80;
root /data/web/html/;
}

  

(2)创建查询认证

[root@master configmap]# kubectl create configmap nginx-www --from-file=./www.conf
configmap/nginx-www created
[root@master configmap]# kubectl get cm
NAME DATA AGE
nginx-config 2 3m
nginx-www 1 5s
[root@master configmap]# kubectl describe cm nginx-www
Name: nginx-www
Namespace: default
Labels: <none>
Annotations: <none> Data
====
www.conf:
----
server {
server_name myapp.along.com;
listen 80;
root /data/web/html/;
} Events: <none>

  

1.3 创建pod使用configmap

1.3.1 pod通过环境变量使用configmap

通过使用环境变量传入pod的configmap,不能实时更新

(1)编写configmap的yaml文件

[root@master configmap]# vim pod-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-1
namespace: default
labels:
app: myapp
tier: frontend
annotations:
along.com/created-by: "cluster admin"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
env:
- name: NGINX_SERVER_PORT
valueFrom:
configMapKeyRef:
name: nginx-config
key: nginx_port
- name: NGINX_SERVER_NAME
valueFrom:
configMapKeyRef:
name: nginx-config
key: server_name

  

(2)创建pod,查询认证

[root@master configmap]# kubectl apply -f pod-configmap.yaml
pod/pod-cm-1 created
[root@master configmap]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-cm-1 1/1 Running 0 41s
---查询pod内部变量
[root@master configmap]# kubectl exec -it pod-cm-1 -- printenv |grep NGINX_SERVER
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=myapp.along.com

  

(3)通过环境变量导入configmap,修改configmap后,pod中内容不会更改

① 使用edit修改configmap,把nginx_port 80改为8080

[root@master configmap]# kubectl edit cm nginx-config
... ...
nginx_port: "8080" #把80改为8080
... ...
configmap/nginx-config edited

② 查询,configmap被修改,但是pod中变量并未修改

因为configmap只是在容器启动时加载生效;现在pod已经创建,再修改,不会生效

------cm已经修改------
[root@master configmap]# kubectl describe cm nginx-config
Data
====
nginx_port:
----
8080
server_name:
----
myapp.along.com
Events: <none>
------但是pod实际没有改变------
[root@master configmap]# kubectl exec -it pod-cm-1 -- printenv |grep NGINX_SERVER
NGINX_SERVER_PORT=80
NGINX_SERVER_NAME=myapp.along.com

  

1.3.2 pod通过存储卷使用configmap

通过使用存储卷传入pod的configmap,可以实时更新

(1)编写configmap的yaml文件,并创建configmap

创建一个volume,使用上边创建好的名为nginx-config的configmap

[root@master configmap]# vim pod-configmap-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-2
namespace: default
labels:
app: myapp
tier: frontend
annotations:
along.com/created-by: "cluster admin"
spec:
volumes:
- name: nginxconf
configMap:
name: nginx-config
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/config.d/
readOnly: true
[root@master configmap]# kubectl apply -f pod-configmap-2.yaml
pod/pod-cm-2 created

  

(2)登入pod中,查询验证

[root@master configmap]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-cm-2 1/1 Running 0 7s
[root@master ~]# kubectl exec -it pod-cm-2 -- /bin/sh
/ # cd /etc/nginx/config.d/
/etc/nginx/config.d # ls
nginx_port server_name
/etc/nginx/config.d # cat nginx_port
80
/etc/nginx/config.d # cat server_name
myapp.along.com

  

(3)通过环境变量导入configmap,修改configmap后,pod中内容会更改

① 使用edit修改configmap,把nginx_port 80改为8080

[root@master ~]# kubectl edit cm nginx-config
apiVersion: v1
data:
nginx_port: "8080"
server_name: myapp.along.com
... ...
configmap/nginx-config edited

② 再登入pod查看,发现已经改变

[root@master ~]# kubectl exec -it pod-cm-2 -- /bin/sh
/ # cat /etc/nginx/config.d/nginx_port
8080/

  

1.4 一个完整的configmap的应用实例

1.4.1 编写创建pod的yaml文件,使用nginx-www的configmap

[root@master configmap]# vim pod-configmap-3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-3
namespace: default
labels:
app: myapp
tier: frontend
annotations:
along.com/created-by: "cluster admin"
spec:
volumes:
- name: nginxconf
configMap:
name: nginx-www
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/conf.d/
readOnly: true

  

1.4.2 创建pod

[root@master configmap]# kubectl apply -f pod-configmap-3.yaml
pod/pod-cm-3 created
[root@master configmap]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-cm-3 1/1 Running 0 24s

  

1.4.3 登入pod,查询配置是否成功

[root@master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh
/ # cat /etc/nginx/conf.d/www.conf
server {
server_name myapp.along.com;
listen 80;
root /data/web/html/;
}
/ # nginx -T |tail -7 #-T查询nginx的配置信息
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/conf.d/www.conf:
server {
server_name myapp.along.com;
listen 80;
root /data/web/html/;
}
---生成nginx的主页内容
/ # mkdir -p /data/web/html
/ # vi /data/web/html/index.html
<h1>Nginx Server configured by CM</h1>

  

1.4.4 在其他节点访问,验证是否成功

(1)在master上新开一个窗口,查询pod对应的IP

[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod-cm-3 1/1 Running 0 7m 10.244.1.124 node2

  

(2)在任意节点上配置host,使其能连通此pod

[root@node1 ~]# vim /etc/hosts
10.244.1.124 myapp.along.com

  

(3)访问pod,成功

[root@node1 ~]# curl myapp.along.com
<h1>Nginx Server configured by CM</h1>

  

1.4.5 通过修改configmap,修改pod内nginx服务的端口

(1)修改configmap的配置,将nginx的端口由80改为8888

[root@master ~]# kubectl edit cm nginx-www
apiVersion: v1
data:
www.conf: "server {\n\tserver_name myapp.along.com;\n\tlisten 8888;\n\troot /data/web/html/;\n}\n"
... ...
configmap/nginx-www edited

  

(2)在pod内还需要重载nginx配置(现在是手工操作,后面会使用k8s工具完成)

/ # cat /etc/nginx/conf.d/www.conf     查询configmap的修改是否生效
server {
server_name myapp.along.com;
listen 8888;
root /data/web/html/;
}
/ # nginx -s reload 重载一下nginx配置
2019/02/25 02:32:00 [notice] 16#16: signal process started

  

(3)在node节点上访问验证,成功

[root@node1 ~]# curl myapp.along.com:8888
<h1>Nginx Server configured by CM</h1>

2、secret

2.1 认识secret

  • Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。将这些信息放在 secret 中比放在 pod 的定义或者 docker 镜像中来说更加安全和灵活。
  • Secret 是一种包含少量敏感信息例如密码、token 或 key 的对象。这样的信息可能会被放在 Pod spec 中或者镜像中;将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险。
  • 用户可以创建 secret,同时系统也创建了一些 secret。
  • 要使用 secret,pod 需要引用 secret。Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里,或者当 kubelet 为 pod 拉取镜像时使用。
  • Secret有三种类型:
    • Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中;
    • Opaque:base64编码格式的Secret,用来存储密码、密钥等;
    • kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。

2.2 创建一个secret

---创建secret
[root@master ~]# kubectl create secret generic mysql-root-passwd --from-literal=password=MyP@ss123
secret/mysql-root-passwd created
---查询secret信息
[root@master ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-wjbzf kubernetes.io/service-account-token 3 35d
mysql-root-passwd Opaque 1 11s
---查询详细信息
[root@master ~]# kubectl describe secret mysql-root-passwd
Name: mysql-root-passwd
Namespace: default
Labels: <none>
Annotations: <none> Type: Opaque Data
====
password: 9 bytes #已经进行64位加密
---以yaml文件显示信息
[root@master ~]# kubectl get secret mysql-root-passwd -o yaml
apiVersion: v1
data:
password: TXlQQHNzMTIz
kind: Secret
metadata:
creationTimestamp: 2018-10-10T03:14:04Z
name: mysql-root-passwd
namespace: default
resourceVersion: "436965"
selfLink: /api/v1/namespaces/default/secrets/mysql-root-passwd
uid: 8adbf6ae-cc3a-11e8-bb48-005056277243
type: Opaque
---解密
[root@master ~]# echo TXlQQHNzMTIz |base64 -d
MyP@ss123

  

2.3 通过secret向pod注入环境变量

(1)编写yaml文件,创建pod

[root@master configmap]# vim pod-secret-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-1
namespace: default
labels:
app: myapp
tier: frontend
annotations:
along.com/created-by: "cluster admin"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
env:
- name: MYSQL_ROOT_PASSWD
valueFrom:
secretKeyRef:
name: mysql-root-passwd
key: password
[root@master configmap]# kubectl apply -f pod-secret-1.yaml
pod/pod-secret-1 created

  

(2)查询并认证

[root@master configmap]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-secret-1 1/1 Running 0 14s
---验证,查询pod中的环境变量,筛选出MYSQL_ROOT_PASSWD
[root@master configmap]# kubectl exec pod-secret-1 -- printenv |grep MYSQL
MYSQL_ROOT_PASSWD=MyP@ss123

  

kubernetes系列12—二个特色的存储卷configmap和secret的更多相关文章

  1. 从0到1使用Kubernetes系列(二):安装工具介绍

    该系列第一篇为:<从0到1使用Kubernetes系列--Kubernetes入门>.本文是Kubernetes系列的第二篇,将介绍使用Kubeadm+Ansible搭建Kubernete ...

  2. kubernetes系列(十二) - 存储之Secret

    1. Secret简介 2. Secret类型 3. Service Account 4. Opaque 4.1 Opaque类型说明 4.2 Opaque创建方式 4.2.1 命令行创建 4.2.2 ...

  3. 二进制安装 kubernetes 1.12(二) - 安装docker, 部署Flannel网络

    在 node 节点上安装 docker 参考 https://www.cnblogs.com/klvchen/p/8468855.html Flannel 工作原理: 部署Flannel网络 在 ma ...

  4. Kubernetes 系列(七):持久化存储StorageClass

    前面的课程中我们学习了 PV 和 PVC 的使用方法,但是前面的 PV 都是静态的,什么意思?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上并不能满足我们的 ...

  5. Kubernetes 系列(二):Deployment 扩容

    (1)首先我们创建一个nginx的Deployment,采用官方的yaml: kubectl create -f https://kubernetes.io/docs/user-guide/nginx ...

  6. 3.k8s存储之ConfigMap、Secret

    1.ConfigMap ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们提供了向容器 ...

  7. kubernetes系列11—PV和PVC详解

    本文收录在容器技术学习系列文章总目录 1.认识PV/PVC/StorageClass 1.1 介绍 管理存储是管理计算的一个明显问题.该PersistentVolume子系统为用户和管理员提供了一个A ...

  8. kubernetes 存储卷

    kubernetes 存储卷    数据卷用于实现容器持久化数据,Kubernetes对于数据卷重新定义,提供了丰富强大的功能.在Kubernetes系统中,当Pod重建的时候,数据卷会丢失,Kube ...

  9. Docker系列05—Docker 存储卷详解

    本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...

随机推荐

  1. 拿Proxy可以做哪些有意思的事儿

    Proxy是什么 首先,我们要清楚,Proxy是什么意思,这个单词翻译过来,就是 代理.可以理解为,有一个很火的明星,开通了一个微博账号,这个账号非常活跃,回复粉丝.到处点赞之类的,但可能并不是真的由 ...

  2. Dubbo原理和源码解析之标签解析

    一.Dubbo 配置方式 Dubbo 支持多种配置方式: XML 配置:基于 Spring 的 Schema 和 XML 扩展机制实现 属性配置:加载 classpath 根目录下的 dubbo.pr ...

  3. ApplicationHost.config(IIS存储配置区文件)

    对于一个刚刚创建网站,以ASP.NET MVC5为例. 我们并没有在网页的配置文件(web.config)中配置一些处理程序或模块,如处理Session的SessionStateModule模块,映射 ...

  4. [译] 理解 LSTM 网络

    原文链接:http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 吴恩达版:http://www.ai-start.com/dl2017/h ...

  5. .NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

    前言 作为.net程序员,使用过指针,写过不安全代码吗? 为什么要使用指针,什么时候需要使用它,以及如何安全.高效地使用它? 如果能很好地回答这几个问题,那么就能很好地理解今天了主题了.C#构建了一个 ...

  6. TensorFlow之DNN(三):神经网络的正则化方法(Dropout、L2正则化、早停和数据增强)

    这一篇博客整理用TensorFlow实现神经网络正则化的内容. 深层神经网络往往具有数十万乃至数百万的参数,可以进行非常复杂的特征变换,具有强大的学习能力,因此容易在训练集上过拟合.缓解神经网络的过拟 ...

  7. 干货,不小心执行了rm -f,除了跑路,如何恢复?

    前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵. 那么如果真的删除了不该删除的文件,比如数据库. ...

  8. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  9. c#批量抓取免费代理并验证有效性

    之前看到某公司的官网的文章的浏览量刷新一次网页就会增加一次,给人的感觉不太好,一个公司的官网给人如此直白的漏洞,我批量发起请求的时候发现页面打开都报错,100多人的公司的官网文章刷新一次你给我看这个, ...

  10. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析

    API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...