Не удается получить доступ к панели управления K8s после установки kubeadm-dind-cluster
Я использую kubeadm-dind-cluster, многоузловой кластер Kubernetes для разработчика Kubernetes и проектов, расширяющих Kubernetes. Основано на kubeadm и DIND (Docker в Docker).
У меня свежая установка Centos 7, на которой я только что запустил ./dind-cluster-v1.13.sh up
, Я не установил никаких других значений и использую все значения по умолчанию для работы в сети.
Все выглядит хорошо:
[root@node01 dind-cluster]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-master Ready master 23h v1.13.0
kube-node-1 Ready <none> 23h v1.13.0
kube-node-2 Ready <none> 23h v1.13.0
[root@node01 dind-cluster]# kubectl config view
apiVersion: v1
clusters:
- cluster:
insecure-skip-tls-verify: true
server: http://127.0.0.1:32769
name: dind
contexts:
- context:
cluster: dind
user: ""
name: dind
current-context: dind
kind: Config
preferences: {}
users: []
[root@node01 dind-cluster]# kubectl cluster-info
Kubernetes master is running at http://127.0.0.1:32769
KubeDNS is running at http://127.0.0.1:32769/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@node01 dind-cluster]#
и кажется здоровым
[root@node01 dind-cluster]# curl -w '\n' http://127.0.0.1:32769/healthz
ok
Я знаю, что сервисная панель есть:
[root@node01 dind-cluster]# kubectl get services kubernetes-dashboard -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard NodePort 10.102.82.8 <none> 80:31990/TCP 23h
однако в любой попытке доступа к ней отказано:
[root@node01 dind-cluster]# curl http://127.0.0.1:8080/api/v1/namespaces/kube-system/services/kubernetes-dashboard
curl: (7) Failed connect to 127.0.0.1:8080; Connection refused
[root@node01 dind-cluster]# curl http://127.0.0.1:8080/ui
curl: (7) Failed connect to 127.0.0.1:8080; Connection refused
Я также вижу следующее в журнале брандмауэра:
2019-02-05 19:45:19 WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t nat -C DOCKER -p tcp -d 127.0.0.1 --dport 32769 -j DNAT --to-destination 10.192.0.2:8080 ! -i br-669b654fc9cd' failed: iptables: No chain/target/match by that name.
2019-02-05 19:45:19 WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t filter -C DOCKER ! -i br-669b654fc9cd -o br-669b654fc9cd -p tcp -d 10.192.0.2 --dport 8080 -j ACCEPT' failed: iptables: Bad rule (does a matching rule exist in that chain?).
2019-02-05 19:45:19 WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t nat -C POSTROUTING -p tcp -s 10.192.0.2 -d 10.192.0.2 --dport 8080 -j MASQUERADE' failed: iptables: No chain/target/match by that name.
Любые предложения о том, как я на самом деле получить доступ к приборной панели извне с моей машины разработки? Я не хочу использовать прокси для этого.
1 ответ
Вы должны иметь возможность доступа kubernetes-dashboard
используя следующие адреса:
ClusterIP (работает для других модулей в кластере):
http://10.102.82.8:80/
NodePort (работает для каждого хоста, который может получить доступ к узлам кластера, используя их IP-адреса):
http://clusterNodeIP:31990/
Обычно приборная панель Kubernetes использует https
протокол, поэтому вам может понадобиться использовать разные порты в запросе kubernetes-dashboard
Сервис для этого.
Вы также можете получить доступ к панели инструментов, используя kube-apiserver
в качестве прокси:
Непосредственно к панели приборов Pod:
https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/pods/https:kubernetes-dashboard-pod-name:/proxy/#!/login
Чтобы настроить сервис ClusterIP на панели инструментов:
https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login
Я могу догадаться, что <master-ip>:<apiserver-port>
будет означать 127.0.0.1:32769
в твоем случае.
В этой ситуации вы действительно ожидаете, что все работает "из коробки". Однако, похоже, в настройке отсутствует подходящая учетная запись службы для доступа и управления кластером через панель управления.
Заметьте, я могу полностью ввести в заблуждение здесь, и, возможно, kubeadm-dind-cluster на самом деле предоставляет такую учетную запись. Также обратите внимание, что этот проект был прекращен некоторое время назад.
Во всяком случае, вот как я решил эту проблему. Надеюсь, это поможет другим людям (все еще) пробовать это...
определите недостающую учетную запись и привязку ролей: создайте файл yaml
# ------------------- Dashboard Secret ------------------- # # ...already available # ------------------- Dashboard Service Account ------------------- # # ...already available # ------------------- Dashboard Cluster Admin Account ------------------- # # # added by Ichthyo 2019-2 # - ServiceAccount and ClusterRoleBinding # - allows administrative Access intoto Namespace kube-system # - necessary to log-in via Kubernetes-Dashboard # apiVersion: v1 kind: ServiceAccount metadata: name: dash-admin namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dash-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: dash-admin namespace: kube-system --- # ------------------- Dashboard Role & Role Binding ------------------- # kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: kubernetes-dashboard-minimal namespace: kube-system rules: # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret. - apiGroups: [""] resources: ["secrets"] verbs: ["create"] # Allow Dashboard to create 'kubernetes-dashboard-settings' config map. - apiGroups: [""] resources: ["configmaps"] verbs: ["create"] # Allow Dashboard to get, update and delete Dashboard exclusive secrets. - apiGroups: [""] resources: ["secrets"] resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"] verbs: ["get", "update", "delete"] # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map. - apiGroups: [""] resources: ["configmaps"] resourceNames: ["kubernetes-dashboard-settings"] verbs: ["get", "update"] # Allow Dashboard to get metrics from heapster. - apiGroups: [""] resources: ["services"] resourceNames: ["heapster"] verbs: ["proxy"] - apiGroups: [""] resources: ["services/proxy"] resourceNames: ["heapster", "http:heapster:", "https:heapster:"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: kubernetes-dashboard-minimal namespace: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: kubernetes-dashboard-minimal subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system
Примените его к уже запущенному кластеру
kubectl apply -f k8s-dashboard-RBAC.yaml
Затем найдите токен безопасности, соответствующий
dash-admin
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep dash-admin | awk '{print $1}')|egrep '^token:\s+'|awk '{print $2}
наконец, вставьте извлеченный токен на экран входа в систему