kubernetes部署dashboard
kubernetes部署dashboard
1. 简介
Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 Deployment、Job、DaemonSet 等等)。 例如,你可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
Dashboard 同时展示了 Kubernetes 集群中的资源状态信息和所有报错信息。
2. 版本兼容性
k8s和dashboard版本存在兼容性关系,版本配套可以到下面的网页查询:https://github.com/kubernetes/dashboard/releases/
以下是部分配套关系:
| Kubernetes version | dashboard version | 备注 |
|---|---|---|
| 1.18 | v2.0.0 | 完全支持 |
| 1.19 | v2.0.4 | 完全支持 |
| 1.20 | v2.4.0 | 完全支持 |
| 1.21 | v2.4.0 | 完全支持 |
| 1.23 | v2.5.0 | 完全支持 |
| 1.24 | v2.6.0 | 完全支持 |
| 1.25 | v2.7.0 | 完全支持 |
| 1.27 | v3.0.0-alpha0 | 完全支持 |
| 1.29 | kubernetes-dashboard-7.5.0 | 完全支持 |
本文使用的k8s版本为1.23,使用dashboard v2.5.0版本部署。
3. 安装
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
如果yaml无法下载,可以手动打开网页拷贝到文件中。以下是v2.5.0版本文件内容。
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.apiVersion: v1
kind: Namespace
metadata:name: kubernetes-dashboard---apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard---kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443selector:k8s-app: kubernetes-dashboard---apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-certsnamespace: kubernetes-dashboard
type: Opaque---apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-csrfnamespace: kubernetes-dashboard
type: Opaque
data:csrf: ""---apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-key-holdernamespace: kubernetes-dashboard
type: Opaque---kind: ConfigMap
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-settingsnamespace: kubernetes-dashboard---kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
rules:# Allow Dashboard to get, update and delete Dashboard exclusive secrets.- apiGroups: [""]resources: ["secrets"]resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]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.- apiGroups: [""]resources: ["services"]resourceNames: ["heapster", "dashboard-metrics-scraper"]verbs: ["proxy"]- apiGroups: [""]resources: ["services/proxy"]resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]verbs: ["get"]---kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard
rules:# Allow Metrics Scraper to get metrics from the Metrics server- apiGroups: ["metrics.k8s.io"]resources: ["pods", "nodes"]verbs: ["get", "list", "watch"]---apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: kubernetes-dashboard
subjects:- kind: ServiceAccountname: kubernetes-dashboardnamespace: kubernetes-dashboard---apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: kubernetes-dashboard
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: kubernetes-dashboard
subjects:- kind: ServiceAccountname: kubernetes-dashboardnamespace: kubernetes-dashboard---kind: Deployment
apiVersion: apps/v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s-app: kubernetes-dashboardtemplate:metadata:labels:k8s-app: kubernetes-dashboardspec:securityContext:seccompProfile:type: RuntimeDefaultcontainers:- name: kubernetes-dashboardimage: kubernetesui/dashboard:v2.5.0imagePullPolicy: Alwaysports:- containerPort: 8443protocol: TCPargs:- --auto-generate-certificates- --namespace=kubernetes-dashboard# Uncomment the following line to manually specify Kubernetes API server Host# If not specified, Dashboard will attempt to auto discover the API server and connect# to it. Uncomment only if the default does not work.# - --apiserver-host=http://my-address:portvolumeMounts:- name: kubernetes-dashboard-certsmountPath: /certs# Create on-disk volume to store exec logs- mountPath: /tmpname: tmp-volumelivenessProbe:httpGet:scheme: HTTPSpath: /port: 8443initialDelaySeconds: 30timeoutSeconds: 30securityContext:allowPrivilegeEscalation: falsereadOnlyRootFilesystem: truerunAsUser: 1001runAsGroup: 2001volumes:- name: kubernetes-dashboard-certssecret:secretName: kubernetes-dashboard-certs- name: tmp-volumeemptyDir: {}serviceAccountName: kubernetes-dashboardnodeSelector:"kubernetes.io/os": linux# Comment the following tolerations if Dashboard must not be deployed on mastertolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedule---kind: Service
apiVersion: v1
metadata:labels:k8s-app: dashboard-metrics-scrapername: dashboard-metrics-scrapernamespace: kubernetes-dashboard
spec:ports:- port: 8000targetPort: 8000selector:k8s-app: dashboard-metrics-scraper---kind: Deployment
apiVersion: apps/v1
metadata:labels:k8s-app: dashboard-metrics-scrapername: dashboard-metrics-scrapernamespace: kubernetes-dashboard
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s-app: dashboard-metrics-scrapertemplate:metadata:labels:k8s-app: dashboard-metrics-scraperspec:securityContext:seccompProfile:type: RuntimeDefaultcontainers:- name: dashboard-metrics-scraperimage: kubernetesui/metrics-scraper:v1.0.7ports:- containerPort: 8000protocol: TCPlivenessProbe:httpGet:scheme: HTTPpath: /port: 8000initialDelaySeconds: 30timeoutSeconds: 30volumeMounts:- mountPath: /tmpname: tmp-volumesecurityContext:allowPrivilegeEscalation: falsereadOnlyRootFilesystem: truerunAsUser: 1001runAsGroup: 2001serviceAccountName: kubernetes-dashboardnodeSelector:"kubernetes.io/os": linux# Comment the following tolerations if Dashboard must not be deployed on mastertolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedulevolumes:- name: tmp-volumeemptyDir: {}
确保dashboard容器运行正常:
[root@k8s ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default nginx-6799fc88d8-lxqvx 1/1 Running 2 (3m53s ago) 3h1m
kube-flannel kube-flannel-ds-7rfqc 1/1 Running 10 (2m12s ago) 3d21h
kube-system coredns-6d8c4cb4d-8sfdr 1/1 Running 3 (2m8s ago) 178m
kube-system coredns-6d8c4cb4d-vw7nz 1/1 Running 4 (113s ago) 178m
kube-system etcd-k8s 1/1 Running 4 (2m13s ago) 170m
kube-system kube-apiserver-k8s 1/1 Running 4 (2m3s ago) 170m
kube-system kube-controller-manager-k8s 1/1 Running 3 (2m13s ago) 169m
kube-system kube-proxy-97l68 1/1 Running 3 (2m13s ago) 178m
kube-system kube-scheduler-k8s 1/1 Running 4 (2m13s ago) 170m
kubernetes-dashboard dashboard-metrics-scraper-799d786dbf-rpcft 1/1 Running 3 (2m13s ago) 156m
kubernetes-dashboard kubernetes-dashboard-546cbc58cd-2wcrz 1/1 Running 0 156m
4. 访问配置
4.1 开启远程访问
dashboard service默认为ClusterIP,需要配置为NodePort,外部才能访问。
[root@k8s ~]# kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d22h
default nginx NodePort 10.109.172.88 <none> 80:32409/TCP 3d22h
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3d22h
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.102.9.117 <none> 8000/TCP 175m
kubernetes-dashboard kubernetes-dashboard ClusterIP 10.97.21.53 <none> 443/TCP 175m
修改svc改为NodePort类型:
[root@k8s ~]# kubectl edit service kubernetes-dashboard -n kubernetes-dashboard
[root@k8s ~]# kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d22h
default nginx NodePort 10.109.172.88 <none> 80:32409/TCP 3d22h
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3d22h
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.102.9.117 <none> 8000/TCP 3h34m
kubernetes-dashboard kubernetes-dashboard NodePort 10.97.21.53 <none> 443:31930/TCP 3h34m
这个时候就可以通过节点IP+31930端口访问dashboard了。dashboard需要使用https访问,自带的证书在最新的chrome、edge浏览器中不受信,切界面无法手动进行确认继续。使用firefox访问可以在界面操作确认继续。
备注:
在较新版本的
Chrome或Edge中访问一些未受信任的HTTPS页面时,会提示类似NET::ERR_CERT_INVALID的错误。以往旧版本中,我们可以选择跳过得以继续访问,但是新版本的Chrome中并不允许继续。当出现 “您的连接不是私密” 页面时,点击高级后,并直接输入thisisunsafe关键字并回车。
4.2 配置访问认证
dashboard 支持Token和Kubeconfig两种认证方式进行登录。
4.2.1 Token认证
创建Service Account 及 ClusterRoleBinding,创建auth.yaml文件,内容如下:
apiVersion: v1
kind: ServiceAccount
metadata:name: kubernetes-adminnamespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: kubernetes-admin
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: kubernetes-adminnamespace: kubernetes-dashboard
创建对应的资源:kubectl apply -f auth.yaml
获取访问所需要的Token:
[root@k8s ~]# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep kubernetes-admin | awk '{print $1}')
Name: admin-user-token-khrll
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-userkubernetes.io/service-account.uid: 266c923b-ed2f-471b-a8fc-1dde3cc10205Type: kubernetes.io/service-account-tokenData
====
ca.crt: 1099 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6InloSUtPM3R6cG9xVnkzNEx5STBmaTctRDRkWE9jX0Zfa0tKVjlBY3hhY2sifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWtocmxsIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIyNjZjOTIzYi1lZDJmLTQ3MWItYThmYy0xZGRlM2NjMTAyMDUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.nYgOBdscFaO3_JUHAC3hX5F-4Imx4RFAu1UA05tbufI6VgR5npJHPBCriNkseo02qaSsjlBwr7slzUcIALC4F16oTVrVHuuPMPSaqrqi-VjoEdd_ZB7vbX6qH7KbAabzmwW966PoXwOiARjraU2CMTmA9dFfk4MkSiwrySUxNUrwQ02isPMDIUxeF5RGESXff7kBzgNFkhwdEuLopmK9k6i0CyuM2ns3TpMO_2TcBlPkDViag1JxixatBJuz9x-OJS-Tnt5A1pmc9J-76MSH7fTRHu3sim2RIPq29QV5EXc4kwyAxha6fnNC3aCTiU9nsDR6E24qYK70ULJKVGxxIQ
4.2.2 kubeconfig认证
如果是使用kubeadmin部署的集群,默认会在下面路径生成一个kubeconfig文件:/etc/kubernetes/admin.conf,下载该文件并编辑,在该文件将上面的toekn加入文件末尾。
apiVersion: v1
clusters:
- cluster:certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJME1EWXhNVEUwTURJd00xb1hEVE0wTURZd09URTBNREl3TTFvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT2RUCjFSU3FmM3JyY1V3WkRsUk5OS05vVlZEelEzNlp4OUovckNSYzR1V3Qzd0YxTitsbFlIaVA2VHdoL0s2UGd0aUEKaHBYeDdWaGRYWElKdHhVd3F2OW8vTnArdUpoOHV2eFdyY25JRDNycFJzWXFvM1ZZSlhnTEtuS1o0bkpRREZzUApCQVZQcUJvS3RhYm9qV0pjU2tTc09VVXM5TFV0VnV3aEZUdmR0ZnJ1TVNMczFjOE1naTlGWlNkTUg3UHN0NzczCkNtUFhvb0k4dlRQSWwwU0dSTU1sSGtIaGJaUDJRVU0rZ1hzUlBRdWt3NFZ4MS9aQ29lZlhjRUE2czJUQmR3MXAKMlhpN2JpdWFKei80Qm1aYWVoQk5LZE1iR1ZMR1NhL1FwRjVDOXUwdnVybEdFZWw5eldoYnFLRFVzenN3dzZxUwpId2V6MXl0UWZpYTEyK2R0V1NNQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQZno5VzJ5UWJaZTAwT3M0ckNSbkc0c3dSV1VNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBR0w1eE1mcU5INDdERGh3Uzd0bApTMWoxZ3hKWWxDclk4M09acTF3bUF0aFlqR2wwN1FJVDJ6NGszVXlMOU5MZzBJWmlIMy93eElsVnc5V0hJYVFRCmwzK0dwMi9Fc0VuWURlWWt0Z2VySDk3M2xGWGsySEJSOWhxemRiNlNnbVd5cWRGdWpvMisrM3Vzb1dxOHJ0eHAKMUdZNU5aakxiQnA0aWs0UVYvSFYvNFRJNzF6VmYyTzd1VG5JMEZ6VlUzR214MmhDSVRzdHRFa0VVd2NCaHRhYgphUWF3NzNiZjU3MEp2bWJXSlF6dnZkMmFVQWk5MUtxQzhEUUFLMk00QUk5NDRsU2xsQlZDeXpQZUdiNnEwc3ZxCmtBaVpVZzFHYSt6d1NLdVhTdmRESm1uQ3psYnE2V2I5N29UdkVaTDJnMlJwMW5Ua1hTSU10Nk41bU1TNXVrYVMKbWVzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==server: https://192.168.0.159:6443name: kubernetes
contexts:
- context:cluster: kubernetesuser: kubernetes-adminname: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-adminuser:client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJWiszaHUzTDI2aGN3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBMk1URXhOREF5TUROYUZ3MHlOVEEyTVRVd09EVTBNRFphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTJ5amFFSi9kSTlDcUhuL2cKWm5CZXhOTG1NTmJRNWltd1pBSnBCTzFyT3A3ZE1JN2ZXZUlvRnN4SlpDUFpodU5SSFhhK29XYjQvM0hYMGl6QgpadGVSeEJUS1F2UkxkT0x5Qnk3SXUyS0JISmJNLzA0bE16cXBlVlVycll4YmkxZjJ1YXZaUXllZjJ1S3g2b1FPCjJPTTZ6RmMwbHNuSFhjYnpOamtWc0wzdElFZXBiVDJsNlFRVDlwOEI5OWs2alBCNDgwOGVPVGRDMEpSK25rTEEKRnhhN05qK2VBU3ZaTTQwbm5qK3BRdUVBWS9SZWF6UU1sTGhRN3hVV1p4WWtJQXZ6eU51Z1ZsazR3VjVrUk1maAplODZjaERKQ05ITERqR1FDdVR0QmluY3c2QWt1RWtMRmk5cnBLL2hrYVZQdFVaekxBNjFFdnZjUzZVVGNLS1BqCnNWT3AzUUlEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JUMzgvVnRza0cyWHRORHJPS3drWnh1TE1FVgpsREFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBbTExNU00NGZYVjRrV0ExdEMxUE9qZWdMbnUvT1EzYVpLZmdPCkoraGpWRWdOaFUzSHgvaExDcGE4eS8zNkIvU3Fud0ZXRE0xaXpWSlhBZndDQWVZaGZIYUZmWjlHL1pFRW9PTmUKajkrZEVWMEo0KzFRWEZzNEFtUGY3bUhJbTV2b0VmSkVRL3dleWt4QTl4cmh2WUprMHhQWWdpSTFUMWJIWkVLZAo5Zjk0ZFNTdTZ4MGUrUTZwK3RwMDFId1ZQR2pEL21XTG5GSHZNOHA4ZS82cWV6VHR3QzB3RlNGb2hBMVdza2hZClVEZGJXTFlFcEN1UkZoUTFuc0V0Z1g3bDkvRndwNG41bmR0Z0JCMzVjU2FrVU9OVkYwbUpCbFpKTVZaM0VqVXoKTzRxVmFTMXlUNXlOOStDUU1tRHd4QUlNRDZPQjJGSG9ac1FaQ0tJdnZ1Mzc5ZzFMM1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMnlqYUVKL2RJOUNxSG4vZ1puQmV4TkxtTU5iUTVpbXdaQUpwQk8xck9wN2RNSTdmCldlSW9Gc3hKWkNQWmh1TlJIWGErb1diNC8zSFgwaXpCWnRlUnhCVEtRdlJMZE9MeUJ5N0l1MktCSEpiTS8wNGwKTXpxcGVWVXJyWXhiaTFmMnVhdlpReWVmMnVLeDZvUU8yT002ekZjMGxzbkhYY2J6TmprVnNMM3RJRWVwYlQybAo2UVFUOXA4Qjk5azZqUEI0ODA4ZU9UZEMwSlIrbmtMQUZ4YTdOaitlQVN2Wk00MG5uaitwUXVFQVkvUmVhelFNCmxMaFE3eFVXWnhZa0lBdnp5TnVnVmxrNHdWNWtSTWZoZTg2Y2hESkNOSExEakdRQ3VUdEJpbmN3NkFrdUVrTEYKaTlycEsvaGthVlB0VVp6TEE2MUV2dmNTNlVUY0tLUGpzVk9wM1FJREFRQUJBb0lCQUNiTFgzYUw1ZWhlR284VgprZEp3VjhZOWt2UFlRdGhMVHVjVktpUHVKd29VYnhFV2FXRU8wSXZnazZrL1UxVTJUZmlLT1lwMm9PTU84dVpJCmQ5L05qd2NIcXhvWkJuWmxhZlJ0aXFqbzhmUHVtZEVqc3lBVFpVYU9GaEk5ZzBMeVNrRnBzeWJaRDhuK1VRSXoKYURGcVg5RW1LcS82ZmVrU3U2REFrQjllTDJpRUV4SmRrL0FVRlJqRVdybkpsb1Z6Tkp6endyaVBNcUMwSlV3eAovUTh4Qjdwc3FQYWpGQzdNL0VNQ0VjeTBQcnpIamk4d1dHUUZjNGdub0FZY1VDdmFhZzdsMjExS3VSZk9YL2Z5CmpWS3Q3Z1RDR0plbXYwMkFobG1laWVlS2kyQjg4Y0dsMmhPVFNqVE1kRnBkVUh1RTJubTNSWXZXcDFVdWliclIKUlpXQlcwRUNnWUVBNlNuSTZwUlNyYWdicjJoQTlvdytJTHhkWkNVWk53YnY3RFdBbkZWU3hGWHYwNmtMTDJ3SwpmREkraWgrMTJ6M2twQXdLVzE5MkdtUXBpelhuRXhzYlRheTNJbGxCZEwvcG9UNXV5QjZnd3hwM1N2U2pNRWZ4CjMwKzZ3U2NtM1MwWU5JM2R5Q3dtbTljeFdpdFlsTm51S0dVQ3hZdFo5ZHBid2pMYjJFYThPeTBDZ1lFQThKL3kKWC9zVUEzTVhHRUd3N2dkU28ycHJILy9SUlVaSVdvY2piWUJFdWpuVVJjSS9SakYrckpITVJuZEQzMTlBdDdxMQpHV0RwS1FZMGowZkY2U1AwRWp0Tm1PZzh6c2pvOHlzREUyRHliZWkrN2g1N2FabG9hUGJkczRQOE5aQllRK1JsCkZZY2hTODU4SG5Xa2JVSWoyd2hmY09aVW1PeWZCalBFakpSdWwzRUNnWUFCOGpKV0d1VFJ4RHh1NjF6WGNmWTIKeWJ1eDBVbHpseUE3aFhyTVV6MzhtNGNENmo1SXFBc3lYQ3ovZENKTmNTZk9ZcmRYYWVXUGROU1A3K1E4MlpZUgp3T1pLYUJwT3dpZE9ERHBhZXo3MlFldEsrZDIrMG1yblpULzJ5ci9kU3JvUC9qc2lwNU91NjAzakpjZDRmcFVwClN5YUp4WTc3cVZYb3Vnbnh0UzF2QlFLQmdCYk1BSW1KWHhjSWsxcVA5clJHYTFUaUl5NFA3WUt6cXUwd3VuR0kKWW5xR09nODEzUXJJYTZqcjB6K2wwdjlacGVjQ1FHQWNKMXJrcEp3aWY2U2I3R2JCeVpOQUJXck43QXdGdWkvZQowbmtKUVBXTVc4TGdidHpxN293d1ovZW5La1djWU50T1J5Qkllc2ZqKzJVQ2pDVVhRUHVRUnRtS0tYTEwrc1lhCjFmTnhBb0dCQUoyTy9MUWZiQWt0ZlI5U2ZpQ3NhcTJKWVduWWhnNU1NVzB2YzlBeUxEdnpQeGNXUHhveVRWREgKK0lmWllhckNkdElTUzZ2NjFYamZva1VFMjhqS1N2dlVtcnhhbkp0RzZudTFTQldzczc1OXhMdlZ3Wi9zS2haaQpwcUZoRURxRXdoejVIem9TbkM2WHFtVEh2V2hPaHdsb21kM2lTY1hVWFlhSnVDMHp5N0JjCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==token: eyJhbGciOiJSUzI1NiIsImtpZCI6InloSUtPM3R6cG9xVnkzNEx5STBmaTctRDRkWE9jX0Zfa0tKVjlBY3hhY2sifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWFkbWluLXRva2VuLTc4NWN0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Imt1YmVybmV0ZXMtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJmMjA2YzUyOC1iMzkyLTQzNDItOWU1Ny02ZjM2YjRkZjgyZWYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6a3ViZXJuZXRlcy1hZG1pbiJ9.FvL4BtAbTGlBZfQcY72AnI2ynBswv7Ug12jczmRoGp1iSRLYPT9kmyEkT13SuggWxxuEDvwwwelgHZ5x6WOO6jSeqCyPwPoojVhszvd56gmiVs2g6Rlqpe2ZCNHY4UXcWg7XXF3FpoLv-760XgxAxy6DHFy_4D31el-DRVn-R3Qy-ji4a7wukQWTBpXo2DY-_ZWBpOeVPX6qjaRTEodBNve8_YU9rOA3HMH380jtfAyoBfT5igCED-15gNilj-IdoCEJWO3mersSzi_HY9OunOqs5ADuhCtdCMSMKUFibSyt_6qkRxvD7ws0d74rCZ2VUKzFMalX9yZ4i0n5sGlAsA
然后登录dashboard选择下载的kubeconfig文件即可进行登录。
5. 参考资料
-
artifacthub:https://artifacthub.io/packages/helm/k8s-dashboard/kubernetes-dashboard
-
github仓库:https://github.com/kubernetes/dashboard
-
部署和访问 Kubernetes 仪表板(Dashboard):https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/web-ui-dashboard/
相关文章:
kubernetes部署dashboard
kubernetes部署dashboard 1. 简介 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息&#…...
FPGA早鸟课程第二弹 | Vivado 设计静态时序分析和实际约束
在FPGA设计领域,时序约束和静态时序分析是提升系统性能和稳定性的关键。社区推出的「Vivado 设计静态时序分析和实际约束」课程,旨在帮助工程师们掌握先进的设计技术,优化设计流程,提高开发效率。 课程介绍 关于课程 权威认证&…...
STM32项目分享:家庭环境监测系统
目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.…...
华为HCIP Datacom H12-821 卷5
1.单选题 下列哪种工具不能被 route-policy 的 apply 子句直接引用? A、IP-Prefix B、tag C、community D、origin 正确答案: A 解析: 因route-policy工具中, apply 后面跟的是路由的相关属性。 但是ip-prefix是用来匹配路由的工具。 2.单选题...
Mongodb数据库基本操作
本文为在命令行模式下Mongodb数据库的基本操作整理。 目录 数据库操作 创建数据库 查看所有数据 查看当前数据库 删除数据库 断开连接 查看命令api 集合操作 查看当前数据库下集合 创建集合 删除当前数据库中的集合 文档操作 插入文档 insertOne()方法 insertMa…...
【机器学习】基于Softmax松弛技术的离散数据采样
1.引言 1.1.离散数据采样的意义 离散数据采样在深度学习中起着至关重要的作用,它直接影响到模型的性能、泛化能力、训练效率、鲁棒性和解释性。 首先,采样方法能够有效地平衡数据集中不同类别的样本数量,使得模型在训练时能够更均衡地学习…...
.NET+Python量化【1】——环境部署和个人资金账户信息查询
前言:量化资料很少,.NET更少。那我就来开个先河吧~ 以下是使用QMT进行量化开发的环境部署和基础信息获取有关操作。 1、首先自己申请券商的QMT权限,此步骤省略。 2、登陆QMT,选择极简模式,或者独立交易模式之类的。会进…...
洛谷 P10584 [蓝桥杯 2024 国 A] 数学题(整除分块+杜教筛)
题目 思路来源 登录 - Luogu Spilopelia 题解 参考了两篇洛谷题解,第一篇能得出这个式子,第二篇有比较严格的复杂度分析 结合去年蓝桥杯洛谷P9238,基本就能得出这题的正确做法 代码 #include<bits/stdc.h> #include<iostream&g…...
深入讲解C++基础知识(一)
目录 一、基本内置类型1. 类型的作用2. 分类3. 整型3.1 内存描述及查询3.2 布尔类型 —— bool3.3 字符类型 —— char3.4 其他整型 4. 有符号类型和无符号类型5. 浮点型6. 如何选择类型7. 类型转换7.1 自动类型转换7.2 强制类型转换7.3 类型转换总结 8. 类型溢出8.1 注意事项 …...
Python爬虫实战:批量下载网站图片
1.获取图片的url链接 首先,打开百度图片首页,注意下图url中的index 接着,把页面切换成传统翻页版(flip),因为这样有利于我们爬取图片! 对比了几个url发现,pn参数是请求到的数量。…...
使用 JavaScript 获取电池状态
在现代的移动设备和笔记本电脑上,了解电池状态是一项非常有用的功能。使用 JavaScript 可以轻松地获取电池的充电状态、电量百分比等信息。本文将介绍如何使用 JavaScript 访问这些信息,并将其显示在网页上。 1. HTML 结构 首先,我们需要一…...
java—类反射机制
简述 反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息(如成员变量,构造器,成员方法等),并能操作对象的属性及方法。反射机制在设计模式和框架底层都能用到。 类一旦加载,在堆中会产生…...
浏览器-服务器架构 (BS架构) 详解
目录 前言1. BS架构概述1.1 BS架构的定义1.2 BS架构的基本原理 2. BS架构的优势2.1 客户端简化2.2 易于更新和维护2.3 跨平台性强2.4 扩展性高 3. BS架构的劣势3.1 网络依赖性强3.2 安全性问题3.3 用户体验局限 4. BS架构的典型应用场景4.1 企业内部应用4.2 电子商务平台4.3 在…...
微型操作系统内核源码详解系列五(四):cm3下svc启动任务
系列一:微型操作系统内核源码详解系列一:rtos内核源码概论篇(以freertos为例)-CSDN博客 系列二:微型操作系统内核源码详解系列二:数据结构和对象篇(以freertos为例)-CSDN博客 系列…...
筛质数(暴力法、埃氏筛、欧拉筛)
筛质数(暴力法、埃氏筛、欧拉筛) 暴力法 思路分析: 直接双for循环来求解质数 如果不设置标记只是简单地执行了break会导致内部循环(由j控制)而不是立即打印i或者跳过它。如果打印语句写到内部循环中,也会导致每个 非素数也被打…...
使用USI作为主SPI接口
代码; lcd_drive.c //***************************************************************************** // // File........: LCD_driver.c // // Author(s)...: ATMEL Norway // // Target(s)...: ATmega169 // // Compiler....: AVR-GCC 3.3.1; avr-libc 1.0 // // D…...
AI播客下载:Eye on AI(AI深度洞察)
"Eye on A.I." 是一档双周播客节目,由长期担任《纽约时报》记者的 Craig S. Smith 主持。在每一集中,Craig 都会与在人工智能领域产生影响的人们交谈。该播客的目的是将渐进的进步置于更广阔的背景中,并考虑发展中的技术的全球影响…...
Flink 窗口触发器
参考: NoteWarehouse/05_BigData/09_Flink(1).md at main FGL12321/NoteWarehouse GitHub Flink系列 9. 介绍 Flink 窗口触发器、移除器和延迟数据等 | hnbian https://github.com/kinoxyz1/bigdata-learning-notes/blob/master/note/flink/Window%26%E6%97%B6…...
Java面试题:解释线程间如何通过wait、notify和notifyAll方法进行通信
在 Java 中,线程间的通信可以通过 wait()、notify() 和 notifyAll() 这三个方法实现。这些方法是 Java 线程 Thread 类的一部分,它们与 synchronized 关键字一起使用,以实现线程间的协调。 基本概念 wait():当一个线程执行到 wa…...
【机器学习 复习】第9章 降维算法——PCA降维
一、概念 1.PCA (1)主成分分析(Principal ComponentAnalysis,PCA)一种经典的线性降维分析算法。 (2)原理,这里以二维转一维为例,原来的平面变成了一条直线 这是三维变二…...
革命性终端网站构建工具LiveTerm:5分钟打造个性化网页终端
革命性终端网站构建工具LiveTerm:5分钟打造个性化网页终端 【免费下载链接】LiveTerm 💻 Build terminal styled websites in minutes! 项目地址: https://gitcode.com/gh_mirrors/li/LiveTerm LiveTerm是一款革命性的终端网站构建工具࿰…...
如何用Mi-Create打造专属小米手表表盘:零基础设计师的终极指南
如何用Mi-Create打造专属小米手表表盘:零基础设计师的终极指南 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 想让你的小米手表与众不同吗&#x…...
如何用5个步骤构建企业级智能SQL工具?自然语言转SQL全攻略
如何用5个步骤构建企业级智能SQL工具?自然语言转SQL全攻略 【免费下载链接】sqlcoder SoTA LLM for converting natural language questions to SQL queries 项目地址: https://gitcode.com/gh_mirrors/sq/sqlcoder 在数据驱动决策的时代,自然语言…...
思源宋体专业应用全攻略:从零开始掌握开源中文字体开发
思源宋体专业应用全攻略:从零开始掌握开源中文字体开发 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业项目寻找高质量中文字体而烦恼?思源宋体作为A…...
新手福音:通过快马ccswitch模型轻松生成你的第一个博客页面代码
作为一名刚接触编程的新手,想要搭建个人博客主页却不知从何下手,这确实是个常见难题。最近我在InsCode(快马)平台尝试了ccswitch模型,发现它特别适合零基础学习者快速入门。下面分享我的实践过程,希望能帮到同样想入门前端开发的朋…...
零基础友好:借助快马生成的指导项目轻松完成anaconda安装与初体验
最近在学Python数据分析,被各种环境配置搞得头大。朋友推荐用Anaconda管理环境,但光是安装就卡了半天。后来在InsCode(快马)平台发现了个神器项目,像有个老师手把手教操作,分享下我的学习过程: 为什么选择Anaconda 刚开…...
AI万能分类器应用解析:零样本分类在舆情分析中的实际价值
AI万能分类器应用解析:零样本分类在舆情分析中的实际价值 1. 引言 每天,互联网上产生数以亿计的文本数据——社交媒体评论、新闻报道、用户反馈、论坛讨论...这些数据蕴含着宝贵的舆情信息,但如何从中快速识别关键话题和情感倾向࿰…...
5分钟快速部署:如何将手机摄像头变为电脑摄像头终极指南
5分钟快速部署:如何将手机摄像头变为电脑摄像头终极指南 【免费下载链接】droidcam GNU/Linux/nix client for DroidCam 项目地址: https://gitcode.com/gh_mirrors/dr/droidcam 想让闲置的安卓手机变身高清电脑摄像头吗?DroidCam正是你需要的免费…...
MinerU 2.5-1.2B镜像体验报告:PDF转Markdown,效果远超传统工具
MinerU 2.5-1.2B镜像体验报告:PDF转Markdown,效果远超传统工具 1. 引言:为什么选择MinerU? 1.1 传统工具的局限性 在日常工作中,我们经常需要将PDF文档转换为Markdown格式。传统的工具如PyPDF2、pdfplumber在处理简…...
Pandas :索引机制与数据访问
Pandas 的运行逻辑建立在索引对象之上。索引对象不仅用于显示标签,更承担“标签查找”的职责。所有基于标签的访问与运算,都会先经过索引对象完成查找与匹配,再进入数据区域。示例数据:import pandas as pd df pd.DataFrame({ …...
