YAML格式和K8S的設(shè)置, 2023-11-05

(2023.11.05 Sun @KLN)

YAML格式

YAML全稱Yet Another Makeup Language。經(jīng)常見到的.yml格式文件可以當(dāng)做是json文件的超集(superset),也就是說json文件可以轉(zhuǎn)換為.yml文件。

在Kubernetes中,一個(gè).yml文件作為K8S manifest用來創(chuàng)建pod。

YAML格式簡(jiǎn)單易學(xué),其中只有兩種數(shù)據(jù)結(jié)構(gòu),

  • maps
  • lists
    下面分別介紹。

YAML Maps

maps是一個(gè)key-value型結(jié)構(gòu),類似于Python中的dict。

---
apiVersion: v1
kind: Pod

首行的---是分隔符,在.yml中是可選項(xiàng),除非需要同單一文件中定義多個(gè)結(jié)構(gòu)。在該案例中有兩個(gè)值v1Pod,對(duì)應(yīng)的key是apiVersionkind

該案例相當(dāng)于如下的JSON文件

{
   "apiVersion": "v1",
   "kind": "Pod"
}

需要注意的是,在YAML格式中,引號(hào)"可以省略。

maps結(jié)構(gòu)可以更加復(fù)雜。

---
apiVersion: v1
kind: Pod
metadata:
  name: rss-site
  labels: 
    api: web

這個(gè)案例中多了一個(gè)key metadata,該key是嵌入(nested)式的key,其中還包含了labels和api這樣的key

YAML的處理器可以根據(jù)空格數(shù)(indentation level)來判定,空格數(shù)可兩個(gè)可多個(gè),由使用者來定,但一定要保持一致性(consistency),比如name和labels是同一級(jí)key,所以前面都是兩個(gè)空格,而api是labels的nested key,所以空四格。

注意,不要在YAML文件中使用Tab鍵空格。

上面案例對(duì)應(yīng)的JSON文件如下

{

  "apiVersion": "v1",

  "kind": "Pod",

  "metadata": {

               "name": "rss-site",

               "labels": {

                          "app": "web"

                         }

              }

}

YAML Lists

一個(gè)包含多個(gè)元素的數(shù)據(jù)結(jié)構(gòu)。每個(gè)元素前面空格,由-開始,在該符號(hào)之后在空一格。一個(gè)-符號(hào)對(duì)應(yīng)了一個(gè)元素。

案例如

args:

  - sleep

  - "1000"

  - message

  - "Bring back Firefly!"

該list對(duì)應(yīng)的JSON表達(dá)為

{
   "args": ["sleep", "1000", "message", "Bring back Firefly!"]
}

lists中的元素可以是maps

---
apiVersion: v1
kind: Pod
metadata:
  name: rss-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: rss-reader
      image: nickchase/rss-php-nginx:v1
      ports:
        - containerPort: 88

該案例對(duì)應(yīng)的JSON文件如

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
                "name": "rss-site",
                "labels": {
                            "app": "web" 
                          }
              },
   "spec": {
              "containers": [ 
                              { 
                                "name": "front-end",
                                "image": "nginx",
                                "ports": [
                                           {
                                              "containerPort": "80"
                                           }
                                         ]
                              }, 
                              {
                                "name": "rss-reader",
                                "image": "nickchase/rss-php-nginx:v1",
                                "ports": [
                                           {
                                              "containerPort": "88"
                                           }
                                         ]
                              }
                            ]
           }
}

(2023.11.12 Sun @KLN)

K8S中YAML設(shè)置

K8S中可以使用設(shè)置Pod和Deployment。

創(chuàng)建pod

首先配置一個(gè)Pod,名pod.yml

---
apiVersion: v1
kind: Pod
metadata:
  name: rss-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: rss-reader
      image: nickchase/rss-php-nginx:v1
      ports:
        - containerPort: 88

逐個(gè)參數(shù)分析。apiVersion顧名思義,注意該案例為Pod,當(dāng)kind為Deployment時(shí),需要指定另一個(gè)版本因Deployment不存在于v1中。

kind參數(shù)用來指定YAML創(chuàng)建的類型,除了穩(wěn)重設(shè)置的Pod,還可設(shè)置DeploymentJob,Service以及其他。

metadata參數(shù),其中包括該P(yáng)od的名字,已經(jīng)該pod在K8S中的識(shí)別標(biāo)簽label。

spec參數(shù)用來指定該pod的實(shí)體。spec的屬性包括容器,內(nèi)存需求,存儲(chǔ)容量,網(wǎng)絡(luò)設(shè)置,容器失敗時(shí)是否重啟,以及其他。

通過kubectl create -f pod.yml命令即可根據(jù)pod.yml中指定的設(shè)置生成一個(gè)pod。

> kubectl create -f pod.yaml
pod "rss-site" created

查看當(dāng)前pod的情況,使用kubectl get pods命令

> kubectl get pods
 NAME       READY     STATUS              RESTARTS   AGE
 rss-site   0/2       ContainerCreating   0          6s

注意該pod的STATUSContainerCreating,稍事片刻重新執(zhí)行kubectl get pods命令會(huì)看到變?yōu)?code>running。

> kubectl get pods
NAME       READY     STATUS    RESTARTS   AGE
rss-site   2/2       Running   0          14s

刪除該pod,用kubectl delete rss-site

> kubectl delete pod rss-site
pod "rss-site" deleted

當(dāng)pod狀態(tài)不正常,比如ErrImagePull,時(shí),用kubectl describe pod rss-site查看pod狀態(tài)

