For K8S Beginner EP 6:透過YAML檔來建立Container
前言
YAML檔案是Kubernetes部署的最基本也是最重要的描述文件,透過YAML的描述內容可以輕易的部署各種資源,甚至是指定資源之間的關係或所屬資源所需要的硬體資源等,若還不懂YAML編寫的讀者,可以至億聚網-YAML教學網站自學YAML的基本撰寫能力,已經擁有YAML技能的讀者可以立刻跟著本文學習如何透過YAML來建立Container囉!
最基礎的四個元素
用於建立Kubernetes資源的YAML檔有一定的規定與風格,其中最基礎的四個元素尤其重要,分別是apiVersion、kind、metadata、spec:
- apiVersion:指定Kubernetes的API版本
- kind:資源類型,如Pod、Service、ReplicaSet…等
- metadata:描述這個資源,如名字、標籤等
- spec:設定這個資源規格,包括有幾個副本、指定的image等
這四個基本元素的排列組合與堆疊,漸漸的就會形成一個複雜的Kubernetes資源描述YAML檔,用於在Kubernetes建立各種資源或服務。
撰寫一個啟動Pod的YAML檔
步驟1:創建一個YAML檔案,名為pod.yaml。
步驟2:在pod.yaml檔案內先放入基本的四個元素:
apiVersion:
kind:
metadata:
spec:
步驟3:指定appVersion版本為v1。
apiVersion: v1
步驟4:指定kind為Pod。
記得,在Kubernetes內,最小的單位是Pod,所以建立一個容器等於建立一個Pod。
kind: Pod
步驟5:撰寫metadata。
metadata:
name: nginx-server # 給這個Pod一個名稱為nginx-server
labels: # 設定標籤給這個Pod,標籤為key-value格式
env: production # 增加一個label,key=env, value=production
# 標籤可以有很多個,在此範例中任何label不影響運作
步驟6:設定Pod內Container的規格。
spec:
containers: # 指定Pod內Container的規格
- name: nginx # 指定這個Container的名稱
image: nginx # 指定image (預設從Docker Hub抓下來)
步驟7:從步驟2到步驟6組合起來,如下:
apiVersion: v1
kind: Pod
metadata:
name: nginx-server
labels:
env: production
spec:
containers:
- name: nginx
image: nginx
步驟8:透過kubectl指令來建立Pod,指令的語法為:
$ kubectl create -f [檔案名稱]
以此案例,實際指令如下:
$ kubectl create -f pod.yaml
成功訊息:
步驟9:透過kubectl get pod來看是否有成功建立。
$ kubectl get pod nginx-server
回應nginx-server這個Pod的資訊,狀態為Running,表示成功建立並運行。
步驟10:透過kubectl describe指令來查詢nginx-server這個Pod的詳細資訊。
$ kubectl describe pod nginx-server
詳細訊息及說明如下:
# 這個Pod的名字是nginx-server,對應到pod.yaml內容的metadata->name
Name: nginx-server
Namespace: default
Priority: 0
Service Account: default
Node: minikube/192.168.49.2
Start Time: Wed, 25 Jan 2023 15:29:07 +0800
# 標籤,對應到pod.yaml內容的metadata->labels->env
Labels: env=production
Annotations: <none>
# Pod運行狀態
Status: Running
IP: 172.17.0.3
IPs:
IP: 172.17.0.3
Containers:
# 建立這個Container的名字,對應到pod.yaml內容的spec->containers->name
nginx:
# Container ID是由Container Engine Docker給的一個唯一值,代表這個Container的身分證
Container ID: docker://c713fda0b8847ab686d4be2c866b2b2ffdb2f5339283eba59f79c0a927c172d8
# 建立這個Container的image,對應到pod.yaml內容的spec->containers->image
Image: nginx
Image ID: docker-pullable://nginx@sha256:b8f2383a95879e1ae064940d9a200f67a6c79e710ed82ac42263397367e7cc4e
Port: <none>
Host Port: <none>
State: Running
Started: Wed, 25 Jan 2023 15:29:11 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-jz2nr (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-jz2nr:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
# 以時間序列出這個Pod所有的事件,包含建立、下載image、啟動等事件
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 19s default-scheduler Successfully assigned default/nginx-server to minikube
Normal Pulling 18s kubelet Pulling image "nginx"
Normal Pulled 15s kubelet Successfully pulled image "nginx" in 3.186193527s
Normal Created 15s kubelet Created container nginx
Normal Started 15s kubelet Started container nginx
~ END ~