Como colocar o Jenkins rodando no Kubernetes

O Jenkins é uma ferramenta muito versátil e largamente utilizada não só para as atividades de Continuous Integration quanto para Continuous Delivery. Neste rápido tutorial irei explicar como pode ser o realizado o deploy do Jenkins de forma bem simples e rápida com o uso do Helm Chart. Além disso, todos os agentes serão provisionados dentro do próprio Cluster aumentando ainda mais a resiliência.

Instalação

Como vimos neste post, o Helm é uma ferramenta que utilizamos para instalar novas aplicações dentro de um cluster Kubernetes. Existem diversos repositórios de Charts mas eu gosto muito do que é oferecido pela Bitnami, o qual usaremos neste tutorial. A primeira coisa que precisa ser feita é realizar a instalação do Helm, caso você não ainda tenha. Neste caso recomendo uma olhada rápida no post que falei anteriormente. Caso contrário pode seguir adiante. Agora vamos adicionar o repositório da Bitnami como nossa fonte de aplicações para o Helm. Para isso execute o comando abaixo na linha de comando:

$ helm repo add bitnami https://charts.bitnami.com/bitnami

Agora que temos o repo configurado, podemos fazer a instalação do Jenkins. Para que nosso cluster tenha o mínimo de organização, vamos primeiro criar um Name Space chamado jenkins usando o comando abaixo:

$ kubectl create ns jenkins
namespace/jenkins created

Com o Name Space criado podemos finalizar a instalação com o Helm. Como queremos que o Jenkins seja instalado no name space de mesmo nome devemos passar uma chave de parâmetro adicional para isso:

$ helm install jenkins bitnami/jenkins -n jenkins

Como de costume o Helm exibe uma mensagem com as instruções necessárias para acessar a aplicação.

NAME: jenkins
LAST DEPLOYED: Tue Dec  7 08:38:27 2021
NAMESPACE: jenkins
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: jenkins
CHART VERSION: 8.0.18
APP VERSION: 2.303.3

** Please be patient while the chart is being deployed **

1. Get the Jenkins URL by running:

