Trinta DevOps

Dicas e macetes do mundo Open Source

Spinnaker

Instalação da solução Spinnaker em um Cluster Kubernetes

O ambiente usado para esta instalação foi um cluster kubernetes composto por 1 Control Plane e dois Worker Nodes. O Spinnaker é relativamente grande, isto é, consome uma quantidade razoável de recursos de sistema e contém diversos PODs para subir, devido a isto não foi utilizado minikube ou outro cluster lab menor.

Instalação

Utilizando o Linux, são necessárias algumas dependências, como o dockerd executando para subirmos o container Halyard, esta, uma ferramenta de gerenciamento via linha de comando da instalação do Spinnaker. O helm instalado para subirmos os charts de algumas dependências do Spinnaker como o Minio.
Antes da instalação garanta a instalação destes recursos.

No seu host linux
Crie o diretório oculto .hal no seu diretório home.
Crie o container Halyard, repare que o container irá mapear o diretório recém criado .hal, e o caminho para seu kubeconfig para que o kubectl do container Halyard tenha acesso para efetuar o deploy.

mkdir ~/.hal
docker run --name halyard -v ~/.hal:/home/spinnaker/.hal -v ~/.kube/config:/home/spinnaker/.kube/config -d gcr.io/spinnaker-marketplace/halyard:stable

Conecte-se no container docker do Halyard

docker exec -it halyard bash

Valide se o kubectl do halyard chega no cluster k8s.

kubectl cluster-info

Uma imagem como esta abaixo deverá aparecer se sua conexão com o cluster estiver correta.

Execute o comando hal abaixo para preparar o deploy do Spinnaker em Kubernetes.

hal config provider kubernetes enable

Crie uma conta (apelido) para seu cluster kubernetes no hal, seguindo o comando abaixo (no caso, dei o nome do meu cluster de my-k8s)

hal config provider kubernetes account add my-k8s --provider-version v2 --context $(kubectl config current-context)

Habilite os artefatos necessários para o Spinnaker

hal config features edit --artifacts true

Aqui indicaremos para o hal onde será feito o deploy do Spinnaker, no caso meu cluster “my-k8s” que será utilizado.

hal config deploy edit --type distributed --account-name my-k8s

Atenção aqui!
Sem fechar o container Halyard, volte a linha de comando do seu host Linux, faremos o deploy do Minio via helm chart.

Um parenteses aqui rapidinho!

O que é o Minio?

O Minio é um Storage de Objetos, uma arquitetura de armazenamento de dados, que consegue lidar com uma abundância de informações não estruturadas, sem hierarquia. 

Ele é uma solução de alto desempenho compatível com os principais recursos do S3, que utilizam Buckets – semelhante a uma pasta/diretório de um sistema de arquivos padrão – para organizar objetos. 

Um objeto é um dado binário, também chamado de BLOB, são dados estáticos (que não requerem alteração frequente, mas podem ser lidos várias vezes), como, por exemplo, fotos, vídeos, logsbackups ou até imagens de container/VM.

No caso, como não utilizaremos nenhuma nuvem para instalação do Spinnaker, estamos fazendo isso localmente, iremos utilizar o padrão S3 que o Minio fornece para armazenar os dados do Spinnaker.

No seu host linux (não no container do Halyard), execute o comando abaixo para criar o namespace:

kubectl create ns spinnaker

Adicione a lib chart do Minio

helm repo add minio https://operator.min.io/

Nativamente o minio na instalação padrão é bem grande e consome muitos recursos devido a várias réplicas na instalação do helm chart padrão. Sendo assim customizaremos o minio para ter apenas um POD e uma quantidade menor de recursos, como memória, por exemplo.

helm install --namespace spinnaker --set resources.requests.memory=4096Mi --set accessKey="myaccesskey" --set secretKey="mysecretkey" --set replicas=1 --set persistence.enabled=false --set mode=standalone --set rootUser=myaccesskey,rootPassword=mysecretkey --generate-name minio/minio

Acima, estamos configurando 4GB de Ram para o Minio, injetando a senha e o usuário com a chave “myaccesskey e a secret “mysecretkey”, configurando apenas 1 réplica, suficiente para o LAB, setando o User e Password.

Tarefas a serem executadas no Minio

Conecte-se no shell do POD do Minio

Execute os comando abaixo:

Isto definirá a senha para o Bucket que será utilizado pelo Spinnaker.

chmod 770 /opt/bin/mc
mc alias set spinnaker http://localhost:9000 myaccesskey mysecretkey
mc config host add myminio http://localhost:9000 myaccesskey mysecretkey

Volte ao container do Halyard

Após o deploy do Minio, cotinuaremos a configuração do Hal para instalação do Spinnaker:
Criaremos um diretório chamado profiles
Desabilitaremos o s3 versioning.

mkdir ~/.hal/default/profiles
echo "spinnaker.s3.versioning: false" > ~/.hal/default/profiles/front50-local.yml

Aqui iremos configurar o Spinnaker para utilizar o minio recém instalado.

Valide o IP do ClusterIP que o Minio recebeu em seu Services instalado.

kubectl get svc -n spinnaker | grep minio

No meu caso o IP era 10.107.225.79 (Copie este IP)

Agora iremos informar este IP para o hal configurar no Spinaker

hal config storage s3 edit --endpoint http://<COLOQUE O IP AQUI>:9000 --access-key-id "myaccesskey" --secret-access-key "mysecretkey"
hal config storage s3 edit --path-style-access true
hal config storage edit --type s3

Agora selecionaremos qual versão do Spinnaker devemos instalar.

hal version list

De acordo com a versão escolhida, execute o comando:

hal config version edit --version <versão desejada>

Tudo pronto, agora podemos fazer o deploy do Spinnaker.

hal deploy apply

Este comando acima criará todo ambiente, ConfigMaps, Services, Secrets e todos os PODs dentro do namespace spinnaker.

Network

De acordo com sua escolha para acesso, via NodePort ou LoadBalancer, execute os comandos abaixo para configurar os parâmetros de segurança do Spinnaker.

Perceba que irá atualizar o deploy para aplicar estas configurações.

Caso utilizar Load Balancer ou NodePort, escolha as opções corretas abaixo:

LoadBalancer

hal config security ui edit --override-base-url "http://<LoadBalancerIP>:9000"
hal config security api edit --override-base-url "http://<LoadBalancerIP>:8084"
hal deploy apply

Caso for NodePort

hal config security ui edit --override-base-url "http://<worker-node-ip>:<nodePort>"
hal config security api edit --override-base-url "http://<worker-node-ip>:<nodePort>"
hal deploy apply

Obviamente é possível utilizar Ingress, no meu caso, estou utilizando MetalLB para criar meu ingress localmente utilizando meus IPs da minha LAN.