上一章对Pod的一些配置进行了更深刻的了解,那对于管理Pod的Controller肯定也要进阶一下,
之前我们已经学习过的 Controller 有RC、RS和Deployment,除此之外官方还提供符合其他场景使用的控制器,如:DaemonSet、statefulSet、Job、cron-job这些。
1、DaemonSet
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
DaemonSet应用场景
- 运行集群存储 daemon,例如在每个节点上运行
glusterd
、ceph
。 - 在每个节点上运行日志收集 daemon,例如
fluentd
、logstash
。 - 在每个节点上运行监控 daemon,例如 Prometheus Node Exporter、
collectd
、Datadog 代理、New Relic 代理,或 Gangliagmond
。
上面的说明应该很容易理解,简单来说就是,使用DaemonSet控制器创建资源,它会让每个Node节点都运行一份Pod,比如日志收集,因为Pod在不同节点运行,那每个节点肯定都要有一个Pod去收集这些日志,那就可以使用DaemonSet。
像K8S kube-system命名空间下的calico-node、kube-proxy组件,这些都是要在每个节点都要保证有一份Pod存在的,它们的资源类型肯定也是DaemonSet的!
2、StatefulSet
StatefulSet 是用来管理有状态应用的工作负载 API 对象。
StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供 序号和唯一性保证。
和 Deployment 相同的是,StatefulSet 管理了基于相同容器定义的一组 Pod。但和 Deployment 不同的是,StatefulSet 为它们的每个 Pod 维护了一个固定的 ID。这些 Pod 是基于相同的声明来创建的,但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。
StatefulSet 和其他控制器使用相同的工作模式。你在 StatefulSet 对象 中定义你期望的状态,然后 StatefulSet 的 控制器 就会通过各种更新来达到那种你想要的状态。
2.1 StatefulSets 与其他控制器的区别:
之前接触的Pod的管理对象比如RC、Deployment、DaemonSet等都是面向无状态的服务,但是现实中有很多服务是有状态的,比如MySQL集群、MongoDB集群、ZK集群等,它们都有以下共同的特点:
- 每个节点都有固定的ID,通过该ID,集群中的成员可以互相发现并且通信
- 集群的规模是比较固定的,集群规模不能随意变动
- 集群里的每个节点都是有状态的,通常会持久化数据到永久存储中
- 如果磁盘损坏,则集群里的某个节点无法正常运行,集群功能受损
而之前的RC/Deployment没办法满足要求,所以从Kubernetes v1.4版本就引入了PetSet资源对象,在v1.5版本时更名为StatefulSet。从本质上说,StatefulSet可以看作是Deployment/RC对象的特殊变种
- StatefulSet里的每个Pod都有稳定、唯一的网络标识,可以用来发现集群内其他的成员
- Pod的启动顺序是受控的,操作第n个Pod时,前n-1个Pod已经是运行且准备好的状态
- StatefulSet里的Pod采用稳定的持久化存储卷,通过PV/PVC来实现,删除Pod时默认不会删除与StatefulSet相关的存储卷
- StatefulSet需要与Headless Service配合使用
2.2 使用StatefulSet
-
准备YAML文件
- nginx-statefulset.yaml
# 定义Service apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- # 定义StatefulSet apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 3 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: nginx ports: - containerPort: 80 name: web
-
创建资源
[root@master-kubeadm-k8s statefulset]# kubectl apply -f nginx-statefulset.yaml service/nginx created statefulset.apps/web created
-
查看资源
通过 kubectl get pods -w 监控Pod创建过程,观察Pod名称及创建顺序
通过观察Pod的创建过程可以发现,StatefulSet类型的资源名称是有序号的了,而且肯定是有序创建的,第一个Pod没创建完成不会创建第二个!
3、Job
Job会创建一个或多个Pod,并确保指定数量的Pod成功终止。job会跟踪 Pod 成功完成的情况。当达到指定的成功完成次数时,任务(即Job)就完成了。删除 Job 将清除其创建的Pod。
对于RS,RC之类的控制器,能够保持Pod按照预期数目持久地运行下去,它们针对的是持久性的任务,比如web服务。
而有些操作其实不需要持久,比如压缩文件,我们希望任务完成之后,Pod就结束运行,不需要保持在系统中,此时就需要用到Job。
所以可以这样理解,Job是对RS、RC等持久性控制器的补充,负责批量处理短暂的一次性任务,仅执行一次,并保证处理的一个或者多个Pod成功结束。
3.1 使用Job
-
准备YAML文件
- job.yaml
这个 Job 会打印 1 ~ 9 的数字到控制台,当打印完成后这个 Pod 的任务就完成
apiVersion: batch/v1 kind: Job metadata: name: job-demo spec: template: metadata: name: job-demo spec: restartPolicy: Never containers: - name: counter image: busybox command: - "bin/sh" - "-c" - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
注意
Job
的RestartPolicy
只支持Never
和OnFailure
两种,不支持Always
,因为Job
就相当于来执行一个批处理任务,执行完就结束了,如果支持Always
的话就陷入死循环了! -
查看日志
# 创建 Job [root@master-kubeadm-k8s job]# kubectl apply -f job.yaml job.batch/job-demo created # 查看Job, 它的状态已经是 Completed 了,表示已经完成了 [root@master-kubeadm-k8s job]# kubectl get pods NAME READY STATUS RESTARTS AGE job-demo-n7wxf 0/1 Completed 0 64s # 也可以单独查看 Job 资源 [root@master-kubeadm-k8s job]# kubectl get job NAME COMPLETIONS DURATION AGE job-demo 1/1 57s 17m [root@master-kubeadm-k8s job]# kubectl get job -o wide NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR job-demo 1/1 57s 17m counter busybox controller-uid=866bed1d-8cff-11ea-827a-5254008afee6 # 查看日志,输出了 1 ~ 9 的数字 [root@master-kubeadm-k8s job]# kubectl logs job-demo-n7wxf 9 8 7 6 5 4 3 2 1
3.2 Job类型
- 非并行Job:
- 通常只运行一个Pod,Pod成功结束Job就退出。
- 固定完成次数的并行Job:
- 并发运行指定数量的Pod,直到指定数量的Pod成功,Job结束。
- 带有工作队列的并行Job:
- Pod必须在彼此之间或外部服务之间进行协调,以确定每个Pod应该如何处理。例如,一个Pod可以从工作队列中获取最多N批的批处理。
- 每个Pod都可以独立地确定其所有对等方是否都已完成,从而确定了整个Job。
- 用户可以指定并行的Pod数量,当任何Pod成功结束后,不会再创建新的Pod
- 一旦至少有一个Pod成功结束,并且所有的Pods都结束了,该Job就成功结束。
- 一旦有一个Pod成功结束,其他Pods都会准备退出。
4、Cron Job
Cron Job 创建基于时间调度的 Jobs。它是基于时间进行任务的定时管理。
一个 CronJob 对象就像 crontab (cron table) 文件中的一行。
它用 Cron 格式进行编写,周期性、或在给定的调度时间执行 Job。
反复在指定的时间点运行任务:比如定时进行数据库备份,定时发送电子邮件等等。
4.1 使用Cron Job
-
准备YAML文件
- cronjob.yaml
这个 cron job 是会一分钟创建一个 Job去运行,每个 Job的任务是:
输出当前时间
打印 Hello Cron Job!!!
apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello Cron Job!!! restartPolicy: OnFailure
-
创建资源
[root@master-kubeadm-k8s job]# kubectl apply -f cronjob.yaml cronjob.batch/hello created
-
查看资源
# 查看cronjob资源, CronJob 还没有调度或执行任何任务。大约需要一分钟任务才能创建好。 [root@master-kubeadm-k8s job]# kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 0 <none> 11s # 通过监控Job状态来观察 [root@master-kubeadm-k8s job]# kubectl get jobs --watch NAME DESIRED SUCCESSFUL AGE hello-4111706356 1 1 20s # 看到了一个运行中的任务被 “hello” CronJob 调度。 # 可以停止监视这个任务,然后再次查看 CronJob 就能看到它调度任务: # 能看到 “hello” CronJob 在 LAST-SCHEDULE 声明的时间点成功的调度了一次任务。 # ACTIVE 为 1 表示 Job 已经开始运行 [root@master-kubeadm-k8s job]# kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 1 21s 2m # 可以选择继续观察Job状态,它会周期性的去执行这个任务 [root@master-kubeadm-k8s job]# kubectl get jobs --watch NAME COMPLETIONS DURATION AGE hello-1588485600 1/1 57s 3m45s hello-1588485660 1/1 44s 2m45s hello-1588485720 1/1 58s 105s hello-1588485780 0/1 45s 45s
-
删除CronJob
删除 CronJob 会清除它创建的所有任务和 Pod,并阻止它创建额外的任务。
[root@master-kubeadm-k8s job]# kubectl delete cronjob hello cronjob.batch "hello" deleted
5、Horizontal Pod Autoscaler
HPA(Horizontal Pod Autoscaler)特性, 是可以基于CPU利用率自动伸缩 replication controller、deployment和 replica set 中的 pod 数量,(除了 CPU 利用率)也可以 基于其他应程序提供的度量指标custom metrics。
pod 自动扩缩容不适用于无法扩缩容的对象,比如 DaemonSets。
Pod 水平自动伸缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。
控制器会周期性的获取平均 CPU 利用率,并与目标值相比较后来调整 replication controller 或 deployment 中的副本数量。
5.1 Horizontal Pod Autoscaler的使用
-
提前准备一个YAML
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
-
创建资源
[root@master-kubeadm-k8s hpa]# kubectl apply -f test-hpa.yaml deployment.apps/nginx-deployment created
-
查看资源
# 3个副本数 [root@master-kubeadm-k8s hpa]# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 3/3 3 3 2m43s
-
手动扩容
[root@master-kubeadm-k8s hpa]# kubectl edit -f test-hpa.yaml deployment.apps/nginx-deployment edited
修改副本数为 10
-
查看资源
# 这块就会动态的增加副本数为10 [root@master-kubeadm-k8s hpa]# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 10/10 10 3 3m54s
-
使用HPA
创建HPA后,HPA会根据资源的使用情况,动态的调整Pod数量,但范围是由用户控制的
# 创建HPA, 使nginx pod的数量介于2和10之间,CPU使用率维持在50% [root@master-kubeadm-k8s hpa]# kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=50 horizontalpodautoscaler.autoscaling/nginx-deployment autoscaled
如果想要测试的话,可以用JMetter之类的工具去并发访问,我这里没有准备项目,就通过手动调整的方式来判断HPA是否生效
-
查看HPA
[root@master-kubeadm-k8s hpa]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-deployment Deployment/nginx-deployment <unknown>/50% 2 10 10 29s
-
调整副本数为15
-
-
查看资源
# 调整完成后发现还是10个, 因为HPA限制了它最大可以运行的副本数为 10 [root@master-kubeadm-k8s hpa]# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 10/10 10 10 5m
5.2 HPA工作机制
HPA实际就是管理RC或Deployment,通过他们来进行动态的扩缩容。它可以根据CPU使用率或应用自定义metrics自动扩展Pod数量(支持replication controller、deployment和replica set)
- 控制管理器每隔15s查询metrics的资源使用情况
- 通过kubectl创建一个horizontalPodAutoscaler对象,并存储到etcd中
- APIServer: 负责接受创建hpa对象,然后存入etcd
6、Resource
因为K8S的最小操作单元是Pod,所以这里主要讨论的是Pod的资源。
当使用Pod,可以指定每个容器需要多少资源,以及限制容器可以使用的资源。
最常见资源是CPU和内存(RAM)。
6.1 reques 与 limit
-
如果运行Pod的节点有足够的可用资源,则容器有可能(允许)使用比该
request
资源指定的资源更多的资源。但是,容器不能使用超出其资源的范围limit
。- 例如,如果为一个容器设置了256 MiB 的memory的请求,并且该容器位于已分配到具有8GiB内存且没有其他Pod的节点的Pod中,则该容器可以尝试使用更多的RAM。
-
如果为该容器设置了4GiB的
memory
限制,则kubelet(以及 容器运行时)会强制执行该限制。运行时可防止容器使用超出配置的资源限制的容器。- 例如:当容器中的进程尝试消耗的内存量超过允许的数量时,系统内核将终止尝试分配的进程,并出现内存不足(OOM)错误。
可以以反应方式实施限制(一旦发现违规,系统就会进行干预),也可以强制实施(系统防止容器超过限制)。不同的运行时可以采用不同的方式来实现相同的限制。
6.2 资源的配置项
Pod的每个容器可以指定以下一项或多项:
spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.limits.hugepages-
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory
spec.containers[].resources.requests.hugepages-
需求:requests 定义容器运行时至少需要资源
限制:limits 定义容器运行时最多能分配的资源
尽管只能在单个容器上指定请求和限制,但是Pod资源请求和限制很方便。Pod中每个Container的该类型资源请求/限制的会进行加总求和。
6.3 资源单位
-
CPU
CPU资源的限制和请求以cpu为单位进行度量。
-
Kubernetes中的
1 cpu
相当于1个vCPU / Core(对于云提供商)和1个超线程(在裸机Intel处理器上)。spec.containers[].resources.requests.cpu: 0.5
表示使用 0.5核 CPU的使用率
-
表达式
0.1
等同于表达式100m
,可以将其理解为“一百毫厘”。有人说“一百亿”,这被理解为是同一回事。100m ≈ 100mi ≈ 0.1
若表达式是纯数字格式,例如
0.1
,K8S会将具有小数点的请求转换为100m
,但精度超出了100m
的允许范围。所以更推荐100m
的写法。尽量使用绝对数量的利用率,而不是相对数量。
-
内存
限制和请求都是以内存
字节
为单位。可以使用以下后缀之一将内存表示为纯整数或定点整数:E,P,T,G,M,K。
-
还可以使用两个幂的等效项:Ei,Pi,Ti ,Gi,Mi,Ki。
-
例如,以下内容表示大致相同的值:
128974848, 129e6, 129M, 123Mi
-
6.4 资源的使用
-
准备YAML文件
以下Pod具有两个容器。
每个容器都有一个0.25核cpu和64MiB的内存请求。
每个容器的限制为0.5核cpu和128MiB的内存。
总和为:
当前Pod的请求为0.5核cpu和128 MiB的内存,限制为1核cpu和256MiB的内存。
apiVersion: v1 kind: Pod metadata: name: frontend spec: containers: - name: db image: mysql env: - name: MYSQL_ROOT_PASSWORD value: "password" resources: requests: memory: "64Mi" # 表示需要64Mi内存 cpu: "250m" # 表示需要0.25核的CPU limits: memory: "128Mi" # 表示限制最大内存为128Mi cpu: "500m" # 表示限制最大CPU使用率为0.5核 - name: wp image: wordpress resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"
-
查看资源
[root@master-kubeadm-k8s resource]# kubectl describe node worker02-kubeadm-k8s
7、Web UI (Dashboard)
Dashboard 是基于网页的 Kubernetes 用户界面。
可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。
-
可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源(如 Deployment,Job,DaemonSet 等等)。
- 例如,可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
Dashboard 同时展示了 Kubernetes 集群中的资源状态信息和所有报错信息。
7.1 部署Dashboard
默认情况下,K8S不会安装Dashboard,可以手动下载yaml文件进行安装
-
yaml文件
有两处需要修改
镜像地址更好为国内镜像
默认Dashboard只能集群内访问,所以使用NodePort方式开放端口供外部访问
apiVersion: v1 kind: ConfigMap metadata: labels: k8s-app: kubernetes-dashboard # Allows editing resource and makes sure it is created first. addonmanager.kubernetes.io/mode: EnsureExists name: kubernetes-dashboard-settings namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard addonmanager.kubernetes.io/mode: Reconcile name: kubernetes-dashboard namespace: kube-system --- apiVersion: apps/v1 kind: Deployment metadata: name: kubernetes-dashboard namespace: kube-system labels: k8s-app: kubernetes-dashboard kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile spec: selector: matchLabels: k8s-app: kubernetes-dashboard template: metadata: labels: k8s-app: kubernetes-dashboard annotations: scheduler.alpha.kubernetes.io/critical-pod: '' seccomp.security.alpha.kubernetes.io/pod: 'docker/default' spec: priorityClassName: system-cluster-critical containers: - name: kubernetes-dashboard image: registry.cn-hangzhou.aliyuncs.com/kubernete/kubernetes-dashboard-amd64:v1.8.3 resources: limits: cpu: 100m memory: 300Mi requests: cpu: 50m memory: 100Mi ports: - containerPort: 8443 protocol: TCP args: # PLATFORM-SPECIFIC ARGS HERE - --auto-generate-certificates volumeMounts: - name: kubernetes-dashboard-certs mountPath: /certs - name: tmp-volume mountPath: /tmp livenessProbe: httpGet: scheme: HTTPS path: / port: 8443 initialDelaySeconds: 30 timeoutSeconds: 30 volumes: - name: kubernetes-dashboard-certs secret: secretName: kubernetes-dashboard-certs - name: tmp-volume emptyDir: {} serviceAccountName: kubernetes-dashboard tolerations: - key: "CriticalAddonsOnly" operator: "Exists" --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: labels: k8s-app: kubernetes-dashboard addonmanager.kubernetes.io/mode: Reconcile name: kubernetes-dashboard-minimal namespace: kube-system rules: # 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 labels: k8s-app: kubernetes-dashboard addonmanager.kubernetes.io/mode: Reconcile roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: kubernetes-dashboard-minimal subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system --- apiVersion: v1 kind: Secret metadata: labels: k8s-app: kubernetes-dashboard # Allows editing resource and makes sure it is created first. addonmanager.kubernetes.io/mode: EnsureExists name: kubernetes-dashboard-certs namespace: kube-system type: Opaque --- apiVersion: v1 kind: Secret metadata: labels: k8s-app: kubernetes-dashboard # Allows editing resource and makes sure it is created first. addonmanager.kubernetes.io/mode: EnsureExists name: kubernetes-dashboard-key-holder namespace: kube-system type: Opaque --- apiVersion: v1 kind: Service metadata: name: kubernetes-dashboard namespace: kube-system labels: k8s-app: kubernetes-dashboard kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile spec: selector: k8s-app: kubernetes-dashboard ports: - port: 443 targetPort: 8443 nodePort: 30018 type: NodePort
-
创建资源
[root@master-kubeadm-k8s dashboard]# kubectl apply -f dashboard.yaml configmap/kubernetes-dashboard-settings unchanged serviceaccount/kubernetes-dashboard unchanged deployment.apps/kubernetes-dashboard created role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created secret/kubernetes-dashboard-certs created secret/kubernetes-dashboard-key-holder created service/kubernetes-dashboard created
-
查看资源
-
访问Web UI
https://192.168.50.113:30018/
谷歌浏览器无法直接访问,K8S内部的一些证书它不支持,要想用谷歌浏览器打开dashboard,得手动配置一些证书才行,具体怎么配,网上一堆,这里不演示
我这里通过搜狗浏览器打开
发现需要认证,有两种方式,我们选择Token令牌的方式登录
-
生成Token
# 创建service account [root@master-kubeadm-k8s dashboard]# kubectl create sa dashboard-admin -n kube-system serviceaccount/dashboard-admin created # # 创建角色绑定关系 [root@master-kubeadm-k8s dashboard]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created # 查看dashboard-admin的secret名字 [root@master-kubeadm-k8s dashboard]# ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}') [root@master-kubeadm-k8s dashboard]# echo ADMIN_SECRET ADMIN_SECRET # 打印secret的token [root@master-kubeadm-k8s dashboard]# kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}' eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4temtsNWoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMGVlZjI5ZDEtOGQzYi0xMWVhLTgyN2EtNTI1NDAwOGFmZWU2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.iFaoyxLbiAxuHT5DXZCt1xUjU2n17I0a7ip2zEY6wEKy6ULhG3I9jByeImETAINzqRsPdiRUwi6Rn-oqoq7_36x-XP4EE7C1EgefJqMWPCvVbC4W3UAG6cfjmAUe-9nc5IwxCIxMX-ZeYcNJ8-QiWNVmCxVgqaN53iqKJAwBvHuNQwyrMDI7tBf5SnjLD5_8_HPtzavRH23QlUjT3X_3DHxzYx03oUoVsijs46u-6n52ZNIfemhMzd751Um57RWzvXtYFsXZsRi_KDppw0AuftX6oajXxJvuquP1HWKxKwo0w93FyjKc0GpGCaMooQOim5957j2PJeYOgLX9q8N_qA
-
登录Dashboard
复制生成的Token登录
Dashboard功能很全面,有了Dashboard我们很多简单操作无需再到宿主机中去敲命令,直接通过界面操作即可。
具体的使用这里不错介绍了,功能很简单,多点点多看看就知道怎么玩了。