我的群集上运行了示例应用。我有一个webapp pod,有三个容器。每个作为单独的springboot webservice运行。 employee,test1和test2。暴露于此的服务如下所示
apiVersion: v1
kind: Service
metadata:
labels:
name: webapp
name: webappservice
spec:
ports:
- port: 8080
nodePort: 30062
type: NodePort
selector:
name: webapp
pod规范如下 - 更新为具有整个上下文
apiVersion: v1
kind: Pod
metadata:
name: webapp
labels:
name: webapp
spec:
containers:
-
resources:
limits:
cpu: 0.5
image: kube/employee
imagePullPolicy: IfNotPresent
name: wsemp
ports:
- containerPort: 8080
name: wsemp
-
resources:
limits:
cpu: 0.5
image: kube/test1
imagePullPolicy: IfNotPresent
name: wstest1
ports:
- containerPort: 8081
name: wstest1
imagePullSecrets:
- name: myregistrykey
我的假设是webservice在节点上运行30062,并且根据映射,我将能够访问web服务。例如http://11.168.24.221:30062/employee和http://11.168.24.221:30062/test1/
将员工容器和test1容器中的日志分开。
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/employee],methods=[GET]}" onto public java.util.List<employee.model.Employee> employee.controller.EmployeeController.getAll()
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/test1/],methods=[GET]}" onto public java.util.List<model.Test1> test1.controller.Test1Controller.getAll()
问题是http://11.168.24.221:30062/employee正确点击了网络服务。但当我点击http://11.168.24.221:30062/test1/时,它表示test1 / mapping在上面的日志中不可用,映射显然是可用的。错误消息是Whitelabel错误页面/。此应用程序没有/ error的显式映射,因此您将此视为后备。
我做错了什么?
答案 0 :(得分:2)
您的服务yaml清楚地表明您只将端口8080暴露为NodePort 30062.可以简单地将另一个-port:8081 nodePort:30063
添加到您现有的配置中,但是 - 由于您的两个服务是单独的容器,您可能更喜欢在kubernetes中创建两个单独的部署和服务。一个用于员工,一个用于test1服务。这将允许您单独开发,部署和测试它们。并且通常不建议在POD中使用多个容器(有一些例外) - 请参阅this。
以下是服务的两个yamls。请注意,我更改了名称,标签和选择器。
apiVersion: v1
kind: Service
metadata:
labels:
name: employeeservice
name: employeeservice
spec:
ports:
- port: 8080
nodePort: 30062
type: NodePort
selector:
app: employeeservice
apiVersion: v1
kind: Service
metadata:
labels:
name: test1service
name: test1service
spec:
ports:
- port: 8081
nodePort: 30063
type: NodePort
selector:
app: test1service
您根本不使用部署,但不推荐这样做,并且您不会从kubernetes自我修复能力中获益,例如:当豆荚变得不健康时,它们会自动被替换。
创建部署是easy。以下是两个包含POD规格的部署yamls。请注意,我更改了名称以匹配上述服务中的选择器。我已将副本计数设置为1,因此每个部署只保留一个POD,但您可以通过将其设置为更高的数字来轻松扩展它。
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: employeeservice-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: employeeservice
spec:
containers:
-resources:
limits:
cpu: 0.5
image: kube/employee
imagePullPolicy: IfNotPresent
name: wsemp
ports:
- containerPort: 8080
name: wsemp
imagePullSecrets:
- name: myregistrykey
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: test1service-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: test1service
spec:
containers:
-
resources:
limits:
cpu: 0.5
image: kube/test1
imagePullPolicy: IfNotPresent
name: wstest1
ports:
- containerPort: 8081
name: wstest1
imagePullSecrets:
- name: myregistrykey
另请注意,您可以通过DNS按名称访问您的服务。因此,如果您使用上面的yamls,您应该能够在http://employeeservice/employee
的集群内查询服务,而不是使用节点的IP地址。对于来自群集外部的访问,您可以按指定使用NodePorts,通常可以通过某种路由到所有节点的负载均衡器来实现。