У меня есть два Java-сервиса ( caller.jar , который вызывает said.jar )
Мы можем установить вызывающий сервисный HTTP-порт через env-var CALLERPORT и адрес вызываемой службы через env-var CALLEDADDRESS .
Так что вызывающая сторона использует два env-var.
Мы также должны установить вызываемый service env-var CALLEDPORT , чтобы установить конкретный порт http, на котором вызываемая служба прослушивает запросы http.
Я не знаю точно, как просто выставить эти переменные из Dockerfile, чтобы установить их с помощью Kubernetes.
Вот как я сделал два файла Docker:
Dockerfile звонящего
FROM openjdk:8-jdk-alpine
# ENV CALLERPORT (it's own port)
# ENV CALLEDADDRESS (the other service address)
ADD caller.jar /
CMD ["java", "-jar", "caller.jar"]
Докер-файл вызываемого
FROM openjdk:8-jdk-alpine
# ENV CALLEDPORT (it's own port)
ADD called.jar /
CMD ["java", "-jar", "called.jar"]
С их помощью я сделал два изображения Docker :
- myaccount / caller
- MyAccount / называется
Затем я создал два deployments.yaml, чтобы позволить K8 развернуть (на мини-кубе) два микросервиса с использованием реплик и балансировщиков нагрузки.
развертывание-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
ВАЖНО:
Отдельные службы работают хорошо, если их вызывать по-отдельности (например, вызывать конечную точку проверки работоспособности), но при вызове конечной точки, которая включает в себя связь между двумя службами, возникает такая ошибка:
java.net.UnknownHostException: вызывается
Модули работают правильно и активны, но я полагаю, что проблема заключается в части deploy.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.
Так что же поставить в эту строку?