首先,配置 Docker 镜像加速服务

登录阿里云账号,进入控制台 -> 容器镜像服务

(不需要有阿里云的服务器,只要注册账号即可)

k8s如何从内网镜像拉取 k8s集群如何上传镜像_vim


在两台 node 节点上配置好阿里云的镜像加速。

重启一下 docker
sudo systemctl restart docker

重启一下 k8s
systemctl start kubelet


部署Tomcat集群

关于 k8s 的安装,看我上一篇博客:

默认已经安装好三台 k8s 的集群,主机规划:

主机名称

node01

node02

node03

角色

master

node

node

IP 地址

10.0.0.131

10.0.0.132

10.0.0.133

方法1:使用可视化界面部署 tomcat 集群

dashboard -> 工作负载 -> 创建 -> 创建应用

k8s如何从内网镜像拉取 k8s集群如何上传镜像_tomcat_02

稍等几分钟之后,可以看到容器自动帮我们下载好了tomcat镜像,并且已经运行起来了。

k8s如何从内网镜像拉取 k8s集群如何上传镜像_vim_03

k8s如何从内网镜像拉取 k8s集群如何上传镜像_k8s如何从内网镜像拉取_04

怎么访问各个节点 tomcat 的内部端口?
  • 用 node02 的 ip:32656 访问 node02 上的 tomcat
  • 用 node03 的 ip:32656 访问 node03 上的 tomcat

注意这里的端口号是 k8s 随机生成的,你要去副本集里面,查看你自己的端口号。

k8s如何从内网镜像拉取 k8s集群如何上传镜像_tomcat_05

方法2:使用 Deployment 脚本创建并部署 Tomcat 集群

k8s如何从内网镜像拉取 k8s集群如何上传镜像_vim_06

Deployment 脚本范本

k8s如何从内网镜像拉取 k8s集群如何上传镜像_vim_07


与部署相关的常用命令

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

k8s如何从内网镜像拉取 k8s集群如何上传镜像_vim_08

kubectl get pod -o wide

k8s如何从内网镜像拉取 k8s集群如何上传镜像_配置文件_09


可以用 kubectl describe tomcat-deploy-698fd7bd4f-98gc8查看更详细的描述信息


外部访问 Tomcat 集群(NodePort方式)

Service 服务用于对外暴露应用

增加 tomcat-service,它也是一个 pod,是访问内部容器的统一入口

k8s如何从内网镜像拉取 k8s集群如何上传镜像_vim_10

# 创建 /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

k8s如何从内网镜像拉取 k8s集群如何上传镜像_k8s如何从内网镜像拉取_11


查看 service 的更详细配置信息

kubectl describe service tomcat-service

k8s如何从内网镜像拉取 k8s集群如何上传镜像_k8s如何从内网镜像拉取_12

然后,就可以利用宿主机上向外暴露的 32500 端口(10.0.0.132:3250010.0.0.133:32500),从浏览器访问 tomcat 应用了~

关于(2020.01.05)后的所有版本,tomcat 首页 404 的原因:
个人猜测:因为docker推荐将webapps下的文件挂载在宿主机下,否则删除tomcat容器的时候服务文件会全部丢失,为了让大家主动将webapps挂载出来,可能维护者将以后的tomcat镜像全部改成webapps为空,需要使用者手动将webapps.dist目录复制出来并挂载使用
参考:


基于 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

k8s如何从内网镜像拉取 k8s集群如何上传镜像_k8s如何从内网镜像拉取_13

在两台node上进行以下设置:

1、查看master上的共享文件夹

showmount -e 10.0.0.131

k8s如何从内网镜像拉取 k8s集群如何上传镜像_tomcat_14


2、挂载

设置完之后,要重新进入 mnt 目录才能看到效果

# 将 master 上的/usr/local/data/www-data,挂载到本机的/mnt下
mount 10.0.0.131:/usr/local/data/www-data /mnt

3、测试挂载效果

(注意,在两个node上是没有权限对文件进行修改的)

k8s如何从内网镜像拉取 k8s集群如何上传镜像_tomcat_15

把原有的部署删除,我们要创建新的部署

1、删除原有的部署

kubectl get deployment
kubectl delete deployment tomcat-deploy

删除之后:

k8s如何从内网镜像拉取 k8s集群如何上传镜像_配置文件_16


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这台机器

k8s如何从内网镜像拉取 k8s集群如何上传镜像_tomcat_17

进入 docker 容器,检查挂载目录是否成功

docker exec -it 9fed8619284a /bin/bash

k8s如何从内网镜像拉取 k8s集群如何上传镜像_tomcat_18


在master中修改文件,可以看到,在docker容器中,能够随时同步master对文件的修改。

k8s如何从内网镜像拉取 k8s集群如何上传镜像_配置文件_19


至此,我们通过一个节点,管理了整个集群要共享的文件!

上面这是个笨办法,需要手动进入docker容器才行。
那么,如何在master服务器上,对全局的docker容器进行观察呢?

在 master 上使用命令:

kubectl get pod -o wide  # 查看所有的pod
kubectl exec -it tomcat-deploy-6659b6749b-8xwhq /bin/bash  # 直接进入某个pod的容器内部交互

k8s如何从内网镜像拉取 k8s集群如何上传镜像_vim_20

Service 提供负载均衡实现:由 Master 上面的 tomcat-service 进行自动请求转发

统一应用入口,至于后端有几个tomcat,我们不用去关心,一切交由服务进行配置和转发。

k8s如何从内网镜像拉取 k8s集群如何上传镜像_tomcat_21


查看并删除已经部署的服务

# 查看已经部署的服务
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

k8s如何从内网镜像拉取 k8s集群如何上传镜像_配置文件_22


发送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帮我们做了负载均衡

k8s如何从内网镜像拉取 k8s集群如何上传镜像_配置文件_23


10.108.170.161:8000 这个 url,在外部的浏览器是无法访问的。在集群外侧,只能通过主机的网卡ip进行访问。

那么如何做地址映射呢?可以使用 Linux 中的端口转发工具:Rinetd

使用 Linux 中的端口转发工具:Rinetd

k8s如何从内网镜像拉取 k8s集群如何上传镜像_k8s如何从内网镜像拉取_24

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

k8s如何从内网镜像拉取 k8s集群如何上传镜像_配置文件_25

浏览器访问 master 的 ip:8000,可以顺利访问了,并且自带负载均衡

k8s如何从内网镜像拉取 k8s集群如何上传镜像_tomcat_26


k8s如何从内网镜像拉取 k8s集群如何上传镜像_配置文件_27


集群配置调整与资源限定

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

k8s如何从内网镜像拉取 k8s集群如何上传镜像_配置文件_28

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集群如何上传镜像_配置文件_29

k8s如何从内网镜像拉取 k8s集群如何上传镜像_k8s如何从内网镜像拉取_30

至此,关于 k8s 的配置与使用,我们讲完啦!


使用 k8s 在集群中部署项目

1、项目拓扑

k8s如何从内网镜像拉取 k8s集群如何上传镜像_k8s如何从内网镜像拉取_31

2、部署需要的所有文件

全部文件都在这里:

  • dist:包含 springboot 打包的 jar
  • sql:数据库导出的 sql,配置好挂载后,mysql 启动时,会自动导入数据文件

k8s如何从内网镜像拉取 k8s集群如何上传镜像_vim_32