4-5-k8s组件-dashboard

熊 0 阅读 容器

1.部署web服务 dashboard

github网站: GitHub - kubernetes/dashboard: General-purpose web UI for Kubernetes clusters

image-20240504140908837

新版本的dashboard, 需要使用helm命令安装对应的软件包。 Helm 是 Kubernetes 的包管理器

官网安装使用手册: Helm | 安装Helm

  • 安装helm

    root@kubeadm-master1:~# snap install --classic  helm 
    helm 3.14.4 from Snapcrafters✪ installed
  • 安装对应dashboard。这个安装命令可以在dashboard的github简介页面看到

    image-20240504152321122
    helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
    helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
  • 命令运行完成之后可以查看对应的服务

    root@kubeadm-master1:~# kubectl get svc -A
    NAMESPACE              NAME                                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
    default                kubernetes                             ClusterIP   10.20.0.1       <none>        443/TCP                         19h
    kube-system            kube-dns                               ClusterIP   10.20.0.10      <none>        53/UDP,53/TCP,9153/TCP          19h
    kubernetes-dashboard   kubernetes-dashboard-api               ClusterIP   10.20.30.89     <none>        8000/TCP                        38m
    kubernetes-dashboard   kubernetes-dashboard-auth              ClusterIP   10.20.46.203    <none>        8000/TCP                        38m
    kubernetes-dashboard   kubernetes-dashboard-kong-manager      NodePort    10.20.115.164   <none>        8002:30133/TCP,8445:30703/TCP   38m
    kubernetes-dashboard   kubernetes-dashboard-kong-proxy        ClusterIP   10.20.125.238   <none>        443/TCP                         38m
    kubernetes-dashboard   kubernetes-dashboard-metrics-scraper   ClusterIP   10.20.51.239    <none>        8000/TCP                        38m
    kubernetes-dashboard   kubernetes-dashboard-web               ClusterIP   10.20.215.169   <none>        8000/TCP                        38m
    ​
  • 默认Dashboard只能集群内部访问 , 修改Service为NodePort类型 , 暴露到外部用于访问dashboard

    root@kubeadm-master1:~# kubectl edit svc -n kubernetes-dashboard kubernetes-dashboard-kong-proxy 

    对应type修改为NodePort , 这里通过nodeport: 30976, 指定暴露出来的端口

    image-20240504190723453

    之后检查是否生效

    image-20240504191041677
  • 创建临时token

    cat > dashboard-user.yaml << EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: admin-user
      namespace: kubernetes-dashboard
    ---
    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: kubernetes-dashboard
    EOF
    ​
    kubectl  apply -f dashboard-user.yaml
    ​
    # 创建token
    kubectl -n kubernetes-dashboard create token admin-user
    ​
    root@kubeadm-master1:~# kubectl -n kubernetes-dashboard  create token admin-user
    eyJhbGciOiJSUzI1NiIsImtpZCI6Im53Z3NxQnBSRlJEQ19NclV5S3dMUkNGUEVITEt2c1lxZC1QUS1BajNEaTAifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNiZWFyLmxvY2FsIl0sImV4cCI6MTcxNDgyNTA0NSwiaWF0IjoxNzE0ODIxNDQ1LCJpc3MiOiJodHRwczovL2t1YmVybmV0ZXMuZGVmYXVsdC5zdmMuY2JlYXIubG9jYWwiLCJrdWJlcm5ldGVzLmlvIjp7Im5hbWVzcGFjZSI6Imt1YmVybmV0ZXMtZGFzaGJvYXJkIiwic2VydmljZWFjY291bnQiOnsibmFtZSI6ImFkbWluLXVzZXIiLCJ1aWQiOiJiZjA5NTFlZC0xZTNkLTRjODMtYWQ5OC04ZDhiYmJkMTk4NTEifX0sIm5iZiI6MTcxNDgyMTQ0NSwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmFkbWluLXVzZXIifQ.LoNtMCxz8ayOUE_Y5d93gT2LRoCFWvxOITLlslTC8A5U_Iy9WYTnZBLfwADgkaN4XpNif5Cg-ea-W6k7dS19-D0guCVZTl8fjIIpqVwsX7Ptoh_MiwZWf5x2RFp1_78RJpBDYoTj-CsYEl7sa44Qq7UpgoehUS5H4BIi0X9JqufsUacLLXf_7ENrL4q64k_7svsBQhCvfV3O2bWRzvqiOxphAISWbtisY7IBmZhl9zKKuz0eJz0i4U4-AbMjmEtzNE4kPRDZoVO5EL82c4oz-63qbzN2mvbzUkj05t1hGt4BIK4d6Ny_ldGLYY_7SwHl_CLhtrDAfu5UsEwO06gPSw
    ​
  • 创建长期token

    cat > dashboard-user-token.yaml << EOF
    apiVersion: v1
    kind: Secret
    metadata:
      name: admin-user
      namespace: kubernetes-dashboard
      annotations:
        kubernetes.io/service-account.name: "admin-user"   
    type: kubernetes.io/service-account-token  
    EOF
    ​
    kubectl  apply -f dashboard-user-token.yaml
    ​
    # 查看密码
    kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d
  • 另外可以通过以下命令 : 创建service account并绑定默认cluster-admin管理员集群角色

    kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
    kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
    kubectl describe secrets -n kube-system $(kubectl -n kubernetes-dashboard get secret | awk '/dashboard-admin/{print $1}')
    kubernetes-dashboard-createuser-1

  • 将生成的临时token复制到页面中。页面访问的端口是上面截图中生成的随机端口30976。使用集群中任意一个https://IP:30976即可。

    image-20240504192426489
  • 之后页面登录成功

    image-20240504192653479