** Please ensure an external IP is associated to the jenkins service before proceeding **
** Watch the status using: kubectl get svc --namespace jenkins -w jenkins **

  export SERVICE_IP=$(kubectl get svc --namespace jenkins jenkins --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
  echo "Jenkins URL: http://$SERVICE_IP/"

2. Login with the following credentials

  echo Username: user
  echo Password: $(kubectl get secret --namespace jenkins jenkins -o jsonpath="{.data.jenkins-password}" | base64 --decode)

Vamos executar os comandos abaixo para obter a URL:

export SERVICE_IP=$(kubectl get svc --namespace jenkins jenkins --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
echo "Jenkins URL: http://$SERVICE_IP/"

Jenkins URL: http://172.20.0.250/

Como você deve ter percebido ele atribuiu um endereço IP externo. No meu caso tenho um Load Balancer configurado no meu cluster Kubernetes. Caso você não tenha um configurado será necessário realizar este deploy antes de prosseguir. Porém, vou te dar uma opção rápida, acesse esse post: Cluster Kubernetes Multimaster com Kind e Docker. Nele ensino de forma rápida e fácil como ter um cluster kubernetes rodando na sua máquina já com Load Balancer e Ingress configurado precisando somente do Docker instalado e mais nada.

Configuração do Jenkins

Apesar do Helm Chart já adiantar bem as configurações tive que fazer um pequeno ajuste na configuração da Service Account que é configurada como padrão. Para isso crie um arquivo chamado rbac-jenkins.yaml com o conteúdo abaixo:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: jenkins
  namespace: jenkins
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: edit
subjects:
- kind: ServiceAccount
  name: default
  namespace: jenkins

Depois de salvar o arquivo acima aplique o manifesto no cluster:

$ kubectl apply -f rbac-jenkins.yaml -n jenkins

Pronto agora que fizemos os ajustes podemos seguir com a configuração no Jenkins.

Atualizando os plugins

Acesse o Jenkins abrindo o browser para a URL que você pegou no passo anterior.

Para as credenciais vamos utilizar os comandos da saída da instalação que fizemos com o Helm.

$ echo Username: user
echo Password: $(kubectl get secret --namespace jenkins jenkins -o jsonpath="{.data.jenkins-password}" | base64 --decode)
Username: user
Password: 9CMIo4atfj

Depois que o Jenkins for carregado clique em Gerenciar Jenkins do lado esquerdo

Logo após a instalação é normal que alguns plugins estejam desatualizados, então a primeira coisa que devemos fazer e atualizá-los. Para isso, clique na opção Gerenciar Plugins a direita.

Na primeira aba Atualizações, desça até o final da lista, clique em Todos em seguida clique em Baixar agora, instalar e depois reiniciar.

Aguarde o processamento concluir e marque a última opção Reinicie o Jenkins quando a instalação … Espere até que o Jenkins reinicie e siga com a configuração.

O restart do Jenkins é bem rápido. Caso a tela fique algum tempo sem atualização pressione F5 para atualizar a página.

Configuração Cloud Provider

Se autentique novamente no Jenkins utilizando as mesmas credenciais que usamos no passo anterior. Na página inicial do Jenkins clique em Estado do executor de builds do lado esquerdo inferior da página.

Depois que a página for carregada clique em Configure Clouds no lado esquerdo da página.

Como é a primeira vez que estamos configurando o Jenkins será exibida uma informação dizendo que não há plugins de Cloud instalados. Para instalarmos, basta clicar em Go to plugin manager.

Será carregada uma lista de plugins disponíveis para instalação. Marque o checkbox ao lado de Kubernetes e clique no botão Install without restart.

Aguarde a conclusão da instalação e depois clique em Voltar para a página principal.

Agora que instalamos o plugin precisamos configurá-lo para utilizar o cluster Kubernetes. Para isso, clique novamente Estado do Executor de Builds na página inicial do Jenkins.

Agora clique em Configure Clouds no lado esquerdo da página.

Na nova página clique em Adicionar uma nova nuvem e selecione Kubernetes.

Clique em Kubernetes Cloud details

Preencha os campos abaixo com as informações da tabela abaixo mantendo o restante inalterado.

itemCampoValor
KubernetesNamekubernetes
KubernetesKubernetes Namespacejenkins

Ao final clique no botão Test Connection. Você deve ver uma mensagem de sucesso: Connected to Kubernetes v1.21.1.

Como estamos rodando o Jenkins de dentro do Cluster Kubernetes não é necessário preencher Kubernetes URL nem Credentials.

Desça um pouco o formulário e preencha as informações de acordo com a tabela abaixo.

ItemCampoValor
KubernetesWebSocketMarcado
KubernetesJenkins URLhttp://jenkins.jenkins.svc.cluster.local

São as configurações de WebSocket e da URL do Jenkins que permitirão que os agentes sejam aprovisionados no Cluster e depois se conectem ao Jenkins Master. Como o Jenkins não precisa sair do Cluster para se conectar aos agentes, no campo Jenkins URL, devemos informar o endereço interno seguindo o padrão: http://<service_name&gt;.<namespace>.svc.cluster.local

Clique em Add Pod Label e em seguida Pod Label. Preencha as informações de acordo com a tabela abaixo:

ItemCampoValor
Pod LabelKeyjenkins
Pod LabelValueagent

Configurando o Pod Template

Depois de preenchida a Cloud que o Jenkins utilizará precisamos configurar os Pod Templates. É aqui que informamos qual imagem um Agente do Jenkins utilizará para conseguir realizar os builds.

Desça até o item de configuração Pod Templates e clique em Add Pod Template e preencha o nome como: test-agent. Em seguida clique em Pod Template Details.

Preencha as informações de acordo com a tabela abaixo:

ItemCampoValor
Pod TemplatesNametest-agent
Pod TemplatesNamespacejenkins
Pod TemplatesLabelstestagent

Agora clique em Add Container e em seguida Container Template e preencha as informações de acordo com a tabela abaixo:

itemcampovalor
Container TemplateNamejnlp
Container TemplateDocker imagejenkins/inbound-agent:latest
Container TemplateWorking directory/home/jenkins/agent

Clique em Save.

Agora vamos criar job simples e realizar um teste.

Criando uma Job de teste

Clique no logo no Jenkins para retornar a página principal e depois clique em Novo Job. Na tela de criação de pipeline digite um Nome da sua preferência, selecione Freestyle project e clique em OK.

Na tela de configuração do Job marque a opção Restrict where this project can be run e preencha o campo Label Expression como testagent. Aqui estamos preenchendo com o mesmo valor que informamos em Labels do Pod Template.

Vá até a seção Build, selecione Adicionar passo de build e em seguida escolha Executar Shell e insira o código abaixo:

echo "Testing"

Clique em Salvar.

Na tela do Job de build do projeto clique em Construir agora.

Aguarde o término do processamento do Job.

Durante a execução do build é possível visualizar a criação de um novo pod durante a execução e ao término a sua destruição. Para isso volte ao terminal e rode o comando abaixo:

kubectl get pods -n jenkins -w
NAME                       READY   STATUS              RESTARTS   AGE
jenkins-866b7585fc-2zc86   1/1     Running             0          12m
test-agent-wjjmi           0/1     ContainerCreating   0          8s
test-agent-wjjmi           1/1     Running             0          12s
test-agent-wjjmi           1/1     Terminating         0          16s

Perceba que é possível ver nas linhas destacadas acima todo o ciclo de vida do pod durante a execução do build.

Clicando no ícone verde ao lado do número você conseguirá visualizar o log de execução do build.

Conclusão

E ai o que acharam? Bem tranquila essa configuração com Helm Chart né? E você usa o Helm Chart ou prefere fazer a configuração manual?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s