kubernetes入门到精通(二):k8s部署Tomcat集群,基于NTFS协议的文件集群共享,Service提供负载均衡,端口转发工具Rinetd配置外部访问
首先,配置 Docker 镜像加速服务
登录阿里云账号,进入控制台 -> 容器镜像服务
(不需要有阿里云的服务器,只要注册账号即可)
在两台 node 节点上配置好阿里云的镜像加速。
重启一下 docker
sudo systemctl restart docker
重启一下 k8s
systemctl start kubelet
部署Tomcat集群
关于 k8s 的安装,看我上一篇博客:
https://blog.csdn.net/sinat_42483341/article/details/107283742
默认已经安装好三台 k8s 的集群,主机规划:
主机名称 | node01 | node02 | node03 |
---|---|---|---|
角色 | master | node | node |
IP 地址 | 10.0.0.131 | 10.0.0.132 | 10.0.0.133 |
方法1:使用可视化界面部署 tomcat 集群
dashboard -> 工作负载 -> 创建 -> 创建应用
稍等几分钟之后,可以看到容器自动帮我们下载好了tomcat镜像,并且已经运行起来了。
怎么访问各个节点 tomcat 的内部端口?
- 用 node02 的 ip:32656 访问 node02 上的 tomcat
- 用 node03 的 ip:32656 访问 node03 上的 tomcat
注意这里的端口号是 k8s 随机生成的,你要去副本集里面,查看你自己的端口号。
方法2:使用 Deployment 脚本创建并部署 Tomcat 集群
Deployment 脚本范本
与部署相关的常用命令
kubectl create -f # 部署yml文件,创建部署
kubectl apply -f # 部署yml文件,更新部署配置。例如,2个改为4个之后,用这个使配置更细
kubectl get pod [-o wide] # 查看已部署的pod,-o wide是可选参数,可以让信息更加详细
kubectl describe pod pod名称 # 查看pod完整的详细信息
kubectl logs [-f] pod名称 # 查看pod内部输出的日志,比如看到tomcat的控制台输出,-f参数表示实时更新
创建yaml文件
cd /usr/local/
mkdir k8s
cd k8s
mkdir tomcat-deploy
cd tomcat-deploy
vim tomcat-deploy.yml# 配置文件如下
apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: tomcat-deploy
spec: replicas: 2template:metadata:labels:app: tomcat-clusterspec:containers:- name: tomcat-clusterimage: tomcat:8ports:- containerPort: 8080# 根据配置文件创建
kubectl create -f ./tomcat-deploy.yml
查看部署后的信息
名称为 tomcat-deploy 的实例就是刚刚部署的 tomcat
my-tomcat 是之前用图形化方式创建的,不用管它
kubectl get deployment
kubectl get pod -o wide
可以用 kubectl describe tomcat-deploy-698fd7bd4f-98gc8
查看更详细的描述信息
外部访问 Tomcat 集群(NodePort方式)
Service 服务用于对外暴露应用
增加 tomcat-service,它也是一个 pod,是访问内部容器的统一入口
# 创建 /usr/local/k8s/tomcat-service
mkdir tomcat-service && cd tomcat-service && vim tomcat-service.yml# 配置文件内容如下
apiVersion: v1
kind: Service
metadata:name: tomcat-servicelabels:app: tomcat-service
spec:type: NodePortselector:app: tomcat-clusterports:- port: 8000targetPort: 8080nodePort: 32500# 如果没有配置自启动的话,别忘了在三台机器上启动一下k8s
systemctl start kubelet# 根据配置文件,生成服务
kubectl create -f ./tomcat-service.yml# 查看服务状态
kubectl get service
查看 service 的更详细配置信息
kubectl describe service tomcat-service
然后,就可以利用宿主机上向外暴露的 32500 端口(10.0.0.132:32500
,10.0.0.133:32500
),从浏览器访问 tomcat 应用了~
关于(2020.01.05)后的所有版本,tomcat 首页 404 的原因:
个人猜测:因为docker推荐将webapps下的文件挂载在宿主机下,否则删除tomcat容器的时候服务文件会全部丢失,为了让大家主动将webapps挂载出来,可能维护者将以后的tomcat镜像全部改成webapps为空,需要使用者手动将webapps.dist
目录复制出来并挂载使用
参考:https://www.cnblogs.com/jying/p/12176107.html
基于 NFS 协议的文件集群共享:解决集群中节点的docker容器内部的文件同步问题
什么是 NFS?
- NTFS解决了发布项目时,不同节点的文件需要同步问题。
安装 NTFS
# 在master上安装
yum install -y nfs-utils rpcbind# 在两个node上安装
yum install -y nfs-utils
集群文件共享
可以将node3看成文件共享服务器,保存了这个集群中所有要共享的文件数据,通过目录挂载,进行远程的文件目录映射。
- 只要一个发生改变,全局所有的文件都会发生改变。
- 一次性解决所有容器之间的文件共享问题。
我们将 master 作为文件共享服务器。
在master上进行以下设置:
mkdir -pv /usr/local/data/www-data && cd /usr/local/data/www-data && vim /etc/exports# 配置如下,设置了共享文件夹
/usr/local/data/www-data 10.0.0.131/24(rw,sync) # rw表示可读可写,sync表示同步写入# 启动nfs服务、设置开机启动
systemctl start nfs.service
systemctl enable nfs.service# 启动rpc绑定服务、设置开机启动
systemctl start rpcbind.service
systemctl enable rpcbind.service
检测是否配置成功
exportfs
在两台node上进行以下设置:
1、查看master上的共享文件夹
showmount -e 10.0.0.131
2、挂载
设置完之后,要重新进入 mnt 目录才能看到效果
# 将 master 上的/usr/local/data/www-data,挂载到本机的/mnt下
mount 10.0.0.131:/usr/local/data/www-data /mnt
3、测试挂载效果
(注意,在两个node上是没有权限对文件进行修改的)
把原有的部署删除,我们要创建新的部署
1、删除原有的部署
kubectl get deployment
kubectl delete deployment tomcat-deploy
删除之后:
2、删除原有的service
# 查看service
kubectl get service
# 删除service
kubectl delete service tomcat-service
3、调整原来的脚本
cd /usr/local/k8s/tomcat-deploy/
vim tomcat-deploy.yml# 调整如下
apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: tomcat-deploy
spec:replicas: 2template:metadata:labels:app: tomcat-clusterspec:volumes:- name: web-apphostPath:path: /mntcontainers:- name: tomcat-clusterimage: tomcat:8ports:- containerPort: 8080volumeMounts:- name: web-appmountPath: /usr/local/tomcat/webapps
4、创建部署
kubectl create -f tomcat-deploy.yml
5、检查一下吧,我们来验证node02这台机器
进入 docker 容器,检查挂载目录是否成功
docker exec -it 9fed8619284a /bin/bash
在master中修改文件,可以看到,在docker容器中,能够随时同步master对文件的修改。
至此,我们通过一个节点,管理了整个集群要共享的文件!
上面这是个笨办法,需要手动进入docker容器才行。
那么,如何在master服务器上,对全局的docker容器进行观察呢?
在 master 上使用命令:
kubectl get pod -o wide # 查看所有的pod
kubectl exec -it tomcat-deploy-6659b6749b-8xwhq /bin/bash # 直接进入某个pod的容器内部交互
Service 提供负载均衡实现:由 Master 上面的 tomcat-service 进行自动请求转发
统一应用入口,至于后端有几个tomcat,我们不用去关心,一切交由服务进行配置和转发。
查看并删除已经部署的服务
# 查看已经部署的服务
kubectl get service# 如果需要删除的话
kubectl delete service 服务名称# 编辑之前的 tomcat-service.yml,把向外暴露端口的这两行注释掉
apiVersion: v1
kind: Service
metadata:name: tomcat-servicelabels:app: tomcat-service
spec:
# type: NodePortselector:app: tomcat-clusterports:- port: 8000targetPort: 8080
# nodePort: 32500# 根据配置文件,生成服务
kubectl create -f ./tomcat-service.yml
查看服务的详细信息
kubectl get service
kubectl describe service tomcat-service
发送get请求
curl 10.108.170.161:8000
测试负载均衡的效果
# 新建一个页面
cd /usr/local/data/www-data && mkdir test
vim index.jsp# index.jsp
当前服务器ip:<%=request.getLocalAddr()%>
发送多次请求curl 10.108.170.161:8000/test
,你看,请求被随机发送到两台节点上了,k8s帮我们做了负载均衡
10.108.170.161:8000
这个 url,在外部的浏览器是无法访问的。在集群外侧,只能通过主机的网卡ip进行访问。
那么如何做地址映射呢?可以使用 Linux 中的端口转发工具:Rinetd
使用 Linux 中的端口转发工具:Rinetd
wget https://boutell.com/rinetd/http/rinetd.tar.gz # 这个已经访问不到了,需要自行下载离线包
tar -xvf rinetd.tar.gz
cd rinetd
sed -i 's/65536/65535/g' rinetd.c
mkdir -p /usr/man/ # rinetd的要求目录,需要手动创建
yum install -y gcc # 没有gcc的话安装一下
make && make installvi /etc/rinetd.conf
# 配置文件格式很简单:[Source Address] [Source Port] [Destination Address] [Destination Port]
# 简单翻译一下:源IP 源端口 目标IP 目标端口
# 每行一条转发规则.# 配置文件这样写:
# 0.0.0.0表示允许所有ip发送请求,8000表示master对外开放8000端口
# 每当 master 的 8000 端口接收到请求后,都转发到内部的 10.108.170.161:8000
0.0.0.0 8000 10.108.170.161 8000
启动和关闭转发程序:
启动:rinetd -c /etc/rinetd.conf
关闭:killall rinetd
检验端口转发程序是否正确运行:netstat -tanulp|grep rinetd
浏览器访问 master 的 ip:8000,可以顺利访问了,并且自带负载均衡
集群配置调整与资源限定
1、更新集群配置
比如,你想把tomcat的数量由原来的3台调整为4台。修改配置文件后,执行:
kubectl apply -f yml文件路径
2、删除已有的部署/服务
# 删除已有部署
bubectl delete deployment 部署的名称# 删除已有服务
bubectl delete service 服务的名称
3、对资源进行限定
在tomcat-deploy.yml
文件中,限定创建的容器可以使用多少 CPU/ 内存 等资源
- 需要满足 requests 需要,才能在这个节点上进行容器的部署(限定了基本需要)
- 容器最多可以使用这个节点上的 limits 限制(限定了最大资源i)
CPU 的单位可以不是整数,例如,0.5
apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: tomcat-deploy
spec: replicas: 3template:metadata:labels:app: tomcat-clusterspec:volumes: - name: web-apphostPath: path: /mntcontainers:- name: tomcat-clusterimage: tomcat:8resources:requests:cpu: 0.5memory: 200Milimits:cpu: 1memory: 512Miports:- containerPort: 8080volumeMounts:- name: web-appmountPath: /usr/local/tomcat/webapps
kubectl apply -f tomcat-deploy.yml
更新集群配置
可以看到原来的 2 个 tomcat 变成了现在的 3 个 tomcat,那么,k8s 是以什么依据选择的节点?
可用资源优先原则:哪个机器的负载低,就优先把新的 pod 部署在这个节点上。
另外,我们也可以指定将容器放在哪个节点上。
至此,关于 k8s 的配置与使用,我们讲完啦!
使用 k8s 在集群中部署项目
1、项目拓扑
2、部署需要的所有文件
全部文件都在这里:
- dist:包含 springboot 打包的 jar
- sql:数据库导出的 sql,配置好挂载后,mysql 启动时,会自动导入数据文件
kubernetes入门到精通(二):k8s部署Tomcat集群,基于NTFS协议的文件集群共享,Service提供负载均衡,端口转发工具Rinetd配置外部访问相关推荐
- java从入门到精通二十三(Servlet)
java从入门到精通二十三(Servlet) Servlet 说明 Servlet初步入门尝试 Servlet生命周期 Servlet方法说明和体系结构 方法说明 体系结构说明 一些优化封装 urlP ...
- Hive3入门至精通(基础、部署、理论、SQL、函数、运算以及性能优化)15-28章
Hive3入门至精通(基础.部署.理论.SQL.函数.运算以及性能优化)15-28章 [Hive3入门至精通(基础.部署.理论.SQL.函数.运算以及性能优化)1-14章](https://blog. ...
- java从入门到精通二十四(三层架构完成增删改查)
java从入门到精通二十四(三层架构完成增删改查) 前言 环境准备 创建web项目结构 导入依赖和配置文件 创建层次模型 实现查询 实现添加 实现修改 完成删除 做一个用户登录验证 会话技术 cook ...
- k8s部署tomcat及web应用_k8s部署tomcat的yaml文件
1.k8s部署tomcat的yaml文件 apiVersion: apps/v1 kind: Deployment metadata: name: mytomcat spec: replicas: 5 ...
- Kali Linux 从入门到精通(二)-安装
Kali Linux 从入门到精通(二)-安装 Kail Linux 安装 持久加密USB安装-1 LUSK:Linux Unified Key Setup 磁盘分区加密规范 不依赖与操作系统的磁盘级 ...
- Mybatis从入门到精通二(入门详解)
Mybatis从入门到精通二(想学Mybatis,看了这一篇你就不需要其他的了) 本课程分为两天第一天的请参考: https://blog.csdn.net/weixin_43564627/artic ...
- Elasticsearch7从入门到精通(简介、部署、原理、开发、ELK)
Elasticsearch7从入门到精通(简介.部署.原理.开发.ELK) 第1章.Elasticsearch简介 1-1.Elasticsearch介绍 Elasticsearch官方网站:http ...
- (K8s入门到精通) 10 k8s service(SVC),管理多个pod信息
SVC 通过label 标签去匹配自己的pod,定义在selector属性中 每个pod 创建时都会指定自己label标签 pod死了一个,deployment新建一个,新的是新IP Nginx中配置 ...
- docker 部署rabbitmq,k8s部署rabbitmq集群,跟踪和监控rabbitmq
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 rabbit原理和架构可以参考https://blog.csdn.net/luanpeng825485697/article/details/8208 ...
最新文章
- 深度学习发展简要笔记
- SoftGrid教程-注意事项、错误代码
- PCIE4.0 简单介绍
- 初识设计模式(单例模式)
- 鼠标移至图片后抖动的JS代码
- 关于a+b共创建了几个对象的问题
- 栈的应用(进制转换)
- java实现语法分析实验报告_[源码和文档分享]基于JAVA实现的基于LL(1)语法分析构造表...
- wget 命令的使用:HTTP文件下载、FTP文件下载
- 超详细! 利用Synopsys VCS对Verilog代码加密的四种方法
- IP路由原理 直连路由和静态路由 路由协议
- java——阿里云短信工具类
- 5G商用牌照发放,“以竞争促落地”,日常5G服务可期
- Photoshop(PS)制作牛年红包
- linux xmanager使用教程,Xmanager企业版中各软件功能简介
- 银联在线支付5.0.0版-仿真端
- ACL扩展IP访问控制列表配置
- 【基础入门题006】求身份证校验位是否正确
- 天线巴伦制作和原理_【火腿DIY】巴伦知识图集|手把手教您制作1:1短波巴伦
- 云计算:openstack neutron(tap、qvb、qvo、qbr详解)
热门文章
- POJ - 3261 Milk Patterns(二分+后缀数组)
- POJ - 2689 Prime Distance(素数区间筛模板)
- 0459-Repeated Substring Pattern(重复的子字符串)
- php 的常量能不能删除,php能删除常量吗
- 7.IDA-创建结构体
- 【玩转cocos2d-x之三十一】弱联网与服务器的通讯
- WebRTC 的 AudioSource/AudioTrack
- live555 源码分析: DESCRIBE 的处理
- Java多线程知识小抄集(二)
- 音视频技术开发周刊 | 239