secret和configmap

一、secret

1、什么是secret?

  • 这个类型主要就是存储密码或者一些隐私一些内容

  • 主要就是保存这些东西的

  • 值都是base64加密的

  • 都是基于命名空间的

2、创建secret方式

1、命令行创建

bash 复制代码
[root@k-master 8-2]# kubectl create secret --help
Create a secret using specified subcommand.

Available Commands:
  docker-registry   Create a secret for use with a Docker registry
  generic           Create a secret from a local file, directory, or literal value # 常用的
  tls               Create a TLS secret

Usage:
  kubectl create secret [flags] [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).


[root@k-master 8-2]# kubectl create secret generic --help

# 这些有的是案例的
[root@k-master 8-2]# kubectl create secret generic --help | grep from
  kubectl create secret generic my-secret --from-file=path/to/bar
  kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa --from-file=ssh-publickey=path/to/id_rsa.pub
  kubectl create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret
  kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa --from-literal=passphrase=topsecret
  # Create a new secret named my-secret from env files
  kubectl create secret generic my-secret --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env
    --from-env-file=[]:  # 通过环境变量创建
    --from-file=[]:  # 通过文件创建
    --from-literal=[]:  # 键值对的方式
  kubectl create secret generic NAME [--type=string] [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run=server|client|none] [options]


[root@k-master 8-2]# kubectl create secret generic mysec1 --from-literal=name1=aaa1 --from-literal=name2=bbb2
secret/mysec1 created

# 上面创建了2个数据
[root@k-master 8-2]# kubectl get secrets 
NAME     TYPE     DATA   AGE
mysec1   Opaque   2      3s
[root@k-master 8-2]# kubectl describe secrets mysec1 
Name:         mysec1
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque  # 基于base64密钥进行解密和加密

Data
====
name2:  4 bytes  # 值默认是加密的
name1:  4 bytes
  • 显示加密后的密钥
bash 复制代码
[root@k-master 8-2]# kubectl get secrets mysec1 -o yaml
apiVersion: v1
data:
  name1: YWFhMQ==
  name2: YmJiMg==
kind: Secret
metadata:
  creationTimestamp: "2025-08-02T07:00:20Z"
  name: mysec1
  namespace: default
  resourceVersion: "150234"
  uid: b89398bb-a512-41bf-9032-31d6e15e2fa0
type: Opaque


# 使用base64进行解密
[root@k-master 8-2]# echo -n  YWFhMQ== | base64 -d
aaa1[root@k-master 8-2]# 

2、文件方式

  • 将内容保存到文件中去

  • 文件名相当于是键,内容是值

bash 复制代码
[root@k-master 8-2]# echo redhat > name3
[root@k-master 8-2]# ls
name3
[root@k-master 8-2]# cat name3 
redhat
[root@k-master 8-2]# kubectl create secret generic mysec2 --from-file=name3

3、环境变量方式

bash 复制代码
cat 1.txt
name1=aaa1

[root@k-master 8-2]# kubectl create secret generic mysec3 --from-env-file=1.txt 
secret/mysec3 created

4、通过yaml文件生成

bash 复制代码
# 通过查看命令帮助
[root@k-master ~]# kubectl explain secret --recursive | less

[root@k-master 8-2]# cat secret1.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: mysec4
data:
  name1: cXFxCg==

3、使用secret方式

1、卷使用secret

  • 将这个secret挂载到容器里面去即可

  • 以卷的方式来挂载这个secret和confgimap的话,适用场景就是一些服务的配置文件

  • 在pod里面存在的方式,文件名就是键

bash 复制代码
[root@k-master 8-2]# cat pod1.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
spec:
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod1
    volumeMounts: # 挂载到这个/mnt目录下
    - name: v1
      mountPath: /mnt
  volumes:  # 使用secret作为卷
  - name: v1
    secret:
      secretName: mysec1

# 将这个密钥写到这个文件里面去了
# 文件名就是这个键,内容就是值

# 在pod里面的存在的方式文件名就是键
[root@k-master 8-2]# kubectl exec -ti pod1  -- ls /mnt
name1  name2
bash 复制代码
# nginx的页面来使用卷挂载网站页面

2、变量方式使用secret

  • mysql运行时,需要环境变量,因此上面的文件不方便
bash 复制代码
[root@k-master 8-2]# cat pod1.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
spec:
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod1
    env:
    - name: env1  # 环境变量名
      valueFrom: # 这个值来自于这个secret
        secretKeyRef:
          name: mysec1
          key: name1  # 使用的键是这个name1,env1的值使用就是name1对应的值

