k8s 部署war包。

一、部署tomcat

1. 在主机上查看链接状况:

kubectl get nodes

如果都是ready,则可以继续。否则,查看k8s的搭建那篇文章,里面有解决办法。

2. 在主机上操作:创建资源对象配置文件

(1)创建一个名为:tomcat01.yaml的配置文件

vi tomcat01.yaml

(2)进入编辑模式之后,输入如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myweb
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
                    - name: myweb
                      image: docker.io/tomcat
       ports:
              - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
   ports:
         - name: myweb-svc
           port: 8099
           targetPort: 8080
           nodePort: 31111
   selector:
           app: myweb
   type: NodePort

注意:1. 同一等级的必须对齐
2. 不能用tab,只能用空格
3. 注意上面的api版本不能弄错了
4. 这里包含了两个不同的配置文件,所以要加那三根小横线分开
借用一下别人的图便于理解:
k8s 部署war包。_第1张图片
(3)附上一些简单的vi界面操作
1. 编辑:i
2. 退出编辑:esc
3. 退出编辑界面:esc -> 冒号 -> wq -> 回车
(4)使用创建命令:

kubectl create -f tomcat01.yaml

如果配置错了,创建了一个错误的service和pod,可以用删除命令,配置正确后再重新创建一遍

kubectl delete -f tomcat01.yaml

(5)查看pod是否创建成功并运行:

kubectl get pods -o wide

成功如下:
在这里插入图片描述
失败如下:
在这里插入图片描述
---------------------------------开始----------------------------------------
如果失败,可参考下面的东西,成功就跳过。(我没有遇到这个问题,下面是复制的别人的笔记,以便以后参考)

1、kubectl create -f xxx.yaml在创建资源对象时,xxx.yaml配置文件里我配置了rc和service,下面表示创建成功,但问题来了
在这里插入图片描述
  2、kubectl get pods时两个pods的状态都是ContainerCreating,而不是running,说明kubectl create -f xxx操作是失败的
在这里插入图片描述
  3、kubectl describe pods myweb-3889544643-3sxrb  查看此pods的日志是什么问题,找到问题关系所在,下图:
k8s 部署war包。_第2张图片
  4、查看另一个pod的日志:如下图,错误跟上一个pod的描述是一样的,都是少了一个文件。
k8s 部署war包。_第3张图片
  5、我将错误内容翻译了一下:大意是说在pull镜像image的时候没有凭据,没有redhat-ca.crt文件或者“POD”与ErrImagePull:“image pull for registration .access.redhat.com/rhel7/pod-infrastructure:latest失败,这可能是因为这个请求上没有凭据。
”详情:(打开/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt:无此文件或目录)”
6、查到其他博客的解决办法,也确实解决了:

其实就是我的两个node节点机上没有一个叫redhat-ca.crt文件,此文件应该是用来连接主机master作凭证的吧,接下来下载这个凭证文件就是了。

在node节点机192.168.26.228上(192.168.26.108节点机也如此),执行以下命令:

1、wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

2、rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

3、docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest

7、报错or “POD” with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"的问题解决成功了,成功如下图:
在这里插入图片描述
  再用Kubectl get pods查看一下pod,发现两个pod的status状态都变成了Running
------------------------------------结束-------------------------------------

3. 在浏览器打开192.168.26.228:31111,或另一个node节点ip,就可以出现tomcat的主页面了。
如果没有出现,可以参考以下的方法。(我没有遇到,以下笔记仅为记录,以便以后踩坑的时候参考)
-----------------------------------开始--------------------------------------
浏览器无法访问k8s中的tomcat开始界面解决方法:
1、当kubect create -f xxx.yaml命令,把资源对象都创建好了,经过第一个大坑的解决,kubectl get pods查看所有的pod也都变成了running状态,再使用:kubectl get pods -o wide命令查看所有pod的运行,发现有两个pod分别运行到我的两个节点机上192.168.26.228和192.168.26.108,如下:
#查看所有pod,加-o wide可以看到每个pod运行在哪个node节点机上
kubectl get pods -o wide
在这里插入图片描述
再看一下service:kubectl get svc
在这里插入图片描述
2、那么问题来了,一切看似很完美,很成功,现在知道了有两个pod,每个pod里面都有一个tomcat容器,两个pod分别运行两个node节点机上:192.168.26.228和192.168.26.108,接下来只要在浏览器上随便输入一台的node节点机的ip:端口就可以访问节点机上的tomcat了,然而并卵如下:
k8s 部署war包。_第4张图片
3、这是什么原因呢?又是让我一顿好找,百度查了半天,终于发现是iptables问题(好像是网关问题,不是太懂),借鉴博客:https://blog.csdn.net/fei79534672/article/details/78710858,但是我并没有用它这篇博客的方法,而是使用命令把iptables FORWARD DROP修改成FORWARD ACCEPT,解决步骤如下:

