tomcat+mysql容器之间相互访问
在企业很多环境中,通常是容器之间相互配合访问的
在k8s中可以通过vip来实现容器之间的相互访问
先准备数据库的yaml文件,在准备应用的yaml文件,应用连接数据库时使用clusterip的方式去连接
环境用到的配置文件
[root@k8s-master tomcat]# tree .
.
├── docker-mysql-5.7.tar.gz
├── mysql-rc.yml
├── mysql-svc.yml
├── tomcat-app-v2.tar.gz
├── tomcat-rc.yml
└── tomcat-svc.yml
0 directories, 6 files
1.准备tomcat mysql容器
1)导入容器
[root@k8s-master tomcat]# docker load -i docker-mysql-5.7.tar.gz
[root@k8s-master tomcat]# docker load -i tomcat-app-v2.tar.gz
2)打标签
[root@k8s-master tomcat]# docker tag docker.io/mysql:5.7 192.168.81.240/k8s/mysql:5.7
[root@k8s-master tomcat]# docker tag docker.io/kubeguide/tomcat-app:v2 192.168.81.240/k8s/tomcat-app:v2
3)推送至harbor
[root@k8s-master tomcat]# docker push 192.168.81.240/k8s/mysql:5.7
[root@k8s-master tomcat]# docker push 192.168.81.240/k8s/tomcat-app:v2
2.准备mysql yaml文件
2.1.mysql rc文件
[root@k8s
-master tomcat
]
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas: 1
selector:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: 192.168.81.240/k8s/mysql
:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: '123456'
2.2.mysql svc文件
[root@k8s
-master tomcat
]
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
2.3.创建mysql
1)启动rc资源并调用pod
[root@k8s-master tomcat]# kubectl create -f mysql-rc.yml
replicationcontroller "mysql" created
[root@k8s-master tomcat]# kubectl get all -o wide
NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR
rc/mysql 1 1 1 3s mysql 192.168.81.240/k8s/mysql:5.7 app=mysql
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc/kubernetes 10.254.0.1 <none> 443/TCP 14d <none>
NAME READY STATUS RESTARTS AGE IP NODE
po/mysql-hvnsc 1/1 Running 0 3s 172.16.48.2 192.168.81.230
会发现pod已经启动
2)启动svc,观察svc是否关联rc的标签
[root@k8s-master tomcat]# kubectl create -f mysql-svc.yml
service "mysql" created
[root@k8s-master tomcat]# kubectl get all -o wide
NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR
rc/mysql 1 1 1 23s mysql 192.168.81.240/k8s/mysql:5.7 app=mysql
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc/kubernetes 10.254.0.1 <none> 443/TCP 14d <none>
svc/mysql 10.254.17.96 <none> 3306/TCP 2s app=mysql
NAME READY STATUS RESTARTS AGE IP NODE
po/mysql-hvnsc 1/1 Running 0 23s 172.16.48.2 192.168.81.230
3.准备tomcat yaml文件
3.1.tomcat rc文件
[root@k8s
-master tomcat
]
apiVersion: v1
kind: ReplicationController
metadata:
name: mytomcat
spec:
replicas: 1
selector:
app: mytomcat
template:
metadata:
labels:
app: mytomcat
spec:
containers:
- name: mytomcat
image: 192.168.81.240/k8s/tomcat
-app
:v2
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: '10.254.17.96'
- name: MYSQL_SERVICE_PORT
value: '3306'
查svc的cluster ip地址,写到yaml配置文件的第17行
[root@k8s
-master tomcat
]
NAME CLUSTER
-IP EXTERNAL
-IP PORT(S) AGE SELECTOR
mysql 10.254.17.96 <none
> 3306/TCP 8m app=mysql
3.2.tomcat svc文件
[root@k8s
-master tomcat
]
apiVersion: v1
kind: Service
metadata:
name: mytomcat
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30008
selector:
app: mytomcat
3.3.创建tomcat
1)启动rc
[root@k8s-master tomcat]# kubectl create -f tomcat-rc.yml
replicationcontroller "mytomcat" created
[root@k8s-master tomcat]# kubectl get rc mytomcat -o wide
NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR
mytomcat 1 1 0 7s mytomcat 192.168.81.240/k8s/tomcat-app:v2 app=mytomcat
2)启动svc
[root@k8s-master tomcat]# kubectl create -f tomcat-svc.yml
service "mytomcat" created
[root@k8s-master tomcat]# kubectl get svc mytomcat -o wide
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
mytomcat 10.254.234.244 <nodes> 8080:30008/TCP 10s app=mytomcat
[root@k8s-master tomcat]#
4.访问资源
查看资源状态
[root@k8s-master tomcat]# kubectl get all -o wide
NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR
rc/mysql 1 1 1 16m mysql 192.168.81.240/k8s/mysql:5.7 app=mysql
rc/mytomcat 1 1 1 2m mytomcat 192.168.81.240/k8s/tomcat-app:v2 app=mytomcat
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc/kubernetes 10.254.0.1 <none> 443/TCP 14d <none>
svc/mynginx 10.254.36.92 <nodes> 80:9907/TCP 3d app=nginx
svc/mysql 10.254.17.96 <none> 3306/TCP 16m app=mysql
svc/mytomcat 10.254.234.244 <nodes> 8080:30008/TCP 1m app=mytomcat
svc/myweb2 10.254.250.66 <nodes> 80:3000/TCP 4d app=myweb
NAME READY STATUS RESTARTS AGE IP NODE
po/mysql-hvnsc 1/1 Running 0 16m 172.16.48.2 192.168.81.230
po/mytomcat-7rv0n 1/1 Running 0 2m 172.16.19.3 192.168.81.220
4.1.tomcat首页
浏览器访问:http://192.168.81.220:30008/
会看到tomcat首页
4.2.demo站点
浏览器访问:http://192.168.81.220:30008/demo/
点击add新增一个
4.3.进入mysql容器查看数据数据
[root@k8s-master tomcat]# kubectl exec -it mysql-hvnsc /bin/bash
root@mysql-hvnsc:/# mysql -uroot -p123456 mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| HPE_APP |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use HPE_APP
mysql> show tables;
+-------------------+
| Tables_in_HPE_APP |
+-------------------+
| T_USERS |
+-------------------+
1 row in set (0.00 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 | jiangxiaolong | 10000 |
+----+---------------+-------+
7 rows in set (0.01 sec)
5.持久化demo站点
如果pod节点死掉,rc会再启动一个,但是数据会丢失,因此我们采用pv+pvc的方式实现持久化存储
数据库一定要做数据卷存储
5.1.安装nfs
1)安装nfs
[root@k8s-master ~]# yum -y install nfs-utils
2)配置nfs
[root@k8s-master ~]# cat /etc/exports
/data2 192.168.81.0/24(rw,sync,no_root_squash,no_all_squash)
3)启动nfs
[root@k8s-master ~]# systemctl restart nfs
[root@k8s-master ~]# systemctl restart rpcbind
5.2.创建pv
1)准备pv yaml文件
[root@k8s
-master tomcat
]
apiVersion: v1
kind: PersistentVolume
metadata:
name: tom
-mysql
-pv
labels:
type: tom
-mysql
-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
path: "/data2/tom_mysql_pv"
server: 192.168.81.210
readOnly: false
[root@k8s
-master tomcat
]
persistentvolume "tom
-mysql
-pv" created
5.3创建pvc
[root@k8s
-master tomcat
]
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: tom
-mysql
-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
selector:
matchLabels:
pv: tom
-mysql
-pv
[root@k8s
-master tomcat
]
persistentvolumeclaim "tom
-mysql
-pvc" created
5.4.查看pv和pvc
[root@k8s-master tomcat]# kubectl get pv tom-mysql-pv
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
tom-mysql-pv 10Gi RWX Recycle Bound default/tom-mysql-pvc 1m
[root@k8s-master tomcat]# kubectl get pvc tom-mysql-pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
tom-mysql-pvc Bound tom-mysql-pv 10Gi RWX 1m
pv和pvc相互关联
5.5.应用挂载
1)修改rc配置文件
[root@k8s
-master tomcat
]
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas: 1
selector:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: 192.168.81.240/k8s/mysql
:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: '123456'
volumeMounts:
- name: tom
-mysql
-data
mountPath: /var/lib/mysql
volumes:
- name: tom
-mysql
-data
persistentVolumeClaim:
claimName: tom
-mysql
-pvc
2)更新
[root@k8s
-master tomcat
]
replicationcontroller "mysql" configured
3)创建nfs目录
[root@k8s
-master tomcat
]
不挂载之前pod死了再启动数据就丢失了
挂载之后及时删了pod再开启也不会丢失数据
nfs目录