k8s 之yaml文件基本格式
注:yaml文件严格要求缩进,默认不同层次等级是两个空格的缩进 1、使用httpd镜像创建一个Deployment资源对象
[root@docker-k8s01 ~]# mkdir yaml
[root@docker-k8s01 ~]# cd yaml/
[root@docker-k8s01 yaml]# vim test01.yaml
kind: Deployment # 指定要创建的资源对象类型
apiVersion: extensions/v1beta1 # 指定deployment所对应的API版本
metadata:
name: test01-deploy # 定义deployment的名称
spec:
replicas: 4 # 定义需要创建pod副本的数量
template:
metadata:
labels:
user: zyz # 指定pod的标签
spec:
containers:
- name: httpd # 指定容器的名称
image: httpd # 指定创建容器基于的镜像
[root@docker-k8s01 yaml]# kubectl apply -f test01.yaml # 执行编写的文件
deployment.extensions/test01-deploy created # 返回信息显示已经创建
#注:如果不知道某个资源对象所对应的API版本,可以通过此命令查看
[root@docker-k8s01 yaml]# kubectl explain deployment
KIND: Deployment
VERSION: extensions/v1beta1 # 这就是Deployment资源所对应的API版本
#确定所执行的yaml文件生成了我们所需数量的pod
[root@docker-k8s01 ~]# kubectl get deployments test01-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
test01-deploy 4/4 4 4 2m19s
查看其pod标签,是否是我们定义的label
#查看这个资源对象的详细信息
[root@docker-k8s01 ~]# kubectl describe deployments test01-deploy
Name: test01-deploy
Namespace: default
CreationTimestamp: Wed, 26 Aug 2020 11:26:28 +0800
Labels: user=zyz # 这里就是该资源对象的标签
2、创建一个svc资源对象与上述Deployment资源对象关联。且能够对外网提供服务。映射节点端口为:32123
[root@docker-k8s01 yaml]# vim httpd-service.yaml
kind: Service
apiVersion: v1
metadata:
name: httpd-service
spec:
type: NodePort # 这里需要指定类型为“NodePort”,否则默认是cluster IP
selector:
user: zyz # 与deployment资源对象的这个标签进行关联
ports:
- protocol: TCP # 指定协议
port: 79 # 这里指定要映射到的Cluster IP的端口
targetPort: 80 # 这里指定的是要映射pod中的端口
nodePort: 32123 # 这里指定的是映射到宿主机的端口
#执行刚刚编辑的文件
[root@docker-k8s01 yaml]# kubectl apply -f httpd-service.yaml
service/httpd-service created
[root@docker-k8s01 yaml]# kubectl get svc httpd-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-service NodePort 10.102.10.20 <none> 79:32123/TCP 48s
#可以看到将指定的群集端口映射到了本地的32123
现在就可以使用client访问k8s群集中任意一个节点的32123端口,即可看到pod所提供的服务
#查看该service的详细信息
[root@docker-k8s01 yaml]# kubectl get svc httpd-service
返回的信息如下(只能显示少量IP,剩下的只是被省略了,而不是未指定)
既然上面说到了,endpoint指定的都是后端pod的IP地址,那么就来查看验证一下,是否正确
#输出后端pod的IP地址
#可以确认查看的IP能对应上上面service的endpoint指定的IP
[root@docker-k8s01 yaml]# kubectl get pod -o wide | awk '{print$6}'
IP
10.244.1.3
10.244.2.3
10.244.2.2
10.244.1.2
查看svc映射endpoint的详细情况,并详细说明负载均衡的底层原理
3、当我们做完上述操作后,client是可以访问我们pod提供的服务的(并且是负载均衡的效果),那么这是一个什么样的实现过程呢?依赖什么实现的? 其实,背后的原理并没有那么高大上,kube-proxy通过iptables的转发机制来实现负载均衡的效果的,先定义目标IP是service提供的群集IP,然后使用“-j”选项转发到其他iptables规则
[root@docker-k8s01 yaml]# kubectl get svc httpd-service | awk '{print$3}'
CLUSTER-IP
10.102.10.20 # 查看到service的群集IP
[root@docker-k8s01 yaml]# iptables-save > a.txt # 将iptables规则输出到文件中,方便我们查找
[root@docker-k8s01 yaml]# vim a.txt # 打开导出的规则进行查看
搜索我们的群集IP,可以看到,当目标地址是群集IP地址时,就会转发到另一个规则“KUBE-SVC-X2P42VLQEZCHLPKZ”,如下
那么,现在继续搜索它转发到的规则上
上面的图中,就是与他实现负载均衡相关的策略的,我们一共四个pod,所以上图中的第一个规则使用了random的算法,只有0.25(1/4)的几率采用这个规则,当到达第二条规则后,则有0.33的几率,因为去除前一个pod,还剩下三个pod,10/3=0.33,这就是这个几率的由来,依次类推,当到达最后一个规则后,那么就不用指定几率了,肯定是它来处理这条请求。
附:为node节点打标签,以便使pod运行在指定的节点
#给节点node01打标签“disktype=ssd”(自定义的标签)
[root@docker-k8s01 yaml]# kubectl label nodes node01 disktype=ssd
#相应的yaml文件如下:
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: httpd
spec:
revisionHistoryLimit: 10
replicas: 3
template:
metadata:
labels:
app: httpd-server
spec:
containers:
- name: httpd
image: 192.168.171.151:5000/httpd:v1
ports:
- containerPort: 80
nodeSelector: //指定标签选择器
disktype: ssd
- OpenCV中BLOB特征提取与几何形状分类
- OpenCV实现照片自动红眼去除
- OpenCV3.1.0级联分类器训练与使用
- 图像处理之理解Homography matrix(单应性矩阵)
- OpenCV中图像直方图与应用
- OpenCV中图像修复技术介绍与演示
- 44个Java代码性能优化总结
- LDA(Linear Discriminant Analysis)算法介绍
- Express.js 4,Node.js,MongoDB REST API 简易教程
- 基于梯度下降算法求解线性回归
- 彩色图像高斯反向投影
- OpenCV中直方图反向投影算法详解与实现
- 基于一维级联快速膨胀与腐蚀算法
- mac下利用Breakpad的dump文件进行调试
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一次KimSuky攻击事件分析
- OpenCV中如何使用滚动条动态调整参数
- 一文读懂「分布式架构」
- 老哥,您看我这篇Java集合,还有机会评优吗?
- 在 IDEA 中使用 Java 热部署插件 JRebel
- 后端必备 Git 分支开发:规范指南
- 大量的 TIME_WAIT 状态连接怎么处理?(文末有福利)
- 线上教育系统开发中,购物车功能是如何实现的?
- IntelliJ IDEA 2020.2重磅发布!全面支持Github PR。真香版本?
- 腾讯云智能语音小程序插件实现实时语音识别
- 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜
- 36个助你成为专家需要掌握的JavaScript概念
- Bulehero 蠕虫病毒安全分析报告
- 一句话加速grep近30倍
- 正道的光!这有个用TensorFlow做的小黄图过滤器