例子来源于《Kubernetes实践指南》一书。问题依然没有解决,求助大神。

测试环境

  • Centos 7.0
  • docker 1.13.1
  • kubectl v1.5.2
  • etcd 3.2.18
    都是通过yum安装,防火墙已关闭。

入坑问题

浏览器输入:http://ip:30001/demo/

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.

相关资源rc、pod、service、ep都创建成功,但是myweb的pods无法访问到mysql提供的数据库服务。

# kubectl get all
NAME       DESIRED   CURRENT   READY     AGE
rc/mysql   1         1         1         4h
rc/myweb   1         1         1         2hNAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
svc/kubernetes   10.254.0.1      <none>        443/TCP          5d
svc/mysql        10.254.67.31    <none>        3306/TCP         4h
svc/myweb        10.254.62.177   <nodes>       8080:30001/TCP   2hNAME             READY     STATUS    RESTARTS   AGE
po/mysql-vc9x6   1/1       Running   0          4h
po/myweb-6k7s3   1/1       Running   0          2h
# kubectl get ep
NAME         ENDPOINTS            AGE
kubernetes   192.168.1.171:6443   5d
mysql        172.17.0.4:3306      4h
myweb        172.17.0.2:8080      2h

定义文件

mysql-rc.yaml

apiVersion : v1
kind : ReplicationController
metadata : name : mysql
spec : replicas : 1selector : app : mysqltemplate : metadata : labels : app : mysqlspec : containers : - name : mysqlimage : mysqlports : - containerPort : 3306env : - name : MYSQL_ROOT_PASSWORDvalue : "123456"

mysql-svc.yaml

apiVersion : v1
kind : Service
metadata :  name : mysql
spec :  ports : - port : 3306selector :app : mysql

myweb-rc.yaml

apiVersion : v1
kind : ReplicationController
metadata :  name : myweb
spec :  replicas : 1 selector :  app : myweb template :  metadata :  labels :  app : myweb spec :  containers :  - name : myweb image : tomcat-app:v1 ports :  - containerPort : 8080 env :- name : MYSQL_SERVICE_HOSTvalue : 'mysql'- name : MYSQL_SERVICE_PORTvalue : '3306'

myweb-svc.yaml

apiVersion : v1
kind : Service
metadata :  name : myweb
spec :  type : NodePortports : - port : 8080nodePort : 30001selector :app : myweb

启动方式是顺序执行kubectl create -f yaml

kubectl create -f mysql-rc.yaml
kubectl create -f mysql-svc.yaml
kubectl create -f myweb-rc.yaml
kubectl create -f myweb-svc.yaml

启动后即前面提到的问题。

查看源代码

既然无法建立连接,那先看下是如何建立连接的。登录到myweb的docker容器里面,查看index.jsp文件,主要内容如下:

java.sql.Connection conn=null;
java.lang.String strConn;
java.sql.Statement stmt=null;
java.sql.ResultSet rs=null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
try{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...");System.out.println("jdbc:mysql://"+ip+":"+port+"?useUnicode=true&characterEncoding=UTF-8");conn = java.sql.DriverManager.getConnection("jdbc:mysql://"+ip+":"+port+"?useUnicode=true&characterEncoding=UTF-8", "root","123456");stmt = conn.createStatement();
}catch(Exception ex){...
}

就是用jsp创建了一个连接,连接的地址通过ENV方式注入。即在myweb-rc.yaml中配置的MYSQL_SERVICE_HOST和MYSQL_SERVICE_PORT环境变量指定。
既然指定名称为mysql无法解决,那换成mysql容器的IP是否可行呢?

更新配置

通过kubectl get ep 可以看到mysql暴露出的服务接口,那就用这个Ip试试。
修改myweb-rc.yaml:

        env :- name : MYSQL_SERVICE_HOSTvalue : '172.17.0.4'

然后重新部署pod。但是结果还是一样。

网上看来的

网上有个说法说把 MYSQL_SERVICE_HOST 去掉不配置。但是从源码看,不配置的默认值是localhost,显然不能具备3306的端口服务。

网络谜团

通过docker登录到容器内,互相ping网络都是通的。

mysql:/# ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4): 56 data bytes
64 bytes from 172.17.0.4: icmp_seq=0 ttl=64 time=0.155 ms
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.139 ms
--- 172.17.0.4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.139/0.147/0.155/0.000 msmyweb:/# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.089 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.062 ms
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.062/0.075/0.089/0.016 ms

很显然网络是互通,但不知为何无法通过端口访问。

clusterIP

除了ep暴露的端口服务外,还有一个ClusterIP存在,是否可以通过ClusterIP访问呢。

# kubectl get svc
NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
svc/kubernetes   10.254.0.1      <none>        443/TCP          5d
svc/mysql        10.254.67.31    <none>        3306/TCP         4h
svc/myweb        10.254.62.177   <nodes>       8080:30001/TCP   2h

发现ping ClusterIP全部都不通。至此不明白了。

三个IP

Kubernetes中管理主要有三种类型的IP:Pod IP 、Cluster IP 和 外部IP。

Pod IP

Kubernetes的最小部署单元是Pod。利用Flannel作为不同HOST之间容器互通技术时,由Flannel和etcd维护了一张节点间的路由表。Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

每个Pod启动时,会自动创建一个镜像为gcr.io/google_containers/pause:0.8.0的容器,容器内部与外部的通信经由此容器代理,该容器的IP也可以称为Pod IP。

