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
修改后:
訪問測試: