Kubectl fra GitHub Actions
Det kan være nyttig å kunne kjøre kubectl fra Github Actions når for eksempel man ønsker å restarte et deployment eller kjøre en jobb on demand.
Vi har laget en GitHub Workflow som gjør det enkelt å kjøre kubectl kommandoer fra GitHub Actions, denne heter run-kubectl
og den kan du finne her.
Oppsett
Før du kan bruke denne actionen må du gjøre noen endringer i gcp-service-accounts
og i ditt teams apps-repo.
1. Legg til ekstra permissions til deploy service accounten
run-kubectl tar i bruk Workload Identity Federation som du kan lese mer om her,
men den krever også ekstra tilganger for å kunne koble til clusteret.
I gcp-service-accounts
har du sannsynligvis definert opp ditt gcp project for å kunne bruke det i GitHub Actions,
og dermed fått laget en deploy service account og et workload identity pool.
Da må du bare legge til en ekstra rolle i modul-definisjonen slik:
module "utviklerportal" {
source = "./project_team"
team_name = "utviklerportal"
repositories = [
"kartverket/kartverket.dev",
]
env = var.env
project_id = var.utviklerportal_project_id
kubernetes_project_id = var.kubernetes_project_id
extra_kubernetes_sa_roles = [
"roles/container.clusterViewer", # <--- Legg til denne linjen i extra_kubernetes_sa_roles
]
}
Nå skal deploy kontoen kunne koble seg til clusteret.
2. Legg til role og rolebinding i ditt apps-repo
For at man skal kunne f.eks restarte et deployment, så må vi legge til en kubernetes rbac rolle som gir kontoen tilgang til dette.
I apps repoet, legg til:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: deployment-restart-role
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: deploy-sa-rolebinding
subjects:
- kind: User
name: your-project-deploy@your-project-id.iam.gserviceaccount.com
roleRef:
kind: Role
name: deployment-restart-role
apiGroup: rbac.authorization.k8s.io
navn på service accounten er "modulnavn"-deploy
, hvor modulnavn finnes i gcp-service-accounts
.
du kan også finne den med gcloud config set project <projectid> && gcloud iam service-accounts list | grep deploy
3. Legg til GitHub workflow
Nå skal alt være konfigurert og du kan legge til en GitHub workflow som kjører run-kubectl
workflow.
eksempel:
name: Get pods
on: push
jobs:
sandbox:
name: get pods
uses: kartverket/github-workflows/.github/workflows/run-kubectl.yaml@v4.2.2
with:
cluster_name: atgcp1-sandbox
service_account: test-deploy@test-sandbox-5cx6.iam.gserviceaccount.com
kubernetes_project_id: kube-sandbox-6e32
project_number: 833464945837
namespace: default
commands: |
get pods
get pods -l app=nginx
Forklaring:
cluster_name
: navnet på clusteret du vil koble til, dette kan du finne medgcloud container fleet memberships list
. mer herservice_account
: navnet på service accounten som skal brukes. denne blir opprettet i gcp-service-accounts, og slutter på-deploy
kubernetes_project_id
: id til prosjektet som clusteret ligger i, finnes medgcloud projects list | grep kubernetes
project_number
: nummeret til prosjektet som service accounten ligger i, dette er produkt prosjektet, finnes medgcloud projects list | grep produkt
commands
: kubectl kommandoene du vil kjøre, uten kubectl foran. husk å bruk multiline string.namespace
: namespace du vil kjøre kommandoen ikubectl_version
: versjonen av kubectl du vil bruke, default er latest stable. format: v1.30.0