如何在命名空间之间复制Kubernetes Secret

时间:2020-02-23 14:30:19  来源:igfitidea点击:

如何将Kubernetes机密从一个名称空间复制到另一个名称空间?Secret是一个Kubernetes对象,它存储敏感数据,例如密码,令牌或者密钥。此类信息可能以其他方式放在Pod规范中或者图像中,但要在Pod和服务之间共享,最好是作为Kubernetes对象来完成。 Kubernetes集群用户可以创建机密,系统还可以创建一些机密。

在本教程中,如果使用OpenShift,我们将复制已经在名称空间或者项目中创建的密钥,并将其应用于其他名称空间。这通常适用于机密,例如注册表机密,共享git凭据,SSL证书和密钥,共享API凭据等。我们将创建一个测试秘密,并向我们展示如何将其从一个项目复制到另一个项目。

创建Kubernetes的Secret

我们将使用文件中的用户名和密码创建一个秘密。

echo -n 'admin' > ./username.txt
echo -n 'Password' > ./password.txt

运行kubectl create secret命令以将这些文件打包为Secret并在API服务器上创建对象。

$kubectl create secret generic my-user-pass --from-file=./username.txt --from-file=./password.txt
secret/my-user-pass created

我们也可以直接使用kubectl创建秘密,而无需文件。

kubectl create secret generic my-user-pass --from-literal='username=admin' --from-literal='password=Password'

机密对象的名称必须是有效的DNS子域名。

列出机密:

$kubectl get secrets

将秘密数据转换为base-64

这是我们手动将机密数据转换为base-64表示形式的方法:

$echo -n 'admin' | base64
YWRtaW4=

$echo -n 'Password' | base64
UGFzc3dvcmQ=

yaml列表文件如下所示。

apiVersion: v1
kind: Secret
metadata:
  name: my-user-pass
data:
  username: YWRtaW4=
  password: UGFzc3dvcmQ=

在命名空间之间复制Kubernetes秘密

使用以下命令语法将机密从一个名称空间复制到另一个名称空间。

kubectl get secret <secret-name> \
  --namespace=<source-nemespace> \
  --export -o yaml | \
  kubectl apply --namespace=<new-namespace> -f 

在我的例子中,我会运行:

kubectl get secret my-user-pass \
  --namespace=namespace1 \
  --export -o yaml | \
  kubectl apply --namespace=namespace2 -f 

命令执行输出:

secret/my-user-pass created

在命名空间中确认秘密创建。

$kubectl get secret -n namespace2 my-user-pass
NAME         TYPE   DATA AGE
my-user-pass Opaque 2    38s

解密机密以确认数据正确:

secret_name="my-user-pass"
namespace="namespace2"
kubectl get secret -n $namespace $secret_name -o go-template='{{range $k,$v := .data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}'

命令输出:

password.txt: Password
username.txt: admin

如果我们有jq,则可以使用以下命令进行解密。

$kubectl get secret my-user-pass -o json | jq '.data | map_values(@base64d)'
{
  "password.txt": "Password",
  "username.txt": "admin"

}

这样便可以轻松地在Kubernetes和OpenShift Cluster中的命名空间之间复制密钥。