YAML

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

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

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

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

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

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

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

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

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

kubectl describe pod nginx
Name: nginx
Namespace: default
Priority: 0
Node: node2/172.19.0.54
Start Time: Thu, 19 Dec 2019 16:51:44 +0800
Labels: app=web
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"app":"web"},"name":"nginx","namespace":"default"},"spec":{"contain...
Status: Running
IP: 10.244.1.4
IPs:
IP: 10.244.1.4
Containers:
front-end:
Container ID: docker://5b4895a1e08387557a02760b8c49513bc2728476d627677662605b1f09b4103c
Image: nginx
Image ID: docker-pullable://nginx@sha256:50cf965a6e08ec5784009d0fccb380fc479826b6e0e65684d9879170a9df8566
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Thu, 19 Dec 2019 16:53:03 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-j9thc (ro)
flaskapp-demo:
Container ID: docker://7d2e0353226f5a36df8384244a8dbcd766bd356ca037a33eb481d4990986fcfc
Image: jcdemo/flaskapp
Image ID: docker-pullable://jcdemo/flaskapp@sha256:8dd21e8822e08414c0fe2531c22b575a33da3964e51d39cfa27e7b68520056af
Port: 5000/TCP
Host Port: 0/TCP
State: Running
Started: Thu, 19 Dec 2019 16:52:18 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-j9thc (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-j9thc:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-j9thc #(目标状态),以目标状态为准,k8s就用来确保当前状态无限向目标状态转移
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s # 容忍那些污点.
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled <unknown> default-scheduler Successfully assigned default/nginx to node2
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
Normal Pulling 11m kubelet, node2 Pulling image "jcdemo/flaskapp"
Normal Pulled 10m kubelet, node2 Successfully pulled image "jcdemo/flaskapp"
Normal Created 10m kubelet, node2 Created container flaskapp-demo
Normal Started 10m kubelet, node2 Started container flaskapp-demo
Warning Failed 10m (x2 over 11m) kubelet, node2 Error: ErrImagePull
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
Normal BackOff 10m (x2 over 10m) kubelet, node2 Back-off pulling image "nginx"
Warning Failed 10m (x2 over 10m) kubelet, node2 Error: ImagePullBackOff
Normal Pulling 10m (x3 over 11m) kubelet, node2 Pulling image "nginx"
Normal Pulled 10m kubelet, node2 Successfully pulled image "nginx"
Normal Created 10m kubelet, node2 Created container front-end
Normal Started 10m kubelet, node2 Started container front-end
describe解释
# 名字段含义 (以Go Template方式过滤指定的信息—— 查询Pod的运行状态(类似docker的inspect))
kubectl get pods nginx --output=go-template --template={{.status.phase}}
Running # 各字段含义
Name: Pod的名称
Namespace: Pod的Namespace。
Image(s): Pod使用的镜像
Node: Pod所在的Node。
Start Time: Pod的起始时间
Labels: Pod的Label。
Status: Pod的状态Running、Complete、Pending,就是pod的生命周期。
Reason: Pod处于当前状态的原因。
Message: Pod处于当前状态的信息。
IP: Pod的PodIP
Replication Controllers: Pod对应的Replication Controller。 Containers:Pod中容器的信息 Container ID: 容器的ID
Image: 容器的镜像
Image ID:镜像的ID
State: 容器的状态
Ready: 容器的准备状况(true表示准备就绪)。
Restart Count: 容器的重启次数统计
Environment Variables: 容器的环境变量
Conditions: Pod的条件,包含Pod准备状况(true表示准备就绪)
Volumes: Pod的数据卷
Events: 与Pod相关的事件列
创建一个简单的Pod
cat pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx # 如果需要更改这个Pod,修改这个配置文件要修改的信息,然后删除重建
kubectl replace -f pod-demo.yaml --force
kubectl apply -f pod-demo.yaml --force

进入Pod对应的容器内部

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

YAML创建deployment和service

创建deployment和pod

cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: daocloud.io/library/nginx
ports:
- containerPort: 80

创建service

cat nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx

YAML资源限制

cat pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: daocloud.io/library/nginx
resources:
requests:
memory: "64Mi" # 初始内存
cpu: "250m"
limits:
memory: "128Mi" # 最大内存
cpu: "500m"
# 其实此处的资源限制是跟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实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素 - 允许重复

    381. O(1) 时间插入.删除和获取随机元素 - 允许重复 设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构. 注意: 允许出现重复元素. insert(val):向集合中插 ...

  2. Java实现 蓝桥杯VIP 算法提高 阶乘差

    问题描述 给定n和m以及p,保证n>=m,求(n!-m!)对p取余的结果. 输入格式 一行三个正整数n,m,p. 输出格式 一行一个非负整数表示结果. 样例输入 3 2 10 样例输出 4 数据 ...

  3. Java实现第九届蓝桥杯小朋友崇拜圈

    小朋友崇拜圈 题目描述 班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己). 在一个游戏中,需要小朋友坐一个圈, 每个小朋友都有自己最崇拜的小朋友在他的右手边. 求满足条件的圈最大多少人 ...

  4. LNMP zabbix 4.4

    硬件配置需求 环境 平台 CPU/内存 数据库 硬盘 监控主机数 小型 CentOS 2CPU/1GB MySQL.InnoDB 普通 100 中型 CentOS 2CPU/2GB MySQL.Inn ...

  5. JNI_day02

    二级指针 指向指针变量的指针,保存指针的地址 结构体 struct Student //struct Stdent 学生结构体类型 { int id;//成员 char name[20]; int a ...

  6. ElasticSearch6.3脚本更新

    使用上篇文章创建的索引进行学习:https://www.cnblogs.com/wangymd/p/11200996.html 官方文档:https://www.elastic.co/guide/en ...

  7. k8s学习-集群安装

    3.kubernetes安装 3.1.规划 hostname ip 内存 核 硬 说明 harbor 192.168.136.30 2G 2 100G 私有仓库 koolshare 2G 2 20G ...

  8. ModelAndView的部分回顾

    ModelAndView的部分回顾 //@RestController @Controller //@SessionAttributes("user") //把modelandvi ...

  9. 超强教程!在树莓派上构建多节点K8S集群!

    在很长一段时间里,我对于在树莓派上搭建Kubernetes集群极为感兴趣.在网络上找到一些教程并且跟着实操,我已经能够将Kubernetes安装在树莓派上,并在三个Pi集群中工作.然而,在master ...

  10. 【代理】内网穿透工具 frp&frps

    frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发. ### frp 的作 ...