K8S--Helm&Dashboard&prometheus&grafana
一、Helm
(一)Helm简介
Helm 是 Kubernetes 的软件包管理工具。在K8S部署时,有deployment、service、rs、pv、pvc等等很多资源需要管理,就非常的麻烦,Helm就是来解决这个问题的。Helm类似于yum安装指令,统一对安装服务进行管理,使得用户不需要关系服务之间的依赖关系。
Helm包含两个组件:helm客户端和Tiller服务器
helm是一个命令行工具,用于本地开发及管理chart,chart仓库管理等
Tiller是Helm的服务端,Tiller负责接收Helm的请求,与K8S的APIServer进行交互,根据chart来生成一个release并管理release
chart Helm的打包格式叫做chart,所谓chart就是一系列文件, 它描述了一组相关的 k8s 集群资源
release 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为
Release Repoistory Helm chart 的仓库,Helm 客户端通过 HTTP 协议来访问存储库中 chart 的索引文件 和压缩包
chart的基本结构
charts 目录存放依赖的chart,依赖包 类似于项目lib,类似前端package-json
Chart.yaml 包 含Chart的基本信息,包 chart版本,名称等
templates 目 录下存放应用 一系列 k8s资源的yaml 模板
_helpers.tpl 此 文件中定义一 些可重用的模板片断,此文件中的定义在任何资源定义模板中可用 NOTES.txt 介绍chart 部署后的帮助信息,如何使用chart等
values.yaml 包含了必要的值定义(默认值), 用于存储 templates 目录中模板文件中用到变量的值,相当于configmap资源对象,用来存储公共资源
(二)Helm安装
# 下载 wget https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux- amd64.tar.gz # 解压 tar -zxvf helm-v2.15.2-linux-amd64.tar.gz # 复制 helm 二进制 到bin目录下 cp linux-amd64/helm /usr/local/bin/ # 第二种安装方式: 使用官方二进制脚本进行安装 curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh chmod 700 get_helm.sh ./get_helm.sh # 还可以通过 Helm 的 github 项目下找到你想要的 Helm 版本的二进制,然后通过手动安装方式一样 安装即可
(三)tiller安装
1、添加配置文件
apiVersion: v1 kind: ServiceAccount metadata: name: tiller namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: tiller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: tiller namespace: kube-system
2、安装
# 构建rbac kubectl create -f rbac-config.yaml # 初始化tiller helm init --service-account tiller --skip-refresh # 查看tiller的pod信息 kubectl get pods -n kube-system | grep tiller
但是这里有个问题,就是查看pod的时候,pod处于下载镜像失败的状态
kubectl describe pod tiller-deploy-659c6788f5-v5hpd -n kube-system
镜像从阿里云平台下载,然后命名为使用的默认的镜像:gcr.io/kubernetes- helm/tiller:v2.15.2(在所有的主节点和node节点都执行,也可以在master安装后,复制到node节点)
# 镜像从阿里云平台下载,然后命名为使用的默认的镜像:
gcr.io/kubernetes- helm/tiller:v2.15.2 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.15.2 # 打包镜像 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.15.2 gcr.io/kubernetes-helm/tiller:v2.15.2
安装后,查看helm版本
此时再查看,即可看到pod已经运行
(四)Helm工程开发
上面提到Helm的工程结构如下:
如果没有依赖,则不需要charts
1、那么首先创建一个Chart.yaml,表明名称和版本
cat << 'EOF' > ./Chart.yaml name: hello-world version: 1.0.0 EOF
2、创建一个templates文件夹,然后在文件夹中创建deployment.yaml文件(固定格式,名称必须这样命名)
mkdir templates # 创建deployment.yaml cat <<'EOF' > ./templates/deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hello-world spec: replicas: 1 template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: nginx ports: - containerPort: 80 protocol: TCP EOF
3、创建service.yaml
cat <<'EOF' > ./templates/service.yaml apiVersion: v1 kind: Service metadata: name: hello-world spec: type: NodePort ports: - port: 80 targetPort: 80 protocol: TCP selector: app: hello-world EOF
4、安装
# 安装 helm install . # 列出已经部署的 helm list # 查看运行的pod kubectl get pod
可以在K8S内使用Cluster-ip进行访问测试:curl 10.99.250.66,也可以在外网进行访问,可以看到安装的时候80端口映射的是30654端口
对于helm的其他相关操作如下:(RELEASE_NAME指的是list列出的helm的name)
# 列出已经部署的 Release helm ls # 查询一个特定的 Release 的状态 helm status RELEASE_NAME # 移除所有与这个 Release 相关的 Kubernetes 资源 (可回滚) helm delete RELEASE_NAME # 回滚上述的删除 helm rollback RELEASE_NAME 1 # 使用 helm delete --purge RELEASE_NAME 移除所有与指定 Release 相关的 Kubernetes 资源 和所有这个 Release 的记录 (不可回滚) helm delete --purge RELEASE_NAME helm ls --deleted # 修改配置文件更新 helm upgrade RELEASE_NAME .
5、values配置
values相当于是configmap,这里模拟一下配置指定的镜像仓库地址(这里一定要注意文件的路径,是和templates平级的)
cat <<'EOF' > ./values.yaml image: repository: hub.menglong.com/lcl-galaxy/nginxtest tag: 'lcl123' EOF
然后修改deployment.yaml中的镜像仓库配置,将images修改为使用values中配置的镜像地址
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hello-world spec: replicas: 1 template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports: - containerPort: 80 protocol: TCP
6、创建
创建helm(要删除上面创建的helm,不然重名创建失败)
# 删除刚才创建的helm helm delete --purge plundering-peahen # 新创建helm helm install .
7、版本更新
# 在 values.yaml 中的值可以被部署 release 时用到的参数 --values YAML_FILE_PATH 或 -- set key1=value1, key2=value2 覆盖掉 helm install --set image.tag='v3' . helm upgrade RELEASE_NAME --set image.tag='v3' . # 升级版本 helm upgrade -f values.yaml test .
(五)Debug调试
验证编写内容是否正确
helm install . --dry-run --debug --set image.tag=latest
二、Dashboard
这里以Dashboard安装为例,演示一下Helm安装软件。
1、使用fetch下载Dashboard
helm fetch stable/kubernetes-dashboard
(1)如果出现错误:Error: no cached repo found. (try 'helm repo update'). open /root/.helm/repository/cache/stable-index.yaml: no such file or directory
则需要更新一下helm的仓库源
helm repo update
(2)如果在更新仓库源中出现错误:Failed to fetch https://kubernetes-charts.storage.googleapis.com/index.yaml : 403 Forbidden
则可以将其更新为阿里的地址
helm repo remove stable helm repo add stable https://charts.helm.sh/stable helm repo update
2、解压查看
tar -zxvf kubernetes-dashboard-1.11.1.tgz
可以看到内容是已经按照Helm格式创建好的各种配置。
3、配置
查看values.yaml配置文件,可以看到镜像仓库地址用的K8S的地址,由于网络的问题,会导致我们下载失败,所以自己创建一个配置文件,在部署helm的时候,使用我们自己创建的配置文件。
首先创建一个dashboard.yaml配置文件,将镜像地址换成阿里的地址
# 编辑dashboard.yaml文件 image: repository: registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64 tag: v1.10.0 ingress: enabled: true hosts: - k8s.frognew.com annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" tls: - secretName: frognew-com-tls-secret hosts: - k8s.frognew.com rbac: clusterAdminRole: true
4、创建
helm install . -n kubernetes-dashboard --namespace kube-system -f dashboard.yaml
然后查看pod和service,同时放开对外端口
5、访问
从上面图片可以看到,开放的端口是443,也就是https访问,然后在浏览器访问:https://192.168.124.17:30464/ (这里要使用火狐浏览器,使用谷歌浏览器不能使用)
选择使用令牌进行登录
获取token
kubectl get secrets -n kube-system | grep kubernetes-dashboard-token kubectl describe secrets kubernetes-dashboard-token-9r494 -n kube-system
登陆后
6、可视化部署
可以选择新建进行服务部署,可以选择yaml文件或json文件、上传文件、手动创建应用进行创建
还可以对服务进行伸缩处理
三、prometheus&grafana
(一)组件说明
1、MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如kubectl,hpa,scheduler等。
2、PrometheusOperator:是一个系统监测和警报工具箱,用来存储监控数据。
3、NodeExporter:用于各node的关键度量指标状态数据。
4、KubeStateMetrics:收集kubernetes集群内资源对象数据,制定告警规则。
5、Prometheus:采用pull方式收集apiserver,scheduler,controller-manager,kubelet组件数据,通过http协议传输。
6、Grafana:是可视化数据统计和监控平台
(二)构建记录
构建可以使用yaml文件构建,也可以使用helm构建,这里演示使用yaml文件构建
1、下载代码并上传至服务器,然后切换至kube-prometheus/manifests/目录
git clone https://github.com/coreos/kube-prometheus.git cd kube-prometheus/manifests/
2、修改 grafana-service.yaml 文件,使用 nodepode 方式访问 grafana
apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: grafana app.kubernetes.io/name: grafana app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/version: 8.0.3 name: grafana namespace: monitoring spec: type: NodePort ports: - name: http port: 3000 targetPort: http nodePort: 30001 selector: app.kubernetes.io/component: grafana app.kubernetes.io/name: grafana app.kubernetes.io/part-of: kube-prometheus
3、修改 prometheus-service.yaml,改为 nodepode
apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: prometheus app.kubernetes.io/name: prometheus app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/version: 2.28.1 prometheus: k8s name: prometheus-k8s namespace: monitoring spec: type: NodePort ports: - name: web port: 9090 targetPort: web nodePort: 30002 selector: app: prometheus app.kubernetes.io/component: prometheus app.kubernetes.io/name: prometheus app.kubernetes.io/part-of: kube-prometheus prometheus: k8s sessionAffinity: ClientIP
4、修改 alertmanager-service.yaml,改为 nodepode
apiVersion: v1 kind: Service metadata: labels: alertmanager: main app.kubernetes.io/component: alert-router app.kubernetes.io/name: alertmanager app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/version: 0.22.2 name: alertmanager-main namespace: monitoring spec: type: NodePort ports: - name: web port: 9093 targetPort: web nodePort: 30003 selector: alertmanager: main app: alertmanager app.kubernetes.io/component: alert-router app.kubernetes.io/name: alertmanager app.kubernetes.io/part-of: kube-prometheus sessionAffinity: ClientIP
5、由于网络的原因,prometheus镜像不好下载,直接上传
https://pan.baidu.com/s/1A4hYxVYqpOlmxrY08vrO8Q 提取码:rd5z
上传后加载镜像
# shell脚本赋权 chmod 755 load-images.sh # 解压 tar -zxvf prometheus.tar.gz # 移动到root目录 mv load-images.sh prometheus /root/ # 加载镜像 ./load-images.sh # 复制文件到node节点 scp -r load-images.sh prometheus root@192.168.124.18:/root scp -r load-images.sh prometheus root@192.168.124.20:/root # 在node节点也加载镜像 ./load-images.sh
6、切换到kube-prometheus/manifests目录,提前创建好namespace然后开始创建
kubectl create ns monitoring
kubectl apply -f .
7、查看pod
kubectl get pod -n monitoring
8、然后就可以使用IP + 端口访问grafana查看监控视图
-----------------------------------------------------------
---------------------------------------------
朦胧的夜 留笔~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律