08--kubernetes可视化界面与Daemonset

前言:前几章写的内容太多了,后面打算写k8s持久化篇幅也不小,这一章算作过度章节,内容简单一些,主要是K8S_web界面与Daemonset控制器。

1、Dashboard

Dashboard是一个图形化界面,用于汇总和展示来自不同数据源的关键信息。它通过图表、表格、图形等形式将数据可视化,使用户能够快速理解数据趋势和关键指标。

功能:

  1. 数据可视化:将数据以图表、仪表、地图等形式展示,使复杂的数据变得易于理解。
  2. 实时更新:许多Dashboard能够实时更新数据,提供最新的信息。
  3. 数据监控:监控关键指标和性能指标,及时发现异常或趋势。
  4. 自定义:用户可以根据需要自定义Dashboard的布局和内容,以关注特定的指标或数据。
  5. 互动性:提供过滤、搜索和钻取等功能,允许用户深入分析数据。
  6. 报告生成:支持生成报告和导出数据,方便进行进一步的分析或分享。

这里dashboard也是运行在k8s集群内部pod上运行的, 所以想使用web界面还需要使用nodeport方式暴露出来。本质上使用dashboard管理k8s集群是使用一个pod管理k8s,所以需要针对这个pod进行提权,这里就要引入另一个资源对象serviceacoount(sa),但sa刚创建出来时,权限仅限于访问apiserver,此时则需要创建一个clusterrole,通过创建clusterrole后赋予其权限,与sa绑定在一起,授予sa权限,这个绑定规则就是clusterrolebinding,创建pod后引用sa即可拥有对应的权限。

详细解释:

  • ServiceAccount 是 Pod 与 Kubernetes API 交互时使用的身份。你可以为 Pod 指定一个 ServiceAccount。

  • ClusterRole 定义了该 ServiceAccount 可以执行的操作权限,比如 getlistwatch 等,针对不同资源如 Pods、Services、Secrets 等。

  • ClusterRoleBinding 将定义好的 ClusterRole 权限绑定到指定的 ServiceAccount 上,使得该 ServiceAccount 可以执行 ClusterRole 中定义的操作。

五种访问dashboard的方式(这里只演示最常使用的nodeport):

1. Nodport方式访问dashboard,service类型改为NodePort
2. loadbalancer方式,service类型改为loadbalacer
3. Ingress方式访问dashboard
4. API server方式访问 dashboard
5. kubectl proxy方式访问dashboard

1.1、Dashboard部署

部署文件下载地址:

文件原地址:https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

百度网盘链接:
链接: https://pan.baidu.com/s/1OwUFWpRSRML3f7i9JhyodA?pwd=gszm 提取码: gszm

所需提前下载的镜像(拉取到node节点,可指定某个节点进行创建):

bash 复制代码
[root@k8s-node1 ~]# docker pull registry.cn-chengdu.aliyuncs.com/k8s_module_images/dashboard:v2.4.0
[root@k8s-node1 ~]# docker pull registry.cn-chengdu.aliyuncs.com/k8s_module_images/metrics-scraper:v1.0.7

[root@k8s-node1 ~]# docker tag registry.cn-chengdu.aliyuncs.com/k8s_module_images/dashboard:v2.4.0 kubernetesui/dashboard:v2.4.0
[root@k8s-node1 ~]# docker tag registry.cn-chengdu.aliyuncs.com/k8s_module_images/metrics-scraper:v1.0.7 kubernetesui/metrics-scraper:v1.0.7

tag不改也可以,记得修改yaml内的image项

修改命名空间为我们现在使用的kube-system

bash 复制代码
[root@k8s-master1 ~]# sed -i '/namespace/ s/kubernetes-dashboard/kube-system/g' recommended.yam

进入文件内部修改

1、命名空间创建部分添加注释
#apiVersion: v1
#kind: Namespace
#metadata:
#  name: kubernetes-dashboard

2、搜索image:
没有docker tag的记得修改image

3、搜索kind: Deployment(有两个组件)
指定创建节点为k8s-node1(根据需要操作)
    spec:
      nodeName: k8s-node1

