目录
Secret,configmap的定义及使用
其实这两者是差不多的,只要搞懂了secret,那么configmap也是很好理解的。这两个是干什么的呢?有什么作用呢?
我们在创建有些容器的时候,比如mysql,你在创建的时候他就要求你给他配置密码,你如果直接在命令行或者yaml文件里面把密码给写上,密码就是明文的,别人可以随意看到,非常的不安全,secret就可以将你要传给容器的隐私内容做一个加密,没那么容易被别人知道,当然,我说的是没那么容易,也就是说是可以通过一些方法查看的
secret
secret的定义
secret的定义很容易,有3种方式
- 来自于文件 --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
- 来自于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,那么我们定义好了该如何去使用呢?
- 挂载使用
这种方式多适用于配置文件,比如传入一个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就可以了