我的群集上有示例应用程序。我有一个WebApp Pod,它有三个容器。每个运行作为单独的Springboot Web服务。员工,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
我的假设是网络服务在节点上的30062上运行,并根据映射,我可以访问WebService。例如http://11.168.24.221:30062/employee and 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正确击中WebService。但是,当我击中http://11.168.24.221:30062/test1/时,它说test1/映射在日志中上述时不可用,显然,映射显然是avaialble的。错误消息是Whitelabel错误页面/。本应用程序没有明确的映射/错误,因此您将其视为后备。
我做错了什么?
您的服务yaml清楚地表明,您仅将端口8080公开为NodePort30062。可以简单地将另一个-port:8081 nodePort:30063
添加到您现有的配置中,但是 - 由于您的两个服务无论如何都是独立的容器您可能更喜欢在Kubernetes中创建两个单独的部署和服务。一个用于员工,一个用于您的Test1服务。这将使您能够分别开发,部署和测试。通常不建议在POD中使用多个容器(有些例外( - 请参阅此。
这是服务的两个YAML。请注意,我更改了名称,标签和选择器。
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自我康复能力,例如当豆荚变得不健康时会自动更换。
创建部署很容易。这是两个用于部署的YAML,其中包括您的POD规格。请注意,我更改了名称以匹配上述服务中的选择器。我已经将复制品计数设置为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通过名称到达的。因此,如果您使用上面的YAML,则应该能够从http://employeeservice/employee
的群集中查询服务,而不是使用节点IP地址。对于从群集外部访问,您可以按指定使用nodeports,通常可以通过将所有节点路由的某种负载平衡器来执行此操作。