4、搜索kind: Service(只改第一个)
有多个svc,只需要修改dashboard的,本yaml内为标签k8s-app: kubernetes-dashboard
指定svc类型为NodePort,添加nodeport端口
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 32123

修改后文件为百度云链接内的recommended-finish.yaml

根据文件创建dashboard

bash 复制代码
[root@k8s-master1 ~]# kubectl apply -f recommended.yaml 
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

检查创建情况

[root@k8s-master1 ~]# kubectl get pod -n kube-system

https访问node1的32123端口(注意浏览器安全策略,最高安全策略会强制拦截访问)

至此搭建完成,下面演示token登录和使用

1.2、Dashboard使用

首先需要获取token

bash 复制代码
[root@k8s-master1 ~]# kubectl get clusterrole

以这个角色作为与我们sa绑定的clusterrole,上面运行yaml文件时也创建了clusterrole并有完整的sa和绑定关系,但是权限较小,所以这里采用权限较大的角色进行绑定。

创建sa和绑定关系的操作过程如下:

bash 复制代码
[root@k8s-master1 ~]# vim dashboard-adminuser.yaml
[root@k8s-master1 ~]# cat dashboard-adminuser.yaml
---
apiVersion: v1  # 指定 API 版本
kind: ServiceAccount  # 资源类型:ServiceAccount
metadata:
  name: admin-user  # ServiceAccount 的名称
  namespace: kube-system  # ServiceAccount 所在的命名空间
---
apiVersion: rbac.authorization.k8s.io/v1  # 指定 API 版本
kind: ClusterRoleBinding  # 资源类型:ClusterRoleBinding
metadata:
  name: admin-user  # ClusterRoleBinding 的名称
roleRef:
  apiGroup: rbac.authorization.k8s.io  # 指定 RBAC API 组
  kind: ClusterRole  # 角色类型:ClusterRole
  name: cluster-admin  # 绑定的角色名称(ClusterRole)
subjects:
- kind: ServiceAccount  # 绑定的主体类型:ServiceAccount
  name: admin-user  # 绑定的 ServiceAccount 名称
  namespace: kube-system  # 绑定的 ServiceAccount 所在的命名空间
bash 复制代码
[root@k8s-master1 ~]# kubectl apply -f dashboard-adminuser.yaml 
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

查看创建情况

bash 复制代码
[root@k8s-master1 ~]# kubectl get sa -n kube-system
NAME                                 SECRETS   AGE
admin-user                           1         72s

创建sa的时候会同步生成对应的secret(以sa名字为前缀)

bash 复制代码
[root@k8s-master1 ~]# kubectl get secret -n kube-system
NAME                                             TYPE                                  DATA   AGE
admin-user-token-5pvvm                           kubernetes.io/service-account-token   3      3m54s

查看该secret的详细信息可以获得token

bash 复制代码
[root@k8s-master1 ~]# kubectl describe secret admin-user-token-5pvvm -n kube-system
Name:         admin-user-token-5pvvm
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: 9d5166be-d225-4395-a17b-3df11808b89f

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6ImtyaU9nanQxZTFrM1RaWDM2b21jOFdFQkIyRDBEM3NDWmJuVWs5U3o1QkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTVwdnZtIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZDUxNjZiZS1kMjI1LTQzOTUtYTE3Yi0zZGYxMTgwOGI4OWYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.rqn5RsVMU5DbAxLRbSR4qsUG_sHEEGQWdIW7KWMLw_MO3JgUrpPFEwBcMfupQq00ck_eX-c7PPbdh-8f5tUXxYxKDkPKwm8VF6Cuk4Q6TLdTUKFmqlZ8X9s-TZdsKIdwPwGkFQtzkMLVnqO8DxcQWZyAWg7Datahbp_pziEXRa1fgw_qnPfw_JyDs1jBUH3H2DLC7bMqeUmYejADeu3odX5hMJM0_ws33rV34Gq1eY1CQV6WuyHRKyZIR7Jj7fvoIz0nKqAE1qqDSMPOmd7tx2JYieL1wTTgegr-SZyUAVHm1jSimI3oSBp6I_Sen7QDBMH1oJgrDzUBzos1Uzabag

复制token,回到浏览器登录使用。进入dashboard界面

