k8s系列文章5: k8s运行第一个应用
本示例应用是一个java web的应用,结构比较简单,是一个运行在Tomcat里的Web app。为了演示简单,只要程序正确连接了数据库,就会自动完成对应的Table创建和初始化数据库的工作。在浏览器中访问此应用,就会显示一个表格的页面。
此应用需要启动两个容器:web App容器和Mysql容器,并且Web App容器需要访问Mysql容器。
1. 环境准备
首先,安装k8s并下载相关镜像。参考前两篇文章:k8s系列文章3: kubeadm搭建k8s集群(上)、k8s系列文章3: kubeadm搭建k8s集群(下)。
2. 启动Mysql服务
首先,为Mysql服务创建一个RC定义文件mysql-rc.yaml:
apiVersion: v1
kind: ReplicationController #该文件是一个副本控制器
metadata:
name: mysql #副本的名称,全局唯一
spec:
replicas: 1 #pod副本的期望数量
selector:
app: mysql #符合目标的pod拥有此标签
template: #根据此模版创建pod副本
metadata:
labels:
app: mysql #pod副本拥有的标签,对应RC的Selector
spec:
containers: #pod内容器的定义部分
- name: mysql
image: mysql:5.7 #此处书上《kubernetes权威指南》没有5.7,若不指定版本,将报错。
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
这里需要注意一点,spec.template.metadata.labels必须匹配之前的spec.selector.否则RC会一直创建无法匹配的pod,陷入恶性循环,直到将节点撑爆。
创建好RC后,将其发布到集群中,在Master节点执行命令:
kubectl create -f mysql-rc.yaml # replicationcontroller "mysql" created
查看刚刚创建的RC:
kubectl get rc
WechatIMG12.png
运行下面的命令查看pod的创建情况:
kubectl get pods
通过docker ps在Node上查看,会发现已经有了docker容器在运行。
最后,创建一个与之关联k8s Service--Mysql的定义文件(文件名为mysql-svc.yaml),完整定义内容如下:
apiVersion: v1
kind: Service #表明这是k8s Service
metadata:
name: mysql #Service的全局唯一名称
spec:
ports:
- port: 3306
selector:
app: mysql
运行命令,创建service:
kubectl create -f mysql-svc.yaml
运行命令查看刚刚创建的Service:
kubectl get svc
svc.png
可以发现,mysql已经被分配了一个集群地址10.103.225.236。在集群中的其他pod就能直接通过这个地址访问mysql服务。
3. 启动Tomcat应用
和创建mysql服务rc类似,启动tomcat,首先创建tomcat的RC文件:
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 2
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
images: kubeguide/tomcat-app:v1
ports:
- containerPort: 8090
env:
- name: MYSQL_SERVICE_HOST
value: 10.103.225.236
创建tomcat对应的Service文件,以下是完整的yaml定义文件:
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
-port: 8080
nodePort: 30001
selector:
app: myweb
创建service:
kubectl create -f myweb-svc.yaml
至此,第一个应用就部署到k8s中了。通过浏览器可以直接访问。通过集群的Master节点+ip/demo访问即可。