kubernetes(10):简单web应用tomcat+mysql样例
简单web应用tomcat+mysql
我们测试一个web+db的项目,这种架构都是先启动MySQL再启动tomcat的,注意顺序
1 准备镜像
1.1 下载官方的测试镜像和MySQL
docker pull kubeguide/tomcat-app:v1 docker pull mysql:5.7
[root@k8s-master ~]# docker images | grep -E "mysql|tomcat" docker.io/mysql 5.7 e1e1680ac726 9 days ago 373.3 MB docker.io/kubeguide/tomcat-app v2 00beaa1d956d 3 years ago 358.2 MB docker.io/kubeguide/tomcat-app v1 a29e200a18e9 3 years ago 358.2 MB [root@k8s-master ~]#
1.2 上传到私服
[root@k8s-master ~]# docker tag docker.io/kubeguide/tomcat-app:v1 192.168.0.136:5000/tomcat-app:v1 [root@k8s-master ~]# docker push 192.168.0.136:5000/tomcat-app:v1 The push refers to a repository [192.168.0.136:5000/tomcat-app] fe9a890c4f24: Pushed 5f70bf18a086: Pushed a072f755a133: Pushed 6d0267f8a9fd: Pushed 7bb92eb08c02: Pushed d8ba5f179687: Pushed 2275023dea33: Pushed d490458a60cb: Pushed bb3e02b5a488: Pushed 3b7a0c95e085: Pushed 02adacdfda2f: Pushed d2c5e3a8d3d3: Pushed 4dcab49015d4: Pushed v1: digest: sha256:565bb4e52ac67b4d37feed9ea4626b786f23e0871451587c7187683532a6188f size: 5719 [root@k8s-master ~]# docker tag docker.io/mysql:5.7 192.168.0.136:5000/mysql:5.7 [root@k8s-master ~]# docker push 192.168.0.136:5000/mysql:5.7 The push refers to a repository [192.168.0.136:5000/mysql] 2ebc9c2f59ec: Pushed de9c8788be4d: Pushed 59f1d30f4003: Pushed 8ea3faa6f944: Pushed bb1ef34119b2: Pushed 65430c57aee2: Pushed 1dd5f3e365cf: Pushed 7f33ce1066af: Pushed 9f77b78f01a7: Pushed f5741d086b76: Pushed 8fa655db5360: Pushed 5.7: digest: sha256:2bd4665d9c5ecad61f7ceff82f82e6470c4686b9ec0fd986b84012861506c722 size: 2621 [root@k8s-master ~]#
2 部署mysql 服务
2.1 创建一个mysql -deployment文件
apiVersion: extensions/v1beta1 kind: Deployment #副本控制器Deployment metadata: name: mysql #Deployment的名称,全局唯一 spec: replicas: 1 #Pod副本的期待数量 template: #根据此模版创建Pod的副本(实例) metadata: labels: app: mysql #Pod副本拥有的标签,对应Deployment的selector spec: containers: #Pod内,定义容器 - name: mysql #容器名称 image: 192.168.0.136:5000/mysql:5.7 #Docker image ports: - containerPort: 3306 #容器应用监听的端口 env: #注入容器内的环境变量 - name: MYSQL_ROOT_PASSWORD #这里设置root初始密码 value: "123456" #RC方式 apiVersion: v1 kind: ReplicationController #副本控制器RC metadata: name: mysql #RC的名称,全局唯一 spec: replicas: 1 #Pod副本的期待数量 selector: app: mysql #符合目标的Pod拥有此标签 template: #根据此模版创建Pod的副本(实例) metadata: labels: app: mysql #Pod副本拥有的标签,对应RC的selector spec: containers: #Pod内,定义容器 - name: mysql #容器名称 image: 192.168.0.136:5000/mysql:5.7 #Docker image ports: - containerPort: 3306 #容器应用监听的端口 env: #注入容器内的环境变量 - name: MYSQL_ROOT_PASSWORD #这里设置root初始密码 value: "123456"
2.2 创建mysql-deployment
kubectl create -f mysql-deploy.yaml
2.3 验证mysql-deployment
[root@k8s-master k8s]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mysql 1 1 1 1 2m [root@k8s-master k8s]# kubectl get rs -o wide NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR mysql-1283186320 1 1 1 2m mysql 192.168.0.136:5000/mysql:5.7 app=mysql,pod-template-hash=1283186320 [root@k8s-master k8s]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql-1283186320-1pt32 1/1 Running 0 2m 172.16.73.2 k8s-node-1 [root@k8s-master k8s]#
2.4 连接MySQL测试
[root@k8s-master k8s]# mysql -uroot -p123456 -h172.16.73.2 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.27 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.09 sec) mysql>
2.5 创建mysql serveice文件
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: NodePort
ports:
- port: 3306
nodePort: 30001
selector:
app: mysql
2.6 创建MySQL svc
[root@k8s-master k8s]# kubectl create -f mysql-svc.yaml service "mysql" created
2.7 验证MySQL svc
两个node的30001端口都能连MySQL服务
[root@k8s-master k8s]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 3d mysql 10.254.58.59 <nodes> 3306:30001/TCP 6m [root@k8s-master k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-1283186320-1pt32 1/1 Running 0 12m [root@k8s-master k8s]# [root@k8s-master k8s]# mysql -uroot -p123456 -P30001 -h192.168.0.137 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.27 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> ^DBye [root@k8s-master k8s]# mysql -uroot -p123456 -P30001 -h192.168.0.138 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.7.27 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
3 部署web服务
3.1 创建一个tomcat-app-deployment文件
[root@k8s-master k8s]# cat tomcat-app-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: tomcat-app spec: replicas: 3 template: metadata: labels: app: tomcat-app spec: containers: - name: tomcat-app image: 192.168.0.136:5000/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: 'mysql' #这是一个坑,最好写IP - name: MYSQL_SERVICE_PORT value: '3306'
3.2 创建tomcat-app-deployment
[root@k8s-master k8s]# kubectl create -f tomcat-app-deployment.yaml deployment "tomcat-app" created
3.3 验证tomcat-app-deployment
[root@k8s-master k8s]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mysql 1 1 1 1 32m tomcat-app 3 3 3 3 6m [root@k8s-master k8s]# kubectl get rs -o wide NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR mysql-1283186320 1 1 1 32m mysql 192.168.0.136:5000/mysql:5.7 app=mysql,pod-template-hash=1283186320 tomcat-app-3309240903 3 3 3 6m tomcat-app 192.168.0.136:5000/tomcat-app:v1 app=tomcat-app,pod-template-hash=3309240903 [root@k8s-master k8s]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql-1283186320-1pt32 1/1 Running 0 32m 172.16.73.2 k8s-node-1 tomcat-app-3309240903-338hl 1/1 Running 0 6m 172.16.47.2 k8s-node-2 tomcat-app-3309240903-xfqwv 1/1 Running 0 6m 172.16.47.3 k8s-node-2 tomcat-app-3309240903-xtqsk 1/1 Running 0 6m 172.16.73.3 k8s-node-1 [root@k8s-master k8s]#
3.4 测试tomcat-app-deployment服务
[root@k8s-master k8s]# curl -I 172.16.73.3:8080 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=UTF-8 Transfer-Encoding: chunked Date: Fri, 23 Aug 2019 07:58:42 GMT [root@k8s-master k8s]# curl -I 172.16.47.2:8080 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=UTF-8 Transfer-Encoding: chunked Date: Fri, 23 Aug 2019 07:58:53 GMT [root@k8s-master k8s]# curl -I 172.16.47.2:8080/demo/ HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=471FD0BD8660E49BF9A82E10FCB9AB47; Path=/demo/; HttpOnly Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Date: Fri, 23 Aug 2019 08:00:39 GMT [root@k8s-master k8s]#
3.5 创建tomcat-app service文件
[root@k8s-master k8s]# cat tomcat-app-svc.yaml apiVersion: v1 kind: Service metadata: name: tomcat-app spec: type: NodePort ports: - port: 8080 name: myweb-svc nodePort: 30002 selector: app: tomcat-app
3.6 创建tomcat-app service
#kubectl create -f tomcat-app-svc.yaml 测试 [root@k8s-master k8s]# kubectl get svc -o wide NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes 10.254.0.1 <none> 443/TCP 3d <none> mysql 10.254.58.59 <nodes> 3306:30001/TCP 32m app=mysql tomcat-app 10.254.210.153 <nodes> 8080:30002/TCP 10s app=tomcat-app [root@k8s-master k8s]#
3.7 测试tomcat
[root@k8s-master k8s]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql-1283186320-1pt32 1/1 Running 0 1h 172.16.73.2 k8s-node-1 tomcat-app-3401974344-mjskq 1/1 Running 0 27m 172.16.73.4 k8s-node-1 [root@k8s-master k8s]# curl -I 172.16.73.4 curl: (7) Failed connect to 172.16.73.4:80; 拒绝连接 [root@k8s-master k8s]# curl -I 172.16.73.4:8080 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=UTF-8 Transfer-Encoding: chunked Date: Fri, 23 Aug 2019 08:34:59 GMT
3.8 测试tomcat-APP项目-DNS错误
Error:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
https://blog.51cto.com/14423403/2417097
我们先把副本设成一个解决问题
[root@k8s-master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql-1283186320-1pt32 1/1 Running 0 1h 172.16.73.2 k8s-node-1 tomcat-app-3401974344-mjskq 1/1 Running 0 29m 172.16.73.4 k8s-node-1 [root@k8s-master ~]# kubectl exec -it tomcat-app-3401974344-mjskq /bin/bash root@tomcat-app-3401974344-mjskq:/usr/local/tomcat# echo "172.16.73.2 mysql" >> /etc/hosts root@tomcat-app-3401974344-mjskq:/usr/local/tomcat#
然后重新刷新192.168.0.137:30002发现访问正常了。
k8s好像网络还需要添加个DNS服务,暂时跳过
3.9 测试tomcat-APP项目
登陆数据库查看
[root@k8s-master ~]# mysql -uroot -p123456 -P30001 -h192.168.0.137 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 5.7.27 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | HPE_APP | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use HPE_APP Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-------------------+ | Tables_in_HPE_APP | +-------------------+ | T_USERS | +-------------------+ 1 row in set (0.01 sec) mysql> select * from T_USERS; +----+-----------+-------+ | ID | USER_NAME | LEVEL | +----+-----------+-------+ | 1 | me | 100 | | 2 | our team | 100 | | 3 | HPE | 100 | | 4 | teacher | 100 | | 5 | docker | 100 | | 6 | google | 100 | | 7 | test | 100 | +----+-----------+-------+ 7 rows in set (0.01 sec) mysql>
3.10修改tomcat-app-deployment文件
把MySQL地址写死
[root@k8s-master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql-1283186320-1pt32 1/1 Running 0 1h 172.16.73.2 k8s-node-1 tomcat-app-3752985145-xw2bg 1/1 Running 0 1m 172.16.47.2 k8s-node-2 [root@k8s-master ~]# [root@k8s-master k8s]# cat tomcat-app-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: tomcat-app spec: replicas: 3 template: metadata: labels: app: tomcat-app spec: containers: - name: tomcat-app image: 192.168.0.136:5000/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: '172.16.73.2' - name: MYSQL_SERVICE_PORT value: '3306'
3.11扩容tomcat-app
kubectl scale deployment tomcat-app --replicas=5 [root@k8s-master k8s]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql-1283186320-1pt32 1/1 Running 0 1h 172.16.73.2 k8s-node-1 tomcat-app-3752985145-95w4t 1/1 Running 0 8m 172.16.73.3 k8s-node-1 tomcat-app-3752985145-gg3d6 1/1 Running 0 8m 172.16.73.4 k8s-node-1 tomcat-app-3752985145-l25dd 1/1 Running 0 8m 172.16.47.4 k8s-node-2 tomcat-app-3752985145-pjz1r 1/1 Running 0 8m 172.16.47.3 k8s-node-2 tomcat-app-3752985145-xw2bg 1/1 Running 0 9m 172.16.47.2 k8s-node-2 [root@k8s-master k8s]#
3.12再次测试tomcat-APP项目
4 存在的问题
1、pod的DNS不能解析,只能写死MySQL的IP地址,而pod的ip地址是很容易变化的。
2、MySQL没有持久化,pod的数据是临时的,如果删除pod或者重启deployment,数据会丢失。