一、YAML 基础

YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便。它实质上是一种通用的数据串行化格式。后文会说明定义YAML文件创建Pod和创建Deployment。

YAML语法规则:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tal键,只允许使用空格
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • ”#” 表示注释,从这个字符一直到行尾,都会被解析器忽略

在Kubernetes中,只需要知道两种结构类型即可:

  • Lists
  • Maps

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

  • 便捷性:不必添加大量的参数到命令行中执行命令
  • 可维护性:YAML文件可以通过源头控制,跟踪每次操作
  • 灵活性:YAML可以创建比命令行更加复杂的结构

YAML Maps

Map顾名思义指的是字典,即一个Key:Value 的键值对信息。例如:

---
apiVersion: v1
kind: Pod

注:--- 为可选的分隔符 ,当需要在一个文件中定义多个结构的时候需要使用。上述内容表示有两个键apiVersion和kind,分别对应的值为v1和Pod。

Maps的value既能够对应字符串也能够对应一个Maps。例如:

---
apiVersion: v1
kind: Pod
metadata:
name: kube100-site
labels:
app: web

注:上述的YAML文件中,metadata这个KEY对应的值为一个Maps,而嵌套的labels这个KEY的值又是一个Map。实际使用中可视情况进行多层嵌套。

​ YAML处理器根据行缩进来知道内容之间的关联。上述例子中,使用两个空格作为缩进,但空格的数据量并不重要,只是至少要求一个空格并且所有缩进保持一致的空格数 。例如,name和labels是相同缩进级别,因此YAML处理器知道他们属于同一map;它知道app是lables的值因为app的缩进更大。

注意:在YAML文件中绝对不要使用tab键

YAML Lists

List即列表,说白了就是数组,例如:

args
-beijing
-shanghai
-shenzhen
-guangzhou

可以指定任何数量的项在列表中,每个项的定义以破折号(-)开头,并且与父元素之间存在缩进。在JSON格式中,表示如下:

{
"args": ["beijing", "shanghai", "shenzhen", "guangzhou"]
}

当然Lists的子项也可以是Maps,Maps的子项也可以是List,例如:

---
apiVersion: v1
kind: Pod
metadata:
name: kube100-site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort:
- name: flaskapp-demo
image: jcdemo/flaskapp
ports:

如上述文件所示,定义一个containers的List对象,每个子项都由name、image、ports组成,每个ports都有一个KEY为containerPort的Map组成,转成JSON格式文件:

{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "kube100-site",
"labels": {
"app": "web"
}, },
"spec": {
"containers": [{
"name": "front-end",
"image": "nginx",
"ports": [{
"containerPort": ""
}]
}, {
"name": "flaskapp-demo",
"image": "jcdemo/flaskapp",
"ports": [{
"containerPort": ""
}]
}]
}
}

二、使用YAML创建Pod

创建Pod

---
apiVersion: v1
kind: Pod
metadata:
name: kube100-site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort:
- name: flaskapp-demo
image: jcdemo/flaskapp
ports:
- containerPort:

上面定义了一个普通的Pod文件,简单分析下文件内容:

  • apiVersion:此处值是v1,这个版本号需要根据安装的Kubernetes版本和资源类型进行变化,记住不是写死的。
  • kind:此处创建的是Pod,根据实际情况,此处资源类型可以是Deployment、Job、Ingress、Service等。
  • metadata:包含Pod的一些meta信息,比如名称、namespace、标签等信息。
  • spe:包括一些container,storage,volume以及其他Kubernetes需要的参数,以及诸如是否在容器失败时重新启动容器的属性。可在特定Kubernetes API找到完整的Kubernetes Pod的属性。

下面是一个典型的容器的定义:


spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort:

上述例子只是一个简单的最小定义:一个名字(front-end)、基于nginx的镜像,以及容器将会监听的指定端口号(80)。

除了上述的基本属性外,还能够指定复杂的属性,包括容器启动运行的命令、使用的参数、工作目录以及每次实例化是否拉取新的副本。 还可以指定更深入的信息,例如容器的退出日志的位置。容器可选的设置属性包括:

