這篇會介紹一些撰寫佈署kubernetes的yaml檔時常用的設定。
主要參考資料:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/
撰寫yaml時常有一些可以幫助我們更好佈署pod的設定,但因為實在太多,這裡就先介紹較簡單且常用的設定。
在此之前要先往Kubernetes中安裝metrics-server,方便用於觀察內部資源使用情形。
使用minikuber的話,輸入以下指令:
minikube addons enable metrics-server
給它一點時間進行啟動與收集數據。
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
用於將pod、node根據需求進行分類、識別,可按需求貼上多個標籤。
label的概念有點類似鍵值對
kubectl label node [node節點名稱] [key]=[value]
yaml中標籤格式為 [key]:[value]
apiVersion: apps/v1
kind: Deployment
metadata:
name: kkk
labels:
app: kkk
我們可以將Pod指定到特定Node上,使用nodeSelector將pod調度到指定Node。
先在minikube上新增一個節點
minikube node add
檢查確認有無新增
minikube status

給節點新增標籤
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"
這裡就將環境變數列印出來。
會在容器啟動後在內部執行指令
因為這裡只是示範輸出,所以kind使用Pod。
apiVersion: v1
kind: Pod
metadata:
name: command-demo
spec:
containers:
- name: command-demo
image: busybox
command: ["echo"]
args: ["Hello Kubernetes"]

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