ConfigMap、Secret

简介: ConfigMap、Secret

屏幕截图 2023-08-28 163846.png

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
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
资源调度 监控 API
开源API网关APISIX分析与使用
开源API网关APISIX分析与使用
1862 0
|
Kubernetes 负载均衡 安全
【K8S系列】深入解析k8s网络插件—Cilium
【K8S系列】深入解析k8s网络插件—Cilium
3493 1
|
机器学习/深度学习 Java PyTorch
《深度剖析:Java利用ONNX Runtime部署ViT模型的关键路径》
ViT将Transformer引入视觉领域,通过自注意力机制捕捉图像长距离依赖,超越传统CNN局限,在图像分类等任务中表现卓越。PyTorch以其动态图机制和简洁API助力ViT开发,而ONNX Runtime作为跨平台推理引擎,实现从PyTorch到部署的无缝衔接。在Java环境中,借助ONNX Runtime加载ViT模型,优化性能并解决兼容性问题,为智能安防、自动驾驶等领域带来全新可能。这场技术融合之旅充满挑战与机遇,推动计算机视觉迈向新高度。
394 0
|
12月前
|
安全 Shell 网络安全
解决Git错误“WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”的方法
注意,维护安全和遵循最佳实践是处理此类问题的关键。如果对服务器或网络安全性有疑问,请寻求专业的网络管理员或安全专家的帮助。在企业环境中频繁遇到此类问题时应重新评估安全协议和服务器管理流程。
837 10
|
编解码 人工智能 API
通义万相2.1视频/图像模型新升级!可在阿里云百炼直接体验
通义万相2.1模型推出新特征,包括复杂人物运动的稳定展现、现实物理规律的逼真还原及中英文视频特效的绚丽呈现。通过自研的高效VAE和DiT架构,增强时空上下文建模能力,支持无限长1080P视频的高效编解码,并首次实现中文文字视频生成功能。升级后的通义万相荣登VBench榜单第一,提供电影级分镜效果、四格漫画故事速览及情侣头像创意定制等多种玩法,满足多样化的视觉创作需求。可直接在阿里云百炼平台调用API体验这些功能。
6198 0
|
Java 程序员
Java中实现动态性的原理和机制
Java中实现动态性的原理和机制
563 1
|
机器学习/深度学习 供应链 搜索推荐
优化销售预测:6种模型适用的场景与实战案例
不同行业的销售预测采用什么模型比较好?3分钟了解6种销售预测模型,以及适用行业场景。
4690 2
优化销售预测:6种模型适用的场景与实战案例
|
JSON JavaScript 前端开发
JS逆向 AST 抽象语法树解析与实践
JS逆向 AST 抽象语法树解析与实践
1199 2
|
存储 移动开发 程序员
80C51单片机的七种寻址方式
80C51单片机的七种寻址方式
1843 1
|
存储 供应链
解读ROI:ERP系统的成本与投资回报分析
解读ROI:ERP系统的成本与投资回报分析
1906 4