该系统主要有三个部分,nginx静态页面、jar包应用、mysql数据库。K8S集群有三台,106 master 107/108为 node
一. 端口分类
(PORT分类)
对网上相关材料进行了搜集整合(仅用作学习,如需删除,可私信)
port
是service端口,即k8s中服务之间的访问端口.service暴露在cluster ip上的端口,clusterIP:port 是提供给集群内部客户访问service的入口
targetport
是pod(也就是容器)的端口;targetPort是pod上的端口。从port和nodePort上来的数据,经过kube-proxy流入到后端pod上的targetPort,最终进入容器
nodePort
首先,nodePort是kubernetes提供给集群外部客户访问service入口的一种方式(另一种方式是LoadBalancer)。是容器所在node节点的端口,即外部机器可访问的端口。(通过nodeport类型的service暴露给集群节点)。所以,nodeIP:nodePort 是提供给集群外部客户访问service的入口
apiVersion: v1
kind: Service
metadata:
name: nio4444-service
spec:
type: NodePort // 有配置NodePort,外部流量可访问k8s中的服务
ports:
- port: 30080 // k8s内部服务访使用
targetPort: 80 // pod容器使用端口
nodePort: 30001 // NodePort,给外部访问使用
selector:
name: nginx-pod
containerPort
containerPort是pod内部容器的端口,targetPort映射到containerPort。containerPort 定义了应用程序可以在容器内访问的端口。 注意它是定义的容器内的端口。是在pod控制器中定义的,pod中的容器需要暴露的端口。
port、nodePort:总的来说,port和nodePort都是service的端口,前者暴露给集群内客户访问服务,后者暴露给集群外客户访问服务。从这两个端口到来的数据都需要经过反向代理kube-proxy流入后端pod的targetPod,从而到达pod中的容器
hostPort
类似docker -p 参数做的端口映射,将容器内端口映射到宿主机上(hostPort),在k8s中,这是一种直接定义Pod网络的方式。
hostPort是直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过宿主机的IP加上来访问Pod了
hostPort:
apiVersion: v1
kind: Pod
metadata:
name: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8.5
ports:
- hostPort: 8081
containerPort: 8080
protocol: TCP
二、Nginx静态页面
主要有三个文件:namespace.yml deployment.yml service.yml
创建命名空间
kubctl create -f namespace.yml
kubctl create -f deployment.yml 如果是离线的话,最好保证每个slave的机器内都有对应的镜像文件。
设置imagePullPolicy:Never 即可从本地拉取镜像,要不然会从联网仓库中拉取。
kubctl create -f service.yml 对外进行服务
发现slave上已有两个pod。 默认情况下会优先分配给清闲的节点上运行,而且大概率都会运行在同一个节点上。
此对外服务的网络是flannel,type为nodeport而非(clusterip),所以虽然运行在04节点上,但是在浏览器也可通过03访问,如下图。nodeport范围为:30000~32767
前端即可显示正常页面
service之ClusterIP(内网ip),暴露集群IP和端口号,解决IP随Pod变化的问题
service之NodePort(外网ip),暴露NodePort类型,解决集群外无法访问的问题
如果使用clusterIP,只可内部访问,如将上面的service.yml文件更改clusterip,也需将nodeport注释,重新deployment和service
kubctl delete/create -f deployment.yml
kubctl delete/create -f service.yml
三、Jar包
因为内网测试,需要在两个node创建jar包镜像
创建dockerfile.yml文件
构建镜像
docker build -t jeecg-boot:V1.0.1 .
master上创建deployment 和service文件
在jar包传入链接数据库的密码,采用env的方式传参。
jar采用clusterIP 的方式,services如下图
matste节点:针对nginx的deployment文件进行修改,挂载conf 文件及html。
node节点:针对nginx.conf的配置文件进行修改,图中proxy_pass 为了测试就简单写了ip,可以使用svr.namespace:port方式。
最终验证功能正常