# 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?

<!--
- 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