前言:前几章写的内容太多了,后面打算写k8s持久化篇幅也不小,这一章算作过度章节,内容简单一些,主要是K8S_web界面与Daemonset控制器。
1、Dashboard
Dashboard是一个图形化界面,用于汇总和展示来自不同数据源的关键信息。它通过图表、表格、图形等形式将数据可视化,使用户能够快速理解数据趋势和关键指标。
功能:
- 数据可视化:将数据以图表、仪表、地图等形式展示,使复杂的数据变得易于理解。
- 实时更新:许多Dashboard能够实时更新数据,提供最新的信息。
- 数据监控:监控关键指标和性能指标,及时发现异常或趋势。
- 自定义:用户可以根据需要自定义Dashboard的布局和内容,以关注特定的指标或数据。
- 互动性:提供过滤、搜索和钻取等功能,允许用户深入分析数据。
- 报告生成:支持生成报告和导出数据,方便进行进一步的分析或分享。
这里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 可以执行的操作权限,比如
get
、list
、watch
等,针对不同资源如 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同样支持热升级。