kubernetes k8s container ReplicaSet Deployment Rolling Update Kubectl Create Service

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

成功訊息:

kubectl create -f yaml file container pod

步驟9:透過kubectl get pod來看是否有成功建立。

$ kubectl get pod nginx-server

回應nginx-server這個Pod的資訊,狀態為Running,表示成功建立並運行。

kubectl get pod

步驟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 ~


, , ,

Related posts

Latest posts