# 进入容器使用环境变量
[root@k-master 8-2]# kubectl exec -ti pod1 -- /bin/bash
root@pod1:/# echo $env1
aaa1
  • 创建一个mysql容器
bash 复制代码
[root@k-master 8-2]# cat mysql.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: mysql1
  name: mysql1
spec:
  containers:
  - image: mysql
    imagePullPolicy: IfNotPresent
    name: mysql1
    ports:
    - containerPort: 3306
    env:
    - name: MYSQLROOT_PASSWORD # 环境变量键
      valueFrom:
        secretKeyRef:
          name: mysec1
          key: name1  # 使用的值就是name1键对应的值
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
  • 远程登录mysql,密码是aaa1
bash 复制代码
[root@k-master 8-2]# kubectl get pod -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP              NODE      NOMINATED NODE   READINESS GATES
mysql1   1/1     Running   0          84s   10.244.82.180   k-node1   <none>           <none>
pod1     1/1     Running   0          16m   10.244.82.172   k-node1   <none>           <none>

# 语法,-u 可以要空格可以不需要空格
# 但是呢,这个密码的话不能有空格

[root@k-master 8-2]# mysql -uroot -paaa1 -h 10.244.82.180
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 9.4.0 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> 

二、configmap

1、什么是configmap

  • 主要就是保存配置文件用的

  • 明文的方式保存

  • 跟上面secret的操作一模一样

2、创建configmap方式

1、命令行创建

bash 复制代码
# 查看命令行帮助
[root@k-master 8-2]# kubectl create configmap --help | grep -i from
  kubectl create configmap my-config --from-file=path/to/bar
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
  # Create a new config map named my-config from the key=value pairs in the file
  kubectl create configmap my-config --from-file=path/to/bar
  # Create a new config map named my-config from an env file
  kubectl create configmap my-config --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env
    --from-env-file=[]:
    --from-file=[]:
    --from-literal=[]:
  kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run=server|client|none] [options]

[root@k-master 8-2]# kubectl create configmap cm1 --from-literal=name1=qqq 
configmap/cm1 created
[root@k-master 8-2]# kubc^C
[root@k-master 8-2]# kubectl get cm
NAME               DATA   AGE
cm1                1      4s
kube-root-ca.crt   1      13d
[root@k-master 8-2]# kubectl describe cm cm1
Name:         cm1
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
name1: # 键
----
qqq  # 文件的内容

BinaryData
====

Events:  <none>

2、文件创建

  • 文件名相当于是键,值是文件里面的内容
bash 复制代码
[root@k-master 8-2]# kubectl create configmap cm2  --from-file=name4 
configmap/cm2 created
[root@k-master 8-2]# kubectl describe cm cm2
Name:         cm2
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
name4:  # 键
----
qqq  # 文件的内容


BinaryData
====

Events:  <none>

3、环境变量和yaml创建

bash 复制代码
[root@k-master 8-2]# kubectl create configmap cm3 --from-env-file=2.txt 
configmap/cm3 created
[root@k-master 8-2]# kubectl get cmck^C
[root@k-master 8-2]# kubectl describe cm cm3
Name:         cm3
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
name1:
----
qqq

BinaryData
====

Events:  <none>
bash 复制代码
[root@k-master 8-2]# kubectl apply -f cm4.yaml 
configmap/cm4 created
[root@k-master 8-2]# kubectl describe configmaps cm4
Name:         cm4
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
name1:
----
qqq

BinaryData
====

Events:  <none>

3、使用configmap方式

1、通过卷的方式使用

bash 复制代码
[root@k-master 8-2]# cat pod2.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod2
  name: pod2
spec:
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod2
    volumeMounts:
    - name: c1
      mountPath: /mnt
    resources: {}
  volumes:
  - name: c1
    configMap:
      name: cm4
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}


# 卷挂载的话,以键是文件的存在形式存在的
[root@k-master 8-2]# kubectl exec -ti pod2  -- cat  /mnt/name1
qqq[root@k-master 8-2]# 

2、通过变量的方式使用

bash 复制代码
[root@k-master 8-2]# cat pod2.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod2
  name: pod2
spec:
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod2
    resources: {}
    env:
    - name: env1 # 环境变量键
      valueFrom:
        configMapKeyRef: # 使用的值是configmap
          name: cm4
          key: name1 # 值是name1对应的值
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

[root@k-master 8-2]# kubectl exec -ti pod2 -- /bin/bash
root@pod2:/# echo $env1
qqq
root@pod2:/# 

三、实验

1、configmap配置nginx网页目录

  • data字段数据写法
bash 复制代码