k8s资源secret和ConfigMap的相关详解
secret
- 一、secret相关简介
- 二、secret资源的使用
- 三、Secret实践k8s连接Harbor
- 四、ConfigMap相关介绍
- 五、ConfigMap资源的使用
一、secret相关简介
1.Secret资源的作用
用来保存一些敏感信息,比如MySQL服务的账号和密码,或者一些秘钥、证书等。
2.使用示例
用户名: root密码:123.com
将上述信息保存为secret资源有以下几种方法可供使用。
(1)- -from-literal
[root@master ~]# kubectl create secret generic secret1 --from-literal=username=root --from-literal=password=123.com
[root@master ~]# kubectl get secrets
注意
generic是一种算法;一个--from-literal语句只能保存一条信息;
使用Describe命令查看其详细信息,可以看到对应的key值,却看不到详细values值。因为创建的时候,我们给这个数据做了一个加密动作。
[root@master ~]# kubectl describe secrets secret1
Name: secret1
Namespace: default
Labels: <none>
Annotations: <none>Type: OpaqueData
====
password: 7 bytes
username: 4 bytes
(2)- -from-file
[root@master secret]# echo root > username
[root@master secret]# echo 123.com > password
[root@master secret]# kubectl create secret generic secret2 --from-file=username --from-file=password
[root@master secret]# kubectl get secrets
注意
--from-file的方式中的每个文件中也是只能够保存一条信息
(3)- -from-env-file
[root@master secret]# vim env.txt
username=root
password=123.com
[root@master secret]# kubectl create secret generic secret3 --from-env-file=env.txt
注意
这种保存数据的方式比第二种要方便的多。不过文件中每一行只能记录一条数据(key=value);
(4)通过yaml文件创建
在创建yaml文件的时候,为了避免能直接看到我们保存的数据,所以我们通常会为保存的数据进行加密。
[root@master secret]# echo root | base64
cm9vdAo=
[root@master secret]# echo 123.com | base64
MTIzLmNvbQo=
[root@master secret]# vim secret4.yaml
apiVersion: v1
kind: Secret
metadata:name: secret4
data:username: cm9vdAo=password: MTIzLmNvbQo=
[root@master secret]# kubectl apply -f secret4.yaml
注意:即使在保存数据前对要保存的数据做了加密处理,但base64这种方法也不是绝对的安全。比如上边我们用base64这种方法得到的乱码字符串,就可以使用–decode解码。
[root@master secret]# echo -n cm9vdAo= | base64 --decode
root
二、secret资源的使用
1.通过volume的方式
示例:创建一个Pod资源,用volume的方式使用之前创建的secret1。
[root@master secret]# vim mypod.yaml
kind: Pod
apiVersion: v1
metadata:name: mypod
spec:containers:- name: mypodimage: busyboxargs:- /bin/sh- -c- sleep 30000volumeMounts:- name: test-volumemountPath: "/etc/volume"readOnly: truevolumes:- name: test-volumesecret:secretName: secret1
通过yalm文件运行此Pod资源,然后进入Pod对应的挂载目录验证是否有secret资源保存的数据。
[root@master secret]# kubectl apply -f mypod.yaml
[root@master secret]# kubectl get pod
[root@master secret]# kubectl exec mypod cat /etc/volume/username
root
[root@master secret]# kubectl exec mypod cat /etc/volume/password
123.com
注意:以volume的挂载方式去使用secret资源,它会随着secret资源对象数据的改变而改变。所以通常用volume挂载的时候,为了保证secret资源的安全,在挂载的使用都是只读挂载(readOnly)。
我们也可以自定义存放数据的文件名。比如上述Pod资源可以更改为
[root@master secret]# vim mypod.yaml
kind: Pod
apiVersion: v1
metadata:name: mypod
spec:containers:- name: mypodimage: busyboxargs:- /bin/sh- -c- sleep 30000volumeMounts:- name: test-volumemountPath: "/etc/volume"readOnly: truevolumes:- name: test-volumesecret:secretName: secret1items:- key: usernamepath: mygroup/my-username- key: passwordpath: mygroup/my-passwd
[root@master secret]# kubectl apply -f mypod.yaml
在对应的位置仍然可以查看到我们更改过后的数据,数据会实时同步更新。
[root@master secret]# kubectl exec -it mypod sh
/etc/volume # ls mygroup/
my-passwd my-username
/etc/volume # pwd
/etc/volume
2.用环境变量的方式
同样我们更改一下上述的Pod,将它引用secret资源对象的方式更改为环境变量的方式。
[root@master secret]# vim mypod.yaml
kind: Pod
apiVersion: v1
metadata:name: mypod
spec:containers:- name: mypodimage: busyboxargs:- /bin/sh- -c- sleep 30000env:- name: SECRET_USERNAMEvalueFrom:secretKeyRef:name: secret1key: username- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: secret1key: password
运行此yaml文件并进入Pod去验证一下变量的值是否正确。
[root@master secret]# kubectl apply -f mypod.yaml
[root@master secret]# kubectl get pod
[root@master secret]# kubectl exec -it mypod sh
/ # echo $SECRET_USERNAME -n
root
/ # echo $SECRET_PASSWORD -n
123.com
注意:用环境变量的方式也可以正确引用secret资源,但是它并不会像Volume的方式一样,它引用数据不会进行动态的更新。
资源在创建的过程中可以直接使用命令的方式,也可以使用yaml文件的方式。虽然yaml文件的方式创建相对比较麻烦,但是它会将我们在创建对应资源的时候的基本状态做一个保存。
我们可以先使用命令的方式创建出来对应的资源,然后将此资源另存为一个yaml文件。比如我们之前创建的secret2
[root@master secret]# kubectl get secrets secret2 -o yaml > secret2.yaml
[root@master secret]# cat secret2.yaml
apiVersion: v1
data:password: MTIzLmNvbQo=username: cm9vdAo=
kind: Secret
metadata:creationTimestamp: "2020-04-27T06:39:47Z"name: secret2namespace: defaultresourceVersion: "12904"selfLink: /api/v1/namespaces/default/secrets/secret2uid: 23b294ab-0ef8-411f-825b-b3c69f14115e
type: Opaque
三、Secret实践k8s连接Harbor
假设此时有一个deployment需要用到私有镜像,已知Harbor地址为:192.168.229.214,首先应该确认各节点都修改了/usr/lib/systemd/system/docker.service文件,或者在/etc/docker/daemon.json文件中添加过私有仓库地址。因为登录Harbor需要用户名和密码,所以我们可以先创建一个Secret文件,将Harbor的信息保存到k8s集群中。
1.先登录harbor仓库
[root@master ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.229.214
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
[root@node1 ~]# vim /usr/lib/systemd/system/docker.service
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl restart docker.service
[root@node2 ~]# vim /usr/lib/systemd/system/docker.service
[root@node2 ~]# systemctl daemon-reload
[root@node2 ~]# systemctl restart docker
[root@harbor harbor]# docker-compose restart
Restarting nginx ... done
Restarting harbor-portal ... done
Restarting harbor-jobservice ... done
Restarting harbor-core ... done
Restarting harbor-adminserver ... done
Restarting registryctl ... done
Restarting registry ... done
Restarting harbor-db ... done
Restarting redis ... done
Restarting harbor-log ... done
[root@master ~]# docker login -u admin -p Harbor12345 192.168.229.214
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
2.查看秘钥登录数据
[root@master ~]# cat .docker/config.json
{"auths": {"192.168.229.214": {"auth": "YWRtaW46SGFyYm9yMTIzNDU="}},"HttpHeaders": {"User-Agent": "Docker-Client/18.09.0 (linux)"}
}
3.进行加密
[root@master ~]# cat .docker/config.json | base64
ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjIyOS4yMTQiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTguMDkuMCAobGludXgpIgoJfQp9
4.创建secret资源
[root@master ~]# mkdir secret
[root@master ~]# cd secret/
[root@master secret]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:name: harbor-secret
type: kubernetes.io/dockerconfigjson
data:.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjIyOS4yMTQiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTguMDkuMCAobGludXgpIgoJfQp9
[root@master secret]# kubectl apply -f secret.yaml
5.创建Deployment资源引用secret资源
[root@master secret]# vim deploy.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: test
spec:replicas: 2template:metadata:labels:test: registryspec:containers:- name: testimage: 192.168.229.214/test/httpd:v1imagePullPolicy: AlwaysimagePullSecrets:- name: harbor-secret
[root@master secret]# kubectl apply -f deploy.yaml
[root@master secret]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test-6d9c69c9f8-7nvlv 1/1 Running 0 42s
test-6d9c69c9f8-sc7w4 1/1 Running 0 42s
四、ConfigMap相关介绍
与secret资源一样,configMap也可以保存一些数据信息。不同的是,secret资源保存的是相对敏感的信息或者是秘钥等,而configMap保存的是一些明文的数据。
1.使用示例
user1=adminuser2=root
(1)- -from-literal
[root@master ~]# mkdir configmap
[root@master ~]# cd configmap/
[root@master configMap]# kubectl create configmap myconfigmap1 --from-literal=user1=admin --from-literal=user2=root
[root@master configmap]# kubectl describe configmaps myconfigmap1
Name: myconfigmap1
Namespace: default
Labels: <none>
Annotations: <none>Data
====
user1:
----
admin
user2:
----
root
Events: <none>
(2)- -from-file
[root@master configMap]# echo admin > user1
[root@master configMap]# echo root > user2
[root@master configMap]# kubectl create configmap myconfigmap2 --from-file=user1 --from-file=user2
[root@master configMap]# kubectl describe configmaps myconfigmap2
Name: myconfigmap2
Namespace: default
Labels: <none>
Annotations: <none>Data
====
user2:
----
rootuser1:
----
adminEvents: <none>
(3)- -from-env-file
[root@master configMap]# cat > user.txt <<EOF
> user1=admin
> user2=root
> EOF
[root@master configMap]# kubectl create configmap myconfigmap3 --from-env-file=user.txt
[root@master configMap]# kubectl describe configmaps myconfigmap3
Name: myconfigmap3
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
user2:
----
root
user1:
----
admin
Events: <none>
(4)通过yaml文件的方式
[root@master configmap]# vim myconfigmap4.yaml
kind: ConfigMap
apiVersion: v1
metadata:name: myconfigmap4
data:user1: adminuser2: root
[root@master configmap]# kubectl apply -f myconfigmap4.yaml
五、ConfigMap资源的使用
示例:创建一个Pod资源,引用上述myconfigmap1资源。
1.以volume的方式引用
[root@master configmap]# vim pod1.yaml
kind: Pod
apiVersion: v1
metadata:name: pod1
spec:containers:- name: pod1image: busyboxargs:- /bin/sh- -c- sleep 30000volumeMounts:- name: volume1mountPath: "/tmp/volume"readOnly: truevolumes:- name: volume1configMap:name: myconfigmap1
[root@master configmap]# kubectl apply -f pod1.yaml
[root@master configmap]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 14s
[root@master configmap]# kubectl exec -it pod1 sh
/ # cat /tmp/volume/user1 -n1 admin
/ # cat /tmp/volume/user2 -n1 root
这里假如我们将myconfigmap1对应的user1的值进行更改,会看到Pod内对应的值也会进行动态的更新。
[root@master configmap]# kubectl edit configmaps myconfigmap1
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:user1: snowuser2: root
kind: ConfigMap
metadata:creationTimestamp: "2020-11-10T08:02:43Z"name: myconfigmap1namespace: defaultresourceVersion: "9180"selfLink: /api/v1/namespaces/default/configmaps/myconfigmap1uid: 88719cef-fd57-4bfd-905f-c807d404ca3a[root@master configmap]# kubectl edit configmaps myconfigmap1
configmap/myconfigmap1 edited
[root@master configmap]# kubectl exec -it pod1 sh
/ # cat /tmp/volume/user1 -n1 snow
2.环境变量的方式引用
[root@master configmap]# vim pod2.yaml
kind: Pod
apiVersion: v1
metadata:name: pod2
spec:containers:- name: pod2image: busyboxargs:- /bin/sh- -c- sleep 30000env:- name: USER_1valueFrom:configMapKeyRef:name: myconfigmap1key: user1- name: USER_2valueFrom:configMapKeyRef:name: myconfigmap1key: user2
[root@master configmap]# kubectl apply -f pod2.yaml
[root@master configmap]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 12m
pod2 1/1 Running 0 36s
[root@master configmap]# kubectl exec -it pod2 sh
/ # echo $USER_1
snow
/ # echo $USER_2
root
这里再把user1对应的更改为admin,再次验证Pod内的变量值仍然不会变,说明环境变量的方式不论引用的什么资源,都不会动态的更新。
[root@master configmap]# kubectl edit configmaps myconfigmap1
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:user1: adminuser2: root
kind: ConfigMap
metadata:creationTimestamp: "2020-11-10T08:02:43Z"name: myconfigmap1namespace: defaultresourceVersion: "14597"selfLink: /api/v1/namespaces/default/configmaps/myconfigmap1uid: 88719cef-fd57-4bfd-905f-c807d404ca3a
[root@master configmap]# kubectl exec -it pod2 sh
/ # echo $USER_1
snow
k8s资源secret和ConfigMap的相关详解相关推荐
- Kubernetes K8S之Taints污点与Tolerations容忍详解
Kubernetes K8S之Taints污点与Tolerations容忍详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master C ...
- k8s教程(Volume篇)-PVC详解
文章目录 01 引言 02 PVC详解 2.1 参数配置 2.1.1 资源请求(Resources) 2.1.2 访问模式 (Access Modes) 2.1.3 存储卷模式(Volume Mode ...
- K8s系列之:kubectl子命令详解edit
K8s系列之:kubectl子命令详解edit 在服务器上使用默认编辑器资源,使用这个命令可以编辑多个对象,然后一次性地应用更改. #编辑名为nginx的服务 kubectl edit svc ngi ...
- K8s系列之:kubectl子命令详解explain
K8s系列之:kubectl子命令详解explain 资源记录.获取资源及其字段的文档. kubectl explain pods#获取资源的特定字段的文档 kubectl explain pods. ...
- k8s挂载目录_云原生存储详解:容器存储与 K8s 存储卷
作者 | 阚俊宝 阿里云技术专家 导读:云原生存储详解系列文章将从云原生存储服务的概念.特点.需求.原理.使用及案例等方面,和大家一起探讨云原生存储技术新的机遇与挑战.本文为该系列文章的第二篇,会对容 ...
- [云原生专题-29]:K8S - 核心概念 - 名字空间/命名空间概念详解与主要操作案例
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- k8s教程(Volume篇)-PV详解
文章目录 01 引言 02 PV详解 2.1 示例配置详解 2.1.1 存储容量 (Capacity) 2.1.2 存储卷模式 (Volume Modes) 2.1.3 访问模式 (Access Mo ...
- mysql数据库安装资源、步骤及基本操作指令详解
mysql数据库安装及基本操作详解 目录 mysql安装资源及教程 安装资源 安装教程 mysql基本指令操作详解 实例操作 mysql安装资源及教程 安装资源 mysql安装包链接 链接:https ...
- 已解决:pod资源清单yaml中各字段详解
1.按层级查看yaml清单 按照层级学习pod的yaml清单,比如apiVersion.kind.metadata.spec为第一层级,metadata下的name.namespace.lables为 ...
最新文章
- 清华校友总会AI大数据专委会(筹)第一次理事会顺利召开
- 发动机异响故障诊断与排除_发动机缺缸故障诊断以及排除方法
- linux awk 用一个或多个空格做分隔符
- Struts2中配置默认Action
- 中国电磁线行业发展前景预测与竞争态势分析报告2022-2028年版
- TCPIP / MTU 和 MSS 的区别和联系
- mysql 行转列 (结果集以坐标显示)
- 怎么在虚拟机上安装linux mint,如何在VirtualBox上安装Linux Mint?
- 关于软件测试工程师所应该具备的能力,就业前景还有适合女生从事吗?
- windows下matplotlib.pyplot图像中显示中文的方法
- N卡A卡流处理器的区别解析
- 简析struct in_addr ,struct sockadd
- ec6108v9c短接j15_华为悦盒EC6108V9C变砖头,J16强刷不出现机器人,重点介绍解决问题!...
- 分析:谷歌不会退出中国市场的8大理由
- ESP8266与阿里云传数据
- linux命令中tar什么意思,Linux中tar命令起什么作用呢?
- 什么是小托福考试?适合什么学生报考?
- 简体中文转繁体的python简单实现
- select 获取选择的值
- Android-悬浮窗功能的实现(附Java、KT实现源码,自学Android