ConfigMap:
是一系列配置的集合,k8s会将这一集合注入到对应的Pod对像中,并为容器成功启动使用。
注入的方式一般有两种,一种是挂载存储卷,一种是传递变量。ConfigMap被引用之前必须
存在,属于名称空间级别,不能跨名称空间使用,内容明文显示。ConfigMap内容修改后,
对应的pod必须重启或者重新加载配置。
Secret:
类似于ConfigMap,是用Base64加密,密文显示,一般存放敏感数据。一般有两种创建方式,
一种是使用kubectl create创建,一种是用Secret配置文件。
使用场景:
我们经常都需要为我们的应用程序配置一些特殊的数据,比如密钥、Token 、数据库连接地址或
者其他私密的信息。你的应用可能会使用一些特定的配置文件进行配置,比如settings.py文件,
或者我们可以在应用的业务逻辑中读取环境变量或者某些标志来处理配置信息。
我们要做到这个,有好多种方案,比如:
1.我们可以直接在打包镜像的时候写在应用配置文件里面,但是这种方式的坏处显而易见而且非
常明显。
2.我们可以在配置文件里面通过 env 环境变量传入,但是这样的话我们要修改 env 就必须去
修改 yaml 文件,而且需要重启所有的 container 才行。
3.我们可以在应用启动的时候去数据库或者某个特定的地方拿,没问题!但是第一,实现起来麻
烦;第二,如果配置的地方变了怎么办?
当然还有别的方案,但是各种方案都有各自的问题。
而且,还有一个问题就是,如果说我的一个配置,是要多个应用一起使用的,以上除了第三种方
案,都没办法进行配置的共享,就是说我如果要改配置的话,那得一个一个手动改。假如我们有
100 个应用,就得改 100 份配置,以此类推……
kubernetes 对这个问题提供了一个很好的解决方案,就是用 ConfigMap 和 Secret。
=======================================================
Secret
什么是Secret?作用是什么?
用来保存一些敏感信息,比如MySQL服务的账号和密码,或者一些秘钥、证书等。
举例:
用户名: root
密码: 123.com
将上述信息,保存为Secret资源,应该怎么做?
一、--from-literal
[root@master ~]# kubectl create secret generic mysecret1 --from-literal=username=root --from-literal=password=123.com PS: generic(通用的,公共的)--算法。 //查看Secrets资源对象 [root@master ~]# kubectl get secrets NAME TYPE DATA AGE default-token-pxcst kubernetes.io/service-account-token 3 15d mysecret1 Opaque 2 2m11s //这里我们使用Describe命令,查看其详细信息,等看到对应的key值,却看不到详细values值,因为创建的时候,我们给这个数据做了一个加密动作 [root@master ~]# kubectl describe secrets mysecret1 Name: mysecret1 Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 7 bytes username: 4 bytes
PS: 注意,一个--from-literal语句 ,只能保存一条信息。
二、--from-file
[root@master secret]# echo root > username [root@master secret]# echo 123.com > password [root@master secret]# kubectl create secret generic mysecret2 --from-file=username --from-file=password secret/mysecret2 created [root@master secret]# kubectl get secrets NAME TYPE DATA AGE default-token-pxcst kubernetes.io/service-account-token 3 15d mysecret1 Opaque 2 15m mysecret2 Opaque 2 10s
PS: --from-file的方式,并没有想象中那么全面,厉害。因为每个文件中,只能够保存一条信息。
三、--from-env-file
[root@master secret]# cat >>env.txt <<EOF username=root password=123.com EOF [root@master secret]# kubectl create secret generic mysecret3 --from-env-file=env.txt secret/mysecret3 created
PS: 这种保存数据的方式,比第二种要方便的多,不过要注意的是,文件中,每一行只能记录一条数据(key=value)。
四、通过yaml文件创建
思考: 在创建yaml文件的时候,为了避免能直接看到我们保存的数据,所以,我们通常为会保存的数据,进行加密。
[root@master secret]# echo root | base64 cm9vdAo= [root@master secret]# echo 123.com | base64 MTIzLmNvbQo= cat >> mysecret4 << EOF apiVersion: v1 kind: Secret metadata: name: mysecret4 data: username: cm9vdAo= password: MTIzLmNvbQo= EOF
PS:即使,在保存数据前,我们对要保存的数据做了加密处理,但,base64这种方法也不是绝对的安全,比如上边我们用base64这种方法得到的乱码字符串,就可以使用--decode解码
[root@master secret]# echo -n cm9vdAo= | base64 --decode
root
Secret资源的使用
1、Volume
举例: 创建一个Pod资源,用volume的方式使用mysecret1.
```yaml kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: mypod image: busybox imagePullPolicy: IfNotPresent args: - /bin/sh - -c - sleep 30000 volumeMounts: - name: test-volume mountPath: "/etc/volume" readOnly: true volumes: - name: test-volume secret: secretName: mysecret1 //通过yalm文件,运行此Pod资源,然后进入Pod对应的挂载目录,去验证是否有我们的secret资源保存的数据。 [root@master secret]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 111s [root@master secret]# kubectl exec -it mypod sh cat /etc/volume/username root cat /etc/volume/password 123.com
PS: 以volume的挂载方式去使用secret资源,它会随着secret资源对象数据的改变而改变。所以,通常用volume挂载的时候,为了保证secret资源的安全,在挂载的使用都是只读挂载(readOnly)
//我们也可以自安定存放数据的文件名,比如上述Pod资源,可以更改为: ```yaml ... volumes: - name: test-volume secret: secretName: mysecret1 items: - key: username path: mygroup/my-username - key: password path: mygroup/my-passwd ``` //在对应的位置,仍然可以查看到我们更改过后的数据。数据会实时同步、更新。 [root@master secret]# kubectl exec -it mypod sh # ls /etc/volume/mygroup/ my-passwd my-username
2、用环境变量的方式
同样,我们更改一下上述的Pod,将它引用secret资源对象的方式更改为环境变量的方式:
```yaml kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: mypod image: busybox imagePullPolicy: IfNotPresent args: - /bin/sh - -c - sleep 30000 env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret1 key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret1 key: password //运行此yaml文件,并进入Pod去验证一下变量的值是否正确。 [root@master secret]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 85s [root@master secret]# kubectl exec -it mypod sh / # echo $SECRET_USERNAME root / # echo $SECRET_PASSWORD 123.com
小的技巧: 资源在创建的过程中,可以直接使用命令的方式创,也可以使用yaml文件的方式,
虽然yaml文件的方式创建,相对比较麻烦,但是,它会将我们在创建对应资源的时候的基本状态
做一个保存。
我们可以先使用命令的方式创建出来对应的资源,然后将此资源另存为一个yaml文件。比如我们
刚刚创建的mysecret2:
[root@master secret]# kubectl get secrets mysecret2 -o yaml > mysecret2.yaml [root@master secret]# cat mysecret2.yaml apiVersion: v1 data: password: MTIzLmNvbQo= username: cm9vdAo= kind: Secret metadata: creationTimestamp: "2020-04-27T06:39:47Z" name: mysecret2 namespace: default resourceVersion: "12904" selfLink: /api/v1/namespaces/default/secrets/mysecret2 uid: 23b294ab-0ef8-411f-825b-b3c69f14115e type: Opaque ```
secret实践 k8s连接Harbor
假设此时有一个deployment需要用到私有镜像,已知 Harbor地址为:192.168.8.20,首先应该
确认各节点都修改了/usr/lib/systemd/system/docker.service文件,或者在
/etc/docker/daemon.json文件中添加过私有仓库地址。因为登录Harbor需要用户名和密码,
所以我们可以先创建一个Secret文件,将Harbor的信息进行保存到k8s集群中。
1.先登录Harbor仓库:
[root@master ~]# docker login -u admin -p Harbor123.com 192.168.8.20 WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
2.查看登录秘钥数据:
[root@master ~]# cat .docker/config.json { "auths": { "192.168.8.20": { "auth": "YWRtaW46SGFyYm9yMTIzNDUK" } }, "HttpHeaders": { "User-Agent": "Docker-Client/18.09.0 (linux)" } } ———————————————— 版权声明:本文为CSDN博主「开化者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/li175325/article/details/132451285
3.进行base加密
[root@master ~]# cat .docker/config.json | base64 ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjguMTAiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dG eVltOXlNVEl6TkRVSyIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50Ijog IkRvY2tlci1DbGllbnQvMTkuMDMuMTAgKGxpbnV4KSIKCX0KfQo=
4.创建Secret资源。
```yaml apiVersion: v1 kind: Secret metadata: name: registry-secret type: kubernetes.io/dockercfg data: .dockercfg: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjguMTAiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dG eVltOXlNVEl6TkRVSyIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50Ijog IkRvY2tlci1DbGllbnQvMTkuMDMuMTAgKGxpbnV4KSIKCX0KfQo= [root@master ~]# kubectl apply -f secret.yaml secret/registry-secret created (或使用命令直接创建:kubectl create secret docker-registry registry-secret2 --docker-server=192.168.8.20 --docker-username=admin --docker-password=Harbor12345 )
5.创建Deployment资源引用secret资源。
```yaml kind: Deployment apiVersion: apps/v1 metadata: name: testdeploy spec: selector: matchLabels: test: registry replicas: 2 template: metadata: labels: test: registry spec: containers: - name: testdeploy image: 192.168.8.20/library/nginx:latest imagePullPolicy: IfNotPresent imagePullSecrets: - name: registry-secret2 =========================================================
ConfigMap
与secret资源一样,configMap也可以保存一些数据信息,不同的是,secret资源保存的是相对敏感的信息或者是秘钥等,而configMap保存的是一些明文的数据。
举例:
user1=admin
user2=root
一、--from-literal
[root@master configMap]# kubectl create configmap myconfigmap1 --from-literal=user1=admin --from-literal=user2=root configmap/myconfigmap1 created [root@master configMap]# kubectl describe configmaps myconfigmap1 Name: myconfigmap1 Namespace: default Labels: <none> Annotations: <none> Data ==== user1: ---- admin user2: ---- root Events: <none> ```
二、--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 configmap/myconfigmap2 created [root@master configMap]# kubectl describe configmaps myconfigmap2 Name: myconfigmap2 Namespace: default Labels: <none> Annotations: <none> Data ==== user2: ---- root user1: ---- admin Events: <none>
三、--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 configmap/myconfigmap3 created [root@master configMap]# kubectl describe configmaps myconfigmap3 Name: myconfigmap3 Namespace: default Labels: <none> Annotations: <none> Data ==== user2: ---- root user1: ---- admin Events: <none>
四、通过yaml文件的方式
```yaml kind: ConfigMap apiVersion: v1 metadata: name: myconfigmap4 data: user1: admin user2: root ---------------------------------------------
ConfigMap资源的使用
举例:创建一个Pod资源,引用上述myconfigmap1资源。
### 1、Volume ```yaml kind: Pod apiVersion: v1 metadata: name: mypod3 spec: containers: - name: mypod3 image: busybox args: - /bin/sh - -c - sleep 30000 volumeMounts: - name: volume2 mountPath: "/tmp/volume" readOnly: true volumes: - name: volume2 configMap: name: myconfigmap1
//创建并运行Pod资源,进入Pod查看验证保存的信息
[root@master configMap]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 56m mypod3 1/1 Running 0 11s [root@master configMap]# kubectl exec mypod3 cat /tmp/volume/user1 admin [root@master configMap]# kubectl exec mypod3 cat /tmp/volume/user2 root
//这里假如我们将myconfigmap1对应的user1的值进行更改,会看到Pod内对应的值也会进行动态的更新
[root@master configMap]# kubectl edit configmaps myconfigmap1 ```yaml ... apiVersion: v1 data: user1: adam user2: root kind: ConfigMap ... [root@master configMap]# kubectl exec mypod3 cat /tmp/volume/user1 adam[root@master configMap]#
2、环境变量
```yaml kind: Pod apiVersion: v1 metadata: name: mypod4 spec: containers: - name: mypod4 image: busybox args: - /bin/sh - -c - sleep 30000 env: - name: USER_1 valueFrom: configMapKeyRef: name: myconfigmap1 key: user1 - name: USER_2 valueFrom: configMapKeyRef: name: myconfigmap1 key: user2 ```
//创建并运行Pod,进入Pod验证环境变量对应的值。
[root@master configMap]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod4 1/1 Running 0 40s [root@master configMap]# kubectl exec -it mypod4 sh / # echo $USER_1 adam / # echo $USER_2 root