> kubectl describe pod rss-site
Name:           rss-site
Namespace:      default
Node:           10.0.10.7/10.0.10.7
Start Time:     Sun, 08 Jan 2017 08:36:47 +0000
Labels:         app=web
Status:         Pending
IP:             10.200.18.2
Controllers:    
Containers:
  front-end:
    Container ID:               docker://a42edaa6dfbfdf161f3df5bc6af05e740b97fd9ac3d35317a6dcda77b0310759
    Image:                      nginx
    Image ID:                   docker://sha256:01f818af747d88b4ebca7cdabd0c581e406e0e790be72678d257735fad84a15f
    Port:                       80/TCP
    State:                      Running
      Started:                  Sun, 08 Jan 2017 08:36:49 +0000
    Ready:                      True
    Restart Count:              0
    Environment Variables:      
  rss-reader:
    Container ID:
    Image:                      nickchase/rss-php-nginx
    Image ID:
    Port:                       88/TCP
    State:                      Waiting
      Reason:                   ErrImagePull
    Ready:                      False
    Restart Count:              0
    Environment Variables:      
Conditions:
  Type          Status
  Initialized   True
  Ready         False
  PodScheduled  True
No volumes.
QoS Tier:       BestEffort
Events:
  FirstSeen     LastSeen        Count   From                    SubobjectPath  Type             Reason                  Message
  ---------     --------        -----   ----                    -------------  -------- ------                  -------
  45s           45s             1       {default-scheduler }                   Normal           Scheduled               Successfully assigned rss-site to 10.0.10.7
  44s           44s             1       {kubelet 10.0.10.7}     spec.containers{front-end}      Normal          Pulling                 pulling image "nginx"
  45s           43s             2       {kubelet 10.0.10.7}                    Warning          MissingClusterDNS       kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  43s           43s             1       {kubelet 10.0.10.7}     spec.containers{front-end}      Normal          Pulled                  Successfully pulled image "nginx"
  43s           43s             1       {kubelet 10.0.10.7}     spec.containers{front-end}      Normal          Created                 Created container with docker id a42edaa6dfbf
  43s           43s             1       {kubelet 10.0.10.7}     spec.containers{front-end}      Normal          Started                 Started container with docker id a42edaa6dfbf
  43s           29s             2       {kubelet 10.0.10.7}     spec.containers{rss-reader}     Normal          Pulling                 pulling image "nickchase/rss-php-nginx"
  42s           26s             2       {kubelet 10.0.10.7}     spec.containers{rss-reader}     Warning         Failed                  Failed to pull image "nickchase/rss-php-nginx": Tag latest not found in repository docker.io/nickchase/rss-php-nginx
  42s           26s             2       {kubelet 10.0.10.7}                    Warning          FailedSync              Error syncing pod, skipping: failed to "StartContainer" for "rss-reader" with ErrImagePull: "Tag latest not found in repository docker.io/nickchase/rss-php-nginx"
  41s   12s     2       {kubelet 10.0.10.7}     spec.containers{rss-reader}    Normal   BackOff         Back-off pulling image "nickchase/rss-php-nginx"
  41s   12s     2       {kubelet 10.0.10.7}                                    Warning  FailedSync      Error syncing pod, skipping: failed to "StartContainer" for "rss-reader" with ImagePullBackOff: "Back-off pulling image \"nickchase/rss-php-nginx\""

創(chuàng)建deployment

(2023.11.18 Sat @KLN)
K8S的deployment應(yīng)用包括:

  • workload的持續(xù)可用:deployment指定特定的保持運(yùn)行的workload的拷貝數(shù)量,一旦某個(gè)workload掛掉,K8S自動(dòng)重啟該workload,確保高可用
  • 擴(kuò)展workloads:K8S使得修改deployment的replicas數(shù)量變得容易
  • 管理應(yīng)用狀態(tài):deployment可以暫停、編輯、回滾(rollback)
  • 易于將workload暴露于cluster外部

案例:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rss-site
  labels:
    app: web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: front-end
          image: nginx
          ports:
            - containerPort: 80
        - name: rss-reader
          image: nickchase/rss-php-nginx:v1
          ports:
            - containerPort: 88

和pod的模版有很多相似,差別之一是kind指定為Deployment。該文件保存為deployment.yaml,創(chuàng)建deployment命令kubectl create -f deployment.yaml

> kubectl create -f deployment.yaml
deployment "rss-site" created

檢測(cè)deployment列表,命令kubectl get deployment

> kubectl get deployments
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
rss-site   2         2         2            1           7s

查看某deployment的詳細(xì)信息,命令同pod,kubectl describe deployment rss-site。

更新某個(gè)deployment,最簡(jiǎn)單的方式是更新創(chuàng)建該deployment的YAML文件,此時(shí)需要使用apply命令而非create命令。

kubectl apply -f deployment.yaml

此時(shí)更新已經(jīng)進(jìn)入YAML文件,再次運(yùn)行kubectl apply則生效。

另一種方法是用kubectl edit命令編輯某個(gè)特定的對(duì)象

kubectl edit deployment.v1.apps/rss-site

接著會(huì)跳轉(zhuǎn)到一個(gè)編輯器編輯YAML文件。保存變更時(shí)也將自動(dòng)應(yīng)用于在線對(duì)象。

擴(kuò)展deployment的另一個(gè)方法是用scale

kubectl scale deployment.v1.apps/rss-site --replicas=5

甚至可以自動(dòng)擴(kuò)展,比如設(shè)置pod使用不超過60%的CPU

kubectl autoscale deployment.v1.apps/rss-site --min=3 --max=20 --cpu-percent=60

K8S仍然有其他的方式管理擴(kuò)展。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容