返回
Featured image of post k8s - Configuration

k8s - Configuration

k8s - Configuration

最佳化配置服務

一般配置

  • 指定最新版本的 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真的很活有很多工具可以嘗試使用到專案內,但是最佳化配置服務永遠都是為了專案資源能完善使用。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus