首先,配置 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:3250010.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配置外部访问相关推荐

  1. java从入门到精通二十三(Servlet)

    java从入门到精通二十三(Servlet) Servlet 说明 Servlet初步入门尝试 Servlet生命周期 Servlet方法说明和体系结构 方法说明 体系结构说明 一些优化封装 urlP ...

  2. Hive3入门至精通(基础、部署、理论、SQL、函数、运算以及性能优化)15-28章

    Hive3入门至精通(基础.部署.理论.SQL.函数.运算以及性能优化)15-28章 [Hive3入门至精通(基础.部署.理论.SQL.函数.运算以及性能优化)1-14章](https://blog. ...

  3. java从入门到精通二十四(三层架构完成增删改查)

    java从入门到精通二十四(三层架构完成增删改查) 前言 环境准备 创建web项目结构 导入依赖和配置文件 创建层次模型 实现查询 实现添加 实现修改 完成删除 做一个用户登录验证 会话技术 cook ...

  4. k8s部署tomcat及web应用_k8s部署tomcat的yaml文件

    1.k8s部署tomcat的yaml文件 apiVersion: apps/v1 kind: Deployment metadata: name: mytomcat spec: replicas: 5 ...

  5. Kali Linux 从入门到精通(二)-安装

    Kali Linux 从入门到精通(二)-安装 Kail Linux 安装 持久加密USB安装-1 LUSK:Linux Unified Key Setup 磁盘分区加密规范 不依赖与操作系统的磁盘级 ...

  6. Mybatis从入门到精通二(入门详解)

    Mybatis从入门到精通二(想学Mybatis,看了这一篇你就不需要其他的了) 本课程分为两天第一天的请参考: https://blog.csdn.net/weixin_43564627/artic ...

  7. Elasticsearch7从入门到精通(简介、部署、原理、开发、ELK)

    Elasticsearch7从入门到精通(简介.部署.原理.开发.ELK) 第1章.Elasticsearch简介 1-1.Elasticsearch介绍 Elasticsearch官方网站:http ...

  8. (K8s入门到精通) 10 k8s service(SVC),管理多个pod信息

    SVC 通过label 标签去匹配自己的pod,定义在selector属性中 每个pod 创建时都会指定自己label标签 pod死了一个,deployment新建一个,新的是新IP Nginx中配置 ...

  9. docker 部署rabbitmq,k8s部署rabbitmq集群,跟踪和监控rabbitmq

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 rabbit原理和架构可以参考https://blog.csdn.net/luanpeng825485697/article/details/8208 ...

最新文章

  1. 深度学习发展简要笔记
  2. SoftGrid教程-注意事项、错误代码
  3. PCIE4.0 简单介绍
  4. 初识设计模式(单例模式)
  5. 鼠标移至图片后抖动的JS代码
  6. 关于a+b共创建了几个对象的问题
  7. 栈的应用(进制转换)
  8. java实现语法分析实验报告_[源码和文档分享]基于JAVA实现的基于LL(1)语法分析构造表...
  9. wget 命令的使用:HTTP文件下载、FTP文件下载
  10. 超详细! 利用Synopsys VCS对Verilog代码加密的四种方法
  11. IP路由原理 直连路由和静态路由 路由协议
  12. java——阿里云短信工具类
  13. 5G商用牌照发放,“以竞争促落地”,日常5G服务可期
  14. Photoshop(PS)制作牛年红包
  15. linux xmanager使用教程,Xmanager企业版中各软件功能简介
  16. 银联在线支付5.0.0版-仿真端
  17. ACL扩展IP访问控制列表配置
  18. 【基础入门题006】求身份证校验位是否正确
  19. 天线巴伦制作和原理_【火腿DIY】巴伦知识图集|手把手教您制作1:1短波巴伦
  20. 云计算:openstack neutron(tap、qvb、qvo、qbr详解)

热门文章

  1. POJ - 3261 Milk Patterns(二分+后缀数组)
  2. POJ - 2689 Prime Distance(素数区间筛模板)
  3. 0459-Repeated Substring Pattern(重复的子字符串)
  4. php 的常量能不能删除,php能删除常量吗
  5. 7.IDA-创建结构体
  6. 【玩转cocos2d-x之三十一】弱联网与服务器的通讯
  7. WebRTC 的 AudioSource/AudioTrack
  8. live555 源码分析: DESCRIBE 的处理
  9. Java多线程知识小抄集(二)
  10. 音视频技术开发周刊 | 239