k8s集群安装学习笔记八——Helm部署及使用
Helm 部署
使用Helm部署 dashboard (K8S官方管理工具)
部署metrics-server(监控项目)
部署Prometheus(监控项目)
Horizontal Pod Autoscaling自动伸缩扩容
资源限制
使用Helm部署 EFK日志平台

Helm 客户端负责 chart 和 release 的创建和管理以及和 Tiller 的交互。
Tiller 服务器运行在 Kubernetes 集群中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互 。
Helm 部署
ntpdate ntp1.aliyun.com 官网下载地址:https://github.com/kubernetes/helm/releases wget https://get.helm.sh/helm-v2.13.1-linux-amd64.tar.gz tar -zxvf helm-v2.13.1-linux-amd64.tar.gz cd linux-amd64/ cp helm /usr/local/bin/
helm命令行工具完成
$ vim rbac-config.yaml
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
kubectl create -f rbac-config.yaml
tiller服务端安装(指定上面创建的service account初始化)
helm init --service-account=tiller --skip-refresh
注:如果镜像下载失败,可以换成阿里云的镜像
进入查看安装结果
kubectl edit pod tiller-deployment-xxx -n kube-system
tiller 默认被部署在 k8s 集群中的 kube-system 这个namespace 下
kubectl get pod -n kube-system -l app=helm
NAME READY STATUS RESTARTS AGE
tiller-deploy-c4fd4cd68-dwkhv 1/1 Running 0 83s helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4",
GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4",
GitTreeState:"clean"}
开始使用
Helm 自定义模板
# 创建文件夹 $ mkdir ./test $ cd ./test
# 创建自描述文件 Chart.yaml , 这个文件必须由 name 和 version 定义 $ cat <<'EOF' > ./Chart.yaml name: hello-world version: 1.0.0 EOF
# 创建模板文件, 用于生成 Kubernetes 资源清单(manifests) $ mkdir ./templates #必须是这个目录名,不能改 $ 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: wangyanglinux/myapp:v1 ports: - containerPort: 80 protocol: TCP EOF $ 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
# 使用命令 helm install RELATIVE_PATH_TO_CHART 创建一次Release
$ helm install .
查看当前helm运行列表信息
如果修改了yaml文件需要更新时:
查看更新历史:
回滚
helm rollback nobby-eel 1
查看当前pod信息:
查看当前helm运行状态:
访问测试:
就可以把下面的目录打包发给别人,用于部署应用程序(当然以上实验比较简单,只包含了一个应用程序,可以部署多个或者集群)
简单总结下关系概念:
在docker里,它会把我们的应用程序封装成一个镜像,在部署应用程序时,只需要运行镜像即可。
在k8s里,helm是把我们集群的部署方案写入到Chart中,然后通过Chart去部署出来一个集群,
也就是生成对应的release,然后在docker里面就会生成对应的容器。
常用其他命令:
# 列出已经部署的 Release
$ helm list
# 查询一个特定的 Release 的状态
$ helm status RELEASE_NAME
# 移除所有与这个 Release 相关的 Kubernetes 资源(还有回滚余地)
$ helm delete cautious-shrimp
# 回滚 helm rollback RELEASE_NAME REVISION_NUMBER
$ helm rollback cautious-shrimp 1
# 使用 helm delete --purge RELEASE_NAME 移除所有与指定 Release 相关的 Kubernetes 资源和所有这个 Release 的记录(彻底删除,无法回滚)
$ helm delete --purge cautious-shrimp
# 查看删除但还保留的记录
$ helm list --deleted
更新操作
# 新建配置文件 values.yaml $ cat <<'EOF' > ./values.yaml image: repository: wangyanglinux/myapp tag: 'v2' EOF # 这个文件中定义的值,在模板文件中可以通过 .Values对象访问到 $ 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: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports: - containerPort: 8080 protocol: TCP EOF
$ helm upgrade nobby-eel .
查看更新结果:
或者使用更简单的方式更新:
helm upgrade nobby-eel --set image.tag='v3' .
由此可知道:如果我们把当前公司的集群项目改成Chart方案,后续我们更新资料的时候,只需要指定values更改即可。
Debug方式创建
使用模板动态生成K8s资源清单时,非常需要能提前预览生成的结果
# 使用--dry-run --debug 选项来打印出生成的清单文件内容,尝试而不执行部署
$ helm install --dry-run . $ helm install . --dry-run --debug --set image.tag=latest
使用Helm部署 dashboard (K8S官方管理工具)
更换helm仓库源的方式部署dashboard
使用helm fetch stable/kubernetes-dashboard 把Chart的压缩包下载到本地使用。
(可能会提示更新repo,使用helm repo update)--类似于Linux中yum仓库更新
或者直接下载再上传
http://mirror.azure.cn/kubernetes/charts/kubernetes-dashboard-1.8.0.tgz
下载后得到下载的压缩包
解压并进入目录
会发现和上面自己创建的目录结构一样。
创建kubernetes-dashboard.yaml: (和上面实验创建的value.yaml含义一样)
image: repository: k8s.gcr.io/kubernetes-dashboard-amd64 tag: v1.10.1 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
提前下载导入dashboard.tar包,免得下面部署的时候下载慢或者下载失败问题
docker load -i dashboard.tar
使用helm创建release
helm install . \ -n kubernetes-dashboard \ #指定名称 --namespace kube-system \ #指定名称空间 -f kubernetes-dashboard.yaml #指定创建的yaml文件
查看Pod创建情况,查看svc创建情况
现在是ClusterIP方式,修改为NodePort方式(或者Ingress),暴露服务给外界访问。
kubectl edit svc kubernetes-dashboard -n kube-system
再查看svc信息(注意:这是https协议访问的)
访问测试:
可以通过指定kubeconfig文件访问,也可以通过令牌token的方式访问。
查看token
$ kubectl -n kube-system get secret | grep kubernetes-dashboard-token kubernetes.io/service-account-token 3 3m7s
$ kubectl describe -n kube-system
secret/kubernetes-dashboard-token-pkm2s Name: kubernetes-dashboard-token-pkm2s Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name: kubernetes-dashboard kubernetes.io/service-account.uid: 2f0781dd-156a-11e9-b0f0-080027bb7c43 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1025 bytes namespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5 pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQ vc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1wa20ycyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWF jY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2Vydml jZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjJmMDc4MWRkLTE1NmEtMTFlOS1iMGYwLTA4MDAyN2JiN2M0MyIsInN 1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.24ad6ZgZMxdydp wlmYAiMxZ9VSIN7dDR7Q6-RLW0qC81ajXoQKHAyrEGpIonfld3gqbE0xO8nisskpmlkQra72- 9X6sBPoByqIKyTsO83BQlME2sfOJemWD0HqzwSCjvSQa0x- bUlq9HgH2vEXzpFuSS6Svi7RbfzLXlEuggNoC4MfA4E2hF1OX_ml8iAKx-49y1BQQe5FGWyCyBSi1TD_- ZpVs44H5gIvsGK2kcvi0JT4oHXtWjjQBKLIWL7xxyRCSE4HmUZT2StIHnOwlX7IEIB0oBX4mPg2_xNGnqwcu- 8OERU9IoqAAE2cZa0v3b5O2LMcJPrcxrVOukvRIumA
然后通过输入token登录
进入管理页面
然后就可以在管理页面创建应用了
使用Helm部署metrics-server(监控项目)
args: - --logtostderr - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP
helm install stable/metrics-server \ -n metrics-server \ --namespace kube-system \ -f metrics-server.yaml

