So, this is the setup:
It is some kind of the classic containerized microservice architecture.
The requirement is to enable the applications to request and provide information for other application running on different pods. But as I need to set these calls up before I push them to the cluster I have, to be honest, no idea how it should work.
E.g. I got an application which is using another rest interface to request data:
public List<Article> getArticles() {
String url = http://ip:port/article/getAllArticles/;
HttpEntity entity = prepareHttpEntity();
ResponseEntity<List> response = restTemplate.exchange(url, HttpMethod.GET, entity, List.class);
return response.getBody();
}
How I can make sure to it is connecting to the right service (pod)?
Same for the DB setup. I need to tell the application the datasource, which is unknown yet.
Is there some kind of best practice to deal with these issues?
Each Pod when created will have its own cluster-private IP, but you never depend on it, as pods are ephemeral. If you want to talk to a Pod, you create a Service that routes traffic to the pod.
restCall --> Service --> PodLet's say you have the following Pod definition
apiVersion: v1
kind: Pod
metadata:
name: appAPod
labels:
app: appA
spec:
containers:
- name: aNameForApp1Container
image: yourRepository/imageName:tag
ports:
- containerPort: 8080
...
Then, you make it accessible by creating a Service Definition:
kind: Service
apiVersion: v1
metadata:
name: serviceA
spec:
selector:
app: appA
ports:
- name: serviceAPort
protocol: TCP
port: 80
targetPort: 8080 So the way you connect a Pod and a Service is via labels and selector. Now, you can hit your pod with the following url :
http://serviceA:80In your second app, you will have the following Pod Definition:
apiVersion: v1
kind: Pod
metadata:
name: appBPod
labels:
app: appB
spec:
containers:
- name: aNameForApp2Container
image: yourRepository/imageName2:tag
ports:
- containerPort: 8080
env:
- name: "APP_A_ADDRESS"
value: serviceA
- name: "APP_A_PORT"
value: 80Since you're using RestTemplate, I assume you are using Spring. So in your application.properties :
..
..
appA.baseUrl=http://${APP_A_ADDRESS}:${APP_A_PORT}And in your code:
@Value("${appA.baseUrl}")
String appABaseUrl;
public List<Article> getArticles() {
String url = appABaseUrl + "/article/getAllArticles/";
HttpEntity entity = prepareHttpEntity();
ResponseEntity<List> response = restTemplate.exchange(url, HttpMethod.GET, entity, List.class);
return response.getBody();
}
You should consider Deplyments, instead of a Pod, as it offers you more flexibility and control over your containers.
If you are going to containerize your DB, then you might want to check out Persistent Volume