Я следую руководству HashiCorp, и все выглядит нормально, пока я не пытаюсь запустить модуль «webapp» — простой модуль, единственной функцией которого является демонстрация того, что он может запускать и монтировать секретный том.
Ошибка (отказано в доступе к вызову REST) показана в нижней части вывода этой команды:
kubectl describe pod webapp
Name: webapp
Namespace: default
Priority: 0
Service Account: webapp-sa
Node: docker-desktop/192.168.65.4
Start Time: Tue, 14 Feb 2023 09:32:07 -0500
Labels: <none>
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Containers:
webapp:
Container ID:
Image: jweissig/app:0.0.1
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/mnt/secrets-store from secrets-store-inline (ro)
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5b76r (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
secrets-store-inline:
Type: CSI (a Container Storage Interface (CSI) volume source)
Driver: secrets-store.csi.k8s.io
FSType:
ReadOnly: true
VolumeAttributes: secretProviderClass=vault-database
kube-api-access-5b76r:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 42m default-scheduler Successfully assigned default/webapp to docker-desktop
Warning FailedMount 20m (x8 over 40m) kubelet Unable to attach or mount volumes: unmounted volumes=[secrets-store-inline], unattached volumes=[secrets-store-inline kube-api-access-5b76r]: timed out waiting for the condition
Warning FailedMount 12m (x23 over 42m) kubelet MountVolume.SetUp failed for volume "secrets-store-inline" : rpc error: code = Unknown desc = failed to mount secrets store objects for pod default/webapp, err: rpc error: code = Unknown desc = error making mount request: couldn't read secret "db-password": Error making API request.
URL: GET http://vault.default:8200/v1/secret/data/db-pass
Code: 403. Errors:
* 1 error occurred:
* permission denied
Warning FailedMount 2m19s (x4 over 38m) kubelet Unable to attach or mount volumes: unmounted volumes=[secrets-store-inline], unattached volumes=[kube-api-access-5b76r secrets-store-inline]: timed out waiting for the condition
Итак, кажется, что этот вызов REST терпит неудачу: GET http://vault.default:8200/v1/secret/data/db-pass. Действительно, это также не работает из curl:
curl -vik -H "X-Vault-Token: root" http://localhost:8200/v1/secret/data/db-pass
* Trying 127.0.0.1:8200...
* TCP_NODELAY set
* connect to 127.0.0.1 port 8200 failed: Connection refused
* Failed to connect to localhost port 8200: Connection refused
* Closing connection 0
curl: (7) Failed to connect to localhost port 8200: Connection refused
В этот момент я немного потерялся. Я не уверен, что вызов REST настроен правильно, т.е. таким образом, что Vault его примет; но я также не уверен, как настроить его по-другому.
Журналы Vault показывают следующую информацию, поэтому мне кажется, что порт и токен, которые я использую, верны:
2023-02-14 09:07:14 You may need to set the following environment variables:
2023-02-14 09:07:14 $ export VAULT_ADDR='http://[::]:8200'
2023-02-14 09:07:14 The root token is displayed below
2023-02-14 09:07:14 Root Token: root
Vault вроде бы нормально работает в Kubernetes:
kubectl get pods
NAME READY STATUS RESTARTS AGE
vault-0 1/1 Running 1 (22m ago) 32m
vault-agent-injector-77fd4cb69f-mf66p 1/1 Running 1 (22m ago) 32m
Если я попытаюсь показать статус хранилища:
vault status
Error checking seal status: Get "http://[::]:8200/v1/sys/seal-status": dial tcp [::]:8200: connect: connection refused
Я не думаю, что Хранилище запечатано, но если я попытаюсь распечатать его:
vault operator unseal
Unseal Key (will be hidden):
Error unsealing: Put "http://[::]:8200/v1/sys/unseal": dial tcp [::]:8200: connect: connection refused
Есть идеи?
@HarshManvar Спасибо за ответ! Я новичок в Vault. Тем не менее, я вижу, что Vault работает нормально на K8s в Docker, но если я запускаю vault status, я получаю Error checking seal status: Get "http://[::]:8200/v1/sys/seal-status": dial tcp [::]:8200: connect: connection refused. То же самое, если я попытаюсь завиться. Так может быть, Vault настроен неправильно? Но я просто сделал то, о чем меня попросил учебник.
Ваше хранилище запечатано, сначала распечатайте его, иначе вы сможете получить доступ к любым данным. попробуйте открыть пользовательский интерфейс хранилища с переадресацией порта, иначе вам может потребоваться загрузить ключи, и он будет распечатан в первый раз. ваше хранилище не будет готово, также при проверке будет статус 0/1 kubectl get pods
Какое-либо обновление об этом сначала распечатывает хранилище внутри хранилища или использует пользовательский интерфейс хранилища?
@HarshManvar Я не думаю, что Убежище было запечатано. Я не знаю, как получить доступ к пользовательскому интерфейсу, и я не думаю, что смогу, так как он работает внутри K8s в Docker на моем ПК, и Docker не показывает, что приложение Vault предоставляет какие-либо порты снаружи.
vault status
работает, но только с терминала, работающего внутри модуля Vault. Кластер Kubernetes-in-Docker-on-DockerDesktop не предоставляет никаких портов для этих модулей, поэтому, хотя на моем ПК установлен vault-cli, я не могу использовать vault status
из-за пределов модулей.
Вы создали правильную политику в хранилище, чтобы ваш клиент мог получить доступ к секрету, сохраненному в хранилище?