Nesta página, descrevemos o objeto Secret no Kubernetes e como usá-lo no Google Kubernetes Engine (GKE).
O que é um secret?
Chaves secretas são objetos seguros que armazenam dados confidenciais, como senhas, tokens OAuth e chaves SSH, nos clusters. Armazenar dados confidenciais em secrets é mais seguro que nos ConfigMaps de texto simples ou nas especificações de pod. O uso de secrets permite controlar como os dados confidenciais são usados e reduz o risco de expor os dados a usuários não autorizados.
Também é possível criptografar os Secrets na camada do aplicativo por meio de uma chave gerenciada no Cloud KMS. Para saber mais, consulte Criptografia de Secrets na camada do aplicativo.
Como criar um Secret
Use kubectl create secret
para criar um secret:
kubectl create secret type name data
em que:
type pode ser:
generic
: cria um secret com base em um valor literal, diretório ou arquivo local.docker-registry
: cria um secretdockercfg
para uso com um registro do Docker. Usado para autenticação nos registros do Docker.tls
: cria um secret TLS com base no par de chaves públicas/privadas determinado. O par de chaves públicas/privadas precisa existir de antemão. O certificado de chave pública precisa ser codificado em .PEM e corresponder à chave privada fornecida.
Na maioria dos secrets, você usa o tipo
generic
.name é o nome do Secret que você está criando.
data pode ser:
- Um caminho para um diretório que contém um ou mais arquivos de configuração, indicado pelas sinalizações
--from-file
ou--from-env-file
. - Pares de chave-valor, cada um deles especificado com as sinalizações
--from-literal
.
- Um caminho para um diretório que contém um ou mais arquivos de configuração, indicado pelas sinalizações
Para mais informações sobre kubectl create
, consulte a
documentação de referência (em inglês).
Outra opção para criar um secret é definir um objeto secret (em inglês) em um arquivo de manifesto YAML e implantá-lo usando o comando a seguir:
kubectl create -f file-name.yaml
Por exemplo, consulte Distribuir credenciais com segurança usando secrets (em inglês).
Com arquivos
Para criar um secret com base em um ou mais arquivos, use --from-file
ou --from-env-file
. O arquivo precisa ser texto simples, mas a extensão do arquivo não importa.
--from-file
Quando você cria um secret usando --from-file
, o valor dele é todo o conteúdo do arquivo. Se o valor do secret tiver vários pares de chave-valor, use --from-env-file
.
É possível especificar um ou vários arquivos:
kubectl create secret type name --from-file /path/to/file --from-file /path/to/file2
É possível também especificar um diretório contendo vários arquivos:
kubectl create secret type name --from-file /path/to/directory
Por exemplo, com o comando a seguir, você cria um secret chamado credentials
com base em dois arquivos, username.txt
e password.txt
, e define as chaves como username.txt
e password.txt
, respectivamente:
kubectl create secret generic credentials --from-file ./username.txt --from-file ./password.txt
Os valores de secrets são codificados em base 64 no Kubernetes.
Executar kubectl get secret credentials -o yaml
retorna a resposta a seguir:
apiVersion: v1 data: password.txt: MTIzNAo= username.txt: YWRtaW4K kind: Secret metadata: creationTimestamp: ... name: credentials namespace: default resourceVersion: "2011810" selfLink: /api/v1/namespaces/default/secrets/credentials uid: ... type: Opaque
Por padrão, a chave é o nome do arquivo. Use a sintaxe estendida de --from-file
para modificar a chave:
kubectl create secret type name --from-file=key=/path/to/directory
No exemplo a seguir, você cria um Secret chamado "credentials" a partir de dois arquivos,
username.txt e password.txt, e define as chaves como username
e password
,
em vez de usar os nomes de arquivo:
kubectl create secret generic credentials --from-file=username=./username.txt --from-file=password=./password.txt
--from-env-file
Para carregar vários pares de chave-valor em um secret, armazene-os em um ou mais arquivos em texto simples e carregue-os usando --from-env-file
em vez de --from-file
. É possível carregar vários arquivos especificando a sinalização várias vezes. As mesmas limitações de --from-file
são aplicadas.
Por exemplo, com o comando a seguir, você cria um secret chamado credentials
com base em um arquivo, credentials.txt
, que contém vários pares de chave-valor:
# Each of these key-value pairs is loaded into the Secret username=jane password=d7xnNss7EGCFZusG
Os valores de secrets são codificados em base64 no Kubernetes.
kubectl create secret generic credentials --from-env-file ./credentials.txt
Executar kubectl get secret credentials -o yaml
retorna a resposta a seguir:
apiVersion: v1
data:
password: ZDd4bk5zczdFR0NGWnVzRw==
username: amFuZQ==
kind: Secret
metadata:
creationTimestamp: 2019-06-04T15:39:27Z
name: credentials
namespace: default
resourceVersion: "14507319"
selfLink: /api/v1/namespaces/default/secrets/credentials
uid: efce376b-86de-11e9-9742-42010a80022f
type: Opaque
Limitações
Arquivos incomuns, como links simbólicos, dispositivos e barras verticais, são ignorados pelo kubectl.
Os subdiretórios também são ignorados. kubectl create secret
não se propaga aos subdiretórios.
Com base em valores literais
Para criar um secret com base em valores literais, use --from-literal
.
Por exemplo, com o comando a seguir, você cria um secret genérico chamado literal-token
com dois pares de chave-valor:
kubectl create secret generic literal-token --from-literal user=admin --from-literal password=1234
Especifique --from-literal
em cada par de chave-valor. Os valores são automaticamente codificados em base64.
Executar kubectl get secret literal-token -o yaml
retorna a resposta a seguir:
apiVersion: v1 data: password: MTIzNA== user: YWRtaW4= kind: Secret metadata: creationTimestamp: ... name: literal-token namespace: default resourceVersion: "2012831" selfLink: /api/v1/namespaces/default/secrets/literal-token uid: ... type: Opaque
Na resposta anterior, password
e user
são codificados em Base64.
A codificação base64 permite que a informação seja processada por apps e serviços que não podem processar certos caracteres. A codificação base64 não fornece segurança.
Como usar uma chave secreta
Para usar uma chave secreta com as cargas de trabalho, é possível especificar variáveis de ambiente que façam referência aos valores da chave secreta ou ativar um volume contendo a chave secreta.
Para saber sobre o uso de chaves secretas, consulte Como usar chaves secretas.