最佳化配置服務
一般配置
- 指定最新版本的 api
- 配置環境時請版控你的 yaml
- 建議將有相關的資源放在同一個 yaml (ex: deployment 和 service 寫一起)
- 多使用
kubectl apply
減少指令錯誤 - 非必要,否則不指定 default 值
- 記得註解
- 不要獨立Pod,儘量和 Workloads 相關資源(ex: deployment/Jobs …) 寫在一起
Service
- 訪問 Pod 調整可使用
kubectl port-forward
- 當不需要使用 Service 對外,可將所有 type:ClusterIP 或 None
container Image
imagePullPolicy
這個功能是讓kubectl
去哪個位置抓Image
imagePullPolicy: IfNotPresent
: 當 Image 不在本地才去拉取。imagePullPolicy: Always
: 每次啟動 Pod 的時候都會拉取 Image。imagePullPolicy
省略時,Image tag:latest 或 沒有tag,會自動變成imagePullPolicy: Always
注意,如果 Image tag有更改,imagePullPolicy
的值不會更新成 IfNotPresent。imagePullPolicy
省略时,Image tag 不是 latest,會自動變成imagePullPolicy: IfNotPresent
注意,如果Image tag的值之後被移除或更改為 latest,imagePullPolicy
的值不會更新成 Always。imagePullPolicy: Never
:在本地,就不會拉取Image
這個部分蠻重要的,蠻常在本地測試環境的,就會用到
imagePullPolicy: Never
,在製作 CI/CD 的時候有一款 CD工具叫做 ArgoCD,這部分也要注意一下,在 Production 環境 Image 不建議使用 :latest tag,通常都是用版號去管控
label
- 建議都要帶入標籤
- 官方建議要額外多加的幾個標籤
ConfigMap & Secret
- ConfigMap: 管控環境變數或是設定檔
- Secret: base64版的ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# key: value
ENV: "prod"
# fileName: content
config.json: |
{
"data": "Hello World!"
}
我自己 Secret 用在 K8s RBAC 權限使用的地方比較多這樣。
Pod 管理 CPU & RAM
CPU
其中設定的單位是 m,每 1000m = 1 vCPU,也可以使用分數,因此設定的方式可以是: \
1 (相當於 1000m)
0.5 (相當於 500m)
300m (相當於 0.3)
設定 1m 是不被允許的,官方建議最低從 100m 開始
Memory
Memory 設定的單位最低則是從 byte 開始,而使用的單位可以是單一字母的 E, P, T, G, M, K,也可以是雙字母的 Ei, Pi, Ti, Gi, Mi, Ki(比較常見),以下是幾個設定範例:\
104857600 (相當於 100 MB = 10010241024) == 100M == 100Mi
Example
官網範例:
Pod 有 2 個 Container
每個 Container 的 request 為 0.25 cpu 和 64MiB 內存
每個 Container 的 limits 為 0.5 cpu 和 128MiB 內存
所以 Pod 的 總 request为 0.5 cpu 和 128 MiB 內存,limits 為 1 cpu 和 256MiB 內存
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: log-aggregator
image: images.my-company.example/log-aggregator:v6
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
可以精準的分配你的Pod需要怎樣的資源大小,建議是平均分配,可以從公有雲當初建置的時候所分配的資源數去調整。
以GKE舉例:
機器選擇 e2-medium (2 vCPU, 4 GB memory), Location type 選擇 Regional,每個 pool 又是只有 1 台 Node
這樣總共就 6 vCPU, 12 GB memory 可以配置
kubeconfig
文件位置:$HOME/.kube/config
管理 Client 如何和 k8s 連接的 config
以GKE舉例好了,如果是private cluster,記得外網content要留自己網路IP,最好是辦公室固定IP
在 GCP 介面中 去選擇 Kubernetes clusters > clusters > 找到要連接的 cluster > 右邊三個點點點開 > connect 點開 > 複製到本地 commend line 直接連線 (本地需要有 gcloud 工具)
這樣就會幫你註冊到 kubeconfig 還會先選好 cluster
結語:
記得Secret是使用base64去加密的,所以嚴格說他是可以被解密的,我自己是比較常使用ConfigMap,可能我對於K8s的RBAC了解的不夠透測,希望在編寫筆記邊複習的時候把這段活用進專案,個人是對
imagePullPolicy
這個配合ArgoCD之後會注意一下,K8s真的很活有很多工具可以嘗試使用到專案內,但是最佳化配置服務永遠都是為了專案資源能完善使用。