k8s-存储-Secret

Secret 存在意义

Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret 可以以 Volume 或者环境变量的方式使用

Secret 有三种类型:
Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中
Opaque :base64编码格式的Secret,用来存储密码、密钥等
kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息

Service Account

Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod的/run/secrets/kubernetes.io/serviceaccount 目录中

[root@k8s-master01 ~]# kubectl run nginx --image nginx
[root@k8s-master01 ~]# kubectl  exec nginx-7bb7cd8db5-w8gfr  -it  -- /bin/sh
# cd /run/secrets/kubernetes.io/serviceaccount
# ls
ca.crt	namespace  token

Opaque Secret

创建说明
Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:

[root@k8s-master01 ~]# echo -n "admin" | base64
YWRtaW4=
[root@k8s-master01 ~]# echo -n "1f2d1e2e67df" | base64
MWYyZDFlMmU2N2Rm
[root@k8s-master01 ~]# base64 --help
Usage: base64 [OPTION]... [FILE]
Base64 encode or decode FILE, or standard input, to standard output.

Mandatory arguments to long options are mandatory for short options too.
  -d, --decode		解码数据
  -i, --ignore-garbag	解码时忽略非字母字符
  -w, --wrap=字符数	在指定的字符数后自动换行(默认为76),0 为禁用自动换行

      --help		显示此帮助信息并退出
      --version		显示版本信息并退出

如果没有指定文件,或者文件为"-",则从标准输入读取。

数据以 RFC 3548 规定的 Base64 字母格式进行编码。 解码时,输入数据(加密流)可能包含一些非有效 Base64 字符的新行字符。可以尝试用 --ignore-garbage 选项来恢复加密流中任何非 base64 字符。

GNU coreutils online help: http://www.gnu.org/software/coreutils/
请向http://translationproject.org/team/zh_CN.html 报告base64 的翻译错误
要获取完整文档,请运行:info coreutils ‘base64 invocation’

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=
[root@k8s-master01 ~]# kubectl apply -f secret.yaml 
secret/mysecret created


[root@k8s-master01 ~]# kubectl  get secret
NAME                  TYPE                                  DATA   AGE
default-token-l2627   kubernetes.io/service-account-token   3      7h24m
mysecret              Opaque                                2      29s

、使用方式
1、将 Secret 挂载到 Volume 中

apiVersion: v1
kind: Pod
metadata:
  labels:
    name: seret-test
  name: seret-test
spec:
  volumes:
  - name: secrets
    secret:
      secretName: mysecret
  containers:
  - image: at.harbor.com/library/nginx:v1
    name: db
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secrets"
      readOnly: true
[root@k8s-master01 ~]# kubectl  apply -f seret.yaml
[root@k8s-master01 ~]# kubectl  get pod
seret-test                  1/1     Running   0          16s

[root@k8s-master01 ~]# kubectl  exec seret-test -it -- /bin/sh
/ # cd /etc/secrets
/etc/secrets # ls
password  username
/etc/secrets # cat username
admin/etc/secrets #

将 Secret 导出到环境变量中

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: pod-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: pod-deployment
    spec:
      containers:
      - name: pod-1
        image: at.harbor.com/library/nginx:v1
        ports:
        - containerPort: 80
        env:
        - name: TEST_USER
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: username
        - name: TEST_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: password
[root@k8s-master01 ~]# kubectl  apply -f servt.yaml 
deployment.extensions/pod-deployment created


[root@k8s-master01 ~]# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
pod-deployment-8965575c6-d9bxs   1/1     Running   0          25s
pod-deployment-8965575c6-nfcp6   1/1     Running   0          25s


[root@k8s-master01 ~]# kubectl exec pod-deployment-8965575c6-d9bxs -it -- /bin/sh
/ # echo $TEST_USER
admin
/ # echo $TEST_PASSWORD
1f2d1e2e67df
/ # 

要想实验的准确性,把每个节点的镜像删除,把仓库设置为私有仓库。
在这里插入图片描述

退出

[root@k8s-master01 ~]# docker logout at.harbor.com/
Removing login credentials for at.harbor.com

尝试下载镜像

[root@k8s-master01 ~]# docker pull at.harbor.com/library/nginx:v1
Error response from daemon: pull access denied for at.harbor.com/library/nginx, rep

开始创建一个pod

在创建 Pod 的时候,通过 imagePullSecrets 来引用刚创建的 myregistrykey

apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
  - name: foo
    image: at.harbor.com/library/nginx:v1
    #引用认证
  imagePullSecrets:
  - name: myregistrykey
[root@k8s-master01 ~]# kubectl create -f pod.yaml 
pod/foo created
[root@k8s-master01 ~]# kubectl  get pod
NAME             READY   STATUS             RESTARTS   AGE
foo              0/1     ImagePullBackOff   0          20s
[root@k8s-master01 ~]# kubectl  describe pod foo

....
error: code = Unknown desc = Error response from daemon: pull access denied for at.harbor.com/library/nginx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed     35s (x4 over 2m1s)  kubelet, k8s-node01  Error: ErrImagePull
  Warning  Failed     12s (x6 over 2m)    kubelet, k8s-node01  Error: ImagePullBackOff
  Normal   BackOff    0s (x7 over 2m)     kubelet, k8s-node01  Back-off pulling image "at.harbor.com/library/nginx:v1"

下载镜像失败

必须要认证之后才能下载

使用 Kuberctl 创建 docker registry 认证的 secret

[root@k8s-master01 ~]# kubectl create secret docker-registry myregistrykey --docker-server=at.harbor.com --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@example.com
secret/myregistrykey created

docker-server:私有仓库地址
docker-username:用户名
docker-password:密码
docker-email:邮箱

重新创建pod

[root@k8s-master01 ~]# kubectl  delete pod --all
[root@k8s-master01 ~]# kubectl  create  -f pod.yaml 
pod/foo created
[root@k8s-master01 ~]# kubectl  get pod
NAME             READY   STATUS    RESTARTS   AGE
foo              1/1     Running   0          7s

认证成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rio520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>