Closed Kerlay closed 1 year ago
Здравствуйте. Покажите как выглядит секрет с токенами в кластере. Он находится в одном namespace c cert-manager'ом?
Да конечно вот:
apiVersion: v1
data:
ACCESS_TOKEN: <ACCESS_TOKEN>
REFRESH_TOKEN: <REFRESH_TOKEN>
kind: Secret
metadata:
creationTimestamp: "2023-07-14T14:59:13Z"
labels:
app.kubernetes.io/instance: cert-manager-webhook-nicru
name: nicru-tokens
namespace: cert-manager
resourceVersion: "132810938"
uid: 87c6297c-373f-4966-880c-43fb9f9323dd
type: Opaque
Так же увидел, что у вас там есть апдейт секрета, для обновления токена. Можно было создать еще тогда функцию, которая генерирует его. Из документации мы получаем следующего ввида запрос:
curl --location --request POST 'https://api.nic.ru/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'password=<pass>' \
--data-urlencode 'client_id=<clien_id>' \
--data-urlencode 'client_secret=<clien_secret>' \
--data-urlencode 'username=<account_username> \
--data-urlencode 'scope=.*' \
--data-urlencode 'offline=999999'
@Kerlay привет! Изначально не все чарты были в репозитории. Добавил отсутствующие: pki.yaml, rbac.yaml, service.yaml. После их применения проблема должна уйти.
У меня есть уже все эти сущности, которые вы обновили. Я за основу брал из hetzner webhook.
Тогда покажите rbac для работы с секретом.
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}
namespace: {{ .Release.Namespace | quote }}
labels:
app: {{ include "cert-manager-webhook-nicru.name" . }}
chart: {{ include "cert-manager-webhook-nicru.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
---
# Grant the webhook permission to read the ConfigMap containing the Kubernetes
# apiserver's requestheader-ca-certificate.
# This ConfigMap is automatically created by the Kubernetes apiserver.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:webhook-authentication-reader
namespace: kube-system
labels:
app: {{ include "cert-manager-webhook-nicru.name" . }}
chart: {{ include "cert-manager-webhook-nicru.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: extension-apiserver-authentication-reader
subjects:
- apiGroup: ""
kind: ServiceAccount
name: {{ include "cert-manager-webhook-nicru.fullname" . }}
namespace: {{ .Release.Namespace }}
---
# apiserver gets the auth-delegator role to delegate auth decisions to
# the core apiserver
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:auth-delegator
labels:
app: {{ include "cert-manager-webhook-nicru.name" . }}
chart: {{ include "cert-manager-webhook-nicru.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- apiGroup: ""
kind: ServiceAccount
name: {{ include "cert-manager-webhook-nicru.fullname" . }}
namespace: {{ .Release.Namespace }}
---
# Grant cert-manager permission to validate using our apiserver
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:domain-solver
labels:
app: {{ include "cert-manager-webhook-nicru.name" . }}
chart: {{ include "cert-manager-webhook-nicru.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
rules:
- apiGroups:
- {{ .Values.groupName }}
resources:
- '*'
verbs:
- 'create'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:domain-solver
labels:
app: {{ include "cert-manager-webhook-nicru.name" . }}
chart: {{ include "cert-manager-webhook-nicru.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:domain-solver
subjects:
- apiGroup: ""
kind: ServiceAccount
name: {{ .Values.certManager.serviceAccountName }}
namespace: {{ .Values.certManager.namespace }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:secret-reader
namespace: {{ .Release.Namespace }}
rules:
- apiGroups:
- ""
resources:
- "secrets"
{{- with .Values.secretName }}
resourceNames:
{{ toYaml . | indent 4 }}
{{- end }}
verbs:
- "get"
- "watch"
- "list"
- "create"
- "update"
- "patch"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:secret-reader
namespace: {{ .Release.Namespace }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:secret-reader
subjects:
- apiGroup: ""
kind: ServiceAccount
name: {{ include "cert-manager-webhook-nicru.fullname" . }}
namespace: {{ .Release.Namespace }}
---
# Grant cert-manager permission to validate using our apiserver
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:flowcontrol-solver
labels:
app: {{ include "cert-manager-webhook-nicru.name" . }}
chart: {{ include "cert-manager-webhook-nicru.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
rules:
- apiGroups:
- "flowcontrol.apiserver.k8s.io"
resources:
- 'prioritylevelconfigurations'
- 'flowschemas'
verbs:
- 'list'
- 'watch'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:flowcontrol-solver
labels:
app: {{ include "cert-manager-webhook-nicru.name" . }}
chart: {{ include "cert-manager-webhook-nicru.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "cert-manager-webhook-nicru.fullname" . }}:flowcontrol-solver
subjects:
- apiGroup: ""
kind: ServiceAccount
name: {{ include "cert-manager-webhook-nicru.fullname" . }}
namespace: {{ .Release.Namespace | quote }}
---
Он даже не пытается сделать апдейт секрета, ошибок в логах по этому поводу не вижу.
Вот такое еще в логах есть, это может влиять на работу?
W0720 14:16:04.059670 1 reflector.go:424] pkg/mod/k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: failed to list *v1beta3.FlowSchema: the server could not find the requested resource
E0720 14:16:04.059704 1 reflector.go:140] pkg/mod/k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: Failed to watch *v1beta3.FlowSchema: failed to list *v1beta3.FlowSchema: the server could not find the requested resource
W0720 14:16:40.851690 1 reflector.go:424] pkg/mod/k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: failed to list *v1beta3.PriorityLevelConfiguration: the server could not find the requested resource
E0720 14:16:40.851713 1 reflector.go:140] pkg/mod/k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: Failed to watch *v1beta3.PriorityLevelConfiguration: failed to list *v1beta3.PriorityLevelConfiguration: the server could not find the requested resource
W0720 14:16:42.855074 1 reflector.go:424] pkg/mod/k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: failed to list *v1beta3.FlowSchema: the server could not find the requested resource
E0720 14:16:42.855097 1 reflector.go:140] pkg/mod/k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: Failed to watch *v1beta3.FlowSchema: failed to list *v1beta3.FlowSchema: the server could not find the requested resource
Это все выполняется в k3s кластере.
Эти ошибки не влияют. Явно проблема с чтением секрета. Начнём с простого. Попробуйте заменить Role для работы с секретом на ClusterRole.
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}-update-secret
rules:
- apiGroups:
- ""
resources:
- secrets
verbs:
- 'get'
- 'list'
- 'watch'
- 'patch'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "cert-manager-webhook-nicru.fullname" . }}-update-secret
subjects:
- kind: ServiceAccount
name: {{ include "cert-manager-webhook-nicru.fullname" . }}
namespace: {{ .Release.Namespace }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "cert-manager-webhook-nicru.fullname" . }}-update-secret
Я даже чарты все сделал как у вас, но все равно ошибка возникает.
Я вручную запрашиваю токен, подставляю в секрет. После этого удаляю pod с webhook. Он походу запрашивает новый токен, но не обновляет его в секрете. Потому что после перезапуска, когда я обращаюсь с токеном, который выпустил он уже просроченный считается. При этом каких либо ошибок связанных с тем что есть проблема с обновлением секрета нет.
Да все корректно, я же получаю вручную через curl refresh и access токены.
Может quote добавить для этих переменных?
Можете попробовать, но они и так должны корректно восприниматься. При раскрытии секрета токена никаких лишних символов нет? Если корректный токен руками прописать в секрет, ошибка сохраняется?
В общем issue можно закрыть. Спасибо больше. Я когда создавал секрет, то делал это следующим образом echo <secret> | base64 -w 0
, а необходимо было echo -n "<secret>" | base64 -w 0
. Отработал вебхук.
Рад был помочь!
Проверил вручную ответ от API все работает корректно. А в логах наблюдается данная ошибка: