Как получить доступ к Kubernetes Dashboard из внешней сети
Я пытаюсь получить доступ к информационной панели kubernetes, используя метод Token вне сети.
Я запустил эти 2 команды, чтобы получить токен
kubectl -n kube-system get secret
kubectl -n kube-system describe secret replicaset-controller-token-2p4fk
Скопируйте токен вывода на страницу входа K8.
Я получаю эту ошибку в браузерной консоли, когда нажимаю кнопку "Войти" (страница не загружается).
Я запускаю k8 на внутреннем сервере с помощью команды:
kubectl proxy --address 0.0.0.0 --accept-hosts '.*'
И пытается получить доступ к консоли k8 UI из внешней сети.
Failed to load resource: the server responded with a status of 401 (Unauthorized)
vendor.bd425c26.js:6 Error during global settings reload: Object
:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/api/v1/rbac/status:1 Failed to load resource: the server responded with a status of 401 (Unauthorized)
vendor.bd425c26.js:6 Possibly unhandled rejection: {"data":"MSG_LOGIN_UNAUTHORIZED_ERROR\n","status":401,"config":{"method":"GET","transformRequest":[null],"transformResponse":[null],"jsonpCallbackParam":"callback","url":"api/v1/rbac/status","headers":{"Accept":"application/json, text/plain, */*"}},"statusText":"Unauthorized","xhrStatus":"complete","resource":{}}
Я даже попробовал эти шаги, но не повезло, что страница не загружается при нажатии на кнопку "Войти".
$ kubectl -n kube-system get secret
# All secrets with type 'kubernetes.io/service-account-token' will allow to log in.
# Note that they have different privileges.
NAME TYPE DATA AGE
deployment-controller-token-frsqj kubernetes.io/service-account-token 3 22h
$ kubectl -n kube-system describe secret deployment-controller-token-frsqj
Name: deployment-controller-token-frsqj
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name=deployment-controller
kubernetes.io/service-account.uid=64735958-ae9f-11e7-90d5-02420ac00002
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZXBsb3ltZW50LWN
Вот мой файл Kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRV..
server: https://192.168.15.97:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBD..
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJ..
И почему я не вижу кнопку Пропустить авторизацию рядом с кнопкой Подписать?
Я также попробовал эти шаги:
Запустите следующие команды:
Эта команда создаст служебную учетную запись для панели мониторинга в пространстве имен по умолчанию
$kubectl create serviceaccount dashboard -n default
Эта команда добавит правила привязки кластера к вашей учетной записи на панели мониторинга.
kubectl создать кластер-связывание инструментальной панели-admin -n по умолчанию \ --clusterrole=cluster-admin \ --serviceaccount= по умолчанию: панель инструментов
Эта команда выдаст вам токен, необходимый для входа на панель управления.
$kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode
Могут ли некоторые помочь мне здесь, что я пропускаю.
Некоторые выводы: Команда прокси Link kubectl разрешает только HTTP-соединение. Для доменов, отличных от localhost и 127.0.0.1, войти в систему будет невозможно. После нажатия кнопки "Войти" на странице входа в систему ничего не произойдет.
kubectl proxy
Не поддерживает https звонки.
Есть ли способ выполнить команду kubectl proxy вместе с IP-адресом сервера Kubernetes из внешней / локальной сети Windows?
Примечание. Локальная система - это Windows 10, а K8 - сервер Linux. Версия Docker: 18.09 & Версия k8: v1.13.1
Спасибо,
7 ответов
У меня возникает эта проблема, когда я пытаюсь получить доступ к панели управления через kubectl proxy
используя простой http и общедоступный IP.
Детали ошибки: kubectl proxy
производит ошибки http: proxy error: context canceled
в консоли, в браузере после того, как вы нажмете "войти", один из запросов, который заканчивается на /plugin/config
возвращает json с MSG_LOGIN_UNAUTHORIZED_ERROR
но браузер не отображает никаких ошибок.
Решение ( источник)
kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8443:443 --address 0.0.0.0
Конечно, вы можете использовать свой ip интерфейса вместо 0.0.0.0, если хотите привязать его только к одному интерфейсу. Затем перейдите вhttps://your.external.ip:8443/
, он перенаправит вас на https://your.external.ip:8443/#/login
и у вас попросят токен. Далее, как описано здесь:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret \
| awk '/^deployment-controller-token-/{print $1}') | awk '$1=="token:"{print $2}'
https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above
У меня есть записка:
Панель инструментов не должна быть доступна публично с помощью прокси-команды kubectl, поскольку она разрешает только HTTP-соединение. Для доменов, отличных от localhost и 127.0.0.1, войти в систему будет невозможно. После нажатия кнопки "Войти" на странице входа в систему ничего не произойдет.
Если у вас есть ssh-доступ к Kubernetes, вы можете выполнить на машине, на которой запущен кластер:
kubectl proxy --address 0.0.0.0 --accept-hosts '.*'
А затем создайте перенаправление локального порта:
ssh -L:8001:XXX.XXX.XXX.XXX:8001 username@XXX.XXX.XXX.XXX
где username
ваше имя пользователя используется для подключения к машине и XXX.XXX.XXX.XXX
это IP-адрес главного узла. Тогда вы сможете передать токен и получить доступ к панели управления.
Конечно, это очень грязный трюк, и я бы не советовал использовать его в производственной среде.
с этим вы можете видеть приборную панель из сети
microk8s kubectl port-forward -n kube-system service/kubernetes-dashboard 443:443 --address 0.0.0.0
Затем вы можете получить доступ к панели управления по адресу
https://<server-host/ip>
Я полагаю, что вы используете неправильный секрет для Bearer Token
, Как правило, вы должны создать ServiceAccount
а затем назначить ему соответствующую служебную роль через ClusterRoleBinding
разрешить вход в Dashboard с помощью Bearer Token
, Найти больше информации о Kubernetes Dashboard Bearer Token
авторизация здесь.
Для входа в приборную панель в vcluster с виртуальными машинами нужен обработчик netwroks для внешних ip-контейнеров У меня есть сообщение с этого https://piensoluegoinstalo.com/kubernetes-cluster-dashboard-on-premise/
ответы использовать металл
https://piensoluegoinstalo.com/kubernetes-cluster-dashboard-on-premise/
vi metallb.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.240-192.168.1.250
kubectl create -f metallb.yaml
Создайте сертификат для вашего ip, внешнего по отношению к панели мониторинга контейнера, и добавьте этот преобразователь в IP-адрес разрешения файла hosts, я использовал "панель мониторинга" для доменного имени.
mkdir $HOME/certs
cd $HOME/certs
openssl genrsa -out dashboard.key 2048
openssl rsa -in dashboard.key -out dashboard.key
openssl req -sha256 -new -key dashboard.key -out dashboard.csr -subj '/CN=dashboard'
openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt
kubectl -n kube-system create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
kubectl -n kube-system edit service kubernetes-dashboard
ИЗМЕНЕНИЕ ТИПА НА БАЛАНСЕР НАГРУЗКИ
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kube-system"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"}}}
creationTimestamp: "2019-04-24T22:21:15Z"
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
resourceVersion: "1753"
selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
uid: 4612785f-66df-11e9-8180-000c29e7b067
spec:
clusterIP: 10.110.50.44
externalTrafficPolicy: Cluster
ports:
- nodePort: 31394
port: 443
protocol: TCP
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: LoadBalancer
status:
{}
kubectl -n kube-system get service kubernetes-dashboard
nano admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
kubectl create -f admin-user.yaml
nano cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
kubectl create -f cluster-role.yaml
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Похоже , что токен закодирован в Base64. Вы пытались расшифровать его перед вставкой в поле токена? см.: https://kubernetes.io/docs/concepts/configuration/secret/