工作之余,学习Docker和K8S有一段时间了,算是略懂皮毛……
开始的时候,觉得使用Docker和K8S各种不习惯,慢慢的,发现还是K8S操作起来方便,比自己“吭哧吭哧”上官网、查资料,配置yum仓库,在虚拟机上一步步安装各种应用比起来,K8S还是省事儿不少,再考虑到生产环境的集群管理、服务自动发现、系统自动修复等,还是应该学习新技术。
这期就针对Tomcat安装,分别用CentOS虚拟机,和K8S+Docker对比一下。
1)操作系统CentOS 7.5
2)Tomcat 7 (可选,如果是通过二进制解压安装,需要在官网上下载,然后在虚拟机本地解压,配置环境变量)
3)JAVA 1.8 (可选,如果Tomcat选择二进制解压安装,或者是yum安装没有包含JAVA,需要手动安装,然后配置环境变量)
1)Docker 18.03.1-ce
2)Kubernetes环境(可以是集群,也可以是单节点,即Master和Node在一台虚拟机或物理机上)
步骤一:安装Tomcat。因为只是做测试,图省事儿,这次并没有上官网,也没有采用二进制解压安装,而是直接使用yum安装,所以Tomcat版本比较低(Tomcat 7,官网已发布到Tomcat 10),但这并不影响实验结果,只要能出现Tomcat欢迎界面即可。
如果不确定自己的虚拟机环境是干净的,之前没有安装过Tomcat或JAVA,可以使用命令查看:
yum info tomcat
rpm -q tomcat
tomcat version
java -version
如果没有任何tomcat和JAVA信息的话,就正式开始安装吧。
yum install tomcat -y
安装完成后,使用tomcat version查看版本信息,如果能够看到相关信息,说明安装成功。
步骤二:安装JAVA。但我发现在yum安装Tomcat的时候,依赖包中已经安装了java,索性用java -version查看了一下版本信息,发现确实已安装。
步骤三:配置环境变量。正常情况下,为了后续工作都会手动配置一下环境变量,比如Tomcat的CATALINA_BASE和CATALINA_HOME,还有JAVA的JAVA_HOME,CLASSPATH等。由于我只是简单测试,查看Tomcat运行状态,好像也关联了环境变量,索性就省略了,抱着“侥幸”心态只追求那个欢迎界面。
tomcat start //启动tomcat服务
systemctl status tomcat //查看tomcat服务运行状态
步骤四:验证安装结果。Tomcat服务已启动,但此时还不能访问tomcat欢迎页面,还需要安装tomcat管理包。
yum install -y tomcat-webapps tomcat-admin-webapps
关闭防火墙firewalld服务,并重新启动tomcat服务,然后使用curl命令进行本地验证。
systemctl stop firewalld //关闭防火墙
tomcat start //可使用tomcat stop停止服务,再start启动服务
ss -ntl | grep 8080 //查看监听端口,能看到8080,说明tomcat启动正常
curl localhost:8080 //测试本地8080端口上的服务
可以看到tomcat欢迎页面的HTML内容,为了直观可见,在浏览器中输入虚拟机IP地址和8080端口,正常可看到tomcat欢迎页面。
在K8S中,最小的部署单元是Pod,一个Pod里面可以创建多个容器,也就是docker,所以在本实验中,Node2就相当于一台虚拟机(生产环境中肯定是物理机),在这个Node2中创建一个Pod,可以叫Pod1(在实验中名字为“demo-tomcat-”前缀加一串随机字符),然后在Pod1中运行着一个tomcat容器(docker),即上图红色框框中。
步骤一:创建运行tomcat的Pod。通过一个yaml文件来创建(如果对于yaml格式的文件不熟悉,可先百度扫盲一下,这种文件格式在K8S中经常遇到),该yaml文件为tomcat-deployment.yaml,详细代码如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-tomcat
labels:
app: demo
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: tomcat
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
先不要因为看到上面的代码而胆怯,后续我会详细的介绍这些代码,看多了就习惯了,而且会发现越来越“好看”。关键几条解释如下:
使用kubectl命令行创建该Pod,注意yaml文件的名字必须跟自己创建的一致,创建过程大概几十秒,直到该Pod运行状态为Running。
kubectl apply -f tomcat-deployment.yaml
kubectl get pod
步骤二:验证结果。可以通过kubectl命令行,获取该Pod的IP地址,同样使用IP地址加端口号,即可访问该Pod中运行的tomcat容器服务。
kubectl get pod -o wide
curl 10.122.16.169:8080
实际上,实验到此就算是成功了,如果想为了直观的用浏览器看到欢迎页面,还需要再做点工作。在K8S中,Pod是不直接对外暴露访问IP地址和端口的,为了集群好管理,如果需要对外提供web服务,可通过Service组件实现。
步骤三:使用浏览器验证tomcat欢迎页面。与创建Pod类似,我们需要先编写一个yaml文件,然后创建一个Service组件,并且与运行Tomcat的Pod关联起来,外部用户通过浏览器访问到Service组件的IP地址和端口号,然后进一步映射到Pod上,从而能够顺利打开Tomcat的欢迎页面。
创建tomcat-svc.yaml文件,详细代码如下:
apiVersion: v1
kind: Service
metadata:
name: mytomcat
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: demo
同样不要因为看到这些代码而发懵,看多了就习惯了。需要强调的是,创建的这个Service文件中一些信息,必须要跟之前创建的Pod文件中关联起来,否则彼此是找不到的。
使用kubectl命令行创建Service,然后根据生成的nodePort端口号(即30001),然后使用Node(即虚拟机)IP地址加上此端口号,通过浏览器访问。如果成功,可访问到Tomcat欢迎界面。
kubectl apply -f tomcat-svc.yaml
kubectl get svc
1)在虚拟机环境下,安装Tomcat,需要自行配置和设置的地方多,我选择还是“懒人做法”,直接用yum安装了,如果选择二进制解压安装,需要单独安装Tomcat、JAVA,配置环境变量,还得设置防火墙(要么关闭,要么放通8080端口),安装Tomcat管理包。
在K8S + Docker环境下,只要编写好yaml文件,镜像(安装包)是直接从K8S公共镜像仓库拉取的,整个镜像包含了完整的运行环境,不需要额外的配置。如果要修改映射端口等信息,仍然是在yaml文件中完成,不需要打开其它配置文件。
2)在权限隔离方面,虚拟机环境下安装了Tomcat,在此虚拟机上如果还安装其它应用,彼此是会互相影响的,且可以看到彼此的配置文件等关键信息,内部几乎没有隔离。从浏览器访问,也是直接访问的虚拟机上的Tomcat服务,也没有内部和外部的逻辑隔离。
而K8S + Docker环境下,权限隔离明显要好很多,Node里面不同Pod的隔离,比如安装Tomcat的Pod和安装Nginx的Pod之间就是隔离的,无论是资源还是权限;对内服务和对外服务的隔离,比如创建Pod后,内部可以直接访问Tomcat欢迎页面,如果外部要通过浏览器访问,需要再创建Service并且暴露nodePort,才能被访问。