YAML

通过k8s操作yaml配置文件在node上创建资源,yaml配置文件就像船垛,用来操控docker这艘大船

yam是专门用来写配置文件的语言,非常简洁和强大。而实际上使用yaml配置文件创建这些操作对象的方式会比直接使用命令行更可取,因为这些文件可以进行版本控制,而且文件的变化和内容也可以进行审核,当使用及其复杂的配置来提供一个稳健、可靠和易维护的系统时,这些点就显得非常重要。

在声明定义配置文件的时候,所有的配置文件都存储在YAML或者JSON格式的文件中并且遵循k8s的资源配置方式。kubectl可以创建、更新、删除和获得API操作对象,当前apiVersion、kind和name会组成一个API Path以供kubectl来调用。

使用YAML用于K8s的定义带来的好处:

  1. # 便捷性:不必添加大量的参数到命令行中执行命令
  2. # 可维护性:YAML文件可以通过源头控制,跟踪每次操作
  3. # 灵活性:YAML可以创建比命令行更加复杂的结构
YAML语法规则
  1. # 1. 大小写敏感.
  2. # 2. 使用缩进表示层级关系.
  3. # 3. 缩进时不允许使用Tab键,只允许使用空格set ai.
  4. # 4. 缩进的空格数不重要,只要相同层级的元素左侧对齐即可.
  5. # 5. 表示注释,从这个字符一直到行尾,都会被解析器忽略.
  1. # 在Kubernetes中,只需要知道两种结构类型:
  2. # 例一.Maps: 映射即字典Kye: Value
  3. ---
  4. apiVersion: v1
  5. kind: Pod
  6. # ---为可选的分隔符,当需要在一个文件中定义多个结构的时候就需要使用
  7. # 例二.lists列表即数组
  8. # python中的列表: args=[beijing,shaohai,shenzhen,guangzhou]
  9. args:
  10. - beijing
  11. - shanghai
  12. - shenzhen
  13. - guangzhou
  14. # 可以指定任何数量的项在列表中,每个项的定义以(-)开头,并且与父元素之间存在缩进

一个简单的Hello World容器Pod可以通过YAML这样定义

  1. cat hello.yaml
  2. ---
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. name: pod-demo
  7. spec:
  8. containers:
  9. - name: hello
  10. image: daocloud.io/library/centos:7
  11. command: ["/bin/echo","hello","world"]
  12. # apiVersion: v1
  13. # API群组名称和版本,由组名+版本号组成: group/version,如果group省略表示核心组的定义: 可用$kubectl api-versions获取;
  14. # 所有的映射数据都可以使用花括号,所有列表数据都得使用中括号.
  15. # apiVersion:piserver版本,创建任何资源都是需要定义的,大部分用v1,但v1不支持deployment,用v1的扩展版extensions/v1beta1
  16. # metadata.name: Pod名,该名称必须是唯一的.
  17. # spec: 当前Pod内容的声明.
  18. # restartPollcy: Never标识启动后运行一次就终止这个Pod
  19. # containers: name为容器的名字
  20. # container[1]: image为该启动容器的镜像
  21. # containers[2]: command相当于Dockerfile中定义的Entrypoint,通过下列的方式来声明cmd的参数.
  22. # command: ["/bin/echo"]
  23. # args: ["hello","world"]
使用yaml发布一个容器化应用

项目描述

1、需要镜像,此镜像可以来自于官方,开发,或者是自己制作的镜像。

2、在k8s集群中按照 Kubernetes 项目的规范和要求,将镜像组织以它能够"认识"的方式部署此应用。考虑是否做副本,不做副本就以pod方式部署应用;做副本就需要以deployment方式部署应用,而且还需要部署一个service

什么叫Kubernetes项目能"认识"的方式?

就是使用YAML或者是JSON格式编写Kubernetes的配置文件,这是k8s的必备技能

Kubernetes跟Docker等很多项目最大的不同在于它虽然支持使用kubectl run这样的命令行方式运行容器,但它并不推荐使用此方式,而是希望用YAML文件的方式来运行容器,即把容器的定义、参数、配置,统统记录在一个 YAML 文件中,然后用kubectl create -f 配置文件的方式把它运行起来。这样部署应用还有一个最大的优点在于:文件中记录了Kubernetes到底"run"了什么。

部署过程

编写创建Pod的YAML文件

