大家好,又见面了,我是你们的朋友全栈君。
首先,配置 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: 2
template:
metadata:
labels:
app: tomcat-cluster
spec:
containers:
- name: tomcat-cluster
image: tomcat:8
ports:
- 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-service
labels:
app: tomcat-service
spec:
type: NodePort
selector:
app: tomcat-cluster
ports:
- port: 8000
targetPort: 8080
nodePort: 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: 2
template:
metadata:
labels:
app: tomcat-cluster
spec:
volumes:
- name: web-app
hostPath:
path: /mnt
containers:
- name: tomcat-cluster
image: tomcat:8
ports:
- containerPort: 8080
volumeMounts:
- name: web-app
mountPath: /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-service
labels:
app: tomcat-service
spec:
# type: NodePort
selector:
app: tomcat-cluster
ports:
- port: 8000
targetPort: 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 install
vi /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: 3
template:
metadata:
labels:
app: tomcat-cluster
spec:
volumes:
- name: web-app
hostPath:
path: /mnt
containers:
- name: tomcat-cluster
image: tomcat:8
resources:
requests:
cpu: 0.5
memory: 200Mi
limits:
cpu: 1
memory: 512Mi
ports:
- containerPort: 8080
volumeMounts:
- name: web-app
mountPath: /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 启动时,会自动导入数据文件
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126281.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...