这里有两点需要说明

如果需要卸载已经通过helm安装好的dashboard,直接使用命令helm uninstall <deployment_name> --namespace <namespace_name> , 即直接运行helm uninstall kubernetes-dashboard --namespace kubernetes-dashboard即可。或者使用helm delete kubernetes-dashboard。

这个安装的是最新的7.3.2 版本。只有v7版本需要使用helm安装

root@kubeadm-master1:~# helm list --namespace kubernetes-dashboard
NAME                    NAMESPACE               REVISION    UPDATED                                 STATUS      CHART                       APP VERSION
kubernetes-dashboard    kubernetes-dashboard    1           2024-05-04 10:07:51.336904721 +0000 UTC deployed    kubernetes-dashboard-7.3.2      

之前版本对应v3.0.0-alpha0 、v2.7。对应的安装方式是直接使用以下命令安装即可。剩余安装步骤基本一致

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml

2. dashboard访问

Kubernetes Dashboard是 Kubernetes 的官方 Web UI. 通过Kubernetes Dashboard, 我们可以方便地管理资源和部署应用. 从 dashboard-1.7.x 起, 只允许 localhost 访问. 那么如何方便从本地访问dashboard呢? 本文介绍几种方案.

下面这一段是网上内容。唯一和实际的区别是访问的url

http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard-kong-proxy:443/proxy/#/login

这里的443端口需要和services的端口对应
root@kubeadm-master1:~# kubectl get services -o wide -n kubernetes-dashboard
NAME                                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE   SELECTOR
kubernetes-dashboard-api               ClusterIP   10.20.186.86    <none>        8000/TCP                        35m   app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kubernetes-dashboard-api,app.kubernetes.io/part-of=kubernetes-dashboard
kubernetes-dashboard-auth              ClusterIP   10.20.205.208   <none>        8000/TCP                        35m   app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kubernetes-dashboard-auth,app.kubernetes.io/part-of=kubernetes-dashboard
kubernetes-dashboard-kong-manager      NodePort    10.20.172.128   <none>        8002:32603/TCP,8445:32156/TCP   35m   app.kubernetes.io/component=app,app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kong
kubernetes-dashboard-kong-proxy        ClusterIP   10.20.169.139   <none>        443/TCP                         35m   app.kubernetes.io/component=app,app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kong
kubernetes-dashboard-metrics-scraper   ClusterIP   10.20.7.198     <none>        8000/TCP                        35m   app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kubernetes-dashboard-metrics-scraper,app.kubernetes.io/part-of=kubernetes-dashboard
kubernetes-dashboard-web               ClusterIP   10.20.31.132    <none>        8000/TCP                        35m   app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kubernetes-dashboard-web,app.kubernetes.io/part-of=kubernetes-dashboard

2.1 本地安装了 kubectl, 并且可以直接访问到 master 的 IP

如果本地(工作电脑)上安装了 kubectl, 并且可以直接访问到 master 的 IP, 那么就很简单, 可以直接在本地启动 k8s proxy:

# 前台启动, 注意会占用终端窗口
kubectl proxy

然后访问: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

2.2 本地没有安装 kubectl, 但是可以直接访问到 master 的 IP

如果本地没有安装 kubectl, 但是可以直接访问到 master 的 IP, 那么可以在 master (假设 hostname 为 ttg12, 当然也可以是集群内任意一台安装了 kubectl 的机器, 这里为了简便就简化到 master 上, 下同) 上开启 k8s proxy:

kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &

这时候我们可以访问到 Dashboard 的登录页面, http://ttg12:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/, 但是如果我们选择 "Token" 模式, 并输入上面记录的token, 点击"Sign in", 心里默数三下, 等待进入期待已久的主页面...

然后事实却是, 你数了10遍1-2-3, 页面还是没有任何反应.

于是你想到按下F12, 打开浏览器的调试窗口"Networking". 发现登录是登录成功了, 但是config接口却返回了状态401.

kubernetes-dashboard-access-1

