单机版的K8s环境搭建及部署Java Web应用

网友投稿 1214 2022-05-29

写在前面

书里看到,这里单独拿出整理一下

博文内容包括:

K8s环境单机版搭建

Tomcat+mysql 一个简单的Java Web APP 应用实践

傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波

K8s环境单机版搭建

1. 环境准备

单机版的K8s环境搭建及部署Java Web应用

# 关闭CentoS自带的防火墙服务: systemctl disable firewalld --now sed -i '/swap/d' /etc/fstab # 安装etcd和Kubernetes软件(会自动安装Docker软件): yum install -y etcd kubernetes #按顺序启动所有的服务: systemctl start etcd systemctl start docker systemctl start kube-apiserver systemctl start kube-controller-manager systemctl start kube-scheduler systemctl start kubelet systemctl start kube-proxy # 查看服务状态 systemctl status etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy

至此,一个单机版的Kubernetes集群环境就安装启动完成了。接下来,我们可以在这个单机版的Kubernetes集群中上手练习了。

镜像相关地址: https://hub.docker.com/u/kubeguide/.

一个简单的Java Web APP 应用实践

1. 启动MySQL服务

首先为MySQL服务创建一个RC定义文件:mysql-rc.yaml,文件的完整内容和解释;

apiVersion: v1 kind: ReplicationController #副本控制器RC metadata: # RC的名称,全局唯一 name: mysql # Pod副本期待数量 spec: replicas: 1 selector: # 符合目标的Pod拥有此标签 app: mysql # 根据此模板创建Pod的副本(实例). template: metadata: #Pod副本拥有的标签,对应RC的Selector labels: app: mysql spec: containers: # Pod内容器的定义部分 - name: mysql # 容器的名称,容器对应的Docker Image image: mysql ports: #容器应用监听的端口号 - containerPort: 3306 env: #注入容器内的环境变量 - name: MYSQL_ROOT_PASSWORD value: "123456"

yaml定义文件中

[root@liruilong k8s]# kubectl create -f mysql-rc.yaml replicationcontroller "mysql" created E:\docker>ssh root@39.97.241.18 Last login: Sun Aug 29 13:00:58 2021 from 121.56.4.34 Welcome to Alibaba Cloud Elastic Compute Service ! ^[[AHow would you spend your life?.I don t know, but I will cherish every minute to live. [root@liruilong ~]# kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 1 1d [root@liruilong ~]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-q7802 1/1 Running 0 1d [root@liruilong ~]#

嗯,这里刚开始搞得的时候是有问题的,pod一直没办法创建成功,第一次启动容器时,STATUS一直显示CONTAINERCREATING,我用的是阿里云ESC单核2G+40G云盘,我最开始以为系统核数的问题,因为看其他的教程写的需要双核,但是后来发现不是,网上找了解决办法,一顿操作猛如虎,后来不知道怎么就好了。

有说基础镜像外网拉不了,只能用 docker Hub的,有说 ,权限的问题,还有说少包的问题,反正都试了,这里列出几个靠谱的解决方案

https://blog.csdn.net/gezilan/article/details/80011905

https://www.freesion.com/article/8438814614/

K8s 根据mysqlde RC的定义自动创建的Pod。由于Pod的调度和创建需要花费一定的时间,比如需要一定的时间来确定调度到哪个节点上,以及下载Pod里容器的镜像需要一段时间,所以一开始我们看到Pod的状态将显示为Pending。当Pod成功创建完成以后,状态最终会被更新为Running我们通过docker ps指令查看正在运行的容器,发现提供MySQL服务的Pod容器已经创建并正常运行了,此外,你会发现MySQL Pod对应的容器还多创建了一个来自谷歌的pause容器,这就是Pod的“根容器".

我们创建一个与之关联的Kubernetes Service 的定义文件 mysql-sve.yaml

apiVersion: v1 kind: Service # 表明是Kubernetes Service metadata: name: mysql # Service的全局唯一名称 spec: ports: - port: 3306 #service提供服务的端口号 selector: #Service对应的Pod拥有这里定义的标签 app: mysql

我们通过kubectl create命令创建Service对象。运行kubectl命令:

[root@liruilong k8s]# kubectl create -f mysql-svc.yaml service "mysql" created [root@liruilong k8s]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql 10.254.155.86 3306/TCP 1m [root@liruilong k8s]#

注意到MySQL服务被分配了一个值为10.254.155.86的Cluster IP地址,这是一个虚地址,随后, Kubernetes集群中其他新创建的Pod就可以通过Service的Cluster IP+端口号3306来连接和访问它了。

