# 01/22 Demo ## 封裝服務 [helm](https://helm.sh/) ### Why helm? <!-- - CNCF畢業的成熟專案 - service的版本控制, 可利用helm rollback 快速的將服務退版 - 專案如有相依的服務, 可以透過helm組成, 避免再寫一次kubernetes物件, 一次部署 --> ### Template 設計原因 [Template](http://10.0.1.31/IT/helm-chart-template) <!-- 目前我們上kubernetes的服務大多是無狀態的web-service 基於這樣的應用我們在template中簡化了一些物件的相依設定 其中有幾個設定 - nodetype : 因為很多容器都會共用底層的主機, 所以目前有分類主機, 避免特別重要的服務, 受到其他服務得影響 - probePath: 根據kubernetes的最佳實踐, 我們會透過探針偵測服務是否正常運行, 避免服務可能錯誤時, 繼續讓流量進入, 使用的是httpget的方法, 定時健康檢查, 如有異常, 會將此pod從endpoint移除 - populateConfigMap/populateSecret: 為了避免服務使用volume, pod在不同主機轉移時, 造成錯誤, 同一使用環境變數的方式, 將設定掛給服務使用 --> ` values.yaml ` ``` ## Global variables application: myfirstapp environment: dev ## Deployment variables deployment: replicaCount: 3 ## Selector which must match a node's labels for the pod to be scheduled on that node. nodetype: compute ## Define container image: repository: nginx tag: 1.19.6 pullPolicy: IfNotPresent containerPort: 80 ## Compute Resources required by this containe cpuRequest: 100m memoryRequest: 100Mi cpuLimit: 200m memoryLimit: 200Mi ## Container will be restarted if the TCPSocket probe fails. ## Container will be removed from service endpoints if the httpGet probe fails. probePath: / ## List of sources to populate environment variables in the container. ## Fill in your variables in configMap-values.yaml. populateConfigMap: true ## If populateSecret is true, please nameing your secret as <application>-secret. populateSecret: false ## Ingress variables ingress: enable: true baseDomain: "dev.gogoro.com" ``` ## Gitlab Pipeline 與目前部署至aws 一樣的流程 build -> push image -> deploy 新專案, 我們做ci之後給develop維護 目前有三個專案正在做, 都可以部署服務到開發環境, 細節部分還會稍微調整 ``` rollout-dev-demo-to-k8s: stage: rollout tags: - TWTPPCSWPA07-K8S image: name: alpine/helm:3.4.2 entrypoint: [""] script: # 設定kubernetes api 位置及使用的token - mkdir .kube - echo $KUBE_CONFIG |base64 -d > .kube/config - KUBECONFIG=$(pwd)/.kube/config - export KUBECONFIG - export NAMESPACE="ggr-dev-${CI_PROJECT_NAME}" # 檢查namespace內是否已有服務 - export DEPLOYS=$(helm ls -n ${NAMESPACE=} | grep ${CI_PROJECT_NAME} | wc -l) # 透過helm將服務部署至kubernetes上 ``` ## Debug ### kubectl logs <podName> -n <namespace> 使用指令印出目前運行中容器的log 優點是快速方便 缺點是容器終止後, log會被移除 ### FLG stack (fluent-bit + loki + grafana) #### 簡介 - fluent-bit: data collector, 統一收集各種log - loki: log紀錄平臺, 存放log - grafana: 查詢, 可視化log及metrics, 漂亮的dashboard 其中fluent-bit會是我們在地端和alicloud使用的log collector #### Why fluent-bit? ![](https://i.imgur.com/7yf9gzN.png) <!-- - CNCF 畢業專案, 社群資源豐富 - 可收集系統, container, appcation的各種log - 豐富的plugin, 支援多種data outputs - 可以依照不同的條件, 將log導向不同的存儲後端, 減低log的費用 --> [fluentbit output plugin](https://docs.fluentbit.io/manual/pipeline/outputs) ## Dome [Grafana](http://grafana.monitoring.dev.gogoro.com) <!-- admin/prom-operator --> account-dashboard.dev.gogoro.com gnop-app.dev.gogoro.com gnop-plus.dev.gogoro.com partner-dashboard.dev.gogoro.com partner-portal.dev.gogoro.com