YAML格式和K8S的设置, 2023-11-05

(2023.11.05 Sun @KLN)

YAML格式

YAML全称Yet Another Makeup Language。经常见到的.yml格式文件可以当做是json文件的超集(superset),也就是说json文件可以转换为.yml文件。

在Kubernetes中,一个.yml文件作为K8S manifest用来创建pod。

YAML格式简单易学,其中只有两种数据结构,

  • maps
  • lists
    下面分别介绍。

YAML Maps

maps是一个key-value型结构,类似于Python中的dict。

---
apiVersion: v1
kind: Pod

首行的---是分隔符,在.yml中是可选项,除非需要同单一文件中定义多个结构。在该案例中有两个值v1Pod,对应的key是apiVersionkind

该案例相当于如下的JSON文件

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

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

maps结构可以更加复杂。

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

这个案例中多了一个key metadata,该key是嵌入(nested)式的key,其中还包含了labels和api这样的key

YAML的处理器可以根据空格数(indentation level)来判定,空格数可两个可多个,由使用者来定,但一定要保持一致性(consistency),比如name和labels是同一级key,所以前面都是两个空格,而api是labels的nested key,所以空四格。

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

上面案例对应的JSON文件如下

{

  "apiVersion": "v1",

  "kind": "Pod",

  "metadata": {

               "name": "rss-site",

               "labels": {

                          "app": "web"

                         }

              }

}

YAML Lists

一个包含多个元素的数据结构。每个元素前面空格,由-开始,在该符号之后在空一格。一个-符号对应了一个元素。

案例如

args:

  - sleep

  - "1000"

  - message

  - "Bring back Firefly!"

该list对应的JSON表达为

{
   "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

该案例对应的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设置

K8S中可以使用设置Pod和Deployment。

创建pod

首先配置一个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

逐个参数分析。apiVersion顾名思义,注意该案例为Pod,当kind为Deployment时,需要指定另一个版本因Deployment不存在于v1中。

kind参数用来指定YAML创建的类型,除了稳重设置的Pod,还可设置DeploymentJobService以及其他。

metadata参数,其中包括该Pod的名字,已经该pod在K8S中的识别标签label

spec参数用来指定该pod的实体。spec的属性包括容器,内存需求,存储容量,网络设置,容器失败时是否重启,以及其他。

通过kubectl create -f pod.yml命令即可根据pod.yml中指定的设置生成一个pod。

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

查看当前pod的情况,使用kubectl get pods命令

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

注意该pod的STATUSContainerCreating,稍事片刻重新执行kubectl get pods命令会看到变为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

当pod状态不正常,比如ErrImagePull,时,用kubectl describe pod rss-site查看pod状态

> 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\""

创建deployment

(2023.11.18 Sat @KLN)
K8S的deployment应用包括:

  • workload的持续可用:deployment指定特定的保持运行的workload的拷贝数量,一旦某个workload挂掉,K8S自动重启该workload,确保高可用
  • 扩展workloads:K8S使得修改deployment的replicas数量变得容易
  • 管理应用状态: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,创建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的详细信息,命令同pod,kubectl describe deployment rss-site

更新某个deployment,最简单的方式是更新创建该deployment的YAML文件,此时需要使用apply命令而非create命令。

kubectl apply -f deployment.yaml

此时更新已经进入YAML文件,再次运行kubectl apply则生效。

另一种方法是用kubectl edit命令编辑某个特定的对象

kubectl edit deployment.v1.apps/rss-site

接着会跳转到一个编辑器编辑YAML文件。保存变更时也将自动应用于在线对象。

扩展deployment的另一个方法是用scale

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

甚至可以自动扩展,比如设置pod使用不超过60%的CPU

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

K8S仍然有其他的方式管理扩展。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容