在通常情况下, Cluster IP是在Service创建后由Kubernetes系统自动分配的,其他Pod无法预先知道某个Service的Cluster IP地址,因此需要一个服务发现机制来找到这个服务。

为此,最初时, Kubernetes巧妙地使用了Linux环境变量(Environment Variable)来解决这个问题,后面会详细说明其机制。现在我们只需知道,根据Service的唯一名字,容器可以从环境变量中获取到Service对应的Cluster IP地址和端口,从而发起TCP/IP连接请求了。

2.启动Tomcat应用

创建对应的 RC文件 myweb-rc.yaml

apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080

replicas: 2: 这里我们用两个tomcat(Pod)提供服务

[root@liruilong k8s]# vim myweb-rc.yaml [root@liruilong k8s]# kubectl create -f myweb-rc.yaml replicationcontroller "myweb" created [root@liruilong k8s]# kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 1 1d myweb 2 2 0 20s [root@liruilong k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-q7802 1/1 Running 0 1d myweb-53r32 0/1 ContainerCreating 0 28s myweb-609w4 0/1 ContainerCreating 0 28s [root@liruilong k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-q7802 1/1 Running 0 1d myweb-53r32 1/1 Running 0 1m myweb-609w4 1/1 Running 0 1m [root@liruilong k8s]#

最后,创建对应的 Service 。以下是完整yaml定义文件 myweb-svc.yaml:

指定端口映射:30001:8080

apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb

[root@liruilong k8s]# vim myweb-svc.yaml [root@liruilong k8s]# kubectl create -f myweb-svc.yaml service "myweb" created [root@liruilong k8s]# kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 443/TCP 2d mysql 10.254.155.86 3306/TCP 5h myweb 10.254.122.63 8080:30001/TCP 54s [root@liruilong k8s]#

3.通过浏览器访问网页

[root@liruilong k8s]# curl http://127.0.0.1:30001/demo/ HPE University Docker&Kubernetes Learning

Error:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.

数据库连接有问题,这里百度发现是mysql驱动版本问题

[root@liruilong k8s]# docker logs a05d16ec69ff [root@liruilong k8s]# vim mysql-rc.yaml

apiVersion: v1 kind: ReplicationController #副本控制器RC metadata: # RC的名称,全局唯一 name: mysql # Pod副本期待数量 spec: replicas: 1 selector: # 符合目标的Pod拥有此标签 app: mysql # 根据此模板创建Pod的副本(实例). template: metadata: #Pod副本拥有的标签,对应RC的Selector labels: app: mysql spec: containers: # Pod内容器的定义部分 - name: mysql # 容器的名称,容器对应的Docker Image image: mysql:5.7 ports: #容器应用监听的端口号 - containerPort: 3306 env: #注入容器内的环境变量 - name: MYSQL_ROOT_PASSWORD value: "123456"

[root@liruilong k8s]# kubectl delete -f mysql-rc.yaml replicationcontroller "mysql" deleted [root@liruilong k8s]# kubectl create -f mysql-rc.yaml replicationcontroller "mysql" created [root@liruilong k8s]# kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 0 10s myweb 2 2 2 4h [root@liruilong k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-2cpt9 0/1 ContainerCreating 0 15s myweb-53r32 1/1 Running 0 4h myweb-609w4 1/1 Running 1 4h [root@liruilong k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-2cpt9 0/1 ContainerCreating 0 32s myweb-53r32 1/1 Running 0 4h myweb-609w4 1/1 Running 1 4h [root@liruilong k8s]#

我们在上面的SVC中定义了Tomcat的两个pod。所以这里显示两个

Digest: sha256:7cf2e7d7ff876f93c8601406a5aa17484e6623875e64e7acc71432ad8e0a3d7e Status: Downloaded newer image for docker.io/mysql:5.7 [root@liruilong k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-2cpt9 1/1 Running 0 31m myweb-53r32 1/1 Running 0 5h myweb-609w4 1/1 Running 1 5h [root@liruilong k8s]# curl http://127.0.0.1:30001/demo/

测试一下

HPE University Docker&Kubernetes Learning

Congratulations!!





Name Level(Score)
google 100
docker 100
teacher 100
HPE 100
our team 100
me 100

Docker Java Kubernetes

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:彻底搞懂 etcd 系列文章(一):初识 etcd
下一篇:一网打尽 Java 并发模型
相关文章