Usando variáveis de ambiente na especificação de implantação do Kubernetes

11

Atualmente, uso uma especificação do Kubernetes Deployment.yaml para implantar um serviço. A especificação inclui uma referência literal a um endereço IP específico (marcado como <static-ip-address> abaixo):

spec:
  type: LoadBalancer
  loadBalancerIP: <static-ip-address>

Estou preocupado em enviar informações como senhas ou endereços IP para repositórios Git remotos. Posso evitar isso? fazendo uso de variáveis de ambiente, por ex. com uma especificação de implantação e uma implantação real da seguinte forma:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

e

export SERVICE_ADDRESS=<static-ip-address>
kubectl create -f Deployment.yaml

Obviamente, esta sintaxe específica ainda não funciona. Mas é algo assim possível e, em caso afirmativo, como?

Prefiro não depender de uma ferramenta de provisionamento em separado. Segredo e ConfigMap parece promissor, mas aparentemente eles não podem ser consumidos de uma maneira que seja adequada a esse propósito. Se eu pudesse referenciar diretamente um endereço IP estático que foi definido com gcloud compute addresses create service-address , seria melhor.

    
por Drux 25.07.2016 / 04:42

4 respostas

2

Houve outra solução agradavelmente simples: eu tenho um endereço do Google Compute my-address definido, e aparentemente posso usá-lo na especificação de serviço assim: loadBalancerIP: my-address .

Com isso como fonte "externa" para endereços IP e segredos para senhas, não há mais necessidade de uma ferramenta de provisionamento (ou modelos) para meu caso de uso simples (dentro de um ambiente GKE).

OBSOLETO AGORA: Eu decidi usar uma ferramenta de provisionamento de tipos, "built-in" sed , afinal.

Meu Deployment.yaml agora contém uma "variável de modelo", por exemplo em

loadBalancerIP: $$EXTERNAL_IP

e eu implantar o serviço com, digamos, 1.2.3.4 como endereço IP externo com

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -
    
por 01.08.2016 / 01:24
15

Uma solução muito mais fácil / mais limpa: envsubst

No deploy.yml:

LoadbalancerIP: $LBIP

Em seguida, basta criar seu env var e executar o kubectl assim:

export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -

Você apenas coloca variáveis Bash regulares em qualquer arquivo que você queira usar, neste caso o manifesto YAML, e ensubst lê esse arquivo. Ele irá gerar o arquivo com as variáveis env, substituídas por seus valores. Você também pode usá-lo para criar novos arquivos como este:

envsubst < input.yml > output.yml

envsubst está disponível em, e. Ubuntu / Debian gettext package.

    
por 11.04.2017 / 14:47
0

Você pode escrever um pré-processador simples para fazer a substituição de variáveis em seus arquivos yaml (ou você pode usar o jsonnet para realizar o mesma coisa nos arquivos de configuração do json).

Há alguma discussão sobre adição de modelos diretamente na configuração do Kubernetes , mas ela ainda não está implementada ou disponível.

    
por 26.07.2016 / 16:27
0

Até que os modelos estejam disponíveis, a maneira mais fácil de fazer isso é executar um trabalho que usa a API do Kubernetes para atualizar o serviço. Um pequeno script de shell em uma imagem baseada em alpine, acoplado a um segredo (contendo o endereço IP) e um configmap (contendo o template), deve ser bastante simples. O bit difícil está usando corretamente os recursos de autenticação e autorização do apiserver.

link dá um exemplo de acesso à API. Obviamente, você desejará POSTAR para / api / v1 / namespaces / default / services em vez do GET nesse exemplo.

    
por 30.07.2016 / 17:22