1. 程式人生 > 其它 >K8S--Helm&Dashboard&prometheus&grafana

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檢視監控檢視

------------------------------------------------------------------
-----------------------------------------------------------
---------------------------------------------
朦朧的夜 留筆~~