本文通过2个实例来了解k8s。第一个实例为TOMCAT+MYSQL实现在线打分系统,出处为Kubernetes权限指南(第四版);第二个实例为Kubernetes官方提供的PHP+Redis留言板的Hello World例子。
打分系统
此Java Web应用的结构比较简单,是一个运行在Tomcat里的Web App,如图1.1所示,JSP页面通过JDBC直接访问MySQL数据库并展示数据。出于演示和简化的目的,只要程序正确连接到了数据库,就会自动完成对应的Table的创建与初始化数据的准备工作。所以,当我们通过浏览器访问此应用时,就会显示一个表格的页面,数据则来自数据库。镜像下载链接为:https://hub.docker.com/r/kubeguide/tomcat-app
为MySQL服务创建一个RC定义文件mysql-rc.yaml如下:
1 | apiVersion: v1 |
书上image写时没有加入mysql的版本号,由于现在最新版本是8.0,会出现异常,所以要修改为5.7。上述yaml表示创建一个RC资源,副本为1,启动mysql:5.7的镜像,mysql的root密码为123456。
再创建一个service,主要用来给集群内部的其他POD进行通信,表示新建一个名为mysql、端口为3306的svc,保存为mysql-svc.yaml:
1 | apiVersion: v1 |
spec.selector确定了哪些Pod副本(实例)对应本服务。
下载kubeguide/tomcat-app:v1镜像,tomcat-rc.yaml
1 | apiVersion: v1 |
再创建一个svc,tomcat-svc.yaml
1 | apiVersion: v1 |
type=NodePort和nodePort=30001的两个属性表明此Service开启了NodePort方式的外网访问模式。在Kubernetes集群之外,比如在本机的浏览器里,可以通过30001这个端口访问myweb(对应到8080的虚端口上)。
开始创建:
1 | kubectl create -f mysql-rc.yaml |
再通过访问 http://192.168.1.60:30001/demo/ 即可成功访问了。
1 | [root@master ~]# kubectl get svc mysql myweb |
可以看到正常运行了。那为什么tomcat就可以直接访问mysql呢?那我们进入myweb看一下代码:
1 | [root@master ~]# kubectl exec -it myweb-lqr4n -- /bin/bash |
从代码上看,是通过获取环境变量的方式进行连接mysql的。如下:
1 | root@myweb-lqr4n:/usr/local/tomcat/webapps/demo# env |grep MYSQL_SERVICE |
MYSQL_SERVICE_HOST的值为mysql,直接 ping mysql 是可以解析的,解析出来的IP是 10.103.193.69,对应svc上面的IP。而mysql对应是svc的名字,在集群内部是可以解析的,解析时,会自动加上 default.svc.cluster.local。
guestbook实例
这个实例是很经典的一个php+redis主备的实例。官方文档为:https://kubernetes.io/docs/tutorials/stateless-application/guestbook/
由于官方的镜像下载非常慢,就把需要使用到的镜像都推送到自己的仓库下面了。完整的yaml如下:
1 | apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 |
将上述配置保存为文件,然后create之后,去查看各资源状态:
1 | [root@master ~]# kubectl get svc frontend redis-master redis-slave |
这时,可以打开 http://masterip:31233 来访问。
有时redis主备通信不正常,这时可以在pod上面安装一些软件。不过这是对于初学者而言的,原则上不能在pod里面安装任何软件的。
redis-slave使用的是debian7的系统,没有ps命令,需要安装procps
1 | cat >/etc/apt/sources.list <<EOF |
进入redis-slave,可以看到有个/run.sh的脚本:
1 | root@redis-slave-6bf98b5d87-ghm7p:/data# ps aux |
怎么样去连接master是通过GET_HOSTS_FROM变量控制的。当 $GET_HOSTS_FROM 等于env时,运行 redis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} 6379,而等于dns时,运行 redis-server --slaveof redis-master 6379。这时redis-master这个dns域名全称为 redis-master.default.svc.cluster.local,为svc的IP。
那如何测试是否正常呢?可以用ping以及telnet,但是ping是不通的。
1 | root@redis-slave-7c7967fc54-4j8ln:/data# ping redis-master -c 1 |
wetty
未实现,待完善。
1 | apiVersion: apps/v1 |
暴露出口:
kubectl expose deployment kubectl-web --type=NodePort --port=3000 --name=kubectl-web-svc
用户名:term