Executor Kubernetes Enterprise
Com o executor Kubernetes, o runner cria um Pod por tarefa em um namespace, transmite o log dele para o Semaphore e exclui o Pod quando a tarefa termina. O runner pode rodar dentro do cluster (recomendado) ou fora dele, com um kubeconfig.
Como uma tarefa em contêiner é executada, o que há dentro do contêiner e o que não é suportado está descrito em Executores. Esta página trata da configuração do Kubernetes.
Antes de começar
- Um servidor Semaphore com licença Enterprise.
- Um runner implantado no cluster, consulte Instalar um runner no Kubernetes.
As etapas abaixo usam o namespace
semaphoree o Deploymentsemaphore-runnerdele. Para um runner fora do cluster, consulte Runner fora do cluster. kubectlcom permissão para criar service accounts e objetos RBAC nesse namespace.- O cluster consegue baixar
semaphoreui/jobesemaphoreui/helper(ou suas próprias imagens).
O que o runner cria
Para uma tarefa com ID 42, o runner cria, no namespace dele:
| Objeto | Nome | Conteúdo |
|---|---|---|
| Pod | semaphore-job-42-<random> | Init container git-clone (imagem auxiliar) e contêiner build (imagem build), restartPolicy: Never. |
| Secret | <pod>-ssh-<key id> | Um por chave SSH, montado em /secrets/ssh/<key id>/. |
| Secret | <pod>-vault | Senhas do Ansible vault. |
| Secret | <pod>-extra-vars | values.json com as variáveis extras. |
| Secret | <pod>-env | Segredos do Variable Group do tipo Environment variable e SEMAPHORE_JWT, injetados com envFrom. |
| ConfigMap | <pod>-inventory | Um inventário estático. |
Somente os objetos de que a tarefa precisa são criados. Todos levam o rótulo
semaphoreui.com/runner=semaphore; o Pod também tem semaphoreui.com/task-id=42. O
runner exclui todos quando a tarefa termina, inclusive após uma falha ou Stop.
Configuração
Etapa 1. Criar as service accounts
O runner precisa de uma service account para criar os Pods das tarefas. Os Pods das tarefas recebem uma segunda, sem permissões e sem token de API, para que um playbook não possa usar os direitos do runner.
apiVersion: v1
kind: ServiceAccount
metadata:
name: semaphore-runner
namespace: semaphore
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: semaphore-job
namespace: semaphore
automountServiceAccountToken: false
Etapa 2. Conceder as permissões ao runner
Esta é a lista completa de chamadas de API que o executor faz:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: semaphore-runner
namespace: semaphore
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "get", "delete"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get"]
- apiGroups: [""]
resources: ["secrets", "configmaps"]
verbs: ["create", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: semaphore-runner
namespace: semaphore
subjects:
- kind: ServiceAccount
name: semaphore-runner
namespace: semaphore
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: semaphore-runner
Um Role, não um ClusterRole: o runner só pode mexer no próprio namespace.
Etapa 3. Mudar o runner para o executor Kubernetes
Os Pods das tarefas não definem um securityContext, então um namespace que impõe o nível de
Pod Security restricted os rejeita. Permita baseline:
kubectl label namespace semaphore pod-security.kubernetes.io/enforce=baseline --overwrite
Dê ao Pod do runner a service account dele e as configurações do executor. No Deployment do
runner, adicione em spec.template.spec:
spec:
serviceAccountName: semaphore-runner
containers:
- name: runner
env:
# ...SEMAPHORE_WEB_ROOT and SEMAPHORE_RUNNER_TOKEN as before
- name: SEMAPHORE_RUNNER_EXECUTOR_TYPE
value: k8s
- name: SEMAPHORE_RUNNER_K8S_NAMESPACE
value: semaphore
- name: SEMAPHORE_RUNNER_K8S_SERVICE_ACCOUNT
value: semaphore-job
- name: SEMAPHORE_RUNNER_K8S_IMAGE
value: semaphoreui/job:latest
kubectl apply -f semaphore-serviceaccounts.yaml -f semaphore-rbac.yaml -f semaphore-runner.yaml
kubectl -n semaphore rollout status deploy/semaphore-runner
Sem kubeconfig definido, o runner usa as credenciais in-cluster de
semaphore-runner. As tarefas não rodam mais no Pod do runner, então você pode reduzir os
resources dele (por exemplo, 100m de CPU e 256Mi de memória).