name、image、command、args、workingDir、ports、env、resource、volumeMounts、livenessProbe、readinessProbe、livecycle、terminationMessagePath、imagePullPolicy、securityContext、stdin、stdinOnce、tty

了解了Pod的定义后,将上面创建Pod的YAML文件保存成pod.yaml,然后使用Kubectl创建Pod:

$ kubectl create -f pod.yaml
pod "kube100-site" created

可以使用Kubectl命令查看Pod的状态

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kube100-site / Running 1m

注: Pod创建过程中如果出现错误,可以使用kubectl describe 进行排查。

创建Deployment

上述介绍了如何使用YAML文件创建Pod实例,但是如果这个Pod出现了故障的话,对应的服务也就挂掉了,所以Kubernetes提供了一个Deployment的概念 ,目的是让Kubernetes去管理一组Pod的副本,也就是副本集 ,这样就能够保证一定数量的副本一直可用,不会因为某一个Pod挂掉导致整个服务挂掉。

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kube100-site
spec:
replicas:
template:
metadata:
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort:
- name: flaskapp-demo
image: jcdemo/flaskapp
ports:
- containerPort:

一个完整的Deployment的YAML文件如上所示,接下来解释部分内容:

  • 注意这里apiVersion对应的值是extensions/v1beta1,同时也需要将kind的类型指定为Deployment。
  • metadata指定一些meta信息,包括名字或标签之类的。
  • spec 选项定义需要两个副本,此处可以设置很多属性,例如受此Deployment影响的Pod的选择器等
  • spec 选项的template其实就是对Pod对象的定义
  • 可以在Kubernetes v1beta1 API 参考中找到完整的Deployment可指定的参数列表
  • 将上述的YAML文件保存为deployment.yaml,然后创建Deployment:

三、使用k8s创建应用

关于k8s的安装,请参考连接:

https://www.cnblogs.com/xiao987334176/p/9947548.html

本文就是基于此链接的环境来搭建的。

新建yaml文件

这里使用 jcdemo/flaskapp 镜像,来介绍,如何创建一个flask应用。

登录到k8s主控端,也就是master节点。新建文件 flask.yaml

vim flask.yaml

内容如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: flaskapp-1
spec:
replicas: 1
template:
metadata:
labels:
name: flaskapp-1
spec:
containers:
- name: flaskapp-1
image: jcdemo/flaskapp
ports:
- containerPort: 5000 ---
apiVersion: v1
kind: Service
metadata:
name: flaskapp-1
labels:
name: flaskapp-1
spec:
type: NodePort
ports:
- port: 5000
name: flaskapp-port
targetPort: 5000
protocol: TCP
nodePort: 30005
selector:
name: flaskapp-1

NodePort方式暴露服务的端口的默认范围(30000-32767)

大概解释一下,这个yaml文件。它分为2部分。蓝色部分 提供节点,红色部分 暴露服务

为什么要分为这2部分呢?因为蓝色部分,只是在 k8s部署了一个pod 节点。那么它对应的服务,比如flask,外部是不能直接访问的。

怎么才能访问呢?必须 暴露服务才行。这就好比下面这个命令!

docker run -it -p : flaskapp-port

使用-p 参数将端口映射出来,其他服务器才能访问!

这2个参数,就是要暴露的端口号,使用的是TCP协议

protocol: TCP
nodePort: 30005

检验配置文件的正确性

当你不确定声明的配置文件是否书写正确时,可以使用以下命令要验证:
kubectl create -f flask.yaml --validate

使用--validate只是会告诉你它发现的问题,仍然会按照配置文件的声明来创建资源,除非有严重的错误使创建过程无法继续,如必要的字段缺失或者字段值不合法,不在规定列表内的字段会被忽略。

可以使用如下命令检查Deployment的列表:

root@k8s-master001:~# kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
flaskapp- 18s

查看pod状态

root@k8s-master001:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
flaskapp--84b7f79cdf-bbp4p / ContainerCreating 27s <none> k8s-node002

