iT邦幫忙

2026 iThome 鐵人賽

DAY 6
0
Kubernetes

從零開始的 Kubernetes 基礎觀念與實作系列 第 6

從零開始的 Kubernetes 基礎觀念與實作 DAY6

  • 分享至 

  • xImage
  •  

這篇會介紹一些撰寫佈署kubernetes的yaml檔時常用的設定。
主要參考資料:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/
撰寫yaml時常有一些可以幫助我們更好佈署pod的設定,但因為實在太多,這裡就先介紹較簡單且常用的設定。
在此之前要先往Kubernetes中安裝metrics-server,方便用於觀察內部資源使用情形。
使用minikuber的話,輸入以下指令:

minikube addons enable metrics-server

給它一點時間進行啟動與收集數據。

各種yaml常用設定

namespace

namespace可以用來對Pod分組,這樣在多個Pod命名時可以避免因為重複命名而產生的衝突,但是在同個namespace中不可一樣,範例如下。

apiVersion: v1
kind: Namespace
metadata:
  name: api-test
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-label
  namespace: api-test
  labels:
    app: api-label
spec:
  replicas: 1
  selector:
    matchLabels:
      app: api-label
  template:
    metadata:
      labels:
        app: api-label
    spec:
      containers:
      - name: api-label
        image: api-label:latest
        imagePullPolicy: Never
        ports:
        - containerPort: 5000

資源請求與分配

我們可以透過請求和限制memory與CPU資源來控制容器與Pod的資源使用量,requests是告訴 Scheduler 這個 Container 預期需要多少資源,limits為限制可以使用的資源上限,當CPU超過時通常會被限制,Memory超過時則有可能會被終止。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: google-samples
  namespace: test
  labels:
    app: google-samples
spec:
  replicas: 1
  selector:
    matchLabels:
      app: google-samples
  template:
    metadata:
      labels:
        app: google-samples
    spec:
      containers:
      - name: google-samples
        image: gcr.io/google-samples/hello-app:1.0
        imagePullPolicy: Always
        ports: 
        - containerPort: 5000
        resources:
          requests:
            memory: "100Mi"  請求100Mi的RAM
            cpu: 500m        請求500 milliCPU=0.5CPU
          limits:
            memory: "200Mi"   限制200Mi的RAM
            cpu: "1"         限制一個CPU

label

用於將pod、node根據需求進行分類、識別,可按需求貼上多個標籤。
label的概念有點類似鍵值對

給node上label

 kubectl label node [node節點名稱] [key]=[value]

給pod上label

yaml中標籤格式為 [key]:[value]

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kkk
  labels:
    app: kkk

將Pod配置到指定Node

我們可以將Pod指定到特定Node上,使用nodeSelector將pod調度到指定Node。
先在minikube上新增一個節點

minikube node add

檢查確認有無新增

minikube status

image
給節點新增標籤

kubectl label nodes minikube-m02 name=test1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kkk
  namespace: kea
  labels:
    app: kkk
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kkk
  template:
    metadata:
      labels:
        app: kkk
    spec:
      containers:
      - name: kkk
        image: kkk:latest
        imagePullPolicy: Never
        ports:
        - containerPort: 5000
      nodeSelector: 
          name: test1

環境變數

apiVersion: apps/v1
kind: Deployment
metadata:
  name: env-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: env-demo
  template:
    metadata:
      labels:
        app: env-demo
    spec:
      containers:
      - name: env-demo
        image: busybox
        command: ["sh", "-c"]
        args:
        - echo "APP_ENV=$APP_ENV";
          echo "APP_VERSION=$APP_VERSION";
        env:
        - name: APP_ENV
          value: "development"
        - name: APP_VERSION
          value: "1.0"

這裡就將環境變數列印出來。
image

Command / Args

會在容器啟動後在內部執行指令
因為這裡只是示範輸出,所以kind使用Pod。

apiVersion: v1
kind: Pod
metadata:
  name: command-demo
spec:
  containers:
    - name: command-demo
      image: busybox
      command: ["echo"]
      args: ["Hello Kubernetes"]

image

小結

今天就先介紹一些撰寫YAML常用的設定,下一篇開始我們會回到工作負載(Workload)的部分,示範各種Workload的特性。


上一篇
從零開始的 Kubernetes 基礎觀念與實作 DAY5
下一篇
從零開始的 Kubernetes 基礎觀念與實作 DAY7
系列文
從零開始的 Kubernetes 基礎觀念與實作9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言