如何在K8s中使用Secrets

125 阅读2分钟

让我们看看如何在K8s中使用Secrets

K8s中的秘密

为了保存机密数据,人们可以使用一种叫做Secret的K8s资源。

人们可以通过运行kubectl create secret从CLI创建Secret。

这里我们将使用两种方法来创建秘密。第一种方法将在一个文件中存储用户,在另一个文件中存储密码,并通过读取文件来创建Secret对象。数据将被加密成base64格式。

$ echo -n 'root' >./username.txt
$ echo -n 'secret' >./password.txt 

# Create generic secret object with keys username and password from files
$ kubectl create secret generic mariadb-secret --from-file=username=./username.txt --from-file=password=./password.txt
secret/mariadb-secret created

要显示秘密,可以使用以下命令

$ kubectl get secret mariadb-secret
NAME             TYPE     DATA   AGE
mariadb-secret   Opaque   2      61s

$ kubectl describe secret mariadb-secret
Name:         mariadb-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
username:  4 bytes
password:  6 bytes

注意,在意外显示Secret的情况下,数据是安全的。

为了解密,可以使用以下命令

# Decode data field from secret using json output
$ kubectl get secret mariadb-secret -o jsonpath='{.data}'
{"password":"c2VjcmV0","username":"cm9vdA=="}

# Get data using yaml output
$ kubectl get secret mariadb-secret -o yaml
apiVersion: v1
data:
  password: c2VjcmV0
  username: cm9vdA==
kind: Secret
metadata:
  creationTimestamp: "2022-03-21T10:49:24Z"
  name: mariadb-secret
  namespace: default
  resourceVersion: "392508"
  uid: 25943f12-d47d-4042-b9c6-027646864d3b
type: Opaque

# Decode base64 encrypted data username
$ echo "cm9vdA=="|base64 -d # output 'root'

要删除密文,请运行

$ kubectl delete secret mariadb-secret
secret "mariadb-secret" deleted

在这里我们要指出的第二个方法是使用键/值字面。

$ kubectl create secret generic my-test-secret --from-literal=mariadb-root-password=secret

为了再次获得数据,我们可以使用输出格式(在这种情况下,让我们使用go-template )。

$ kubectl get secret my-test-secret -o go-template='{{.data}}'
[mariadb-root-password:c2VjcmV0]

另外,我们也可以使用配置文件。配置文件的例子(文件在GitHub上)。

apiVersion: v1
kind: Secret
metadata:
    name: mariadb-secret
type: Opaque
data:
  # Encoded value: echo -n 'secret'|base64
  mariadb-root-password: c2VjcmV0 

要创建资源,运行kubectl apply。

$ kubectl apply -f mariadb-secret.yaml 
secret/mariadb-secret created

要使用Secrets,首先需要存在secrets。

人们可以在容器中使用它来设置根密码,所以要做的就是更新MARIADB_ROOT_PASSWORD的值(部署文件在GitHub)。

        - name: MARIADB_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: mariadb-root-password

让我们创建包含秘密信息的部署配置文件并显示结果。

$ kubectl  apply -f mariadb-deployment-from-secret.yaml 
deployment.apps/mariadb-deployment created

现在你可以通过运行kubectl exec命令在Pod上进行测试。

# Get the Pods
$ kubectl get all 
NAME                                      READY   STATUS    RESTARTS   AGE
pod/mariadb-deployment-7bcbb796f5-cfh8b   1/1     Running   0          6s
pod/mariadb-deployment-7bcbb796f5-gjtlj   1/1     Running   0          6s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   143d

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mariadb-deployment   2/2     2            2           6s

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/mariadb-deployment-7bcbb796f5   2         2         2       6s

# Run mariadb client
$ kubectl exec mariadb-deployment-7bcbb796f5-cfh8b -- mariadb -uroot -psecret -e "select version()"
version()
10.7.3-MariaDB-1:10.7.3+maria~focal

从上面,我们可以看到MariaDB数据库的成功访问。

结论和未来工作

这篇博客展示了如何在K8s集群中创建一个Secret,并演示了在K8s中使用Secret的基本kubectl命令的用法。此外,还创建了一个部署,并与秘密一起使用。