zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

2023-02-26 10:16:52 时间

写在前面


  • 书里看到,这里单独拿出整理一下
  • 博文内容包括:

    • K8s环境单机版搭建
    • Tomcat+mysql 一个简单的Java Web APP 应用实践

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

(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>

K8s环境单机版搭建

1. 环境准备

环境准备
关闭CentoS自带的防火墙服务(交换分区)
安装etcd和Kubernetes软件(会自动安装Docker软件):
按顺序启动所有的服务:
查看服务状态
单机版的K8s环境搭建及部署Java Web应用Demo
# 关闭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"

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

yaml定义文件中

yaml定义文件
kind属性,用来表明此资源对象的类型,比如这里的值为”ReplicationController”,表示这是一个RC:
spec一节中是RC的相关属性定义,比如spec.selector是RC的Pod标签(Label)选择器,即监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有replicas个Pod实例在运行,这里我们设置replicas=1表示只能运行一个MySQL Pod实例。
当集群中运行的Pod数量小于replicas时, RC会根据spec.template一节中定义的Pod模板来生成一个新的Pod实例, spec.template.metadata.labels指定了该Pod的标签.
需要特别注意的是:这里的labels必须匹配之前的spec.selector,否则此RC每次创建了一个无法匹配Label的Pod,就会不停地尝试创建新的Pod
[[email protected] k8s]# kubectl create -f mysql-rc.yaml replicationcontroller "mysql" created E:docker>ssh  [email protected] 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. [[email protected] ~]# kubectl  get rc NAME      DESIRED   CURRENT   READY     AGE mysql     1         1         1         1d [[email protected] ~]# kubectl  get pods NAME          READY     STATUS    RESTARTS   AGE mysql-q7802   1/1       Running   0          1d [[email protected] ~]#

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

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命令:

[[email protected] k8s]# kubectl create -f mysql-svc.yaml service "mysql" created [[email protected] k8s]# kubectl  get svc NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE mysql        10.254.155.86   <none>        3306/TCP   1m [[email protected] k8s]#

注意到MySQL服务被分配了一个值为10.254.155.86的Cluster IP地址,这是一个虚地址,随后, Kubernetes集群中其他新创建的Pod就可以通过ServiceCluster 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)提供服务

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

[[email protected] k8s]# vim myweb-rc.yaml [[email protected] k8s]# kubectl create -f myweb-rc.yaml replicationcontroller "myweb" created [[email protected] k8s]# kubectl get rc NAME      DESIRED   CURRENT   READY     AGE mysql     1         1         1         1d myweb     2         2         0         20s [[email protected] 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 [[email protected] 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 [[email protected] 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    

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

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

3.通过浏览器访问网页

[[email protected] k8s]# curl http://127.0.0.1:30001/demo/  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>HPE University Docker&Kubernetes Learning</title> </head> <body  align="center">      <h3> Error:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.</h3>  </body> </html>

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

[[email protected] k8s]# docker logs a05d16ec69ff [[email protected] 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"
[[email protected] k8s]# kubectl delete -f mysql-rc.yaml replicationcontroller "mysql" deleted [[email protected] k8s]# kubectl create -f mysql-rc.yaml replicationcontroller "mysql" created [[email protected] k8s]# kubectl get rc NAME      DESIRED   CURRENT   READY     AGE mysql     1         1         0         10s myweb     2         2         2         4h [[email protected] 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 [[email protected] 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 [[email protected] k8s]#

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

Digest: sha256:7cf2e7d7ff876f93c8601406a5aa17484e6623875e64e7acc71432ad8e0a3d7e Status: Downloaded newer image for docker.io/mysql:5.7 [[email protected] 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 [[email protected] k8s]# curl http://127.0.0.1:30001/demo/ #测试一下  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>HPE University Docker&Kubernetes Learning</title> </head> <body  align="center">         <h2>Congratulations!!</h2>      <br></br>          <input type="button" value="Add..." onclick="location.href='input.html?userCode=wrvvs1rm'" >              <br></br>       <TABLE align="center"  border="1" width="600px">    <TR>       <TD>Name</TD>       <TD>Level(Score)</TD>    </TR>    <TR>       <TD>google</TD>       <TD>100</TD>    </TR>   <TR>       <TD>docker</TD>       <TD>100</TD>    </TR>   <TR>       <TD>teacher</TD>       <TD>100</TD>    </TR>   <TR>       <TD>HPE</TD>       <TD>100</TD>    </TR>   <TR>       <TD>our team</TD>       <TD>100</TD>    </TR>   <TR>       <TD>me</TD>       <TD>100</TD>    </TR>    </TABLE>  </body> </html>

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

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


本站部分内容转载自网络,版权属于原作者所有,如有异议请联系QQ153890879修改或删除,谢谢!
转载请注明原文链接:单机版的K8s环境搭建及部署Java Web应用Demo

你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:

1、点击这里立即申请成为腾讯云VIP客户

2、点击这里立即注册成为天翼云VIP客户

3、点击这里立即申请成为华为云VIP客户

4、点击这里立享阿里云产品终身VIP优惠价

喜欢 (0)
[[email protected]]
分享 (0)