k8s 存储之secret
目录Service AccountOpaque SecretⅠ、创建说明Ⅱ、使用方式1、将 Secret 挂载到 Volume 中2、将 Secret 导出到环境变量中kubernetes.io/dockerconfigjsonSecret 存在意义Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret 可以以 Vol
目录
kubernetes.io/dockerconfigjson
Secret 存在意义
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret 可以以 Volume 或者环境变量的方式使用。也就意味着我们有一些密码被我们的pod去使用,完全可以先保存在我们的secret里面,然后在我们的pod运行的时候挂载进我们的pod即可。
Secret 有三种类型
Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中。
对于有些pod来说,它需要跟我们的kube-api进行交互,比如说,flannel,coredns,但是kube-api并不是谁都可以进行访问的,因为它是一切访问的入口,它的加密就是集群的加密,要是谁都可以进行访问的话,那就没有什么安全性可言了,所以对于pod来说,它的访问机制就是SA。
Opaque :base64编码格式的Secret,用来存储密码、密钥等。(容易破解,加密程度不高)
kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息。
Service Account
Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod的/run/secrets/kubernetes.io/serviceaccount 目录中,下面我们简单看一个之前创建好的pod。
[root@master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx-84ff5c99b6-hf4fw 1/1 Running 0 3h57m
[root@master1 ~]# kubectl exec -it my-nginx-84ff5c99b6-hf4fw -- sh
/ # cd /run/secrets/kubernetes.io/serviceaccount/
/run/secrets/kubernetes.io/serviceaccount # ls -al
total 0
drwxrwxrwt 3 root root 140 Sep 4 07:49 .
drwxr-xr-x 3 root root 28 Sep 4 07:49 ..
drwxr-xr-x 2 root root 100 Sep 4 07:49 ..2021_09_04_07_49_29.238705065
lrwxrwxrwx 1 root root 31 Sep 4 07:49 ..data -> ..2021_09_04_07_49_29.238705065
lrwxrwxrwx 1 root root 13 Sep 4 07:49 ca.crt -> ..data/ca.crt
lrwxrwxrwx 1 root root 16 Sep 4 07:49 namespace -> ..data/namespace
lrwxrwxrwx 1 root root 12 Sep 4 07:49 token -> ..data/token
/run/secrets/kubernetes.io/serviceaccount #
ca.crt,namespace ,token 这三个才能够让我们的pod去访问当kube-apiserver
Opaque Secret
Ⅰ、创建说明
Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:
[root@master1 secret]# echo -n "admin"|base
base64 basename
[root@master1 secret]# echo -n "admin"|base64
YWRtaW4=
[root@master1 secret]# echo -n "1dsf251dsds"|base64
MWRzZjI1MWRzZHM=
[root@master1 secret]#
[root@master1 secret]# echo -n "YWRtaW4="|base64 -d ##解码
admin[root@master1 secret]#
然后将我们上面创建的用户名和密码的加密之后保存至我们的secret。
secrets.yml
[root@master1 secret]# cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MWRzZjI1MWRzZHM=
username: YWRtaW4=
[root@master1 secret]# kubectl apply -f secret.yaml
secret/mysecret created
[root@master1 secret]#
[root@master1 secret]# kubectl get secrets
NAME TYPE DATA AGE
basic-auth Opaque 1 6d3h
default-token-pd2hb kubernetes.io/service-account-token 3 7d1h
mysecret Opaque 2 27s
tls-secret kubernetes.io/tls 2 6d3h
[root@master1 secret]#
分析:如果我们想要以“admin”和"1f2d1e2e67df"进行保存的话,要先以base64进行加密之后,再把加密值保存至secret中,下面就是如何使用
Ⅱ、使用方式
1、将 Secret 挂载到 Volume 中
[root@master1 secret]# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
name: seret-test
name: seret-test
spec:
volumes:
- name: secrets
secret:
secretName: mysecret
containers:
- image: nginx:alpine
name: db
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
[root@master1 secret]#
[root@master1 secret]# kubectl apply -f pod1.yaml
pod/seret-test created
[root@master1 secret]#
[root@master1 secret]# kubectl get pod
NAME READY STATUS RESTARTS AGE
seret-test 1/1 Running 0 37s
[root@master1 secret]# kubectl exec -it seret-test -- sh
/ # cd /etc/secrets/
/etc/secrets # ls
password username
/etc/secrets # cat password
1dsf251dsds/etc/secrets #
/etc/secrets # cat username
admin/etc/secrets #
虽然以加密的方式导入pod中去了,但是在pod中还是会自动解密。
2、将 Secret 导出到环境变量中
比上面的那种稍微安全一点,其实跟之前的configmap的类似,就是声明一个env,通过valueFrom来赋值,把键名username和password分别赋值给变量TEST_USER和TEST_PASSWORD,这样的方式避免了以明文的方式去赋值。
[root@master1 secret]# kubectl apply -f pod2.yaml
deployment.extensions/pod-deployment created
[root@master1 secret]# cat pod2.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: pod-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: pod-deployment
spec:
containers:
- name: pod-1
image: nginx:alpine
ports:
- containerPort: 80
env:
- name: TEST_USER
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[root@master1 secret]#
[root@master1 secret]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-deployment-5845fcb99f-fktr2 1/1 Running 0 2s
pod-deployment-5845fcb99f-qr46x 1/1 Running 0 2s
[root@master1 secret]# kubectl exec -it pod-deployment-5845fcb99f-fktr2 -- sh
/ #
/ # echo $TEST_USER
admin
/ #
/ # echo $TEST_PASSWORD
1dsf251dsds
/ #
/ # exit
[root@master1 secret]#
kubernetes.io/dockerconfigjson
对于我们的私有仓库里面的镜像,我们如果没有认证的话就去访问就会出错,
如果我们想要对这些私有仓库进行认证的话,我们可以通过如下的方式,
使用 Kuberctl 创建 docker registry 认证的 secret:
[root@master1 secret]# kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret "myregistrykey" created.
分析:创建的类型为docker-registry,名称为myregistrykey。
后面的就是关键认证信息:
--docker-server=私有仓库地址 --docker-username=私有仓库的用户名 --docker-password=私有仓库的密码 --docker-email=用户邮箱
注意,要想使用这种自动认证方式的话,记得在我们的pod里面添加
[root@master1 secret]# cat pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: nginx:alpine
imagePullSecrets:
- name: myregistrykey
[root@master1 secret]#
ImagePullScerets 密码下载策略,如果我下载镜像的话,就会用到myregistrykey去进行认证。
更多推荐
所有评论(0)