Kubernetes入门实践(YAML)
YAML是Kubernetes的标准工作语言
YAML介绍
Kubernetes使用了YAML语言一个非常关键的特性,叫作"声明式",对应的有另外一个词: "命令式"
先简单描述声明式和命令式之间的区别: 如Docker和Dokcerfile就属于"命令式",大多数编程语言属于命令式,特点是交互性强,注重顺序和过程,必须告诉计算机每步该做什么。所有的步骤都列清楚,这样程序才能一步步走下去。对应的,声明式不关心具体过程,更注重结果,只要告诉它一个目标状态,就会自己想办法完成任务,较为智能化。我们希望Kubernetes能够自动化,其内部的众多组件和插件能够自动监控和管理应用,这个时候用命令式操控它就不合适了,应该使用声明式,因此使用专门的YAML语言。
YAML是JSON的超集,支持整数、浮点数、布尔、字符串、数组和对象等数据类型,也就是说,任何JSON文档都是YAML文档
YAML简单实例:
数组
# YAML数组(列表)
OS:
- linux
- macOS
- Windows
这段YAML对应的JSON如下:
{
"OS": ["linux","macOS","Windows"]
}
对比之下,YAML的形式更为简单,没有闭合花括号、方括号的麻烦,每个元素后面无需逗号
字典
# YAML对象(字典)
Kubernetes:
master:1
worker:3
等价的JSON:
{
"Kubernetes": {
"master": 1,
"worker": 3
}
}
YAML中的Key无需双引号
利用这两个对象,可以描述任意的Kubernetes资源对象:
Kubernetes:
master:
- apiserver: running
- etcd: running
node:
- kubelet: running
- kube-proxy: down
- container-runtime: [docker,containerd,cri-o]
Kubernetes下有两个数组master和node,maste中是两对键值:apiserver:running和etcd:running,而node同理
API对象
使用kubectl api-resources来查看当前Kubernetes版本支持的所有对象:
$ minikube kubectl -- api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
...
NAME一列是对象的名字,比如ConfigMap、Pod、Service等等,第二列SHORTNAME是该资源的简写
API对象全面描述了集群的节点、应用、配置、服务、帐号等信息,apiserver会将它们存储在数据库etcd里,然后kubelet、scheduler、controller-manager等组件通过apiserver来操作,就在API对象这个抽象层次实现了对整个集群的管理
可以编辑YAML,让Kubernetes自己去拉取镜像:
apiVersion: v1
kind: Pod
metadata:
name: ngx-pod
labels:
env: demo
owner: test
spec:
containers:
- image: nginx:alpine
name: ngx
ports:
- containerPort: 80
kind指明了这是一个Pod,image要使用nginx:alpine镜像创建一个容器,containerPort指明开放80端口
apiVersion、kind、metadata算是API对象的基本信息,apiVersion表示操作这种资源的API版本号,kind表示资源对象类型,metadata表示资源的元信息
name和labels是元信息,name为Pod命名,labels为Pod的标签信息,便于查找,分别是env和owner
kubectl将基于这些基本信息生成HTTP请求发送给apiserver,spec表示对对象的期望状态,其中有一个containers数组,其中每个元素都是一个对象,指定了名字、镜像、端口等信息
上述的YAML文档完整地描述了一个类型是Pod的API对象,使用kubectl apply和kubectl delete再加上参数-f就可以用这个文件创建和删除对象
创建:
$ minikube kubectl -- apply -f ngx-pod.yml
pod/ngx-pod created
删除:
$ minikube kubectl -- delete -f ngx-pod.yml
pod "ngx-pod" deleted
加上--v=9就可以看到HTTP请求的详细信息:
$ minikube kubectl -- apply -f ngx-pod.yml --v=9
I0723 21:22:29.488559 14027 loader.go:372] Config loaded from file: /home/hwx/.kube/config
I0723 21:22:29.488939 14027 cert_rotation.go:137] Starting client certificate rotation controller
I0723 21:22:29.489379 14027 round_trippers.go:466] curl -v -XGET -H "Accept: application/com.github.proto-openapi.spec.v2@v1.0+protobuf" -H "User-Agent: kubectl/v1.23.3 (linux/amd64) kubernetes/816c97a" 'https://192.168.59.100:8443/openapi/v2?timeout=32s'
I0723 21:22:29.493235 14027 round_trippers.go:510] HTTP Trace: Dial to tcp:127.0.0.1:7890 succeed
I0723 21:22:29.498071 14027 round_trippers.go:570] HTTP Statistics: DNSLookup 0 ms Dial 0 ms TLSHandshake 3 ms ServerProcessing 0 ms Duration 8 ms
I0723 21:22:29.498087 14027 round_trippers.go:577] Response Headers:
I0723 21:22:29.498092 14027 round_trippers.go:580] Audit-Id: b9d283c2-26c6-4c7b-953a-91edcc96c164
I0723 21:22:29.498098 14027 round_trippers.go:580] Content-Type: application/octet-stream
I0723 21:22:29.498102 14027 round_trippers.go:580] Last-Modified: Sat, 23 Jul 2022 10:25:52 GMT
编写技巧
使用kubectl api-resources命令查看资源对象相应的API版本和类型
使用kubectl explain相当于是Kubernetes自带的API文档,会给出对象字段的详细说明
$ minikube kubectl -- explain pod
KIND: Pod
VERSION: v1
DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is
created by clients and scheduled onto hosts.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
....
$ minikube kubectl -- explain pod.metadata
KIND: Pod
VERSION: v1
RESOURCE: metadata <Object>
DESCRIPTION:
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
ObjectMeta is metadata that all persisted resources must have, which
includes all objects users must create.
......
生成样板:
$ minikube kubectl -- run ngx --image=nginx:alpine --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: ngx
name: ngx
spec:
containers:
- image: nginx:alpine
name: ngx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
加上两个特殊参数--dry-run=client和-o yaml,前者是空运行,后者是生成YAML格式,这两者结合不会有实际的创建动作,只生成YAML文件
Kubernetes入门实践(YAML)的更多相关文章
- 微服务 + Docker + Kubernetes 入门实践 目录
微服务 + Docker + Kubernetes 入门实践: 微服务概念 微服务的一些基本概念 环境准备 Ubuntu & Docker 本文主要讲解在 Ubuntu 上安装和配置 Dock ...
- kubernetes入门实践
k8s中文文档 k8s概念比较多,有什么概念的疑惑的推荐看k8s中文文档. me的环境 操作系统:centos7 docker:1.12.6 环境跟me的不一致?不要慌,基本大部分操作都是行的通的. ...
- 云原生入门 第五章:kubernetes学习实践
1. 简介 在本章中,我们将学习不同的Kubernetes对象,它们的用途以及如何与它们交互. 在设置集群或使用现有集群之后,我们可以开始部署一些工作负载.Kubernetes中最小的计算单元不是一个 ...
- 第一章 Kubernetes入门
第一章 Kubernetes入门 kubernetes是基于容器技术的分布式架构领先方案,是一个完备的分布式系统支撑平台. kubernetes带来的好处:1)全面拥抱微服务:2)统可以随时随地整体“ ...
- Kubernetes入门(四)——如何在Kubernetes中部署一个可对外服务的Tensorflow机器学习模型
机器学习模型常用Docker部署,而如何对Docker部署的模型进行管理呢?工业界的解决方案是使用Kubernetes来管理.编排容器.Kubernetes的理论知识不是本文讨论的重点,这里不再赘述, ...
- 分布式学习系列【dubbo入门实践】
分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...
- sass、less和stylus的安装使用和入门实践
刚 开始的时候,说实话,我很反感使用css预处理器这种新玩意的,因为其中涉及到了编程的东西,私以为很复杂,而且考虑到项目不是一天能够完成的,也很少是 一个人完成的,对于这种团队的项目开发,前端实践用c ...
- Django入门实践(三)
Django入门实践(三) Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子 ...
- Django入门实践(二)
Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...
- Django入门实践(一)
Django入门实践(一) Django编程思路+入门 认识Django有一个多月了,我觉得学习Django应该先理清它的编程思路.它是典型的MVC框架(在Django里也称MTV),我觉得Djang ...
随机推荐
- Python Boolean类型 判断
and 判断非Boolean类型数据会自动转换类型 "A" and "B" → "B" 因为表达式 A 和 B都为True所以返回 &quo ...
- 使用python制作nRF52832升级包和合成烧录文件的经验(nRF52832 DFU经验分享)
使用python制作nRF52832升级包和合成烧录文件,青风开发板的作者已经说得很明白,不过作者使用的python是2.7的,已经很落后了.目前python已经更新到3.10.4了.所以我换了台电脑 ...
- manu check RAID GEM count and Fragment count of local FN>1
cat MANU_CHK.sh echo "input Chr" read C echo "input Start" read S echo "inp ...
- git合入代码过程中问题记录
问题一. 对远端仓库没有操作权限 ERROR: Repository not found. fatal: Could not read from remote repository. 定位思路 1.检 ...
- BlenderGIS记录
blender GIS 的插件名:"3Dview:blenderGIS" 具体使用方法看文档. 选择地图时选择bing地图会快一点.如果能挂梯子可以选择google地图 shift ...
- Spring MVC 常见问题
Spring MVC的主要组件有那些? spring mvc 在使用 DispatcherServlet 处理 web 请求的时候,会用到 spring 中的九大组件,以下是几个关键的组件: 1.Li ...
- typescript 的动态引入组件
环境: Arco Pro + Vue3 vite自身对动态字符串形式的组件引入是有限制的, 以下写法会报错 官方文档中也对此有做说明, 只能通过固定形式去引用 以下形式不会报错, 但这种固定格式的局限 ...
- 【picoCTF】GET aHEADwrite up
打开链接,页面如下: 这道题我试了两种解法,大家都可以看看哦! 一.burpsuit拦截 1.点击bule,打开burpsuit拦截(记得打开intercept哦) 2.将 POST 请求更改为 HE ...
- linux查看mac地址
1. ip addr show (ip address show .ip addr ) 查看本机ip和额外的一些信息 2.ifconfig -a 其中 HWaddr 就是mac地址 3.cat /s ...
- NTP同步时间
什么是NTPNTP:Network Time Protocol(网络时间协议) ️ NTP 是用于同步网络中计算机时间的协议.它的用途是把计算机的时钟同步到世界协调时UTC. UTC:Universa ...