Kubenetes1.13.1集群部署 --02Hello World

介绍

本文主要介绍如何搭建一个Mysqkl+Java Web留言板项目,JSP页面通过JDBC直接访问Mysql数据库并展示数据。为了演示和简化的目的,只要程序正确连接到了数据库上,它就会自动完成对应Table的创建和初始化数据的准备工作。

此应用需要启动两个容器:Web APP容器和MySQL容器,并且WebApp容器需要访问MySQL容器。

启动MySQL服务器

首先为MySQL服务创建一个RC定义文件:mysql-rc.yaml,下面给出了改文件的完成内容和解释:

apiVersion: v1
kind: ReplicationController         # 副本控制器RC
metadata:
  name: mysql                       # RC的名称,全局唯一
spec:
  replicas: 1                       # Pod副本数量
  selector:
    app: mysql                      # 符合目标的Pod拥有此标签
  template:
    metadata:
      labels:
        app: mysql                  # Pod副本用户的标签,对应RC的Selector
    spec:
      containers:                   # Pod内容器的定义部分
      - name: mysql                 # 容器名称
        image: mysql:5.6            # 容器对应的docker image
        ports:
        - containerPort: 3306       # 容器暴露的端口号
        env:
        - name: MYSQL_ROOT_PASSWORD # mysql容器默认密码设置
          value: "123456"

执行该文件:

kubectl create -f mysql-rc.yaml

 

接下来,我们用kubectl命令查看刚刚创建的RC:

[root@bigman-m2 config]# kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
mysql   1         1         1       20m

 

查看Pod的创建情况时,可以运行下面的命令:

[root@bigman-m2 config]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
mysql-xxp56   1/1     Running   0          20m

 

我们通过docker ps|grep mysql指令查看正在运行的容器,发现提供MySQL服务的Pod容器已经创建并正常运行了,除此之外还多创建了一个来自谷歌的pause容器,这就是Pod的根容器:

[root@bigman-s3 ~]# docker ps|grep mysql
3a07bce96aab        mysql                  "docker-entrypoint.s…"   23 minutes ago      Up 23 minutes                                k8s_mysql_mysql-xxp56_default_a03ab81d-0f34-11e9-8c52-1866da8c1dba_0
06f009f3886a        k8s.gcr.io/pause:3.1   "/pause"                 24 minutes ago      Up 24 minutes                                k8s_POD_mysql-xxp56_default_a03ab81d-0f34-11e9-8c52-1866da8c1dba_0

后面我们创建一个与之关联的Kubernetes Service-Mysql的定义文件mysql-svc.yaml:

apiVersion: v1
kind: Service            # 表名是Kubernetes Service
metadata:
  name: mysql            # Service的全局唯一名称
spec:
  ports:
    - port: 3306         # Service提供服务的端口号
  selector:              # Pod副本实例名称
    app: mysql

执行该文件:

kubectl create -f mysql-svc.yaml

运行kubectl命令,查看刚刚创建的service

[root@bigman-m2 config]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          3h
mysql        ClusterIP   10.107.100.143   <none>        3306/TCP         9m

注意到Mysql服务被分配了一个值为10.107.100.143的Cluster-ip,这是一个虚拟地址,随后,Kubernetes集群中其他新创建的Pod就可以通过Service的Cluster IP+端口号3306来连接和访问它了。这些信息kubernetes巧妙地利用了Linux环境变量来进行存储。

 

启动Tomcat应用

上面我们定义和启动了MySQL服务,接下来我们采用同样的步骤,完成Tomcat应用的启动过程。

首先,创建对应的RC文件myweb.yaml,内容如下:

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 5                             # 5个副本,负载均衡
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST         # 定义环境变量,代码中才能获取到值
          value: 'mysql'
        - name: MYSQL_SERVICE_PORT         # 定义环境变量,代码中才能获取到值
          value: '3306'


有人肯定会疑惑,这里只配置了主机名和端口,并没有配置账号密码,tomcat能启动成功吗?原因是在于这个tomcat-app容器代码中默认写死了账号密码(root/123456)。

执行该文件:

kubectl create -f myweb-rc.yaml


查看创建好的Pod:

[root@bigman-m2 config]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
mysql-xxp56   1/1     Running   0          38m
myweb-ds8nv   1/1     Running   0          82m
myweb-jdtdw   1/1     Running   0          82m
myweb-rjbm9   1/1     Running   0          82m
myweb-tg6zc   1/1     Running   0          49m
myweb-v7fwf   1/1     Running   0          82m

最后创建对应的service,下面是文件内容和说明,myweb-svc.yaml:

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort          # 表示此Service开启了NodePort方式的外网访问模式
  ports:
    - port: 8080          # Service提供服务的端口号
      nodePort: 30002     # 外网访问端口
  selector:
    app: myweb            # Pod副本实例名称

执行该文件:

kubectl create -f myweb-svc.yaml


查看刚才创建的Service:

[root@bigman-m2 config]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          3h
mysql        ClusterIP   10.107.100.143   <none>        3306/TCP         3m
myweb        NodePort    10.106.119.48    <none>        8080:30002/TCP   3m

 

通过浏览器访问页面

访问地址是master节点的30002端口, http://192.168.22.141:30002/demo/index.jsp

[root@cloud01 helloworld.ex]# kubectl get pod myweb-lb9ck -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
myweb-lb9ck   1/1     Running   0          5m40s   10.244.2.3   cloud03   <none>           <none>
[root@cloud01 helloworld.ex]# kubectl get svc myweb-lb9ck 
Error from server (NotFound): services "myweb-lb9ck" not found
[root@cloud01 helloworld.ex]# kubectl get svc 
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          11h
mysql        ClusterIP   10.103.168.75    <none>        3306/TCP         8m39s
myweb        NodePort    10.101.248.174   <none>        8080:30002/TCP   3m21s

 

 

访问地址是node节点的30002端口因为myweb-lb9ck   1/1     Running   0          5m40s   10.244.2.3   cloud03,所以还可以直接访问节点:如 http://192.168.22.143:30002/demo/index.jsp

 

dashboard界面查看

 

相关操作

命令行登录容器

显示Pods:

[root@bigman-m2 config]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
mysql-xxp56   1/1     Running   0          46m
myweb-ds8nv   1/1     Running   0          90m
myweb-jdtdw   1/1     Running   0          90m
myweb-rjbm9   1/1     Running   0          90m
myweb-tg6zc   1/1     Running   0          57m
myweb-v7fwf   1/1     Running   0          90m


比如,进入mysql容器:

[root@bigman-m2 config]# kubectl exec -ti mysql-xxp56 -c mysql /bin/bash
root@mysql-xxp56:/# date
Thu Jan  3 09:38:26 UTC 2019

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值