3.1、原因已经找到node节点上的tomcat访问不了,好像是网关没有打通,我们在192.168.26.228节点机上查看iptables,命令如下:

(注意这是在…228节点机上操作)
    k8s 部署war包。_第5张图片
    3.2、使用命令把FORWARD DROP 修改成FORWARD ACCEPT

iptables -P FORWARD ACCEPT

#机器重启之后,又恢复DROP了,再此加一条防止重启还原DROP的命令
sleep 60 && /sbin/iptables -P FORWARD ACCEPT

#再查看
sudo iptables -S

k8s 部署war包。_第6张图片
4、弄好了,弄好了,啊西吧,浏览器打开:192.168.26.228:31111
k8s 部署war包。_第7张图片
---------------------------------结束----------------------------------------

二、把项目部署上去。

1. 查看docker所有的镜像
找到tomcat的镜像,记下它的镜像id。(我的是89481b5d9082)

docker images

2. 给tomcat镜像生成容器

docker create 89481b5d9082

3. 查看docker下所有的容器(列出运行中和未运行的容器)

docker ps -a 

4. 找到tomcat的容器,记录下它的容器id(我的是a408143f5a8e),然后启动该容器。

docker  start  a408143f5a8e

(注意,也可以直接跑 docker run 89481b5d9082 ,这样直接包含了前面四步。还有一些相关的指令,参考https://www.cnblogs.com/xxj-bigshow/p/9089140.html)
5. 把项目的war包拷贝到服务器的任意文件夹下,我拷到root下的。
6. 把服务器上的war包拷贝到tomcat中:(如果之前war包是放到别的路径下的,先要进入那个路径再执行)

docker cp DDDHYPT_war.war a408143f5a8e:/usr/local/tomcat/webapps/

注意冒号前面是tomcat的容器id。

7. 重启tomcat容器:

docker restart a408143f5a8e

8. 访问:ip:项目默认端口/项目名。
如:http://192.168.105.64:8080/DDDHYPT_war/

ps:查看项目的war包有没有放到tomcat上面:
1. 进入tomcat容器

docker  exec -it   a408143f5a8e   /bin/bash

2. 查看当前目录下的文件

ls

3. 进入webapps文件夹

cd webapps

4. 查看目录下的文件,看里面是否有自己项目的war包。

别的方法(亲测可行):

1.拉取registry镜像

docker pull docker.io/registry 

2.启动registry

docker run -d -p 5000:5000 --name=registry --restart=always --privileged=true  --log-driver=none -v /home/data/registrydata:/tmp/registry registry

3.创建Dockerfile文件,内容如下:(注意下面war包的名字要跟拷贝到服务器上的war包的名字一致)

FROM tomcat:8
ADD myddd.war /usr/local/tomcat/webapps/
EXPOSE 8080
CMD ["catalina.sh", "run"]

4. 将Dockerfile和war包一起拷贝到服务器的同一个目录下

5.生成项目的镜像文件,这里的ddd是别名。

docker build -t ddd .

4.这里的4130a363d457是镜像id

docker tag 4130a363d457  192.168.105.56:5000/ddd:v1

5.把项目的镜像推上去(相当于上传)

docker push 192.168.105.56:5000/ddd:v1

6.跑项目

kubectl run ddd  --image=192.168.105.56:5000/ddd:v1 --port=8080

7.发布项目

kubectl expose deployment ddd --port=8080 --type=NodePort --target-port=8080 --name=node-ddd

8.界面上访问
去192.168.105.56:30001上的服务界面查看访问的端口号(下面那个,我的是30226),然后访问192.168.105.56:30226/myddd
注意:这里的包名不是生成的镜像的名字ddd,而是之前war包的名字myddd。

你可能感兴趣的:(笔记本)