Estou tentando aprender como o Kubernetes funciona, então criei meu próprio K3S
cluster usando o guia de início rápido .
Então instalei o Cert Manager usando o guia do Helm .
Quero usar certificados Let's Encrypt para meu cluster e validá-los usando o dns01
webhook com meu provedor DNS Simply.com.
Isso pode ser feito usando um webhook encontrado aqui:
https://github.com/RunnerM/simply-dns-webhook
Atualmente estou testando se consigo um certificado do Let's Encrypt usando seu servidor de teste.
Criei o arquivo Yaml letsencrypt-staging.yaml
com o seguinte conteúdo para ClusterIssuer
:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
namespace: default
spec:
acme:
email: [email protected]
privateKeySecretRef:
name: letsencrypt-staging-key
server: https://acme-staging-v02.api.letsencrypt.org/directory
solvers:
- dns01:
webhook:
groupName: com.github.runnerm.cert-manager-simply-webhook
solverName: simply-dns-solver
config:
secretName: simply-credentials # notice the name
selector:
dnsZones:
- 'cluster.example.com'
- '*.cluster.example.com'
Meu arquivo de configuração é basicamente um copiar e colar literalmente do exemplo encontrado na página RunnerM GitHub.
Para emitir um certificado criei um arquivo Yaml chamado certificate-test.yaml
com o seguinte conteúdo:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: test-certificate
spec:
dnsNames:
- test.cluster.example.com
issuerRef:
name: letsencrypt-staging
kind: ClusterIssuer
secretName: test-certificate-tls
Devo então conseguir obter um certificado emitido usando os seguintes comandos:
kubectl apply -f letsencrypt-staging.yaml
kubectl apply -f certificate-test.yaml
No entanto, não estou recebendo um certificado emitido.
Ao executar kubectl describe challenge test-certificate-1-1965387138-1295925723
recebo a seguinte mensagem de erro:
...
Status:
Presented: false
Processing: true
Reason: secrets "simply-credentials" is forbidden: User "system:serviceaccount:default:my-simply-dns-webhook" cannot get resource "secrets" in API group "" in the namespace "cert-manager"
State: pending
E
...
Entendo que o webhook do Simply DNS my-simply-dns-webhook
está em execução no default
namespace e as credenciais do Simply DNS estão armazenadas no cert-manager
namespace.
Então, como faço para permitir que o webhook do Simply DNS acesse recursos no namespace cert-manager?
Informações adicionais
A execução do comando kubectl get clusterrolebindings
fornece, entre outras, as seguintes informações:
my-simply-dns-webhook:secret-access ClusterRole/my-simply-dns-webhook:secret-access 76s
simply-dns-webhook:challenge-management ClusterRole/simply-dns-webhook:challenge-management 76s
my-simply-dns-webhook:domain-solver ClusterRole/my-simply-dns-webhook:domain-solver 76s
my-simply-dns-webhook:flow-control ClusterRole/my-simply-dns-webhook:flow-control 76s
my-simply-dns-webhook:auth-delegator ClusterRole/system:auth-delegator 76s
A saída de kubectl get clusterrole my-simply-dns-webhook:secret-access
fornece o seguinte resultado:
Name: my-simply-dns-webhook:secret-access
Labels: app=simply-dns-webhook
app.kubernetes.io/managed-by=Helm
chart=simply-dns-webhook-1.5.4
heritage=Helm
release=my-simply-dns-webhook
Annotations: meta.helm.sh/release-name: my-simply-dns-webhook
meta.helm.sh/release-namespace: default
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
secrets.* [] [] [get]
E o comando kubectl describe clusterrolebindings my-simply-dns-webhook:secret-access
dá a saída:
Name: my-simply-dns-webhook:secret-access
Labels: app=simply-dns-webhook
app.kubernetes.io/managed-by=Helm
chart=simply-dns-webhook-1.5.4
heritage=Helm
release=my-simply-dns-webhook
Annotations: meta.helm.sh/release-name: my-simply-dns-webhook
meta.helm.sh/release-namespace: default
Role:
Kind: ClusterRole
Name: my-simply-dns-webhook:secret-access
Subjects:
Kind Name Namespace
---- ---- ---------
ServiceAccount my-simply-dns-webhook cert-manager
Então, o que estou perdendo?
Acho que o gráfico do leme simplesmente dns-webhook está cheio de erros.
Ele cria um ServiceAccount nomeado
simply-dns-webhook
nodefault
namespace (ou qualquer namespace que você passe para o argumentohelm install
de-n
), massimply-dns-webhook:secret-access
ClusterRoleBinding especifica:Isso nunca vai combinar.
Pode funcionar se você implantar tudo no
cert-manager
namespace: