Kubernetes ingress is a collection of routing rules that govern how external users access services running in a Kubernetes cluster.
Kubernetes does not run containers directly; instead it wraps one or more containers into a higher-level structure called a
There are two possible ways we can create pods.
1. Using Pod Configuration
Pod contains one /more different kind of container grouped and assigned under single IP. Any containers in the same pod will share the same resources and local network. Containers can easily communicate with other containers in the same pod as though they were on the same machine while maintaining a degree of isolation from others.
apiVersion: v1 kind: Pod metadata: name: documentation.tvajjala.com labels: app: documentation spec: containers: - name: docuementation image: tvajjala/documentation ports: - containerPort: 8080
2. Using Deployment Configuration
A deployment’s primary purpose is to declare how many replicas of a pod should be running at a time. When a deployment is added to the cluster, it will automatically spin up the requested number of pods, and then monitor them. If a pod dies, the deployment will automatically re-create it.
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: documentation-deployment spec: replicas: 1 template: metadata: labels: app: documentation spec: containers: - name: documentation image: tvajjala/documentation ports: - name: doc-port containerPort: 8080 livenessProbe: httpGet: path: / port: doc-port initialDelaySeconds: 15 timeoutSeconds: 30
|It is highly recommended that you use a Deployment to create your pods. It watches for failed pods and will start up new pods as required to maintain the specified number.|
When to use Pods directly?
If you don’t want a Deployment to monitor your pod (e.g. your pod is writing non-persistent data which won’t survive a restart, or your pod is intended to be very short-lived), you can create a pod directly with the create command.
A Service in Kubernetes is an abstraction defining a logical set of Pods and an access policy.
Services can be exposed in different ways by specifying a type in the service spec, and different types determine accessibility from inside and outside of cluster.
tvajjala$kubectl get svc nginx-svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-svc ClusterIP 10.100.196.54 <none> 80/TCP 4m33s
tvajjala$kubectl get svc nginx-svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-svc NodePort 10.100.196.54 <none> 80:32293/TCP 7m25s
tvajjala$kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 28h nginx-svc LoadBalancer 10.110.188.121 *`<pending>`* 80:31159/TCP 6m42s
|If you are running with Minikube EXTERNAL-IP always in pending state.|
To know your external IP address run below command
tvajjala$minikube service nginx-svc --url http://192.168.99.102:31159
Run below command to check status
tvajjala$minikube tunnel Password: Status: machine: minikube pid: 78370 route: 10.96.0.0/12 -> 192.168.99.102 minikube: Running services: [nginx-svc] errors: minikube: no errors router: no errors loadbalancer emulator: no errors
You have to enable ingress addons by following command before creating ingress rules. You can also enable it before executing any other command
tvajjala$minikube addons enable ingress ✅ ingress was successfully enabled
|Wait until the pods are up and running. You can check by executing following command and wait for the similar output|
tvajjala$kubectl get pods -n kube-system | grep nginx-ingress-controller nginx-ingress-controller-586cdc477c-j75dz 1/1 Running 0 2m36s
apiVersion: apps/v1beta2 kind: Deployment metadata: name: wiremock-server spec: selector: matchLabels: app: wiremock-server replicas: 1 template: metadata: labels: app: wiremock-server spec: containers: - name: wiremock image: tvajjala/wiremock ports: - name: doc-port # Give name to port so that you can refer by name , instead of hard-coding in services containerPort: 8080 --- apiVersion: v1 kind: Service metadata: labels: app: wiremock-server name: wiremock-service namespace: default spec: type: LoadBalancer ports: - port: 8080 targetPort: doc-port selector: app: wiremock-server --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: doc-ingress annotations: INGRESS.kubernetes.io/rewrite-target: / spec: backend: serviceName: default-http-backend servicePort: 8080 rules: - host: tvajjala.com http: paths: - path: / backend: serviceName: wiremock-service servicePort: 8080
Run below command to update your host file
$ echo "$(minikube ip) tvajjala.com" | sudo tee -a /etc/hosts
Verify host file with below command
$ cat /etc/hosts
Open your browser and point to http://tvajjala.com, which serves the content.