k8s集群安裝學習筆記八——Helm部署及使用


簡介:

Helm 部署
使用Helm部署 dashboard (K8S官方管理工具)
部署metrics-server(監控項目)
部署Prometheus(監控項目)
Horizontal Pod Autoscaling自動伸縮擴容

資源限制 
使用Helm部署 EFK日志平台

 
什么是 Helm
在沒使用 helm 之前,向 kubernetes 部署應用,我們要依次部署 deployment、svc 等,步驟較繁瑣。
況且隨着很多項目微服務化,復雜的應用在容器中部署以及管理顯得較為復雜,helm 通過打包的方式,
支持發布的版本管理和控制,很大程度上簡化了 Kubernetes 應用的部署和管理。
 
Helm 本質就是讓 K8s 的應用管理(Deployment,Service 等 ) 可配置,能動態生成。
通過動態生成 K8s 資源清單文件(deployment.yaml,service.yaml)。
然后調用 Kubectl 自動執行 K8s 資源部署。
 
Helm 是官方提供的類似於 YUM 的包管理器,是部署環境的流程封裝。
Helm 有兩個重要的概念:chartrelease
  1).chart 是創建一個應用的信息集合,包括各種 Kubernetes 對象的配置模板、參數定義、依賴關系、文檔說明等。
  chart 是應用部署的自包含邏輯單元。可以將 chart 想象成 apt、yum 中的軟件安裝包。
  2).release 是 chart 的運行實例,代表了一個正在運行的應用。當 chart 被安裝到 Kubernetes 集群,就生成 一個 release。
  chart 能夠多次安裝到同一個集群,每次安裝都是一個 release。
 
Helm 包含兩個組件:Helm 客戶端和 Tiller 服務器,如下圖所示

Helm 客戶端負責 chart 和 release 的創建和管理以及和 Tiller 的交互。

Tiller 服務器運行在 Kubernetes 集群中,它會處理 Helm 客戶端的請求,與 Kubernetes API Server 交互 。

 

Helm 部署

越來越多的公司和團隊開始使用 Helm 這個 Kubernetes 的包管理器,我們也將使用 Helm 安裝 Kubernetes 的常用 組件。
Helm 由helm客戶端命令行工具服務端 tiller 組成,Helm 的安裝十分簡單。
下載 helm 命令行工具到 master 節點 node1 的 /usr/local/bin 下,這里下載的 2.13. 1版本:
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命令行工具完成

為了安裝服務端 tiller,還需要在這台機器上配置好 kubectl 工具和 kubeconfig 文件,確保 kubectl 工具可以
在這台機器上訪問 apiserver 且正常使用。 這里的 node1 節點已經配置好了 kubectl 
 
因為 Kubernetes APIServer 開啟了 RBAC 訪問控制,所以需要創建 tiller 使用的 service account: tiller 並分
配合適的角色給它。 詳細內容可以查看helm文檔中的 Role-based Access Control。 這里簡單起見直接分配
cluster- admin 這個集群內置的 ClusterRole 給它。創建 rbac-config.yaml 文件: 
$ 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(監控項目)

從 Heapster 的 github <https://github.com/kubernetes/heapster >中可以看到已經,heapster 已經DEPRECATED。
這里是 heapster的deprecation timeline。 可以看出 heapster 從 Kubernetes 1.12 開始將從 Kubernetes 各種安裝腳
本中移除。Kubernetes 推薦使用 metrics-server。我們這里也使用helm來部署metrics-server。
 
metrics-server.yaml: 
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時選其一,前者集成了后者,且功能更多。

相關地址信息 

Prometheus github 地址:https://github.com/coreos/kube-prometheus 

組件說明 

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:是可視化數據統計和監控平台。

 

構建記錄

mkdir prometheus && cd prometheus
git clone https://github.com/coreos/kube-prometheus.git cd /root/kube-prometheus/manifests

 

修改 grafana-service.yaml 文件,使用 NodePort 方式訪問 grafana: 
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

 

修改 prometheus-service.yaml,改為 NodePort
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

 

修改 alertmanager-service.yaml,改為 NodePort
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

prometheus 對應的 nodeport 端口為 30200,訪問 http://MasterIP:30200
 
通過訪問 http://MasterIP:30200/target 可以看到 prometheus 已經成功連接上了 k8s 的 apiserver 
 
 
查看 service-discovery
 
Prometheus 自己的指標

 

prometheus 的 WEB 界面上提供了基本的查詢 K8S 集群中每個 POD 的 CPU 使用情況,查詢條件如下:
sum by (pod_name)( rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m] ) )

 

上述的查詢有出現數據,說明 node-exporter 往 prometheus 中寫入數據正常,接下來我們就可以部署
grafana 組件,實現更友好的 webui 展示數據了
 

訪問 grafana

查看 grafana 服務暴露的端口號: 
如上可以看到 grafana 的端口號是 30100,瀏覽器訪問 http://MasterIP:30100 用戶名密碼默認 admin/admin

 

修改密碼並登陸 

添加數據源 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個正在被創建

 

 

 

 
資源限制 - Pod 
Kubernetes 對資源的限制實際上是通過 cgroup 來控制的,cgroup 是容器的一組用來控制內核如何運行進程的 相關屬性集合。
針對內存、CPU 和各種設備都有對應的 cgroup。
默認情況下,Pod 運行沒有 CPU 和內存的限額。 這意味着系統中的任何 Pod 將能夠像執行該 Pod 所在的節點一 樣,
消耗足夠多的 CPU 和內存 。一般會針對某些應用的 pod 資源進行資源限制,這個資源限制是通過 resources 的 requests 和 limits 來實現。
spec:
  containers: 
  - image: xxxx 
    imagePullPolicy: Always 
    name: auth 
    ports: 
    - containerPort: 8080 
      protocol: TCP 
    resources: 
      limits:  #最大分配資源
        cpu: "4" 
        memory: 2Gi 
      requests:  #初始分配資源
        cpu: 250m 
        memory: 250Mi

 

requests 要分配的資源,limits 為最高請求的資源值。可以簡單理解為初始值和最大值
 

資源限制 - 名稱空間

Ⅰ、計算資源配額 
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
·default 即 limit 的值
·defaultRequest 即 request 的值 
 

 

部署 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

 

修改后:

 

訪問測試:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM