本文首发于我的公众号 CloudDeveloper(ID: cloud_dev), 专注于干货分享, 号内有大量书籍和视频资源, 后台回复「1024」即可领取, 欢迎大家关注, 二维码文末可以扫.
Hi, 大家好, 我是 CloudDeveloper, 欢迎大家和我一起学 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 配置文件有一个基本的认识.
几个例子
下面, 我们分别来看看 deployment,pod,service 这三种资源的说明书都长啥样.
由于 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
我的公众号 CloudDeveloper(ID: cloud_dev), 号内有大量书籍和视频资源, 后台回复「1024」即可领取, 分享的内容包括但不限于云计算虚拟化, 容器, OpenStack,K8S, 雾计算, 网络, 工具, SDN,OVS,DPDK,Linux,Go,Python,C/C++ 编程技术等内容, 欢迎大家关注.
来源: https://www.cnblogs.com/bakari/p/10509484.html