原因是, 即便 proxy 允许外网访问, 但是从 dashboard-1.7.x 起, 只允许 localhost 访问. Github 有人提过 issue, 但是回复说这是 feature, 不是 bug, 怪只怪初学者不懂的太多.

所以, 我们需要通过端口转发来访问localhost. 有如下2种方法.

2.2.1 方法一: kubectl port-forward

注意: 这种方法适合有正式ssl证书的情况. 如果没有, 先用方法二进行访问.

In an environment where one needs to access the dashboard from another host than the kubectl proxy's localhost, one can run: kubectl port-forward --namespace kubernetes-dashboard service/kubernetes-dashboard 10443:443 --address 0.0.0.0 to access the dashboard through HTTPS

然后访问: https://ttg12:10443

不过因为测试环境没有正式的ssl证书, 所以浏览器会拒绝访问. 需要采用方法二.

2.2.2 方法二: ssh端口转发

在工作电脑(需要能 ssh 连接 k8s master)上, 使用以下命令转发端口:

$ ssh -L localhost:8001:localhost:8001 -NT faceless@ttg12
faceless@ttg12's password:

输入master机器faceless账号的登录密码后, 转发成功.

然后通过如下本地地址访问: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

终于见到 Dashboard 主页本尊.

kubernetes-dashboard-access-2

2.3 本地没有安装 kubectl, 且不可直接访问到 master 的 IP

这种情况一般是 k8s 集群完全在内网, 日常访问通过跳板机进行, 这也是生产环境正常的状态. 这种情况下, 我们有2种方案.

2.3.1 在跳板机启动 kube-proxy, 然后本地 ssh 端口转发

首先在跳板机上启动 kube-proxy (假设跳板机的 hostname 是 ttg11):

kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &

然后本地 ssh 端口转发到跳板机:

ssh -L localhost:8001:localhost:8001 -NT weiping@ttg11

然后通过如下本地地址访问: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

2.3.2 本地直接通过跳板机 ssh 端口转发到 k8s master

首先在 k8s master (或内网上的其他机器) 上启动 kube-proxy (假定 k8s master的 hostname 是 ttg12):

kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &

然后本地端口通过跳板机 (假设跳板机的 hostname 是 ttg11) ssh 转发到 k8s master 上:

# 格式为: ssh -L localhost:<本地使用端口>:<k8s-master-IP或域名>:<k8s-master-port> -NT <跳板机登录账户>@<跳板机IP或域名>
ssh -L localhost:8001:ttg12:8001 -NT weiping@ttg11

然后通过如下本地地址访问: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

2.4 登录方式

  1. 创建ServiceAccount,根据其管理目标,使用rolebinding或clusterrolebinding绑定至合理role或clusterrole;

  2. 获取到此ServiceAccount的secret,查看secret的详细信息,其中就有token;

  3. 生成kubeconfig文件

    kubectl config set-cluster  --kubeconfig=/PATH/TO/SOMEFILE
    kubectl config set-credentials NAME --token=$KUBE_TOKEN --kubeconfig=/PATH/TO/SOMEFILE
    kubectl config set-context
    kubectl config use-context

使用实例如下:

kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kubernetes-dashboard get secret | awk '/dashboard-admin/{print $1}')

$ kubectl create serviceaccount dashboard -n kubernetes-dashboard

$ kubectl create rolebinding def-ns-admin --clusterrole=admin --serviceaccount=default:def-ns-admin

$ kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard

$ kubectl describe sa dashboard -n kubernetes-dashboard
Name: dashboard
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: dashboard-token-vtncb
Tokens: dashboard-token-vtncb
Events: <none>

$ kubectl describe secret dashboard-token-vtncb -n kubernetes-dashboard

创建kubeconfig认证文件

root@harbor:~# DASH_TOCKEN=$(kubectl -n kube-system  get  secret  admin-user  -o jsonpath={.data.token} |base64 -d)
root@harbor:~# kubectl config set-cluster cluster1 --server=192.168.71.150:6443 --kubeconfig=/usr/local/src/dashbord-admin.conf
Cluster "cluster1" set.

root@harbor:~# kubectl config set-credentials dashboard-admin --token=$DASH_TOCKEN --kubeconfig=/usr/local/src/dashbord-admin.conf
User "dashboard-admin" set.

root@harbor:~# kubectl config set-context dashboard-admin@cluster1 --cluster=kubernetes --user=dashboard-admin --kubeconfig=/usr/local/src/dashbord-admin.conf
Context "dashboard-admin@cluster1" created.

    
    
root@harbor:~# kubectl config set-context dashboard-admin@cluster1 --cluster=cluster1 --user=dashboard-admin --kubeconfig=/usr/local/src/dashbord-admin.conf
Context "dashboard-admin@cluster1" modified.

root@harbor:~# kubectl config use-context dashboard-admin@cluster1 --kubeconfig=/usr/local/src/dashbord-admin.conf
Switched to context "dashboard-admin@cluster1".
root@harbor:~#