我有两个Java微服务( caller.jar ,调用被称为.jar ) java.net.UnknownHostException: called
我们可以通过 env-var CALLERPORT设置 call 者服务http端口,并通过env-var CALLEDADDRESS设置被叫服务的地址。
因此,调用方使用两个env-var。
我们还必须设置称为 service env-var CALLEDPORT的,以便设置被调用服务正在侦听HTTP请求的特定http端口。
我不知道确切如何从Dockerfile中公开这些变量,以便使用Kubernetes进行设置。
这是我制作两个Dockerfile的方法:
调用方的DockerfileFROM openjdk:8-jdk-alpine
# ENV CALLERPORT (it's own port)
# ENV CALLEDADDRESS (the other service address)
ADD caller.jar /
CMD ["java", "-jar", "caller.jar"]
名为的DockerfileFROM openjdk:8-jdk-alpine
# ENV CALLEDPORT (it's own port)
ADD called.jar /
CMD ["java", "-jar", "called.jar"]
通过这些,我制作了两个 Docker镜像:
然后,我做了两个Deployments.yaml,以便让K8s使用副本和负载平衡器部署(在minikube上)两个微服务。
Deployment-caller.yaml apiVersion: v1
kind: Service
metadata:
name: caller-loadbalancer
spec:
type: LoadBalancer
ports:
- port: 8080
targetPort: 8080
selector:
app: caller
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: caller
labels:
app: caller
spec:
replicas: 2
minReadySeconds: 15
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
selector:
matchLabels:
app: caller
tier: caller
strategy:
type: Recreate
template:
metadata:
labels:
app: caller
tier: caller
spec:
containers:
- image: myaccount/caller
name: caller
env:
- name: CALLERPORT
value: "8080"
- name: CALLEDADDRESS
value: called-loadbalancer # WHAT TO PUT HERE?!
ports:
- containerPort: 8080
name: caller
而部署称为.yaml apiVersion: v1
kind: Service
metadata:
name: called-loadbalancer
spec:
type: LoadBalancer
ports:
- port: 8081
targetPort: 8081
selector:
app: called
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: called
labels:
app: called
spec:
replicas: 2
minReadySeconds: 15
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
selector:
matchLabels:
app: called
tier: called
strategy:
type: Recreate
template:
metadata:
labels:
app: called
tier: called
spec:
containers:
- image: myaccount/called
name: called
env:
- name: CALLEDPORT
value: "8081"
ports:
- containerPort: 8081
name: called
重要提示:
如果单独调用单个服务(例如调用运行状况检查端点),则可以很好地工作,但是,当调用涉及两个服务之间的通信的端点时,就会出现此错误:
Pod正确运行且处于 Activity 状态,但是我想问题是Deployment.yaml的一部分,在其中必须定义如何查找指向的服务,因此在这里:spec:
containers:
- image: myaccount/caller
name: caller
env:
- name: CALLERPORT
value: "8080"
- name: CALLEDADDRESS
value: called-loadbalancer # WHAT TO PUT HERE?!
ports:
- containerPort: 8080
name: caller
都没有called
也不called-loadbalancer
也不http://caller
kubectl get pods,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/called-855cc4d89b-4gf97 1/1 Running 0 3m23s 172.17.0.4 minikube <none> <none>
pod/called-855cc4d89b-6268l 1/1 Running 0 3m23s 172.17.0.5 minikube <none> <none>
pod/caller-696956867b-9n7zc 1/1 Running 0 106s 172.17.0.6 minikube <none> <none>
pod/caller-696956867b-djwsn 1/1 Running 0 106s 172.17.0.7 minikube <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/called-loadbalancer LoadBalancer 10.99.14.91 <pending> 8081:30161/TCP 171m app=called
service/caller-loadbalancer LoadBalancer 10.107.9.108 <pending> 8080:30078/TCP 65m app=caller
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 177m <none>
如果放在deploy.yaml的这一行中,则可以正常工作。
那该放在那一行呢?
最佳答案
要访问Kubernetes内部的服务,您应该使用以下DNS:
关于docker - Kubernetes和Docker:如何让两个服务正确通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54249672/