最新要闻
- 世界今亮点!不止是中药 连花清瘟新专利来了 可用于制作口罩、内衣、防护服等
- 时讯:200元耳机降噪效果比肩2000元!贝壳王子MO3 2代上手:同价位天花板
- 全国单日票房一度超4000万元:《阿凡达2》万众期待
- 热门:快升级5G!明年4G网速体验更糟糕:原因很无解
- 54年了!波音747飞机正式停产 一记录保持37年
- 画家要失业了?PS母公司Adobe开卖AI图片:侵权赔偿也自己扛
- 为什么海底火山不会被海水浇灭?
- 国产CPU与国产OS联合 阿里平头哥加入openKylin社区
- 男子iPhone 13 Pro不到三个月自燃 法院:商品不符合质量要求 可以换新
- 新资讯:《阿凡达2》获知名制作人小岛秀夫好评点赞:能够让人焕发激情
- 当前滚动:进军PC配件!一加将推出旗下首款机械键盘
- 《巫师3》次时代版“史诗升级”:官方Mod工具终于来了
- AMD RX 7900又一非公卡亮相:档次上去了
- 每日热文:女子被绑浇墨汁?官方:自导自演 直播网红为赚流量博人眼球将严惩
- 全球观热点:AMD RX 7900首批供货非常紧张!某品牌明年才能有
- 环球讯息:约4.1万人民币 法国一公司推出氢能电动自行车:像是助力车
手机
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
票房这么火爆,如何请视障人士“看”一场电影?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
- 票房这么火爆,如何请视障人士“看”一场电影?
家电
环球速讯:Kubernetes单机创建MySQL+Tomcat演示程序:《Kubernetes权威指南》第一章demo报错踩坑
引言
最近做边缘计算项目,因为没有基础,所以首先学习Kubernetes。感觉系统的中文入门资料比较少,只找到《Kubernetes权威指南》(龚正、吴治辉等著,下称《指南》),照着第一章的demo教程编写,前前后后遇到不少问题,也是找了好多资料才解决。所以从头写一下如何配置一个单机版MySQL+Tomcat的demo,希望能给陷入同样困境的同学一点帮助。
文章较长,如果你已经按照《指南》的demo走了一遍,但是遇到了问题,可以直接看最后的“坑点总结”中的解决方案能否解决你的问题。
(资料图片)
知识准备和环境准备
前导知识
本着对零基础的同学友好的态度,前排提示阅读本文前你至少需要以下知识:
- 掌握虚拟机的使用,尤其是网络的配置
- Linux的使用,尤其是CentOS 7的systemctl功能
- 了解如何更换软件安装源(主要是yum和docker)
- 了解docker和容器的基本概念
- 大致了解yaml
- 可能的kexue上网方法(但一般可以通过更换软件源代替)
也就是说,以上的知识本文不会详细展开。如果其中有读者从来没有听说过的概念,最好先学习一下。
实验环境
笔者的实验环境:
Win10 + VMWare14中安装CentOS 7(带GUI),桥接模式上网
之所以强调是CentOS 7(包括RHEL 7),是因为它的系统服务配置使用的是systemctl命令,这可能与其他CentOS版本或Linux发行版有所不同。当然,如果你对Linux的系统服务配置有经验,可以不采用和笔者相同的版本。
另外,下面所有操作最好在root下进行,避免出现权限不足的问题。
Kubernetes安装和配置
基本上按照《指南》中的环境准备如下:
关闭防火墙
终端输入以下命令关闭防火墙:
systemctl disable firewalld #禁止防火墙开机启动systemctl stop firewalld #关闭防火墙服务
如果tab之后有后缀.service是一样的,不带后缀的是简称。
可以使用下面的命令查看防火墙是否已经关闭,如果是inactive表明已关闭:
systemctl status firewalld
当然,生产环境需要自己配置端口访问控制,不能完全关闭防火墙。这里因为是较安全的内网,学习和测试用,直接关闭比较方便。
安装etcd和Kubernetes
yum install -y etcd kubernetes
kubernetes的每个组件有各自的配置文件,可以自定义。而该命令会执行默认配置的安装,对kubernetes尚不了解时一键安装非常方便。
如果安装缓慢,可以尝试更换国内的yum安装源,或者代理上网(虚拟机可以共享物理机的代理端口,SSR和clash软件都有允许局域网共享的功能)。
修改配置文件
此处需要修改两处配置文件。
- Docker配置文件
Docker配置文件为/etc/sysconfig/docker,将OPTIONS的内容设置为:
OPTIONS="--selinux-enabled=false --insecure-registry gcr.io"
可以注释OPTIONS所在行,而非删除它,以留出容错空间ω。
- Kubernetes apiserver配置文件
Kubernetes apiserver配置文件为/etc/kubernetes/apiserver,将--admission_control参数中的ServiceAccount删除(同样地,可以注释原行,复制一行来修改)。也就是更改为:
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
也许你的--admission_control参数并不是在KUBE_ADMISSION_CONTROL变量下,但是在哪里其实是一样的,只要之后的变量读取都有录入即可(不细讲,笔者也尚未完全学习),这里只需要删除。
启动kubernetes服务
按顺序启动以下服务:
systemctl start etcdsystemctl start dockersystemctl start kube-apiserversystemctl start kube-controller-managersystemctl start kube-schedulersystemctl start kubeletsystemctl start kube-proxy
至于为什么要按顺序,笔者认为是因为后面的服务对前面的有依赖,启动顺序不对可能会导致某些意外错误。
这里有一个坑点,就是kube-apiserver启动时必须要开启网络连接,否则会报错:
Job for kube-apiserver.service failed because the control process exited with error code. See "systemctl status kube-apiserver.service" and "journalctl -xe" for details.
因为笔者系统是带GUI的,直接在右上角设置网络连接即可。如果是纯字符界面可能需要自己开启网络服务。
另外,将start选项改为stop和restart分别是停止服务和重启服务,改为enable表示加入开机启动列表。
一键启动脚本
因为是学习阶段,出现各种错误老是需要开开关关,所以写了一个一键启动的脚本。
创建service-list.txt文件,按顺序写上所有需要启动的服务名称:
etcddockerkube-apiserverkube-controller-managerkube-schedulerkubeletkube-proxy
创建脚本文件k8s-service-start.sh:
#!/bin/bashfor SERVNAME in `cat service-list.txt`do systemctl status $SERVNAME &> /dev/null if [ $? -eq 0 ] then echo "Already Active : $SERVNAME" else systemctl start $SERVNAME systemctl status $SERVNAME &> /dev/null if [ $? -eq 0 ] then echo "Start Success : $SERVNAME" else echo "! Start fail : $SERVNAME" fi fidone
记得给脚本加上执行权限:
chmod +x k8s-service-start.sh
当然,如果已经使用systemctl enable加入了开机启动就无需重复操作了。
Docker镜像加速
一般从官方网站下载Docker镜像都比较慢,所以设置一下国内源进行镜像加速。
在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):
{"registry-mirrors":["你的镜像加速地址"]}
我使用的是阿里云源,在阿里云账号的“容器镜像服务 - 镜像中心 - 镜像加速器”菜单中可以找到你专属的镜像加速地址。
你也可以使用其他地址:
网易:https://hub-mirror.c.163.com/
七牛云:https://reg-mirror.qiniu.com
之后重启docker服务:
systemctl daemon-reloadsystemctl restart docker
启动MySQL服务
以上都是安装和配置,下面正式进入到kubernetes的使用了。
首先最好新建一个工作文件夹,方便管理。
编写mysql-rc文件
在工作文件夹下新建RC定义文件mysql-rc.yaml,内容如下:
apiVersion: v1kind: ReplicationControllermetadata: name: mysqlspec: replicas: 1 selector: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 #若不加版本号5.7,可能会导致错误 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "123456"
这里yaml文件中的kind属性,用来表示资源对象的类型,比如这里就表示一个RC。(最外层的)spec一节表示RC的相关属性定义,如replicas表示期望实例数量,template是创建POD实例的模板。注意template中的labels必须与前面的selector匹配。
原版书的spec.containers.image没有写版本号,默认拉取latest镜像,这可能会导致一些不兼容的错误。笔者使用5.7版本没有问题。
另外注意缩进要正确。
编写mysql-svc文件
新建Service定义文件mysql-svc.yaml,内容如下:
apiVersion: v1kind: Servicemetadata: name: mysqlspec: ports: - port: 3306 selector: app: mysql
启动Service和发布RC
文件编写完毕后,就可以启动Service和发布RC了。
- 创建Service:
kubectl create -f mysql-svc.yaml# 正确输出:service "mysql" created
此外对应地,可以用如下命令删除服务:
kubectl delete -f mysql-svc.yaml
- 查看Service是否创建成功:
kubectl get svc# 正确输出:# NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE# kubernetes 10.254.0.1 443/TCP 2d# mysql 10.254.21.86 3306/TCP 17h
其中CLUSTER-IP是kubernetes为POD自动分配的集群内IP,与宿主机无关(且与宿主机网段不能重合)。
- 发布RC:
kubectl create -f mysql-rc.yaml# 正确输出:replicationcontroller "mysql" created
- 查看RC状态:
kubectl get rc# 正确输出,READY应为1:# NAME DESIRED CURRENT READY AGE# mysql 1 1 1 17h
查看POD状态:
kubectl get pods# 正确输出,READY应为1,STATUS应为Running:# NAME READY STATUS RESTARTS AGE# mysql-8811b 1/1 Running 1 17h
如果STATUS为Pending或ContainerCreating,说明还在下载或创建容器,可以等待片刻。如果长时间处于此状态,或者状态变为CrashLoopBackOff或Error,说明出现了某些错误。可以检查一下所有的服务是否已开启,yaml文件编写有无错误(拼写、缩进、多余的空格等)。
读者可能注意到,之前是先编写rc文件再编写svc文件的,但此处是先创建Service再发布RC。实际上,《指南》中是先发布RC再创建Service的,但有博客说这样启动出现了一些问题(虽然不是这个例子),因此这里先创建Service再发布RC。
启动MyWeb服务
上一节定义和启动了MySQL服务,这里用同样的步骤启动Tomcat,也就是Web应用。
编写myweb-rc文件
创建myweb-rc.yaml文件,内容如下:
kind: ReplicationControllermetadata: name: mywebspec: replicas: 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" value: 10.254.21.86 # 这里很坑,集群尚未启动域名解析服务,需要直接填写mysql服务的IP地址 - name: MYSQL_SERVICE_PORT value: "3306"
这个文件也很关键,按照《指南》里写可能会出错。坑点是MYSQL_SERVICE_HOST的值要直接写mysql服务的IP地址,也就是之前使用kubectl get svc
命令查看到的mysql的IP。
当然,真正应用时一定不会这么做,因为某个POD是有可能挂掉的,下次启动时IP可能就会变。但是在刚刚入门时啥都不懂的情况下,这样做是最快的,否则搞了半天看不到成功结果,是非常打击学习兴趣和信心的(笔者就是QwQ)。
编写myweb-svc文件
创建myweb-svc.yaml文件,内容如下:
apiVersion: v1kind: Servicemetadata: name: mywebspec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
启动Service和发布RC
发布Service:
kubectl create -f myweb-svc.yaml# 正确输出:service "myweb" created
发布RC:
kubectl create -f myweb-rc.yaml# 正确输出:replicationcontroller "myweb" created
同样地,可以用kubectl get
命令来查看各种资源的状态。
浏览器访问网页
终于到了激动人心的时刻,配置完毕,可以开始访问网站了。
使用物理机的浏览器访问:
http://虚拟机的IP:30001/demo/
如果成功,你会看到如下页面:
点击“Add...”可以增加记录。
如果不能访问,就用虚拟机自己的浏览器来访问。如果虚拟机可以访问,那么很可能是防火墙的问题,需要关闭后重启kubernetes相关服务,再执行命令:
iptables -P FORWARD ACCEPT
如果还是不能解决,也许你要从头开始检查每个步骤,甚至可能遇到笔者未遇到的错误。假如下面一节的方法都不能解决你的问题,那么笔者也无能为力了orz!
Good luck!_
坑点总结
总结一下笔者踩到的坑。当然也不一定就是关键的错误,但下面的方案笔者都试过。
使用下面的命令查看pods的日志,可能有助于定位错误:
kubectl logs POD名
mysql无法链接
现象
可以访问网页,但浏览器显示报错:
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.
解决方案
有2种可能性:
- mysql版本不对。
- 无法进行域名解析
对于1,删除mysql的RC资源,将mysql-rc.yaml中的image参数改为mysql:5.7后重新发布。
对于2,将myweb-rc.yaml中MYSQL_SERVICE_HOST的value改为mysql服务的IP地址,也就是用kubectl get svc
查看到的地址,重新发布RC。
物理机无法访问网页
现象
物理机无法访问网页,但虚拟机可以。
解决方案
- 查看防火墙状态:
systemctl status firewalld
- 如果没有关闭则手动关闭:
systemctl disable firewalld #禁止防火墙开机启动systemctl stop firewalld #关闭防火墙服务
重启kubernetes相关服务
执行以下命令:
iptables -P FORWARD ACCEPT
无法启动kube-apiserver
现象
启动kube-apiserver报错:
Job for kube-apiserver.service failed because the control process exited with error code. See "systemctl status kube-apiserver.service" and "journalctl -xe" for details.
解决方案
首先打开CentOS自己的网络连接,再启动kube-apiserver。
RC状态卡住
现象
RC的状态卡在ContainerCreating/Pending,或变成CrashLoopBackOff/Error。
解决方案
检查rc的yaml文件有无错误,包括拼写、缩进、多余的空格等。
如果文件编写无误,尝试更换Docker国内镜像源或kexue上网。
其他错误
现象
其他报错,或者看不到报错,但虚拟机和物理机都不能访问。
解决方案
按照本文从头检查所有步骤,若仍然有错可以尝试:
- 删除所有RC和Service,先创建Service,再启动RC
- 重启所有kubernetes服务
- 重启虚拟机
- 打开百度/谷歌/StackOverflow
参考资料:k8s中部署 Tomcat+MySQL服务在k8s中定义和启动mysql和tomcat服务之后,浏览器无法访问的问题
-
环球速讯:Kubernetes单机创建MySQL+Tomcat演示程序:《Kubernetes权威指南》第一章demo报错踩坑
详细记录了完成《Kubernetes权威指南》第一章demo的方法,尤其是可能会遇到的一些错误。希望可以帮助到...
来源: 环球速讯:Kubernetes单机创建MySQL+Tomcat演示程序:《Kubernetes权威指南》第一章demo报错踩坑
全球最新:npm或者yarn安装sharp太慢、失败等问题
世界今亮点!不止是中药 连花清瘟新专利来了 可用于制作口罩、内衣、防护服等
时讯:200元耳机降噪效果比肩2000元!贝壳王子MO3 2代上手:同价位天花板
全国单日票房一度超4000万元:《阿凡达2》万众期待
热门:快升级5G!明年4G网速体验更糟糕:原因很无解
54年了!波音747飞机正式停产 一记录保持37年
焦点播报:MAUI新生3.4-深入理解XAML:数据模板DataTemplate
环球观热点:生成器函数
当前视点!Kubernetes configmap 笔记
画家要失业了?PS母公司Adobe开卖AI图片:侵权赔偿也自己扛
为什么海底火山不会被海水浇灭?
Javascript-极速入门指南-2-BOM与DOM操作-jQuery简介
54个CSS重难点整理,12-24篇,进阶高薪必需要掌握的知识点
国产CPU与国产OS联合 阿里平头哥加入openKylin社区
男子iPhone 13 Pro不到三个月自燃 法院:商品不符合质量要求 可以换新
全球热点!java创建线程的唯一方式
第一百一十篇:内存泄漏和垃圾回收(JS)
新资讯:《阿凡达2》获知名制作人小岛秀夫好评点赞:能够让人焕发激情
当前滚动:进军PC配件!一加将推出旗下首款机械键盘
《巫师3》次时代版“史诗升级”:官方Mod工具终于来了
AMD RX 7900又一非公卡亮相:档次上去了
每日热文:女子被绑浇墨汁?官方:自导自演 直播网红为赚流量博人眼球将严惩
left jon连接查询踩坑记
全球观热点:AMD RX 7900首批供货非常紧张!某品牌明年才能有
环球讯息:约4.1万人民币 法国一公司推出氢能电动自行车:像是助力车
环球焦点!一加11渲染图被网友恶搞:辨识度拉满
中国超越德国成全球第二大出口国!比亚迪自建船队引关注
世界快看点丨福建一景区回应多人推山顶“风动石”:重几十吨 风能吹动人推不动它
天天微头条丨没开发人员,接到开发物联网系统的活儿,干不干?
当前快讯:大笔加码越南!三星电子和LG将追加投资数十亿美元建厂
世界观点:惊了!研究发现蚂蚁竟也产奶 难道它也是哺乳动物?
1.7米长 从头裹到脚:洁丽雅加厚加大浴巾29元抄底
天天快播:“售后、周转、维护” 电动自行车换电池“三不要”
环球微动态丨移动端硬件实时光追落地!第二代骁龙8让游戏画面更逼真
快讯:全同态加密是否完美?
力扣刷题03
热门看点:MySQ 8.0 推出直方图,性能大大提升!
记录--uniapp自定义相机 自定义界面拍照录像闪光灯切换摄像头
世界视点!浙里办单点登陆、令牌获取用户信息
【全球热闻】iOS开发证书发布证书,推送证书,描述文件的生成总集(一)
世界今热点:AirPods Pro 2立大功!苹果占据31%真无线耳机市场
天天热议:网友吐槽买瓶饮料都要下载APP 网友:是我我扭头就走
全球热点!Chrome更新置顶横幅通知:明确不再支持Win7/8.1平台
环球速看:价格屠夫 小米4K双99%色域专业显示器2399元(首发3499)
天天快播:日本队更衣室留千纸鹤表感谢!国际足联再感谢日本球迷清理看台引热议 高素质
世界快讯:日产回应车机更新显示文案待定:车联网激活才可正常使用
手机端光追将至:Basemark推出首个移动设备光追基准测试
奇瑞汽车站起来了!连续6月销量超10万 破百万辆大关
小太阳取暖忘断电7分钟烧掉整间屋!官方科普冬季电器使用指南
世界焦点!买到运损保时捷女子要求退一赔三!判了:退车4S店再赔20万
焦点快播:吃肉最毁环境、很不环保?国外动物保护主义者抗议肉食让吃素
“不良剧情直播”污人眼球 抖音出手:禁止虚假炒作、已处罚9万多账号
天天热点!醉驾男遇上碰瓷女:给五万要私了嫌贵 结果双双被拘
4比1送走韩国 巴西球员轮流摸罗纳尔多双腿蹭欧气 “小熊”说要继续跳舞直到决赛
环球微动态丨告别半斤机!小米13全系机身数据出炉:陶瓷/玻璃/素皮集齐了
4比1大胜韩国 巴西队赛后集体为球王贝利祈福 女儿称正从肺部感染康复
咖喱味越来越浓!消息称苹果调整产业链 国行iPhone/iPad印度产会变多
小米13系列海报曝光!标准版设计如何 跟Pro差别较大
环球速讯:网飞期待《狩魔猎人》新季新气象
每日焦点!开眼了!丰田为电动车推出“手动挡”结构 雷克萨斯实车跑山演示
【天天新视野】全球首发第二代骁龙8!vivo X90 Pro+开售:12+512GB顶配6999元
”摆烂模式“成牛津词典2022年度词 今天你摆烂了吗?
环球讯息:韩国球迷用7比1嘲讽巴西最后惨败 亚洲一哥孙兴慜称尽力:网友直言自取其辱
天天视点!7399买吗?AMD RX 7900XTX性能首曝光:对比4080/90结果意外
【全球时快讯】比亚迪纯电神车海豚哥伦比亚发布:405km续航、搭刀片电池
全球热文:11月新能源汽车销量再创新高:比亚迪一骑绝尘 甩远特斯拉
世界热头条丨市场仍低迷!预计2022年全球智能手机出货量下降9.1%
【独家】柯洁直播透露斥巨资进军餐饮:光装修花了1800万 品质、价位无敌
世界今热点:日本点球战2-4负克罗地亚、巴西4-1大胜韩国:亚洲球队世界杯全部出局
“侃爷”怀疑马斯克是半个中国人!本人神回应
你每天都在用的餐具 用错等于慢性“投毒”!小心这7类材料
中国人搞锂到底有多狠?美国都开始耍花招了!
天天日报丨当年那些卖伟哥的垃圾邮件:一天就能赚7000美元!
观焦点:100年前的导演拍出“摘头”特效:就问你服不服
快报:网传上海工厂将主动减产20% 特斯拉回应:不实消息
今热点:长沙一SUV高速上失控狂飙500公里引热议 刹车为何同时失灵?专家释疑
小米上一代旗舰12S Pro降至4699元!传小米13也差不多卖这价
世界微动态丨电费飙升 日本最强超算用不上起了:临时关闭30%节点
2022十佳游戏公布:第一名《战神5》
全球要闻:女子头胎生龙凤胎 2胎又生双胞胎:众网友顶礼膜拜
国服花落谁家?暴雪心血大作《暗黑破坏神4》:要正式来了
NVIDIA坐不住了:要用1年时间干掉游戏显卡市场一切乱象
天天微资讯!仅上线不到一年!字节跳动旗下阅读App识区宣布停运
连续泄露小米13真机!百万粉汽车大V公开道歉 愿意接受处罚
【世界报资讯】恒驰汽车累计被执行超1亿元 研究院曾同一天5次成老赖
【天天新视野】日本神嘴鹦鹉冲上微博热搜榜:预测日本晋级
上海一轿车冲下数十米高架:车顶塌陷、摔成铁饼
手机飞行模式将成过去时 欧盟明年允许飞机上开5G
荣耀Magic Vs推出个性化服务:手机铰链处可自定义镌刻
每日速看!小直屏+直边方向对了!小米13预约数领先Pro版:核心配置完全同步
世界信息:加码VR头显!苹果大力招募神经渲染研究人员
米粉建议小米13发布会直接说价格 魏思琪:料还有很多
妈妈带女儿在自家保时捷上作画:网友质疑
讯息:今晚油价“二连降”!92号汽油重回“7元时代”:加满少花17.5元
元旦假期还有三周时间 机票平均价格上涨30%:贵过黄金周
小米在德国推出米家烹饪机器人!看到价格我就放心了
RTX 4080被曝要降价了!可不是惧怕AMD RX 7900
天天资讯:米粉谈小米12S Ultra给他的最大印象:拍照不可思议
爱美不容易!穿错高跟鞋可能会带来身体伤害:弓形腿、骨盆前倾