部署Prometheus(监控项目)
注意:部署Prometheus和metrics-server时选其一,前者集成了后者,且功能更多。
相关地址信息
组件说明
构建记录
mkdir prometheus && cd prometheus
git clone https://github.com/coreos/kube-prometheus.git cd /root/kube-prometheus/manifests
vim grafana-service.yaml apiVersion: v1 kind: Service metadata: name: grafana namespace: monitoring spec: type: NodePort #添加内容 ports: - name: http port: 3000 targetPort: http nodePort: 30100 #添加内容 selector: app: grafana
vim prometheus-service.yaml apiVersion: v1 kind: Service metadata: labels: prometheus: k8s name: prometheus-k8s namespace: monitoring spec: type: NodePort #添加内容 ports: - name: web port: 9090 targetPort: web nodePort: 30200 #添加内容 selector: app: prometheus prometheus: k8s
vim alertmanager-service.yaml apiVersion: v1 kind: Service metadata: labels: alertmanager: main name: alertmanager-main namespace: monitoring spec: type: NodePort ports: - name: web port: 9093 targetPort: web nodePort: 30300 selector: alertmanager: main app: alertmanager
下载并上传加载 PrometheusOperator的镜像文件(更快,否则会在部署的时候自动下载,速度很慢)
解压并执行load-images.sh加载脚本
将上面使用文件拷贝到node节点服务器(node01、node02)
然后在node节点服务器同样执行导入镜像操作
通过yaml文件创建
进入解压缩后的kube-prometheus\manifests目录下,可看到全是yaml文件
kubectl apply -f ../manifests/
查看pod创建状态
然后就可以查看监控信息了
kubectl top node
kubectl top pod
访问 prometheus




