使用Service发布前后端应用程序
使用Service发布前后端应用程序
文章目录
- 使用Service发布前后端应用程序
- @[toc]
- 一、创建并发布后端应用程序
- 二、创建并发布前端应用程序
- 三、通过前端发送流量进行测试
文章目录
- 使用Service发布前后端应用程序
- @[toc]
- 一、创建并发布后端应用程序
- 二、创建并发布前端应用程序
- 三、通过前端发送流量进行测试
部署前端(Frontend)微服务和后端(Backend)微服务是比较常见的应用场景。使用Service就可以在Kubernetes集群中实现这种部署,本例以nginx作为前端应用程序,Tomcat作为后端应用程序,分别创建两个Service,前端Service对外发布,前端的Pod通过后端Service的域名连接后端
一、创建并发布后端应用程序
将请求从前端发送到后端的关键是后端Service。为简化实验,本例的后端应用程序选择基本的Tomcat服务器。
(1)使用Deployment部署该应用程序
[root@master ~]# vim backend-deploy.yaml
[root@master ~]# cat backend-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: backend
spec:selector:matchLabels: # 多标签选择器app: webapptier: backendreplicas: 3template:metadata:labels:app: webapptier: backendspec:containers: # 容器运行Tomcat服务器- name: tomcatimage: tomcat:8.0-alpineports:- containerPort: 8080
(2)执行创建Deployment
[root@master ~]# kubectl apply -f backend-deploy.yaml
deployment.apps/backend created
(3)使用Service发布该应用程序
[root@master ~]# vim backend-service.yaml
[root@master ~]# cat backend-service.yaml
apiVersion: v1
kind: Service
metadata:name: webapp
spec:selector: # 组合多标签选择器来选择目标Podapp: webapptier: backendports:- protocol: TCPport: 80targetPort: 8080
(4)执行创建Service
[root@master ~]# kubectl apply -f backend-service.yaml
service/webapp created
(5)查看Service详细信息
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
backend-5c94c696c-2jb4g 1/1 Running 0 11m
backend-5c94c696c-8hmvv 0/1 ContainerCreating 0 11m
backend-5c94c696c-pw4mj 1/1 Running 0 11m
[root@master ~]# kubectl describe service webapp
Name: webapp
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=webapp,tier=backend
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.107.1.140
IPs: 10.107.1.140
Port: <unset> 80/TCP
TargetPort: 8080/TCP
Endpoints: 10.244.166.135:8080,10.244.166.136:8080
Session Affinity: None
Events: <none>
至此,名为webapp的Service可以将请求流量发送到后端服务的2个副本上。Service用于发送网络流量,是的后端微服务总是可以访问,但是此Service在集群外部无法访问也无法解析。
二、创建并发布前端应用程序
接下来创建一个可在集群外部访问的前端应用程序,并通过代理前端的请求连接到后端应用程序。本例的前端应用程序选择nginx。与后端应用程序类似,前端应用程序包含一个Deployment和一个Service,唯一的区别是前端Service要提供外部访问。
(1)创建ConfigMap,将nginx的上游服务器配置为后端应用程序
nginx除了可以直接作为Web服务器使用外,还可以通过反向代理将请求转发给上游服务器。本例前端使用的是原生的nginx镜像,需要自定义配置文件,将请求转发给前面发布的后端Service。
首先创建一个nginx配置文件
[root@master ~]# cat nginx.conf
# Backend 是 Nginx 的内部标识符,用于命名以下特定的上游服务器(upstream)
upstream Backend {# webapp 是 Kubernetes 中的后端服务所使用的内部DNS名称server webapp;
}
server {listen 80;location / {# 以下语句将流量通过代理方式转发到名为Backend的上游服务器proxy_pass http://Backend;}
}
Service具有服务发现机制,前端应用程序通过后端Service的域名就可以将请求发送到后端Pod
然后基于该配置文件创建名为nginx-config的ConfigMap,供前端使用
[root@master ~]# kubectl create configmap nginx-config --from-file=nginx.conf
configmap/nginx-config created
(2)创建Deployment
[root@master ~]# vim frontend-deploy.yaml
[root@master ~]# cat frontend-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: frontend
spec:selector:matchLabels:app: webapptier: frontendreplicas: 1 # 前端只提供一个副本template:metadata:labels:app: webapptier: frontendspec:containers:- name: nginximage: nginx:1.14.2volumeMounts: # 挂载由ConfigMap提供的配置文件- name: nginx-configmountPath: /etc/nginx/conf.d/default.confsubPath: nginx.confvolumes: # 定义由ConfigMap提供的特殊卷- name: nginx-configconfigMap:name: nginx-configitems:- key: nginx.confpath: nginx.conf[root@master ~]#
注意,这里的容器挂载了由上述ConfigMap提供的nginx配置文件
(3)执行创建
[root@master ~]# kubectl apply -f frontend-deploy.yaml
deployment.apps/frontend created
(4)创建Service
[root@master ~]# cat frontend-service.yaml
apiVersion: v1
kind: Service
metadata:name: frontend
spec:type: NodePort # Service类型为NodePortselector:app: webapptier: frontendports:- protocol: TCPport: 80targetPort: 80nodePort: 30080 # 节点上绑定的端口
实际应用中,大多会使用LoadBalancer类型的Service,利用云提供商的负载均衡器实现从集群外部访问的目的。为了便于实验,这里改用NodePort类型的Service,通过节点IP地址和端口对外发布应用程序。
(5)执行创建
[root@master ~]# kubectl apply -f frontend-service.yaml
service/frontend created
(6)列出该Service的基本信息
[root@master ~]# kubectl get svc frontend
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend NodePort 10.101.220.232 <none> 80:30080/TCP 47s
(7)该Service仅运行一个Pod副本,执行以下命令列出该Pod信息。
[root@master ~]# kubectl get po --selector="tier=frontend" -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
frontend-85bf7d77d8-xfzbl 1/1 Running 0 5m3s 10.244.104.1 node2 <none> <none>
可以发现,该Service的Pod副本在node2节点上运行。但是,外部用户可以通过集群中任一节点的IP地址(域名)和节点端口来访问该Service发布的应用程序。至此,前端和后端的连接已经完成。
三、通过前端发送流量进行测试
可以使用curl命令通过前端Service的集群节点IP地址和端口访问服务端点,进行简单的测试,结果发现能够访问后端的Tomcat服务器。例如,访问node1节点:
[root@master ~]# curl http://192.168.10.31:30080
...<h1>Apache Tomcat/8.0.53</h1>
...
[root@master ~]#
使用浏览器访问该前端Service,这里访问另一个节点node2(IP地址为192.168.10.32),进一步验证了前后端的成功连接。
测试完毕后,删除创建的对象
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
backend-5c94c696c-2jb4g 1/1 Running 0 36m
backend-5c94c696c-8hmvv 0/1 ContainerCreating 0 36m
backend-5c94c696c-pw4mj 1/1 Running 0 36m
frontend-85bf7d77d8-xfzbl 1/1 Running 0 12m
[root@master ~]# kubectl delete services frontend webapp
service "frontend" deleted
service "webapp" deleted
[root@master ~]# kubectl delete deployment frontend backend
deployment.apps "frontend" deleted
deployment.apps "backend" deleted
[root@master ~]# kubectl delete cm nginx-config
configmap "nginx-config" deleted
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
backend-5c94c696c-8hmvv 0/1 Terminating 0 37m
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 27d
[root@master ~]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 27d
[root@master ~]# kubectl delete pod backend-5c94c696c-8hmvv --grace-period=0 --force
Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "backend-5c94c696c-8hmvv" force deleted
[root@master ~]# kubectl get pods
No resources found in default namespace.
[root@master ~]#