I comparing the scenario of communication between two pods with container --link.I had a rabbit mq container and an application that uses it.
Now, how can we do the same in kubernetes where an application is dependent on a rabbitmq.
Below is my code for replicationcontroller of my myapplication which is apache airavata:
airavata-all-rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: airavata-all-rc
labels:
app : airavata-all-sc
spec:
replicas: 5
selector:
app: airavata-all
template:
metadata:
labels:
app: airavata-all
spec:
containers:
- name: airavata-all
image: satyamsah/airavata-all
ports:
- containerPort: 8080
Below is my code for service version the same myapplication which is apache airavata:
airavata-all-svc.yml
apiVersion: v1
kind: Service
metadata:
name: airavata-svc
labels:
app: airavata-all-svc
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30002
protocol: TCP
selector:
app: airavata-all
Below is the rabbitmq dependency:rmq-rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: rmq-rc
spec:
selector:
app: rmq
replicas: 1
template:
metadata:
labels:
app: rmq
spec:
containers:
- name: rmq
image: rabbitmq:3-management
env:
- name: RABBITMQ_DEFAULT_USER
value: "airavata"
- name: RABBITMQ_DEFAULT_PASS
value: "airavata"
ports:
- containerPort: 5672
- containerPort: 15672
How to make these two apps communicate to each other?
I think the easiest way is to create a rabbitmq service and link it via ENV variable.
Create a service yaml:
apiVersion: v1
kind: Service
metadata:
name: rabbitmq
labels:
app: rabbitmq
spec:
ports:
- port: 5672
name: amqp
- port: 4369
name: epmd
- port: 25672
name: rabbitmq-dist
clusterIP: None
selector:
app: rabbitmq
Then instead of replication controller create a deployment or stateful set for Rabbitmq which will depend on this service:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: rabbitmq
spec:
serviceName: "rabbitmq"
replicas: 1
template:
metadata:
labels:
app: rabbitmq
spec:
containers:
- name: rabbitmq
....
Now make your airavata take a Rabbitmq link through ENV. and add ENV variable to its yaml:
....
env:
- name: RABBITMQ_HOST
value: "rabbitmq"
....
Expose the RabbitMQ dependency as a Kubernetes Service, this will give it a consistent IP address. You can use that IP from your other pods, or use the service's DNS name in the format: my-svc.my-namespace.svc.cluster.local.
On a side note, consider migrating from Replication Controller to ReplicaSet, or Deployment. See: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/