zoukankan      html  css  js  c++  java
  • Kubernetes 笔记 05 yaml 配置文件详解

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。

    Hi,大家好,欢迎大家和我一起学 K8S,这是系列第 5 篇。

    生活中,随处可见,几乎每一款产品都会附带一份说明书,说明书可以记录产品的使用方法,也可以记录产品的配方。有了说明书,我们完全可以窥探一款产品的全貌。

    在 K8S 中,yaml 配置文件就是 K8S 资源对象的说明书,定义了对象包含的元素及采取的动作,每种对象都可以通过 yaml 配置文件来创建。

    yaml 是什么

    yaml 是一种用来写配置文件的语言,没错,它是一门语言。如果你用过 json,那么对它就不会陌生,yaml 又被称为是 json 的超集,使用起来比 json 更方便。

    结构上它有两种可选的类型:Lists 和 Maps。

    List 用 -(破折号) 来定义每一项,Map 则是一个 key:value 的键值对来表示。如下是一个 json 文件到 yaml 文件的转换:

    json:

    {
      "apiVersion": "v1",
      "kind": "Pod",
      "metadata": {
            "name": "xx"
      }
      "spec": {
            "containers": [{
                "name": "front-end",
                "image": "nginx",
                "ports": [{
                    "containerPort": "80"
                }]
            }, {
                "name": "flaskapp-demo",
                "image": "jcdemo/flaskapp",
                "ports": [{
                    "containerPort": "5000"
                }]
            }]
      }
    }
    

    yaml:

    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: xx
    spec:
      containers:
        - name: front-end
          image: nginx
          ports:
            - containerPort: 80
        - name: flaskapp-demo
          image: jcdemo/flaskapp
          ports: 8080
    

    这个文件简单地定义了一个 Pod 对象,包含两个容器,我们可以很清晰地看到两者是如何转换的。

    K8S 创建资源的两种方式

    在 K8S 中,有两种创建资源的方式:kubectl 命令和 yaml 配置文件。

    两种方式各有各的好处。命令行的方式最为简单,一条命令就万事大吉,但缺点也很明显,你并不知道这条命令背后到底做了哪些事,配置文件就提供了一种让你知其然更知其所以然的方式。总的来说,它有以下好处:

    • 完整性:配置文件描述了一个资源的完整状态,可以很清楚地知道一个资源的创建背后究竟做了哪些事;
    • 灵活性:配置文件可以创建比命令行更复杂的结构;
    • 可维护性:配置文件提供了创建资源对象的模板,能够重复使用;
    • 可扩展性:适合跨环境、规模化的部署。
    • ......

    当然,复杂的东西对用户就难以做到友好,我们需要熟悉它的配置文件的语法,有一定难度。下面举几个例子,让你对 yaml 配置文件有一个基本的认识。

    几个例子

    下面,我们分别来看看 deploymentpodservice 这三种资源的说明书都长啥样。

    由于 K8S 对每种资源的定义非常庞杂,限于篇幅,我们只看一些必选的参数,目的是通过这几个例子,读懂 yaml 配置文件。

    deployment

    定义 deployment 配置文件,命名为:nginx-deployment.yaml

    apiVersion: apps/v1   # 1.9.0 之前的版本使用 apps/v1beta2,可通过命令 kubectl api-versions 查看
    kind: Deployment 	#指定创建资源的角色/类型
    metadata: 	 #资源的元数据/属性
      name: nginx-deployment	#资源的名字,在同一个namespace中必须唯一
    spec:
      replicas: 2 	 #副本数量2
      selector:      #定义标签选择器
        matchLabels:
          app: web-server
      template: 	 #这里Pod的定义
        metadata:
          labels: 	 #Pod的label
            app: web-server
        spec:		 # 指定该资源的内容  
          containers:  
          - name: nginx 	 #容器的名字  
            image: nginx:1.12.1  #容器的镜像地址    
            ports:  
            - containerPort: 80  #容器对外的端口
    

    执行kubectl create -f nginx.yaml创建 deployment 资源:

    pod

    定义 pod 配置文件,命名为 redis-pod.yaml

    apiVersion: v1
    kind: Pod  
    metadata:  
      name: pod-redis
      labels:
        name: redis
    spec: 
      containers:
      - name: pod-redis
        image: docker.io/redis  
        ports:
        - containerPort: 80	#容器对外的端口
    

    执行kubectl create -f pod-redis.yaml创建 pod 资源:

    可以看到,成功创建一个 Pod,ContainerCreating表示 Pod 中的容器正在执行镜像的下载和安装过程,过一会儿,就显示Running了,表明 Pod 应用部署完成。

    service

    定义 service 配置文件,命名为 httpd-svc.yaml

    apiVersion: v1  
    kind: Service  # 指明资源类型是 service
    metadata:  
      name: httpd-svc # service 的名字是 httpd-svc
      labels:  
        name: httpd-svc 
    spec:  
      ports:  # 将 service 8080 端口映射到 pod 的 80 端口,使用 TCP 协议
      - port: 8080
        targetPort: 80  
        protocol: TCP  
      selector:  
        run: httpd # 指明哪些 label 的 pod 作为 service 的后端
    

    执行kubectl create -f httpd-svc.yaml创建 service 资源:

    可以看到,service httpd-svc 分配到一个 Cluster-IP 10.96.0.1,我们可以通过该 IP 访问 service 所维护的后端 Pod。

    另外,还有一个 service kubernetes,这个是 Kubernetes API Server 的 service,Cluster 内部的各组件就是通过这个 service 来访问 API Server。

    总结

    yaml 是 K8S 资源对象的说明书,每个对象拥有哪些属性都可以在 yaml 中找到详尽的说明,初学者建议多写 yaml 文件,少用命令行。

    以上三个例子只是对 yaml 文件做个简单说明,更详细的信息还是参考官网。

    OK,本文就到此为止,下文我们开始进入豌豆荚之旅。觉得不错,别忘了转发分享给你的朋友哦。

    参考:
    https://www.kubernetes.org.cn/1414.html


    我的公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。

  • 相关阅读:
    vue3父组件方法之间方法的互相调用
    vue3获取数据的注意点
    2021牛客暑期多校训练营5 D. Double Strings(DP/排列组合)
    2021牛客暑期多校训练营8 K. Yet Another Problem About Pi(几何)
    2021牛客暑期多校训练营8 D. OR(位运算/结论)
    2021牛客暑期多校训练营5 J. Jewels(二分图最大权匹配)
    关于C++ STL中对于set使用lower_bound进行二分查找的效率问题
    CSP202012-4 食材运输(70分)
    【k8s】Volume-pv-local
    【k8s】Volume-pvc
  • 原文地址:https://www.cnblogs.com/bakari/p/10509484.html
Copyright © 2011-2022 走看看