secret用来保存敏感信息,比如密码或者令牌。
使用文件进行创建
[kubeadm@server1 secret]$ echo -n "admin" > username.txt ##创建用户信息
[kubeadm@server1 secret]$ echo -n "aekhg777" > password.txt ##创建用户密码文件
[kubeadm@server1 secret]$ kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
##创建secret 性质是generic(通用) 名字随便创建 后面接用户名密码文件
secret/db-user-pass created
[kubeadm@server1 secret]$ kubectl get secrets
NAME TYPE DATA AGE
db-user-pass Opaque 2 6s
default-token-6qxhd kubernetes.io/service-account-token 3 8d
[kubeadm@server1 secret]$ kubectl describe secrets db-user-pass
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 8 bytes
username.txt: 5 bytes
再或者直接使用命令进行创建,区别是其中的参数从--from-file
变为--from-literal=username/passwd=用户名/密码
kubectl create secret generic db-user-pass --from-literal=username=admin --from-literal=password=aekhg777
这两种方式得到的结果是相同的,并且直接可以看到密码
[kubeadm@server1 secret]$ kubectl get secrets db-user-pass -o yaml
apiVersion: v1
data:
password.txt: YWVraGc3Nzc=
username.txt: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2020-02-24T13:06:05Z"
name: db-user-pass
namespace: default
resourceVersion: "611210"
selfLink: /api/v1/namespaces/default/secrets/db-user-pass
uid: d0743c70-6697-4b16-b149-b338ea4954c7
type: Opaque
其中用户名和密码都在上面进行了显示,但是我们会发现和我们原来的设定并不相同,因为这个使用了加密,想要直接看到密码需要进行解码。
[kubeadm@server1 secret]$ echo YWVraGc3Nzc= | base64 -d ##使用64位解码得到原始数据
aekhg777
但是如果密码中存在特殊字符那需要使用\(反斜杠)进行转译。
正向来完之后我们反向进行,如何使用yaml文件创建secret。
首先我们将用户名和密码使用base64进行加密。之后将加密过的用户名和密码写入文件中。
[kubeadm@server1 secret]$ echo admin | base64
YWRtaW4K
[kubeadm@server1 secret]$ echo aekhg777 | base64
YWVraGc3NzcK
[kubeadm@server1 secret]$ vim mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: YWVraGc3NzcK
username: YWRtaW4K
再使用命令将secret创建出来。
使用secret
使用secret需要进行挂接,
apiVersion: v1
kind: Pod
metadata:
name: mysecret
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/secret"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
首先创建一个pod,在pod中查看挂接的文件。
[kubeadm@server1 secret]$ kubectl exec mysecret ls /secret
password
username
内部文件就是你的用户名和密码,文件中的内容是前面的secret文件的内容。
同时我们可以指定挂载卷的目录,
前面的yaml文件内容不变最后卷的地方添加指定目录
volumes:
- name: secrets
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
最底下的path创建的地点不是直接在当前目录,而是在/secret(查看前面的yaml文件)目录下继续进行创建。
[kubeadm@server1 secret]$ kubectl exec mysecret2 cat /secret/my-group/my-username
admin
给secret设置环境变量
直接再创建一个pod
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[kubeadm@server1 secret]$ kubectl exec mysecret2 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=mysecret2
SECRET_USERNAME=admin
##在这里直接就可以看到了
SECRET_PASSWORD=aekhg777
拉取私有仓库的镜像
kubectl create secret docker-registry myregistrykey --docker-server=passyt.com --docker-username=admin --docker-password=aekhg777 --docker-email=passyt@passyt.com
##创建一个secret 名字叫myregistrykey
docker-registry是仓库的认证设置。
secret创建完成后编写一个yaml文件,创建一个pod
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: game2048
image: passyt.com/test/game2048
imagePullSecrets: ##这个东西是给认证信息的必须要添加
- name: myregistrykey ##认证信息的名字是myregistrykey
使用私有仓库中的镜像创建pod,首先的操作就是要给仓库进行登陆,登陆完成之后才可以拉取镜像,那么我们的顺序就是首先创建一个secret来储存用户的用户名和密码,之后在创建pod的时候调取这个secret中的内容,成功认证拉取镜像。