YAML基础知识及搭建一台简洁版guestbook
一,前言
前面我们已经搭建过简易版k8s集群了,在此基础上可以搭建一个简洁版guestbook ,以便来学习k8s创建pod的整个过程。
二,在此之前,我们还需要学习一下YAML基础知识
YAML 基础
YAML
是专门用来写配置文件的语言,非常简洁和强大,远比JSON
格式方便。YAML
语言(发音 /ˈjæməl/)的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。
它的基本语法规则如下:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
#
表示注释,从这个字符一直到行尾,都会被解析器忽略。
在我们的kubernetes
中,你只需要两种结构类型就行了:
- Lists
- Maps
也就是说,你可能会遇到Lists的Maps和Maps的Lists,等等。不过不用担心,你只要掌握了这两种结构也就可以了,其他更加复杂的我们暂不讨论。
Maps
首先我们来看看Maps
,我们都知道Map
是字典,就是一个key:value的键值对,Maps
可以让我们更加方便的去书写配置信息,例如:
---
apiVersion: v1 kind: Pod
第一行的---
是分隔符,是可选的,在单一文件中,可用连续三个连字号---
区分多个文件。这里我们可以看到,我们有两个键:kind 和 apiVersion,他们对应的值分别是:v1和Pod。上面的 YAML 文件转换成 JSON 格式的话,你肯定就容易明白了:
{
"apiVersion": "v1",
"kind": "pod"
}
我们在创建一个相对复杂一点的 YAML 文件,创建一个 KEY 对应的值不是字符串而是一个 Maps:
---
apiVersion: v1
kind: Pod
metadata:
name: kube100-site
labels:
app: web
上面的 YAML 文件,metadata 这个 KEY 对应的值就是一个Maps
了,而且嵌套的 labels 这个 KEY 的值又是一个Map,你可以根据你自己的情况进行多层嵌套。
上面我们也提到了 YAML 文件的语法规则,YAML 处理器是根据行缩进来知道内容之间的嗯关联性的。比如我们上面的 YAML 文件,我用了两个空格作为缩进,空格的数量并不重要,但是你得保持一致,并且至少要求一个空格(什么意思?就是你别一会缩进两个空格,一会缩进4个空格)。我们可以看到 name 和 labels 是相同级别的缩进,所以 YAML 处理器就知道了他们属于同一个 MAP,而 app 是 labels 的值是因为 app 的缩进更大。
注意:在 YAML 文件中绝对不要使用 tab 键。
同样的,我们可以将上面的 YAML 文件转换成 JSON 文件:
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "kube100-site",
"labels": {
"app": "web"
}
}
}
或许你对上面的 JSON 文件更熟悉,但是你不得不承认 YAML 文件的语义化程度更高吧?
Lists
Lists
就是列表,说白了就是数组,在 YAML 文件中我们可以这样定义:
args
- Cat
- Dog
- Fish
你可以有任何数量的项在列表中,每个项的定义以破折号(-
)开头的,与父元素直接可以缩进一个空格。对应的 JSON 格式如下:
{
"args": [ 'Cat', 'Dog', 'Fish' ]
}
当然,list 的子项也可以是 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:
- containerPort:
比如这个 YAML 文件,我们定义了一个叫 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": ""
}]
}]
}
}
是不是觉得用 JSON 格式的话文件明显比 YAML 文件更复杂了呢?
三,创建pod
使用 YAML 创建 Pod
现在我们已经对 YAML 文件有了大概的了解了,我相信你应该没有之前那么懵逼了吧?我们还是来使用 YAML 文件来创建一个 Deployment 。
#创建pod的过程,都在master上进行操作。
#如下是需要用到的YAML文件
1,redis-master-deployment.yaml配置文件
[root@master guestbook]# cat redis-master-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: redis-master
spec:
replicas:
template:
metadata:
labels:
app: redis
role: master
tier: backend
spec:
containers:
- name: master
# image: redis
image: 192.168.200.10/redis/redis:master
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort:
#注意,配置文件中 image此处使用的我本地harbor上的image,你也可以直接写注释行的image:redis 。即可从外网下载redis镜像,此过程pod启动较慢,需要耐心等待。
#下文中出现的任何image均可被替换为自己的本地的image
2,redis-master-service.yaml配置文件
[root@master guestbook]# cat redis-master-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
app: redis
role: master
tier: backend
spec:
ports:
# the port that this service should serve on
- port:
targetPort:
selector:
app: redis
role: master
tier: backend
3,redis-slave-deployment.yaml
[root@master guestbook]# cat redis-slave-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: redis-slave
spec:
replicas:
template:
metadata:
labels:
app: redis
role: slave
tier: backend
spec:
containers:
- name: slave
image: 192.168.200.10/redis/redis:slave resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort:
#注 此处image可以替换为:image: kubeguide/guestbook-redis-slave
4,redis-slave-service.yaml配置文件
[root@master guestbook]# cat redis-slave-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
app: redis
role: slave
tier: backend
spec:
ports:
# the port that this service should serve on
- port:
selector:
app: redis
role: slave
tier: backend
5,frontend-deployment.yaml配置文件
[root@master guestbook]# cat frontend-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: frontend
spec:
replicas:
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: kubeguide/guestbook-php-frontend
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort:
6,frontend-service.yaml配置文件
[root@master guestbook]# cat frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
type: NodePort
ports:
# the port that this service should serve on
- port:
nodePort:
selector:
app: guestbook
tier: frontend
四,启动pod
1,启动redis master
使用deployment确保只有一个pod在运行(当某个节点down了,deploy会在另一个健康的node启动redis master),但可能会有数据丢失。
[root@master guestbook]# kubectl create -f redis-master-deployment.yaml deployment "redis-master" created
2,启动master service
一个kubernetes service会对一个或多个container进行负载均衡,这是通过我们上面redis-master中定义的labels元数据实现的,值得注意的是,在redis中只有一个master,但是我们依然为它创建一个service,这是因为这样我们就能使用一个elastic IP来路由到具体某一个master。
kubernetes集群中的service是通过container中的环境变量实现服务发现的,service基于pod label实现container的负载均衡。
在第一步中创建的pod包含了一个label“name=redis-master”,service的selector字段决定了service将流量转发给哪个pod,port和targetPort信息定义了service proxy运行在什么端口。
[root@master guestbook]# kubectl create -f redis-master-service.yaml
service "redis-master" created #查看创建的service
[root@master guestbook]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend 10.254.206.198 <nodes> :/TCP 5d
kubernetes 10.254.0.1 <none> /TCP 8d
nginx 10.254.178.122 <pending> :/TCP 4d
redis-master 10.254.90.116 <none> /TCP 5d
redis-slave 10.254.248.244 <none> /TCP 5d
3,同样的方式创建其他pod,如果出现是吧,可打开/var/log/message/下进行查看。
4,在master上查看创建的pod详细信息
#查看service信息
[root@master guestbook]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend 10.254.206.198 <nodes> :/TCP 5d
kubernetes 10.254.0.1 <none> /TCP 8d
nginx 10.254.178.122 <pending> :/TCP 4d
redis-master 10.254.90.116 <none> /TCP 5d
redis-slave 10.254.248.244 <none> /TCP 5d [root@master guestbook]# kubectl get service --all-namespaces
NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default frontend 10.254.206.198 <nodes> :/TCP 5d
default kubernetes 10.254.0.1 <none> /TCP 8d
default nginx 10.254.178.122 <pending> :/TCP 4d
default redis-master 10.254.90.116 <none> /TCP 5d
default redis-slave 10.254.248.244 <none> /TCP 5d
kube-system kubernetes-dashboard 10.254.22.70 <nodes> :/TCP 4d #查看pod信息
[root@master guestbook]# kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
default frontend--bvpkx / Running 5d 10.255.98.3 192.168.20.75
default frontend--lg52q / Running 5d 10.255.39.4 192.168.20.76
default frontend--z67ct / Running 5d 10.255.34.2 192.168.20.74
default nginx--19ms4 / Running 4d 10.255.34.4 192.168.20.74
default redis-master--zmv8f / Running 5d 10.255.39.2 192.168.20.76
default redis-slave--bg8k5 / Running 5d 10.255.39.3 192.168.20.76
default redis-slave--m2s6n / Running 5d 10.255.98.2 192.168.20.75
kube-system kubernetes-dashboard--x47dd / Running 4d 10.255.34.3 192.168.20.74 [root@master guestbook]# kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
frontend 5d
nginx 4d
redis-master 5d
redis-slave 5d [root@master guestbook]# kubectl get deployments --all-namespaces
NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
default frontend 5d
default nginx 4d
default redis-master 5d
default redis-slave 5d
kube-system kubernetes-dashboard 4d
[root@master guestbook]#
5,可以通过任意node节点来访问
http://192.168.20.74:30001/
五,总结
由此可见,访问任意工作节点都可以,可以得出,此处可以使用VIP来实现HA。
在创建pod过程中,如果出现问题都可以通过/var/log/message 日志动态查看。
YAML基础知识及搭建一台简洁版guestbook的更多相关文章
- Java基础知识➣环境搭建与类型整理(一)
概述 公司业务需要,产品既要有.NET又需要Java,没得选择,只能业余时间学习Java,整体觉得Java也.NET还是很相似的,只是语法有差别,差别也不是很大,这就将学习Java的基础知识整理下,以 ...
- Appium基础知识与环境搭建
基础知识: 环境搭建: 1.安装jdk,配置java环境变量 (1)新建变量"JAVA_HOME",变量值"D:\Frameworks\Java\jdk1.8.0_18 ...
- vue3 自学(一)基础知识学习和搭建一个脚手架
两年前曾自学过几天vue,那时候版本还是vue2,但后来项目中一直没用到,当时也觉得学习成本太高,便没有继续学习下去.初学者可以看下链接文章以前的吐槽~~ 学习 Vue ,从入门到放弃 最近部门决定升 ...
- 快速掌握Docker必备基础知识
快速掌握Docker必备基础知识 Docker是时下热门的容器技术,相信作为一名开发人员,你一定听说过或者使用过,很多人会把Docker理解为一个轻量级虚拟机,但其实Docker与虚拟机(VM)是两种 ...
- ros基础知识总结
参考于:ros官网教程 实验楼:ros机器人操作系统自主学习实验 基础知识 1 一个catkin程序包由什么组成? 一个程序包要想称为catkin程序包必须符合以下要求: 该程序包必须包含catkin ...
- TCP/IP协议(一)网络基础知识
参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...
- FTP基础知识 FTP port(主动模式) pasv(被动模式) 及如何映射FTP
您是否正准备搭建自己的FTP网站?您知道FTP协议的工作机制吗?您知道什么是PORT方式?什么是PASV方式吗?如果您不知道,或没有完全掌握,请您坐下来,花一点点时间,细心读完这篇文章.所谓磨刀不误砍 ...
- Ant学习-001-ant 基础知识及windows环境配置
一.Ant 概要基础知识 Apache Ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发,用以构建应用,或结合其他开源测试工具例如 git.T ...
- 做好SEO需要掌握的20个基础知识
作为一个网站优化者,有一些基础seo知识点是大家必须要掌握的,网站排名的好快,和这些基础的SEO优化知识有没做好,有没做到位,有着直接的关系!今天,伟伟SEO就把我前面讲的SEO优化基础知识做个总结, ...
随机推荐
- BZOJ4777 [Usaco2017 Open]Switch Grass[最小生成树+权值线段树套平衡树]
标题解法是吓人的. 图上修改询问,不好用数据结构操作.尝试转化为树来维护.发现(不要问怎么发现的)最小生成树在这里比较行得通,因为最近异色点对一定是相邻的(很好想),所以只要看最短的一条两端连着异色点 ...
- Eclipse里导入Mybatis源码工程
打开Eclipse,在前两天的记录里我已经把Maven什么的都配置好了,还有Mybatis的源码也下载下来了,不相信的话可以去看一下我之前的记录:) OK. Mybatis源码解压之后是一个标准的Ma ...
- mysql 模拟oracle中的序列
因业务需要,把oracle 数据据转成mysql,同时oracle中程序本来一直在用 序列, mysql中没有,所以需要在mysql中新建一个表进行模拟, CREATE TABLE `sequence ...
- MySQL 关于索引的操作
-- 索引分类? 1.普通索引 2.唯一索引 3.全文索引 4.组合索引 普通索引:仅加速查询,最基本的索引,没有任何限制 唯一索引:加速查询 + 列值唯一(可以有null) 全文索引:仅适用于MyI ...
- Java 对象序列化和反序列化 (实现 Serializable 接口)
序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 ...
- php+memcache实现的网站在线人数统计
<?php $mc = new Memcache (); // 连接memcache $mc->connect ( ); // 获取 在线用户 IP 和 在线时间数据 $online_me ...
- 面向对象(oop)特征
上课时老师不止一次和我们说过,面向对象是Java基础的重中之重!!所以一定要扎实基本功,代码都是呆子活,重要的是思想! 一般来说oop的三大特性是:封装.继承和多态,上次笔者看到有把抽象也归类其中,不 ...
- npoi 导出
npoi 导出 public void Output(DataTable table, string SheetName, string reportName) { string result = s ...
- Malloc Maleficarum复盘
1.hos复盘 hos即伪造堆块,free栈上地址,然后下一个malloc去分配一个fastbin(栈上),包含返回地址. 代码来源 他这个我直接复现有问题,咨询了joker师傅,应该是gcc版本问题 ...
- HDU 5727 Necklace ( 2016多校、二分图匹配 )
题目链接 题意 : 给出 2*N 颗珠子.有 N 颗是阴的.有 N 颗是阳的.现在要把阴阳珠子串成一个环状的项链.而且要求珠子的放置方式必须的阴阳相间的.然后给出你 M 个限制关系.格式为 ( A.B ...