sum by (pod_name)( rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m] ) )
访问 grafana


添加数据源 grafana 默认已经添加了 Prometheus 数据源,grafana 支持多种时序数据源,每种数据源都有各自的查询编辑器

Prometheus 数据源的相关参数:
目前官方支持了如下几种数据源:
就可以实现资源的监控了,例如node节点监控信息
监控部分就完成了!
Horizontal Pod Autoscaling
没外网可先下载上传压缩包然后加载镜像(node节点服务器执行相同操作导入镜像)
先下载示例镜像
docker load -i hpa-example.tar
Horizontal Pod Autoscaling 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量 。
kubectl run php-apache --image=gcr.io/google_containers/hpa-example --requests=cpu=200m --expose --port=80
--requests=cpu=200m:就是一个资源限制,初始分配值
查看pod的监控信息(是否能正常获取)
创建 HPA 控制器(CPU负载超过50%就扩容,最大扩容数为10,负载小了之后会减小节点数,最少保持1个)
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
查看hpa信息(现在的负载为0%)
已经获取到资源了
增加负载,查看负载节点数目 (压测)
$ kubectl run -i --tty load-generator --image=busybox /bin/sh $ while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

可以看到CPU利用率上去了,然后就会自动扩容增加Pod数量减压,最大增加到上面设置的10个上限
查看此时Pod的创建状态
稍等会儿就可以看到创建了10个pod,第10个正在被创建
spec: containers: - image: xxxx imagePullPolicy: Always name: auth ports: - containerPort: 8080 protocol: TCP resources: limits: #最大分配资源 cpu: "4" memory: 2Gi requests: #初始分配资源 cpu: 250m memory: 250Mi
资源限制 - 名称空间
apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources namespace: spark-cluster spec: hard: pods: "20" requests.cpu: "20" requests.memory: 100Gi limits.cpu: "40" limits.memory: 200Gi
Ⅱ、配置对象数量配额限制
apiVersion: v1 kind: ResourceQuota metadata: name: object-counts namespace: spark-cluster spec: hard: configmaps: "10" persistentvolumeclaims: "4" #PV限制 replicationcontrollers: "20" #RC限制 secrets: "10" services: "10" services.loadbalancers: "2"
Ⅲ、配置 CPU 和 内存 LimitRange (如果上面两种都没设置,如下这样限制pod使用的最大资源)
apiVersion: v1 kind: LimitRange metadata: name: mem-limit-range spec: limits: - default: #最大值 memory: 50Gi cpu: 5 defaultRequest: #初始值 memory: 1Gi cpu: 1 type: Container
部署 EFK日志平台
(部署很简单,但是对系统要求很高,默认配置内存至少需要20G以上)
添加 Google incubator 仓库
helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
部署 Elasticsearch
kubectl create namespace efk #创建名称空间 helm fetch incubator/elasticsearch #提前下载好镜像
tar -xf elasticsearch-xxx.tgz && cd elasticsearch #如果服务器配置不够,可以修改values.yaml对应的集群节点和PVC设置,生产的也可以不修改
#安装运行 helm install --name els1 --namespace=efk -f values.yaml .
#启动测试 kubectl run cirror-$RANDOM --rm -it --image=cirros -- /bin/sh curl Elasticsearch:Port/_cat/nodes
部署 Fluentd
helm fetch stable/fluentd-elasticsearch
# 解压进入修改文件 vim values.yaml # 更改其中 Elasticsearch 访问地址
# 安装运行 helm install --name flu1 --namespace=efk -f values.yaml .
部署 kibana
注意:部署EFK时,E和K的版本必须一致,否则会报错
helm fetch stable/kibana --version 0.14.8
# 同样需要进入values.yaml中Elasticsearch的访问地址
helm install --name kib1 --namespace=efk -f values.yaml . --version 0.14.8
查看Pod创建情况
修改svc访问方式(默认不允许外部访问)
$ kubectl edit svc kib1-kibana -n efk
type: NodePort
修改后:
访问测试:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了