Secret,configmap的定义及使用,探针

Secret,configmap的定义及使用

其实这两者是差不多的,只要搞懂了secret,那么configmap也是很好理解的。这两个是干什么的呢?有什么作用呢?
我们在创建有些容器的时候,比如mysql,你在创建的时候他就要求你给他配置密码,你如果直接在命令行或者yaml文件里面把密码给写上,密码就是明文的,别人可以随意看到,非常的不安全,secret就可以将你要传给容器的隐私内容做一个加密,没那么容易被别人知道,当然,我说的是没那么容易,也就是说是可以通过一些方法查看的

secret

secret的定义

secret的定义很容易,有3种方式

  1. 来自于文件 --from-file
    来自于文件的这种方式,你的文件名就是你的键,文件内的内容就是你的值,我们现在来编写一个文件test,内容是aaa
[root@master k8s]# cat test
aaa

然后我们通过这个文件来创建secret

[root@master k8s]# kubectl create secret generic test1 --from-file=./test
[root@master k8s]# kubectl get secret
NAME    TYPE     DATA   AGE
test1   Opaque   1      1m48s

我们可以看到,有一个叫做test1的secret了,然后我们来看看它里面的内容

[root@master k8s]# kubectl get secret/test1 -o yaml
apiVersion: v1
data:
  test: YWFhCg==
kind: Secret
metadata:
  creationTimestamp: "2024-01-17T03:02:45Z"
  name: test1
  namespace: default
  resourceVersion: "273551"
  uid: 5d2bb0c1-61d2-42fb-983d-70a112a11f49
type: Opaque

我们可以看到,data那里有一个叫做test的键,但是值是YWFhCg==,他是被加密过的内容
2. 来自于键值对 --from-literal
这种方式相对来说简单一点,学习的时候比较常用一点

[root@master k8s]# kubectl create secret generic test2 --from-literal=test2=bbb
secret/test2 created
[root@master k8s]# kubectl get secret
NAME    TYPE     DATA   AGE
test1   Opaque   1      10m
test2   Opaque   1      8s

这样test2就被创建出来了,同样可以查看内容

[root@master k8s]# kubectl get secret/test2 -o yaml
apiVersion: v1
data:
  test2: YmJi
kind: Secret
metadata:
  creationTimestamp: "2024-01-17T03:12:44Z"
  name: test2
  namespace: default
  resourceVersion: "274751"
  uid: 38158752-697d-4d7a-9991-a5ce791ca503
type: Opaque
  1. 来自于env文件 --from-env-file
    这样的方式其实就是把键值对全都写到文件内,然后一次性创建出来
    我们先创建一个文件
[root@master k8s]# cat test2
test3=ccc

我们再来查看一下

[root@master k8s]# kubectl create secret generic test3 --from-env-file=./test2
[root@master k8s]# kubectl get secrets/test3 -o yaml
apiVersion: v1
data:
  test3: Y2Nj
kind: Secret
metadata:
  creationTimestamp: "2024-01-17T03:16:59Z"
  name: test3
  namespace: default
  resourceVersion: "275263"
  uid: 9337e8d4-8818-4a12-9db4-f88d0110b900
type: Opaque

secret的使用

刚刚我们已经学会了如何去定义secret,那么我们定义好了该如何去使用呢?

  1. 挂载使用
    这种方式多适用于配置文件,比如传入一个index.html文件进去这样的做法
    我们直接来看看yaml文件
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: web
  name: web
spec:
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: web
    resources: {}
# 容器挂载卷,挂载到容器内的/data
    volumeMounts:
    - name: secret
      mountPath: /data
  dnsPolicy: ClusterFirst
  restartPolicy: Always
# 定义一个卷,卷名叫做secret
  volumes:
  - name: secret
    secret:
            secretName: test3
status: {}

我们进入容器查看/data目录

[root@master k8s]# kubectl exec -it pods/web -- bash
root@web:/# cat /data/test3 
cccroot@web:/# 

进入容器的/data目录之后,我们看见目录下有个test3,并且文件内容是ccc,跟我们之前定义的一样,没有问题,这种就是通过卷挂载的方式
2. 当作环境变量使用
我们也可以直接把secret当作环境变量传递给容器,这样我们在启动mysql容器的时候就不用明文显示密码了
先创建一个secret

[root@master k8s]# kubectl create secret generic pass1 --from-literal=MYSQL_ROOT_PASSWORD=123
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: db1
  name: db1
spec:
  containers:
  - image: mysql
    name: db1
    resources: {}
# 定义容器的环境变量
    env:
# 变量名是MYSQL_ROOT_PASSWORD
    - name: MYSQL_ROOT_PASSWORD
# 值来自于secret
      valueFrom:
          secretKeyRef:
            key: MYSQL_ROOT_PASSWORD
            name: pass1
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

我们来使用这个yaml文件来创建pod,看看能否直接创建成功

[root@master k8s]# kubectl apply -f secret_mysql.yaml 
pod/db1 created
[root@master k8s]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
db1    1/1     Running   0          62s

我们可以看到,他就直接变成running了,我们来尝试登录一下这个mysql

# 先查看ip
[root@master k8s]# kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
db1    1/1     Running   0          65s   10.244.104.46    node2   <none>           <none>
# 登录mysql
[root@master k8s]# mysql -uroot -p123 -h10.244.104.46
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.2.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

configmap与secret的区别是,secret你去查看的时候他是加密过的,而configmap是明文的,比如aaa=111 configmap里面他就直接这样显示,其他的内容都与secret差别不大,包括定义啊,使用啊,只需要将secret的地方修改成configmap就可以了

posted @ 2024-02-15 09:34  FuShudi  阅读(30)  评论(2编辑  收藏  举报