【发布时间】:2018-08-18 15:35:37
【问题描述】:
Step1:在 CentOS7 中用 YUM 完成安装 etcd 和 kubernetes 并关闭防火墙
Step2:修改/etc/sysconfig/docker中的相关配置项
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
Step3:修改/etc/kubernetes/apiserver中相关配置项
删除
服务帐户
在 KUBE_ADMISSION_CONTROL 配置项中
Step4:启动etcd和kubernetes的所有相关服务
Step5:为 mysql db 启动 ReplicationController
kubectl create -f mysql-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas: 1
selector:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: hub.c.163.com/library/mysql
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
Step6:启动相关的mysql db服务
kubectl create -f mysql-svc.yaml
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
Step7:为 myweb 启动 ReplicationController
kubectl create -f myweb-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 3
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: docker.io/kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: "mysql"
- name: MYSQL_SERVICE_PORT
value: "3306"
Step8:启动相关的tomcat服务
kubectl create -f myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
当我使用 nodeport(30001) 从浏览器访问时,我得到以下异常:
错误:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信链路故障 最后一个数据包成功发送到 服务器是 0 毫秒前。驱动程序没有收到任何数据包 来自服务器。
kubectl 获取 ep
NAME ENDPOINTS AGE
kubernetes 192.168.57.129:6443 1d
mysql 172.17.0.2:3306 1d
myweb 172.17.0.3:8080,172.17.0.4:8080,172.17.0.5:8080 1d
kubectl 获取服务
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 1d
mysql 10.254.0.5 <none> 3306/TCP 1d
myweb 10.254.220.2 <nodes> 8080:30001/TCP 1d
从任何tomcat容器的内部我可以看到mysql env和JSP中相关的mysql链接代码如下:
Class.forName("com.mysql.jdbc.Driver");
String ip=System.getenv("MYSQL_SERVICE_HOST");
String port=System.getenv("MYSQL_SERVICE_PORT");
ip=(ip==null)?"localhost":ip;
port=(port==null)?"3306":port;
System.out.println("Connecting to database...");
conn = java.sql.DriverManager.getConnection("jdbc:mysql://"+ip+":"+port+"?useUnicode=true&characterEncoding=UTF-8", "root","123456");
[root@promote ~]# docker exec -it 1470cfaa1b1c /bin/bash
root@myweb-xswfb:/usr/local/tomcat# env |grep MYSQL_SERVICE
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_HOST=mysql
root@myweb-xswfb:/usr/local/tomcat# ping mysql
ping:未知主机
谁能告诉我为什么我无法从内部 tomcat 服务器 ping mysqldb 主机名?或者如何进一步定位问题?
【问题讨论】:
-
你的mysql容器运行正常吗?看看stackoverflow.com/a/10772407/2718151
-
我已经检查了数据库状态。它运行良好。 [root@promote ~]# docker exec -it 6985951cfd7f /bin/bash root@mysql-8zzxp:/# mysql -p 输入密码:欢迎使用 MySQL 监视器。命令以 ; 结尾或 \g.
-
Endpoint ip 可以很好到达。但是服务 ip 无法到达。不可能这么奇怪。
标签: mysql docker kubernetes