九、Kubernetes 进阶之控制器篇

上一章对Pod的一些配置进行了更深刻的了解,那对于管理Pod的Controller肯定也要进阶一下,

之前我们已经学习过的 Controller 有RC、RS和Deployment,除此之外官方还提供符合其他场景使用的控制器,如:DaemonSet、statefulSet、Job、cron-job这些。

1、DaemonSet

DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

DaemonSet应用场景

  • 运行集群存储 daemon,例如在每个节点上运行 glusterdceph
  • 在每个节点上运行日志收集 daemon,例如fluentdlogstash
  • 在每个节点上运行监控 daemon,例如 Prometheus Node Exportercollectd、Datadog 代理、New Relic 代理,或 Ganglia gmond

上面的说明应该很容易理解,简单来说就是,使用DaemonSet控制器创建资源,它会让每个Node节点都运行一份Pod,比如日志收集,因为Pod在不同节点运行,那每个节点肯定都要有一个Pod去收集这些日志,那就可以使用DaemonSet。

像K8S kube-system命名空间下的calico-node、kube-proxy组件,这些都是要在每个节点都要保证有一份Pod存在的,它们的资源类型肯定也是DaemonSet的!

image.png
image.png

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名称及创建顺序

image.png

通过观察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"
    

    注意JobRestartPolicy 只支持NeverOnFailure两种,不支持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
    
image.png

修改副本数为 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

      image.png
  • 查看资源

    # 调整完成后发现还是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
image.png

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
    
    image.png

7、Web UI (Dashboard)

  • Dashboard 是基于网页的 Kubernetes 用户界面。

  • 可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。

  • 可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源(如 Deployment,Job,DaemonSet 等等)。

    • 例如,可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
  • Dashboard 同时展示了 Kubernetes 集群中的资源状态信息和所有报错信息。

image.png

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
    
  • 查看资源

    image.png
  • 访问Web UI

    https://192.168.50.113:30018/

    谷歌浏览器无法直接访问,K8S内部的一些证书它不支持,要想用谷歌浏览器打开dashboard,得手动配置一些证书才行,具体怎么配,网上一堆,这里不演示

    image.png

我这里通过搜狗浏览器打开

发现需要认证,有两种方式,我们选择Token令牌的方式登录

image.png
  • 生成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登录

    image.png

Dashboard功能很全面,有了Dashboard我们很多简单操作无需再到宿主机中去敲命令,直接通过界面操作即可。

具体的使用这里不错介绍了,功能很简单,多点点多看看就知道怎么玩了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342