We must understand that deployment, service and ingress are inter-related so we need to understand all the concepts and how are they related to each other. Here we will setup all of them with simple example and understand all of them.
Creating a simple Kubernetes Deployment:
Here, we will write a manifest for deployment which will run a simple nginx pods(container).
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: mynginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
Everything is crystal clear, here we created a deployment with 2 replicas for the container with label app:nginx and will run the pods with nginx image at port 80.
The next step will be creating a service to expose the service but remember we will making it of type ClusterIp not NodePort because our ultimate goal is to create a ingress controller for the service.
Creating a kubernetes service for the deployment created:
We have a deployment ready now time to make a service for it. As stated before we will be creating a service of type ClusterIp. The most important things to consider when creating a service is the selector and label. As we have a deployment with label app:nginx, we need to create a service with selector app:nginx to make the service associated with the deployment. In nutshell the label belongs to deployment and the selector belong to service and we use them to match them.
apiVersion: v1 kind: Service metadata: name: nginx-service spec: ports: - port: 80 targetPort: 80 protocol: TCP name: http selector: app: nginx
The service is ready now the moment has come to create a ingress controller.
Creating a Kubernetes ingress controller:
The service is ready and is of type ClusterIP which means we can’t access the service from the internet. To make it accessible from internet we need here is create a Ingress Controller. Though there are other options too but here we will be going with Ingress. Consider ingress as a way to allow external traffic to reach the cluster.
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: rules: - host: www.mynginx.com http: paths: - backend: serviceName: nginx-service servicePort: 80
Now we will be able to access the cluster service from internet using the host name www.mynginx.com. Note: add the domain to the /etc/hosts as it is not the real domain. Need to add the following to the /etc/hosts
To know the ip address of minikube you can use the following command