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格式簡單易學(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蛹磺,對應(yīng)的key是apiVersionkind梆奈。

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

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

需要注意的是,在YAML格式中称开,引號"可以省略。

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是同一級key昆雀,所以前面都是兩個(gè)空格逼龟,而api是labels的nested key逻悠,所以空四格。

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

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

{

  "apiVersion": "v1",

  "kind": "Pod",

  "metadata": {

               "name": "rss-site",

               "labels": {

                          "app": "web"

                         }

              }

}

YAML Lists

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

案例如

args:

  - sleep

  - "1000"

  - message

  - "Bring back Firefly!"

該list對應(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

該案例對應(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è)置Deployment徒探,Job瓦呼,Service以及其他。

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

spec參數(shù)用來指定該pod的實(shí)體碗啄。spec的屬性包括容器质和,內(nèi)存需求,存儲容量稚字,網(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命令會看到變?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

檢測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烦衣,最簡單的方式是更新創(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è)特定的對象

kubectl edit deployment.v1.apps/rss-site

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

擴(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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市经备,隨后出現(xiàn)的幾起案子拭抬,更是在濱河造成了極大的恐慌,老刑警劉巖侵蒙,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件造虎,死亡現(xiàn)場離奇詭異,居然都是意外死亡纷闺,警方通過查閱死者的電腦和手機(jī)算凿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犁功,“玉大人氓轰,你說我怎么就攤上這事〔ㄗ” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵请敦,是天一觀的道長镐躲。 經(jīng)常有香客問我,道長侍筛,這世上最難降的妖魔是什么萤皂? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮匣椰,結(jié)果婚禮上裆熙,老公的妹妹穿的比我還像新娘。我一直安慰自己禽笑,他們只是感情好入录,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著佳镜,像睡著了一般僚稿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟀伸,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天蚀同,我揣著相機(jī)與錄音缅刽,去河邊找鬼。 笑死蠢络,一個(gè)胖子當(dāng)著我的面吹牛衰猛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刹孔,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼啡省,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芦疏?” 一聲冷哼從身側(cè)響起冕杠,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酸茴,沒想到半個(gè)月后分预,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薪捍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年笼痹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酪穿。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凳干,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出被济,到底是詐尸還是另有隱情救赐,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布只磷,位于F島的核電站经磅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钮追。R本人自食惡果不足惜预厌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望元媚。 院中可真熱鬧轧叽,春花似錦、人聲如沸刊棕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甥角。三九已至腰埂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜈膨,已是汗流浹背屿笼。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工牺荠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驴一。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓休雌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肝断。 傳聞我的和親對象是個(gè)殘疾皇子杈曲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容