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檢視監控檢視
-----------------------------------------------------------------------------------------------------------------------------
---------------------------------------------
朦朧的夜 留筆~~