k8s创建secret并在container中获取secret

k8s创建secret并在container中获取secret

本文使用的deployment和service与我的上一篇文章一样。link也放在下面了,如果不懂什么事deployment和service,可以先看我的上一篇文章。
k8s使用kustomize来部署应用

下面我们将通过创建secret开始。secret是我们自己收到创建的,我们需要先通过下面的命令来创建分别存放username和password的文件。

echo -n 'admin' > ./username.txt
echo -n 'S!B\*d$zDsb=' > ./password.txt

下面我们通过一个命令把secret绑定到我们需要部署的命名空间,即dev-api中,secret的名字叫db-user-pass,存放有两对keypairs。

kubectl create -n dev-api secret generic db-user-pass \
    --from-file=username=./username.txt \
    --from-file=password=./password.txt

我们通过下面命令查看secret是否创建成功,如果有secret的详细信息,说明已经创建成功了。

# 查看secret
kubectl get secret -n dev-api
kubectl describe secret -n dev-api db-user-pass 

也可以使用下面命令解码secret看看。

kubectl get secret -n dev-api db-user-pass -o jsonpath='{.data.password}' | base64 --decode

方法一:使用挂载访问secret

下面我们更改deployment.yaml是的container中可以访问这个secret。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-helloworld # 部署的名称
  # namespace: dev-api # 部署到哪个命名空间, 使用kustomize的话这里不能出现,需要在overlays/dev/kustomization.yaml 指定
spec:
  replicas: 2  # 设置副本数量为2
  selector:
    matchLabels:
      app: api-helloworld # 用于选择匹配的Pod标签
  template:
    metadata:
      labels:
        app: api-helloworld # Pod的标签
    spec:
      containers:
      - name: api-helloworld-c # 容器名称
        # image: docker.io/library/restfulapi:latest # For image in container, use ctr -n k8s.io images import restfulapi.tar to import images
        image: restfulapi:1  # For image in docker
        imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取
        ports:
        - containerPort: 80 # 容器内部监听的端口
        volumeMounts:
        - name: secret-volume
          mountPath:  "/etc/secrets"
          readOnly: true
      volumes:
      - name: secret-volume
        secret:
          secretName: db-user-pass

想对于没有修改之前的版本,这里主要加入了对volume以及volumeMounts的描述,volume把secret定义在volume上面了,volumeMount则是把volume挂载到Pod.

主要变化。

      containers:
      - name: api-helloworld-c # 容器名称
        # image: docker.io/library/restfulapi:latest # For image in container, use ctr -n k8s.io images import restfulapi.tar to import images
        image: restfulapi:1  # For image in docker
        imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取
        ports:
        - containerPort: 80 # 容器内部监听的端口
        volumeMounts:
        - name: secret-volume
          mountPath:  "/etc/secrets"
          readOnly: true
      volumes:
      - name: secret-volume
        secret:
          secretName: db-user-pass

最后,我们重新部署一下。

cd overlay/dev
kubectl kustomize | kubectl apply -f -

在这里插入图片描述
当确定好Pod已经起来以后,我们就可以进去Pod里面看看我们的secret了。

kubectl exec -it -n dev-api api-helloworld-6c7c74fcbd-22prm -- bash
ls /etc/secrets/

在这里插入图片描述
可以看得到secret已经可以成功范围了,并且值得注意的是,当作为volume挂载进来Pod的时候,secret会自动的进行base64解码,这里直接就可以访问明文了。

方法二:使用环境变量方式访问secret

deployment.yaml如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-helloworld # 部署的名称
  # namespace: dev-api # 部署到哪个命名空间, 使用kustomize的话这里不能出现,需要在overlays/dev/kustomization.yaml 指定
spec:
  replicas: 2  # 设置副本数量为2
  selector:
    matchLabels:
      app: api-helloworld # 用于选择匹配的Pod标签
  template:
    metadata:
      labels:
        app: api-helloworld # Pod的标签
    spec:
      containers:
      - name: api-helloworld-c # 容器名称
        # image: docker.io/library/restfulapi:latest # For image in container, use ctr -n k8s.io images import restfulapi.tar to import images
        image: restfulapi:1  # For image in docker
        imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取
        ports:
        - containerPort: 80 # 容器内部监听的端口
        env:
        - name: SECRET_USERNAME
          valueFrom: 
            secretKeyRef:
              name: db-user-pass
              key: username
        - name: SECRET_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-user-pass
              key: password

上面主要是加入了env的相关描述,绑定到Pod里面的环境变量名分别为SECRET_USERNAME,SECRET_PASSWORD。同样,我们把deployment的变化直接apply到集群。

cd overlay/dev
kubectl kustomize | kubectl apply -f -

Pod确定起来以后,我们进去里面看看我们新绑定的env.

kubectl get pods -n dev-api
kubectl exec -it -n dev-api api-helloworld-797679c6c-5wk72 -- bash
env | grep SECRET

在这里插入图片描述
同样我们也可以在env中看到我们新绑定的secret,并且和卷绑定一样,可以看到是明文形式来存储的。

好了以上是本期分享的全部内容了,如果你觉得对你还有帮助,建议点赞分享并收藏哦。如果大家想对我表示肯定,扫描下面的二维码即可哦,原创不易,一分钱也是爱哦。
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KubernetesSecret是一种用于存储敏感数据的资源对象,如API密钥、数据库密码等。它可以被挂载到Pod的Volume,也可以通过环境变量或者命令行参数传递给容器,以便容器可以安全地访问这些敏感数据。 Secret可以被创建和更新,并且可以由Kubernetes管理员管理。创建一个Secret有两种方式:命令行和YAML文件。 1. 命令行方式 ``` $ kubectl create secret generic <secret_name> --from-literal=<key>=<value> ``` 其,`<secret_name>`是你想要创建Secret的名称,`<key>`是密钥名称,`<value>`是密钥的值。 例如,要创建一个包含API密钥的Secret: ``` $ kubectl create secret generic my-api-key --from-literal=api-key=1234567890 ``` 2. YAML文件方式 创建一个包含API密钥的Secret的YAML文件,例如: ``` apiVersion: v1 kind: Secret metadata: name: my-api-key type: Opaque data: api-key: MTIzNDU2Nzg5MA== ``` 然后,使用以下命令创建Secret: ``` $ kubectl apply -f secret.yaml ``` 引用Secret: 你可以在Pod的spec声明Volume并将Secret挂载到其。 例如,在以下Pod配置,将my-api-key Secret挂载到/my-secrets目录下: ``` apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image volumeMounts: - name: my-secrets mountPath: /my-secrets readOnly: true volumes: - name: my-secrets secret: secretName: my-api-key ``` 这样,容器就可以通过访问/my-secrets/api-key文件来获取API密钥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值