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查看监控视图

 

posted @ 2021-08-12 18:04  李聪龙  阅读(634)  评论(0编辑  收藏  举报