返回
Featured image of post Kubernetes初探(十)

Kubernetes初探(十)

使用 Kubernetes 管理 Secrets 和密码

Katacoda在线课:Use Kubernetes To Manage Secrets And Passwords

本系列教程希望能通过交互式学习网站与传统方式结合,更高效、容易的学习知识。 本系列教程将使用 Katacoda在线学习平台 完成学习。

在此场景中,您将了解如何使用 Kubernetes 管理 SecretsKubernetes 允许您创建通过环境变量或作为卷挂载到 PodSecrets

只允许 Secrets (例如 SSL 证书或密码)通过基础架构团队以安全的方式进行管理,而不是将密码存储在应用程序的部署工件中。

启动 Kubernetes

首先,我们需要启动一个 Kubernetes 集群。

执行以下命令启动集群组件并下载 Kubectl CLI

controlplane $ launch.sh
Waiting for Kubernetes to start...
Kubernetes started

创建 Secrets

Kubernetes 要求将 Secrets 编码为 Base64 的字符串。

使用命令行工具,我们可以创建 Base64 字符串并将它们存储为变量在文件中使用。

controlplane $ username=$(echo -n "admin" | base64)
controlplane $ password=$(echo -n "a62fjbd37942dcs" | base64)

Secrets 是使用 YAML 定义的。下面我们将使用上面定义的变量,并为它们提供我们的应用程序可以使用的标签。这将创建一个可以通过名称访问的键/值秘密的集合。

echo "apiVersion: v1
kind: Secret
metadata:
  name: test-secret
type: Opaque
data:
  username: $username
  password: $password" >> secret.yaml

secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: test-secret
type: Opaque
data:
  username: YWRtaW4=
  password: YTYyZmpiZDM3OTQyZGNz

这个 YAML 文件中定义可以与 Kubectl 一起使用来创建我们的 Secrets 。在启动需要访问密钥的 Pod 时,我们将通过名称引用集合。

任务: 创建 Secret

使用 kubectl 创建 Secret

controlplane $ kubectl create -f secret.yaml
secret/test-secret created

以下命令允许您查看定义的所有Secret集合。

controlplane $ kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-z8shh   kubernetes.io/service-account-token   3      14m
test-secret           Opaque                                2      26s

在下一步中,我们将通过 Pod 使用这些 Secret

通过环境变量使用 Secret

在文件 secret-env.yaml 中,我们定义了一个有先前创建的 Secret 为环境变量的 Pod

使用 cat secret-env.yaml 查看文件

secret-env.yaml

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
    - name: mycontainer
      image: alpine:latest
      command: ["sleep", "9999"]
      env:
        - name: SECRET_USERNAME
          valueFrom:
            secretKeyRef:
              name: test-secret
              key: username
        - name: SECRET_PASSWORD
          valueFrom:
            secretKeyRef:
              name: test-secret
              key: password
  restartPolicy: Never

为了填充环境变量,我们定义了名称,在本例中为 SECRET_USERNAME,以及 Secret 集合的名称和包含数据的密钥。

结构如下所示:

- name: SECRET_USERNAME
valueFrom:
 secretKeyRef:
   name: test-secret
   key: username

任务

使用 kubectl create -f secret-env.yaml 启动 Pod

controlplane $ kubectl create -f secret-env.yaml
pod/secret-env-pod created

Pod 启动后,将输出填充的环境变量。

controlplane $ kubectl exec -it secret-env-pod env | grep SECRET_
SECRET_USERNAME=admin
SECRET_PASSWORD=a62fjbd37942dcs

Kubernetes 在填充环境变量时解码 base64 值。您应该会看到我们定义的原始用户名/密码组合。这些变量现在可用于访问 API、数据库等。

您可以使用 kubectl get pods 检查 Pod 的状态。

controlplane $ kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
secret-env-pod   1/1     Running   0          34s

在下一步中,我们将把 Secret 挂载为文件。

通过文件使用 Secret

使用环境变量在内存中存储 Secret 可能会导致它们意外泄漏。推荐的方法是将它们作为卷安装。

Pod 定义可以使用 cat secret-pod.yaml 查看。

secret-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: secret-vol-pod
spec:
  volumes:
  - name: secret-volume
    secret:
      secretName: test-secret
  containers:
    - name: test-container
      image: alpine:latest
      command: ["sleep", "9999"]
      volumeMounts:
          - name: secret-volume
            mountPath: /etc/secret-volume

要将 Secret 安装为卷,我们首先定义一个具有名称的卷,在本例中为 Secret 卷,并为其提供我们存储的 Secret

volumes:
 - name: secret-volume
   secret:
     secretName: test-secret

当我们定义容器时,我们将创建的卷挂载到特定目录。应用程序将从该路径读取Secret 作为文件。

volumeMounts:
 - name: secret-volume
   mountPath: /etc/secret-volume

任务

使用 kubectl create -f secret-pod.yaml 创建我们的新 Pod

controlplane $ kubectl create -f secret-pod.yaml
pod/secret-vol-pod created

启动后,您可以与安装的Secret 进行交互。例如,您可以列出所有可用的 Secret ,就好像它们是常规数据一样。

controlplane $ kubectl exec -it secret-vol-pod ls /etc/secret-volume
password  username

读取文件允许我们访问解码的 Secret 值。要访问我们使用的用户名

controlplane $ kubectl exec -it secret-vol-pod cat /etc/secret-volume/username
admin

对于密码,我们会读取密码文件。

admincontrolplane $ kubectl exec -it secret-vol-pod cat /etc/secret-volume/password
a62fjbd37942dcs
Built with Hugo
Theme Stack designed by Jimmy