YAML 文件,对应到 k8s 中,就是一个API Object(API 对象)。当你为这个对象的各个字段填好值并提交给 k8s 之后,k8s 就会负责创建出这些对象所定义的容器或者其他类型的 API 资源.

  1. cat pod-demo.yaml
  2. ---
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. name: nginx
  7. labels:
  8. app: web
  9. spec:
  10. containers:
  11. - name: front-end
  12. image: nginx
  13. ports:
  14. - containerPort: 80
  15. - name: flaskapp-demo
  16. image: jcdemo/flaskapp
  17. ports:
  18. - containerPort: 5000
  19. kubectl apply -f pod-demo.yaml --validate
  20. # kind:这里我们创建的是一个Pod,当然根据你的实际情况,这里的资源类型可以是Deployment,Job,ngress,Service等.
  21. # metadata: 包含了我们定义的Pod的一些meta信息,比如名称namespace、标签等等信息.
  22. # spec:包括一些containers,storage,volumes,或者其他Kubernetes需要知道的参数,以及诸如是否在容器失败时重新启动容器的属性,
  23. # 你可以在特定KubernetesAP找到完整的Kubernetes Pod的属性让我们看一个典型容器的定义.
  24. spec
  25. containers:
  26. - name: front-end
  27. image: nginx
  28. ports:
  29. - containerPort: 80
  30. # 我们将上面内容保存成为Pod.yaml文件,来创建Pod

