Provider Lab Part 1
Vamos criar um laboratório com tudo que precisamos para o nosso estudo de Crossplane. A proposta é criar um lab com vários providers de coisas que utilizamos no nosso dia a dia.
Vamos reaproveitar o lab do Backstage e adicionar o Crossplane, porém vamos adicionar vários providers extras para nos conseguir explorar diferentes cenários no futuro.
Vamos instalar utilizando values.yaml abaixo.
Provider GitHub
Aplique o yaml abaixo.
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-github
spec:
package: xpkg.upbound.io/coopnorge/provider-github:v0.13.0
Vamos configurar o provider do GitHub usando um personal token.
Vamos criar uma secret contendo dentro de credentials o token e o owner que são os valores que ele precisa buscar.
Crie o arquivo github.yaml
#github.yaml
apiVersion: v1
kind: Secret
metadata:
name: github-davidpuziol # Nome da secret, mude para a sua
namespace: crossplane-system
type: Opaque
stringData:
credentials: "{\"token\":\"${GITHUB_TOKEN}\",\"owner\":\"${GITHUB_ACCOUNT}\"}"
---
apiVersion: github.upbound.io/v1beta1
kind: ProviderConfig
metadata:
# Este é um provider config do github conforme podemos ver pela apiversion.
# Uma boa prática é que pelo nome já consigamos saber qual a conta será usada
# Mude para a sua conta para ficar fácil.
name: github-provider-davidpuziol
spec:
credentials:
source: Secret
secretRef:
name: github-davidpuziol # Irá referenciar a secret que criamos acima.
namespace: crossplane-system
key: credentials
Cada provider tem o seu próprio Kind ProviderConfig que utiliza sua própria apiVersion.
Podemos ter vários provider config para o mesmo tipo de provider. Por exemplo duas contas diferentes no GitHub.
Agora vamos aplicar o que temos acima.
export GITHUB_TOKEN="seu-token"
export GITHUB_ACCOUNT="sua-conta"
# Como o yaml não tem a capacidade da substituir as variáveis, devemos fazer isso antes de aplicar.
envsubst < gitlab.yaml | kubectl apply -f -
Para testar vamos aplicar o manifesto abaixo para criar um novo repositório.
apiVersion: repo.github.upbound.io/v1alpha1
kind: Repository
metadata:
name: test-repo-crossplane
namespace: default
spec:
forProvider:
name: test-repo-crossplane
description: "Repositório de teste criado via Crossplane"
visibility: "public"
hasIssues: true
hasWiki: true
autoInit: true
providerConfigRef:
name: github-provider-davidpuziol # Veja que estamos utilizando esse provider config, ou seja, vai para a minha conta.
kubectl apply -f githubrepotest.yaml
repository.repo.github.upbound.io/test-repo-crossplane created

Uma curiosidade é que esse recurso é cluster scope, ou seja, por mais que definimos o namespace default, não faz diferença. Na verdade todos os custom resources do GitHub estão em nível de cluster.
❯ k get repositories.repo.github.upbound.io -n default
NAME SYNCED READY EXTERNAL-NAME AGE
test-repo-crossplane True True test-repo-crossplane 2m2s
❯ k get repositories.repo.github.upbound.io -n crossplane-system
NAME SYNCED READY EXTERNAL-NAME AGE
test-repo-crossplane True True test-repo-crossplane 2m15s
Deletando esse recurso.
kubectl delete repositories.repo.github.upbound.io test-repo-crossplane
repository.repo.github.upbound.io "test-repo-crossplane" deleted

Vários novos custom resources foram criados para uso do GitHub, apesar de usarmos o repositories.repo.github.upbound.io.
k get customresourcedefinitions.apiextensions.k8s.io -n crossplane-system -o custom-columns=NAME:.metadata.name | grep github.upbound.io
actionssecrets.actions.github.upbound.io
actionsvariables.actions.github.upbound.io
branches.repo.github.upbound.io
branchprotections.repo.github.upbound.io
defaultbranches.repo.github.upbound.io
deploykeys.repo.github.upbound.io
emugroupmappings.team.github.upbound.io
memberships.user.github.upbound.io
organizationrulesets.enterprise.github.upbound.io
organizations.enterprise.github.upbound.io
providerconfigs.github.upbound.io
providerconfigusages.github.upbound.io
pullrequests.repo.github.upbound.io
repositories.repo.github.upbound.io
repositoryautolinkreferences.repo.github.upbound.io
repositoryfiles.repo.github.upbound.io
repositorywebhooks.repo.github.upbound.io
storeconfigs.github.upbound.io
teammemberships.team.github.upbound.io
teamrepositories.team.github.upbound.io
teams.team.github.upbound.io
teamsettings.team.github.upbound.io
teamsyncgroupmappings.team.github.upbound.io
Provider GitLab
Criamos a secret com o token que necessitamos.
apiVersion: v1
kind: Secret
metadata:
name: gitlab-davidpuziol
namespace: crossplane-system
type: Opaque
stringData:
token: "${GITLAB_TOKEN}"
---
apiVersion: gitlab.crossplane.io/v1beta1
kind: ProviderConfig ## Mais uma vez veja que é kind ProviderConfig para um apiVersion diferente.
metadata:
name: gitlab-provider-davidpuziol
namespace: crossplane-system
spec:
baseURL: https://gitlab.com/
credentials:
source: Secret
method: PersonalAccessToken
secretRef:
namespace: crossplane-system
name: gitlab-davidpuziol
key: token
E temos os custom resources abaixo, todos em nível de cluster também.
k get customresourcedefinitions.apiextensions.k8s.io -n crossplane-system -o custom-columns=NAME:.metadata.name | grep gitlab.crossplane.io
accesstokens.groups.gitlab.crossplane.io
accesstokens.projects.gitlab.crossplane.io
deploykeys.projects.gitlab.crossplane.io
deploytokens.groups.gitlab.crossplane.io
deploytokens.projects.gitlab.crossplane.io
groups.groups.gitlab.crossplane.io
hooks.projects.gitlab.crossplane.io
members.groups.gitlab.crossplane.io
members.projects.gitlab.crossplane.io
pipelineschedules.projects.gitlab.crossplane.io
projects.projects.gitlab.crossplane.io
providerconfigs.gitlab.crossplane.io
providerconfigusages.gitlab.crossplane.io
samlgrouplinks.groups.gitlab.crossplane.io
storeconfigs.gitlab.crossplane.io
variables.groups.gitlab.crossplane.io
variables.projects.gitlab.crossplane.io
Para criar um repositório já seria outro custom resource diferente do GitHub. No GitLab definimos um projeto.
apiVersion: projects.gitlab.crossplane.io/v1alpha1
kind: Project
metadata:
name: test-project-crossplane
namespace: default
spec:
forProvider:
name: test-project-crossplane
description: "Projeto de teste criado via Crossplane"
visibility: private
initializeWithReadme: true
providerConfigRef:
name: gitlab-provider-davidpuziol
Aplicando esse manifesto temos.
kubectl apply -f /docs/iac/crossplane/resources/providers-configs/gitlabrepo.yaml
project.projects.gitlab.crossplane.io/test-project-crossplane created
k get projects.projects.gitlab.crossplane.io
NAME READY SYNCED AGE PATH WITH NAMESPACE
test-project-crossplane True True 23s davidpuziol/test-project-crossplane

Para deletar.
❯ k delete projects.projects.gitlab.crossplane.io test-project-crossplane
project.projects.gitlab.crossplane.io "test-project-crossplane" deleted
