让我们看看如何在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命令的用法。此外,还创建了一个部署,并与秘密一起使用。