SUMMARY:
- CLUSTER IP
- NODEPORT
- LOADBALANCER
- INGRESS - NGINX INGRESS CONTROLLER
Kubernetes Services
An abstract way to expose an application running on a set of Pods as a network service.
With Kubernetes you don't need to modify your application to use an unfamiliar service discovery mechanism. Kubernetes gives Pods their own IP addresses and a single DNS name for a set of Pods, and can load-balance across them
ClusterIP (internal inbuilt service, basically created when deployment of pods is initiated)
ClusterIP is the default kubernetes service. This service is created inside a cluster and can only be accessed by other pods in that cluster. So basically we use this type of service when we want to expose a service to other pods within the same defined cluster (using ClusterIP service).
Nodeport (external service)
NodePort opens a specific port on your node/VM and when that port gets traffic, that traffic is forwarded directly to the service.
NodePort opens a specific port on your node/VM and when that port gets traffic, that traffic is forwarded directly to the service.
There are a few limitations (so it is not advised to use NodePort):
- only one service per port
- You can only use ports 30000-32767
LoadBalancer (internal service)
This is the standard way to expose service to the internet. All the traffic on the port is forwarded to the service. It's designed to assign an external IP to act as a load balancer for the service. There's no filtering, no routing. LoadBalancer uses cloud service.
Few limitations with LoadBalancer:
- every service exposed will acquire it's own IP address
- It gets very expensive
1. Deployment & NodePort service manifest file
Deployment YAML file:
# Deployment
# nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx-app
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-container
image: nginx:1.7.9
ports:
- containerPort: 80
--------------------------------------
NodePort Service YAML file:
# Service
# nginx-svc-np.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
app: nginx-app
spec:
selector:
app: nginx-app
type: NodePort
ports:
- nodePort: 31000
#clusterIP (THIS ONE NEED TO CHECK ON YOUR VAGRANTFILE CONFIG WHAT GUEST PORT)
port: 80
#service port
targetPort: 80
#container port
*******************************************************************
2. Create and Display Deployment and NodePort
kubectl create –f nginx-deploy.yaml
kubectl create -f nginx-svc.yaml
kubectl get service -l app=nginx-app
kubectl get po -o wide
kubectl describe svc my-service
*******************************************************************
3. Testing
# To get inside the pod
kubectl exec [Poc-IP] -it /bin/sh
# Create test HTML page
cat <<EOF > /usr/share/nginx/html/test.html
<!DOCTYPE html>
<html>
<head>
<title>Testing..</title>
</head>
<body>
<h1 style="color:rgb(90,70,250);">Hello, NodePort Service...!</h1>
<h2>Congratulations, you passed :-) </h2>
</body>
</html>
EOF
exit
NodePort - Test using Pod IP:
kubectl get po -o wide
curl http://[POD-IP]/test.html
NodePort – Test using Service IP:
kubectl get svc -l app=nginx-app
curl http://[cluster-ip]/test.html
NodePort- Test using Node IP (external IP)
http://nodep-ip:nodePort/test.html
note: node-ip is the external IP address of a node.
*******************************************************************
4. Cleanup
kubectl delete -f nginx-deploy.yaml
kubectl delete -f nginx-svc.yaml
kubectl get deploy
kubectl get svc
kubectl get pods
*******************************************************************
LoadBalancer
1. YAML: Deployment & Load Balancer Service
# Deployment
------------------------------------
*******************************************************************
2. Create & Display: Deployment & Load Balancer Service
kubectl create –f nginx-deploy.yaml
kubectl create -f lb.yaml
kubectl get pod -l app=nginx-app
kubectl get deploy -l app=nginx-app
kubectl get service -l app=nginx-app
kubectl describe service my-service
*******************************************************************
3. Testing Load Balancer Service
# To get inside the pod
kubectl exec -it [pod-name] -- /bin/sh
# Create test HTML page
cat <<EOF > /usr/share/nginx/html/test.html
<!DOCTYPE html>
<html>
<head>
<title>Testing..</title>
</head>
<body>
<h1 style="color:rgb(90,70,250);">Hello, Kubernetes...!</h1>
<h2>Load Balancer is working successfully. Congratulations, you passed :-) </h2>
</body>
</html>
EOF
exit
# Test using load-balancer-ip
http://load-balancer-ip
http://load-balancer-ip/test.html
# Testing using nodePort
http://nodeip:nodeport
http://nodeip:nodeport/test.html
*******************************************************************
4. Cleanup
kubectl delete –f nginx-deploy.yaml
kubectl delete -f lb.yaml
kubectl get pod
kubectl get deploy
kubectl get service
Nginx Ingress Controller
Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.
kubectl get svc -l app=nginx-app
curl http://[cluster-ip]/test.html
NodePort- Test using Node IP (external IP)
http://nodep-ip:nodePort/test.html
note: node-ip is the external IP address of a node.
*******************************************************************
4. Cleanup
kubectl delete -f nginx-deploy.yaml
kubectl delete -f nginx-svc.yaml
kubectl get deploy
kubectl get svc
kubectl get pods
*******************************************************************
LoadBalancer
1. YAML: Deployment & Load Balancer Service
# Deployment
# nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx-app
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-container
image: nginx:1.7.9
ports:
- containerPort: 80
------------------------------------
# Service - LoadBalancer
#lb.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
app: nginx-app
spec:
selector:
app: nginx-app
type: LoadBalancer
ports:
- nodePort: 31000
port: 80
targetPort: 80
*******************************************************************
2. Create & Display: Deployment & Load Balancer Service
kubectl create –f nginx-deploy.yaml
kubectl create -f lb.yaml
kubectl get pod -l app=nginx-app
kubectl get deploy -l app=nginx-app
kubectl get service -l app=nginx-app
kubectl describe service my-service
*******************************************************************
3. Testing Load Balancer Service
# To get inside the pod
kubectl exec -it [pod-name] -- /bin/sh
# Create test HTML page
cat <<EOF > /usr/share/nginx/html/test.html
<!DOCTYPE html>
<html>
<head>
<title>Testing..</title>
</head>
<body>
<h1 style="color:rgb(90,70,250);">Hello, Kubernetes...!</h1>
<h2>Load Balancer is working successfully. Congratulations, you passed :-) </h2>
</body>
</html>
EOF
exit
# Test using load-balancer-ip
http://load-balancer-ip
http://load-balancer-ip/test.html
# Testing using nodePort
http://nodeip:nodeport
http://nodeip:nodeport/test.html
*******************************************************************
4. Cleanup
kubectl delete –f nginx-deploy.yaml
kubectl delete -f lb.yaml
kubectl get pod
kubectl get deploy
kubectl get service
Nginx Ingress Controller
Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.
internet
|
[ Ingress ]
--|-----|--
[ Services ]
An Ingress may be configured to give Services externally-reachable URLs, load balance traffic, terminate SSL / TLS, and offer name-based virtual hosting. An Ingress controller is responsible for fulfilling the Ingress, usually with a load balancer, though it may also configure your edge router or additional frontends to help handle the traffic.
An Ingress may be configured to give Services externally-reachable URLs, load balance traffic, terminate SSL / TLS, and offer name-based virtual hosting. An Ingress controller is responsible for fulfilling the Ingress, usually with a load balancer, though it may also configure your edge router or additional frontends to help handle the traffic.
download and provision your master with ingress:
create ingress controller
- kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/baremetal/deploy.yaml
- kubectl get svc --all-namespaces
Create a nginx container in a pod:
- kubectl run nginx --image=nginx
- kubectl expose pod nginx --type=ClusterIP --port=80
create ingress controller
#ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /nginx
backend:
serviceName: nginx
servicePort: 80
kubectl create -f ingress.yaml
kubectl get ingress
**********************************************************************************
now create a tomcat container in the pod:
- kubectl run tomcat --image=tomcat
- kubectl expose pod nginx --type=ClusterIP --port=8080
update and apply changes to the ingress controller
#ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /nginx
backend:
serviceName: nginx
servicePort: 80
- path: /abc
backend:
serviceName: tomcat
servicePort: 8080
kubectl apply -f ingress.yaml
No comments:
Post a Comment