选择命名空间,查看对应资源对象

管理删除pod

扩容deployment,其他资源对象同理

2、Daemonset

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

DaemonSet 的一些典型用法:

在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。

在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash、filebeat。

在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、Flowmill、Sysdig 代理、collectd、Dynatrace OneAgent、AppDynamics 代理、Datadog 代理、New Relic 代理、Ganglia gmond 或者 Instana 代理。

一个简单的用法是在所有的节点上都启动一个 DaemonSet,并作为每种类型的 daemon 使用。

一个稍微复杂的用法是单独对每种 daemon 类型使用一种DaemonSet。这样有多个 DaemonSet,但具有不同的标识,并且对不同硬件类型具有不同的内存、CPU 要求。

查看当前集群已有的daemonset

bash 复制代码
[root@k8s-master1 deployment.yaml.d]# kubectl get daemonset -n kube-system
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-flannel-ds   3         3         3       3            3           <none>                   13d
kube-proxy        3         3         3       3            3           kubernetes.io/os=linux   13d

这里有三个的原因是,除两个node节点外,最初yaml文件设置master接受调度

DaemonSet 中的 Pod 可以使用 hostPort,从而可以通过node节点 IP 访问到 Pod;因为DaemonSet模式下Pod不会被调度到其他节点。

bash 复制代码
 ports:
    - name: httpd
      containerPort: 80
      #除非绝对必要,否则不要为 Pod 指定 hostPort。 将 Pod 绑定到hostPort时,它会限制 Pod 可以调度的位置数;DaemonSet除外
      #一般情况下 containerPort与hostPort值相同
      hostPort: 8090     #可以通过宿主机+hostPort的方式访问该Pod。例如:pod在/调度到了k8s-node02			                      【192.168.153.147】,那么该Pod可以通过192.168.153.147:8090方式进行访问。
      protocol: TCP

操作演示:

无需指定副本数量

bash 复制代码
[root@k8s-master1 ~]# mkdir daemonset.yaml.d
[root@k8s-master1 ~]# cd daemonset.yaml.d/
[root@k8s-master1 daemonset.yaml.d]# vim nginx-daemonset.yml 
[root@k8s-master1 daemonset.yaml.d]# cat nginx-daemonset.yml 
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.cn-chengdu.aliyuncs.com/liumuquan_app/nginx:1.20.1
        ports:
        - name: nginx
          containerPort: 80
          hostPort: 8090
          protocol: TCP

创建daemonset并查看

bash 复制代码
[root@k8s-master1 daemonset.yaml.d]# kubectl apply -f nginx-daemonset.yml 
daemonset.apps/nginx-daemonset created
[root@k8s-master1 daemonset.yaml.d]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
nginx-daemonset-f4456   1/1     Running   0          16s
nginx-daemonset-h9ttq   1/1     Running   0          16s
[root@k8s-master1 daemonset.yaml.d]# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nginx-daemonset-f4456   1/1     Running   0          37s   10.244.1.37   k8s-node1   <none>           <none>
nginx-daemonset-h9ttq   1/1     Running   0          37s   10.244.2.23   k8s-node2   <none>           <none>

使用浏览器访问

与deploy一样,daemonset同样支持热升级。

相关推荐
Mitch3116 分钟前
【漏洞复现】CVE-2015-3337 Arbitrary File Reading
elasticsearch·网络安全·docker·漏洞复现
Mitch31111 分钟前
【漏洞复现】CVE-2015-5531 Arbitrary File Reading
web安全·elasticsearch·网络安全·docker·漏洞复现
雨中rain42 分钟前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
Bessssss1 小时前
centos日志管理,xiao整理
linux·运维·centos
s_yellowfish1 小时前
Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人
linux·服务器·chatgpt
豆是浪个1 小时前
Linux(Centos 7.6)yum源配置
linux·运维·centos
vvw&1 小时前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
我一定会有钱1 小时前
【linux】NFS实验
linux·服务器
Ven%1 小时前
如何在防火墙上指定ip访问服务器上任何端口呢
linux·服务器·网络·深度学习·tcp/ip
是阿建吖!1 小时前
【Linux】基础IO(磁盘文件)
linux·服务器·数据库