Cluster IP

Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的,但Service Cluster IP就不一样了,没有网络设备为这个地址负责。它是由kube-proxy使用Iptables规则重新定向到其本地端口,再均衡到后端Pod的。

外部IP

Service对象在Cluster IP range池中分配到的IP只能在内部访问,如果服务作为一个应用程序内部的层次,还是很合适的。如果这个Service作为前端服务,准备为集群外的客户提供业务,我们就需要给这个服务提供公共IP了。

结论

依然不懂为什么会出现链接失败的情况,网络ping通的情况下,无法访问,这个坑填不上
怀疑方向:应该是配置层面的问题,可能是k8s的,也可能是docker的。

转载于:https://www.cnblogs.com/jason0529/p/9146724.html

k8s踩坑记第2篇--3个IP折磨人的故事相关推荐

  1. (二)K8s踩坑记录

    文章目录 1 kubeadm join报错 2 Unable to connect to the server: x509 3 coredns一直处于ContainerCreating状态 4 nod ...

  2. 服务器重新部署踩坑记

    服务器重新部署踩坑记 Intro 之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除 ...

  3. IdentityServer 部署踩坑记

    IdentityServer 部署踩坑记 Intro 周末终于部署了 IdentityServer 以及 IdentityServerAdmin 项目,踩了几个坑,在此记录分享一下. 部署架构 项目是 ...

  4. android小程序_小程序踩坑记

    小程序踩坑记 希望这个文章能尽量记录下小程序的那些坑,避免开发者们浪费自己的生命来定位到底是自己代码导致的还是啥神秘的字节跳变原因. 前记 小程序大多数坑是同一套代码在不同平台上表现不一致导致的,微信 ...

  5. 西岛住宿软件测试,西岛踩坑记:寄存行李居然还要收费!听说要晋升5A,你觉得呢?...

    原标题:西岛踩坑记:寄存行李居然还要收费!听说要晋升5A,你觉得呢? 西岛一个历史很久远的三亚小岛,岛上在很久以前便开始有人居住,他们以捕鱼为生,以海为伴,因为距三亚很近,慢慢得被世人发现发现,后来有 ...

  6. Typora+PicGo-core+SMMS图床踩坑记

    Typora+PicGo-core+SMMS图床踩坑记 一.安装PicGo-Core 二.安装smms v2 API插件 三.配置PicGo-Core 四.最终效果 五.总结 最近把Typora更新后 ...

  7. Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记

    前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...

  8. 在百度地图中叠加CAD图及GIS数据展示踩坑记

    前言 在之前的几篇博客中分别介绍了 在Cesium中实现与CAD的DWG图叠加显示分析 https://www.cnblogs.com/vjmap/p/16541751.html . 高德地图与CAD ...

  9. 微信小程序踩坑记——ColorUI组件的使用

    微信小程序踩坑记--组件的使用 组件类型 ColorUI Vant weapp ColorUI 首先贴上官网链接:官网链接,GitHub链接 简介 ColorUI是一个css库!!!在你引入样式后可以 ...

  10. 7代cpu能装虚拟xp系统吗_Intel 10代PC/笔记本安装Win7踩坑记 amp; 驱动分享

    免责声明:本文只是从技术角度进行讨论,主要因我自己的兴趣而引发测试.只代表个人观点,与任何组织机构无关. 目录 -  从赛扬G5900"亮机"CPU说起 -  10代Core Wi ...

最新文章

  1. 苹果cms10的php.ini目录列表,使用苹果CMSV10常见问题整理官方版
  2. 10 个免费的服务器监控工具推荐
  3. 解决Asp.net中的Chart控件运行出现错误提示“ ChartImg.axd 执行子请求时出错”
  4. AngularJs应用页面切换优化方案
  5. 【NLP】GPT:第一个引入Transformer的预训练模型
  6. 如何向微软提交 Windows 7 测试反馈
  7. 据说这是最受科研人员喜爱的春联
  8. java list初始值null_关于list集合存储null的问题
  9. asp.net 添加权限
  10. 怎么样用计算机才能让电量增多,高手分享:教你如何让电脑延长2倍使用率
  11. 很久很久之前的一道面试题(老师的生日是那一天?)~
  12. 读ZAC网络营销实战密码有感
  13. 【运动学】基于matlab平抛小球地面跳跃规律【含Matlab源码 981期】
  14. Redis分布式锁之:RedLock
  15. Win11文件类型怎么改?Win11修改文件后缀的方法
  16. 梦三国服务器维护多久,《梦三国2》天命地图开启时间变更公告
  17. 《孤独的根号三》 中英文对照
  18. React+Redux技术栈核心要点解析(上篇)
  19. html语言可以写微信小程序吗,微信小程序 语句
  20. 教育部统考课程-计算机,教育部统考课程—《计算机应用基础》作业练习三.doc...

热门文章

  1. spring springMvc spring-boot spring-cloud分别是什么
  2. 复制class文件到as中出现非法字符,须要class,interface货enum
  3. [hadoop读书笔记] 第五章 MapReduce工作机制
  4. 数字头盔摄像头是一个智能选项
  5. feathers ui 实现机制深入解析(feathers ui 源码解析-原创)
  6. 5月8号--华为正式推出新企业标识
  7. 据说IE7.0不支持跨域名脚本,那网页计数器不是要失效啦?
  8. 【5】Java内存访问重排序vs volatile
  9. 关于EntityManager(实体管理器)的常用方法
  10. iOS 几个时间类型