提示正在创建中,等待几秒钟,再次查看

root@k8s-master001:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
flaskapp--84b7f79cdf-bbp4p / Running 31s 192.138.6.130 k8s-node002

如果状态是 Running,并且出现了IP地址,那么表示部署成功了!

如果状态不是Running,查看日志

kubectl describe po flaskapp--84b7f79cdf-bbp4p

如果 出现错误,需要解决错误,将应用删除,使用命令

这个是单个pod删除

kubectl delete pods flaskapp--84b7f79cdf-bbp4p

如果需要删除flaskapp所有的pod,使用命令

kubectl delete -f flask.yaml

如果images更新了,修改yaml文件,重新应用一遍

kubectl apply -f flask.yaml

访问应用

这个时候,就可以访问flask页面了

root@k8s-master001:~# curl http://192.138.6.130:5000/
<html><head><title>Docker + Flask Demo</title></head><body><table><tr><td> Start Time </td> <td>-Dec- ::</td> </tr><tr><td> Hostname </td> <td>flaskapp--84b7f79cdf-bbp4p</td> </tr><tr><td> Local Address </td> <td>192.138.6.130</td> </tr><tr><td> Remote Address </td> <td>192.138.121.64</td> </tr><tr><td> Server Hit </td> <td></td> </tr></table></body></html>root@k8s-master001:~#

我想直接使用windows 10访问flask,可不可呢?

不可以!为什么?因为我的电脑不能直接访问 192.138.0.0/16 的网络。这个是k8s的pod 网络。

添加路由

首先需要在windows 10 中添加路由,比如:k8s主控端的地址为 192.168.0.102

确保cmd打开时,以管理员身份运行,否则提示没有权限!

在cmd中输入如下命令:

route add 192.138.0.0 MASK 255.255.0.0 192.168.0.121

设置nat规则

登录到k8s 主控端,添加一个nat规则。

其中 -s 是你的客户端网络,-d 是k8s 的 pod 网络。-o 指定网卡。tunl0是k8s集群,创建的。

iptables -t nat -I POSTROUTING -s 192.168.0.0/ -d 192.138.0.0/ -o tunl0 -j MASQUERADE

使用windos 10 访问flask页面,效果如下:

或者使用 http://node_ip:30005 也是可以访问的。

本文参考链接:

https://blog.csdn.net/phantom_111/article/details/79427144

最新文章

  1. [Leetcode][JAVA] Flatten Binary Tree to Linked List
  2. jQuery ajax()使用serialize()提交form数据
  3. hp unix
  4. Java处理InterruptedException异常小结
  5. poj 2524 Ubiquitous Religions(宗教信仰)
  6. Android 应用层知识纲要
  7. hadoop笔记之hdfs shell操作
  8. 《深入理解mybatis原理》 MyBatis事务管理机制
  9. python webdriver安装
  10. Web API 路由 [一] Convention-Based Routing
  11. gdb学习(一)[第二版]
  12. 企业级Harbor介绍及安装
  13. 一起学Android之Intent
  14. [Swift]LeetCode888. 公平的糖果交换 | Fair Candy Swap
  15. IDEA ----Apachemaven连接私服,mavenWed工程 、以及Tomcat配置和项目的部署
  16. 【macOS】 在OpenCV下训练Haar特征分类器
  17. 玩转spring boot——负载均衡与session共享
  18. centos打开matlab的正确姿势
  19. 喵哈哈村的魔法考试 Round #13 (Div.2) 题解
  20. pycurl提示load dll failed 找不到注册程序

热门文章

  1. R语言画图
  2. Digia公司投资qt
  3. java基础-引用数据类型之二维数组(Array)
  4. java基础-Math类常用方法介绍
  5. node.js如何让前端请求时能跨域
  6. CF&amp;&amp;CC百套计划1 Codeforces Round #449 B. Ithea Plays With Chtholly
  7. BFS:八数码问题
  8. hive介绍
  9. Web API: Security: Authentication and Authority
  10. html_entity_decode() 将 HTML 实体转成字符原型