查询Pod的状态和生命周期事件

  1. kubectl describe pod nginx
  2. Name: nginx
  3. Namespace: default
  4. Priority: 0
  5. Node: node2/172.19.0.54
  6. Start Time: Thu, 19 Dec 2019 16:51:44 +0800
  7. Labels: app=web
  8. Annotations: kubectl.kubernetes.io/last-applied-configuration:
  9. {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"app":"web"},"name":"nginx","namespace":"default"},"spec":{"contain...
  10. Status: Running
  11. IP: 10.244.1.4
  12. IPs:
  13. IP: 10.244.1.4
  14. Containers:
  15. front-end:
  16. Container ID: docker://5b4895a1e08387557a02760b8c49513bc2728476d627677662605b1f09b4103c
  17. Image: nginx
  18. Image ID: docker-pullable://nginx@sha256:50cf965a6e08ec5784009d0fccb380fc479826b6e0e65684d9879170a9df8566
  19. Port: 80/TCP
  20. Host Port: 0/TCP
  21. State: Running
  22. Started: Thu, 19 Dec 2019 16:53:03 +0800
  23. Ready: True
  24. Restart Count: 0
  25. Environment: <none>
  26. Mounts:
  27. /var/run/secrets/kubernetes.io/serviceaccount from default-token-j9thc (ro)
  28. flaskapp-demo:
  29. Container ID: docker://7d2e0353226f5a36df8384244a8dbcd766bd356ca037a33eb481d4990986fcfc
  30. Image: jcdemo/flaskapp
  31. Image ID: docker-pullable://jcdemo/flaskapp@sha256:8dd21e8822e08414c0fe2531c22b575a33da3964e51d39cfa27e7b68520056af
  32. Port: 5000/TCP
  33. Host Port: 0/TCP
  34. State: Running
  35. Started: Thu, 19 Dec 2019 16:52:18 +0800
  36. Ready: True
  37. Restart Count: 0
  38. Environment: <none>
  39. Mounts:
  40. /var/run/secrets/kubernetes.io/serviceaccount from default-token-j9thc (ro)
  41. Conditions:
  42. Type Status
  43. Initialized True
  44. Ready True
  45. ContainersReady True
  46. PodScheduled True
  47. Volumes:
  48. default-token-j9thc:
  49. Type: Secret (a volume populated by a Secret)
  50. SecretName: default-token-j9thc #(目标状态),以目标状态为准,k8s就用来确保当前状态无限向目标状态转移
  51. Optional: false
  52. QoS Class: BestEffort
  53. Node-Selectors: <none>
  54. Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s # 容忍那些污点.
  55. node.kubernetes.io/unreachable:NoExecute for 300s
  56. Events:
  57. Type Reason Age From Message
  58. ---- ------ ---- ---- -------
  59. Normal Scheduled <unknown> default-scheduler Successfully assigned default/nginx to node2
  60. Warning Failed 11m kubelet, node2 Failed to pull image "nginx": rpc error: code = Unknown desc = Get https://registry-1.docker.io/v2/library/nginx/manifests/sha256:189cce606b29fb2a33ebc2fcecfa8e33b0b99740da4737133cdbcee92f3aba0a: net/http: TLS handshake timeout
  61. Normal Pulling 11m kubelet, node2 Pulling image "jcdemo/flaskapp"
  62. Normal Pulled 10m kubelet, node2 Successfully pulled image "jcdemo/flaskapp"
  63. Normal Created 10m kubelet, node2 Created container flaskapp-demo
  64. Normal Started 10m kubelet, node2 Started container flaskapp-demo
  65. Warning Failed 10m (x2 over 11m) kubelet, node2 Error: ErrImagePull
  66. Warning Failed 10m kubelet, node2 Failed to pull image "nginx": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout
  67. Normal BackOff 10m (x2 over 10m) kubelet, node2 Back-off pulling image "nginx"
  68. Warning Failed 10m (x2 over 10m) kubelet, node2 Error: ImagePullBackOff
  69. Normal Pulling 10m (x3 over 11m) kubelet, node2 Pulling image "nginx"
  70. Normal Pulled 10m kubelet, node2 Successfully pulled image "nginx"
  71. Normal Created 10m kubelet, node2 Created container front-end
  72. Normal Started 10m kubelet, node2 Started container front-end
describe解释
  1. # 名字段含义 (以Go Template方式过滤指定的信息—— 查询Pod的运行状态(类似docker的inspect))
  2. kubectl get pods nginx --output=go-template --template={{.status.phase}}
  3. Running
  4. # 各字段含义
  5. Name: Pod的名称
  6. Namespace: PodNamespace
  7. Image(s): Pod使用的镜像
  8. Node: Pod所在的Node
  9. Start Time: Pod的起始时间
  10. Labels: PodLabel
  11. Status: Pod的状态RunningCompletePending,就是pod的生命周期。
  12. Reason: Pod处于当前状态的原因。
  13. Message: Pod处于当前状态的信息。
  14. IP: PodPodIP
  15. Replication Controllers: Pod对应的Replication Controller
  16. Containers:Pod中容器的信息
  17. Container ID: 容器的ID
  18. Image: 容器的镜像
  19. Image ID:镜像的ID
  20. State: 容器的状态
  21. Ready: 容器的准备状况(true表示准备就绪)。
  22. Restart Count: 容器的重启次数统计
  23. Environment Variables: 容器的环境变量
  24. Conditions: Pod的条件,包含Pod准备状况(true表示准备就绪)
  25. Volumes: Pod的数据卷
  26. Events: Pod相关的事件列
创建一个简单的Pod
  1. cat pod-demo.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: nginx-pod
  6. labels:
  7. app: nginx
  8. spec:
  9. containers:
  10. - name: nginx
  11. image: nginx
  12. # 如果需要更改这个Pod,修改这个配置文件要修改的信息,然后删除重建
  13. kubectl replace -f pod-demo.yaml --force
  14. kubectl apply -f pod-demo.yaml --force

进入Pod对应的容器内部

  1. kubectl exec -it nginx /bin/bash
  2. # 也可以去node端使用docker命令进入命令,并且exit对容器不会产生影响.
使用yaml创建一个名称空间
  1. cat namespace.yml
  2. ---
  3. apiVersion: v1
  4. kind: Namespace
  5. metadata:
  6. name: ns-monitor
  7. labels:
  8. name: na-monitor
  9. # 元数据习惯带name,查询时可以使用名字,但是labels可以不带,资源之间调用时使用标签.
  10. # 创建该资源
  11. kubectl apply -f namespace.yml
  12. # 查看该资源
  13. kubectl get namespaces
  14. NAME STATUS AGE
  15. default Active 47h
  16. kube-node-lease Active 47h
  17. kube-public Active 47h
  18. kube-system Active 47h
  19. ns-monitor Active 21s
  20. kubectl describe namespace ns-monitor
  21. Name: ns-monitor
  22. Labels: name=na-monitor
  23. Annotations: kubectl.kubernetes.io/last-applied-configuration:
  24. {"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"labels":{"name":"na-monitor"},"name":"ns-monitor"}}
  25. Status: Active
  26. No resource quota.
  27. No LimitRange resource.
  28. # 删除该资源
  29. kubectl delete -f namespace.yml

YAML创建deployment和service

创建deployment和pod

  1. cat nginx-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: nginx-deployment
  6. spec:
  7. replicas: 3
  8. selector:
  9. matchLabels:
  10. app: nginx
  11. template:
  12. metadata:
  13. labels:
  14. app: nginx
  15. spec:
  16. containers:
  17. - name: nginx
  18. image: daocloud.io/library/nginx
  19. ports:
  20. - containerPort: 80

创建service

  1. cat nginx-service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: nginx-service
  6. labels:
  7. app: nginx
  8. spec:
  9. ports:
  10. - port: 80
  11. targetPort: 80
  12. selector:
  13. app: nginx

YAML资源限制

  1. cat pod-demo.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: nginx-pod
  6. labels:
  7. app: nginx
  8. spec:
  9. containers:
  10. - name: nginx
  11. image: daocloud.io/library/nginx
  12. resources:
  13. requests:
  14. memory: "64Mi" # 初始内存
  15. cpu: "250m"
  16. limits:
  17. memory: "128Mi" # 最大内存
  18. cpu: "500m"
  19. # 其实此处的资源限制是跟docker差不多的,可以在docker用docker inspect查看.

04 . kubernetes资源清单YAML入门的更多相关文章

  1. 4、kubernetes资源清单快速入门190625

    一.资源清单概念 资源/对象的类型 工作负载型资源:Pod, ReplicaSet, Deployment, StatefulSet, DaemonSet, Job, Cronjob, ... 服务发 ...

  2. kubernetes系列06—kubernetes资源清单定义入门

    本文收录在容器技术学习系列文章总目录 1.认识kubernetes资源 1.1 常用资源/对象 workload工作负载型资源:pod,ReplicaSet,Deployment,StatefulSe ...

  3. Kubernetes 学习5 kubernetes资源清单定义入门

    一.kubernetes是有一个restful风格的 API,把各种操作对象都一律当做资源来管理.并且可通过标准的HTTP请求的方法 GET,PUT,DELETE,POST,等方法来完成操作,不过是通 ...

  4. kubernetes 资源清单定义入门

    k8s中的资源 什么叫资源? k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象 在k8s中有哪些资源? 工作负载型资源(workload): Pod ReplicaSet Deploymen ...

  5. 5、kubernetes资源清单定义入门

    使用配置清单创建资源 定义pod时使用yaml格式 master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE client / Error 1 ...

  6. Kubenetes 资源清单定义入门

    Kubernetes 常用资源 资源  对象 工作负载型资源对象(workload): Pod  Replicaset  ReplicationController  Deployments Stat ...

  7. k8s学习笔记之四:资源清单定义入门

    第一章.k8s中的资源 1.什么叫资源? k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象 2.在k8s中有哪些资源? 工作负载型资源(workload): Pod ReplicaSet D ...

  8. 04-kubernetes 资源清单定义入门

    目录 资源对象 创建资源的方法 清单帮助命令 创建测试清单 资源的三种创建方式 资源对象 workload:Pod, ReplicaSet, Deployment, StatefulSet, Daem ...

  9. (四)Kubernetes 资源清单定义

    Kubernetes常用资源对象 依据资源的主要功能作为分类标准,Kubernetes的API对象大体可分为五个类别,如下: 类型 名称 工作负载(Workload) Pod.ReplicaSet.D ...

随机推荐

  1. Java实现 洛谷 P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元 ...

  2. Java实现 LeetCode 6 Z字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  3. java实现基因牛的繁殖

    基因牛的繁殖 基因牛 张教授采用基因干预技术成功培养出一头母牛,三年后,这头母牛每年会生出1头母牛, 生出来的母牛三年后,又可以每年生出一头母牛.如此循环下去,请问张教授n年后有多少头母牛? 以下程序 ...

  4. java实现第七届蓝桥杯有奖竞猜

    有奖竞猜 题目描述 小明很喜欢猜谜语. 最近,他被邀请参加了X星球的猜谜活动. 每位选手开始的时候都被发给777个电子币. 规则是:猜对了,手里的电子币数目翻倍, 猜错了,扣除555个电子币, 扣完为 ...

  5. 终于我用JOL打破了你对java对象的所有想象

    目录 简介 JOL简介 使用JOL分析VM信息 使用JOL分析String 使用JOL分析数组 使用JOL分析自动装箱 使用JOL分析引用关系 总结 简介 使用面向对象的编程语言的好处就是,虽然没有女 ...

  6. [go设计模式]工厂方法模式

    简单工厂就是生产整个计算器,而工厂方法只生产计算器的一部分: 原有的简单工厂可以生'+' '-' '*' '/' ;但是如果添加新的部件'%',厂房就 需要扩充.修改很可以会影响原来部件的正常生产,这 ...

  7. 2.3 sqlmap目录及结构

    2.3 sqlmap目录及结构Tips:此篇文章主要参考了<sqlmap从入门到精通>这本书中的相关具体细节,由于这本书作者完成的时间大概在2017年作用,所以我根据书中提到的信息再根据目 ...

  8. Node.js躬行记(3)——命令行工具

    一.自定义 创建一个空目录,然后通过npm init命令初始化package.json文件,并按提示输入相关信息或直接回车使用默认信息,生成的内容如下所示. { "name": & ...

  9. .NET 技术栈 思维导图

    背景介绍 根据网上招聘网站的一些.NET技能需求,画了一个图,便于在自修和学习的过程当中有一个方向. 技能栈 Web front-end o 框架技术 ▣ Vue ▣ Bootstrap ▣ LayU ...

  10. ubuntu12.04 跳过grub选择

    1.修改/etc/grub.d/00_head文件. set timeout=-1 修改成 set timeout = ${GRUB_RECORDFAIL_TIMEOUT:--1} 2.修改/etc/ ...