For deploying nginx to kubernetes, it’s like hello word of programming language. Then learn anything, learn, just run the first
From now on we will mostly work with this Master Node
Initialize .yaml file
1 2 | nano nginx-deployment-service.yaml |
paste the following
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <span class="token key atrule">apiVersion</span> <span class="token punctuation">:</span> apps/v1 <span class="token comment"># ở đây phiên bản cũ hơn của kubernetes có dạng extensions/v1beta1</span> <span class="token key atrule">kind</span> <span class="token punctuation">:</span> Deployment <span class="token comment"># kind là loại Deployment</span> <span class="token key atrule">metadata</span> <span class="token punctuation">:</span> <span class="token key atrule">name</span> <span class="token punctuation">:</span> nginx <span class="token punctuation">-</span> deployment <span class="token key atrule">spec</span> <span class="token punctuation">:</span> <span class="token key atrule">replicas</span> <span class="token punctuation">:</span> <span class="token number">2</span> <span class="token comment"># replica ở đây sẽ tạo ra 2 pods luôn luôn chạy, khi một số pods bị down hay chết hay bất kì lý do nào đó sẽ tự động tạo lại số lượng pods bằng 2</span> <span class="token key atrule">selector</span> <span class="token punctuation">:</span> <span class="token key atrule">matchLabels</span> <span class="token punctuation">:</span> <span class="token key atrule">app</span> <span class="token punctuation">:</span> nginx <span class="token punctuation">-</span> deployment <span class="token key atrule">template</span> <span class="token punctuation">:</span> <span class="token key atrule">metadata</span> <span class="token punctuation">:</span> <span class="token key atrule">labels</span> <span class="token punctuation">:</span> <span class="token key atrule">app</span> <span class="token punctuation">:</span> nginx <span class="token punctuation">-</span> deployment <span class="token key atrule">spec</span> <span class="token punctuation">:</span> <span class="token key atrule">containers</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">name</span> <span class="token punctuation">:</span> nginx <span class="token punctuation">-</span> deployment <span class="token comment"># image của container docker</span> <span class="token key atrule">image</span> <span class="token punctuation">:</span> nginx <span class="token key atrule">ports</span> <span class="token punctuation">:</span> <span class="token comment"># port bên trong container</span> <span class="token punctuation">-</span> <span class="token key atrule">containerPort</span> <span class="token punctuation">:</span> <span class="token number">8080</span> <span class="token punctuation">---</span> <span class="token key atrule">apiVersion</span> <span class="token punctuation">:</span> v1 <span class="token comment"># kind là loại Service</span> <span class="token key atrule">kind</span> <span class="token punctuation">:</span> Service <span class="token key atrule">metadata</span> <span class="token punctuation">:</span> <span class="token key atrule">name</span> <span class="token punctuation">:</span> nginx <span class="token punctuation">-</span> svc <span class="token key atrule">spec</span> <span class="token punctuation">:</span> <span class="token key atrule">ports</span> <span class="token punctuation">:</span> <span class="token comment"># port bên ngoài của pods mà các pods có thể giao tiếp được với nhau</span> <span class="token punctuation">-</span> <span class="token key atrule">port</span> <span class="token punctuation">:</span> <span class="token number">80</span> <span class="token comment"># port target với 8080 của deployment</span> <span class="token key atrule">targetPort</span> <span class="token punctuation">:</span> <span class="token number">8080</span> <span class="token key atrule">protocol</span> <span class="token punctuation">:</span> TCP <span class="token key atrule">name</span> <span class="token punctuation">:</span> http <span class="token key atrule">selector</span> <span class="token punctuation">:</span> <span class="token comment"># dựa theo app : nginx-deployment ở labels trên kia sẽ map với service này</span> <span class="token key atrule">app</span> <span class="token punctuation">:</span> nginx <span class="token punctuation">-</span> deployment <span class="token key atrule">type</span> <span class="token punctuation">:</span> ClusterIP |
Finally run
1 2 | kubectl apply -f nginx-deployment-service.yaml |
So deploying finished, quite easy.
Check deploy is not
1 2 | kubectl get pods |
I got 2 pods
1 2 3 | nginx-deployment-8c8ff9b4f-dn7jj 1/1 Running 0 7h2m nginx-deployment-8c8ff9b4f-nnj6l 1/1 Running 0 7h2m |
Now try deleting a pods to see what happens
1 2 | kubectl delete pod nginx-deployment-8c8ff9b4f-nnj6l |
Remember that nginx-deployment pods can be spread evenly across the other two worker nodes. The question is, what 1 server worker node is shutdown? I think this question can be found through this visual image
For example, the pod has the address 10.10.10.2 died due to worker node shutdown, it will automatically generate a new pods of 10.10.10.5 at another node and Service will still function normally.
then get pods
then immediately a new pods created 9s before is almost preserved realtime
1 2 3 | nginx-deployment-8c8ff9b4f-dn7jj 1/1 Running 0 7h6m nginx-deployment-8c8ff9b4f-q2pg5 1/1 Running 0 9s |
Run some commands to see how
1 2 3 4 | kubectl get deployments or kubectl get deploy |
result:
1 2 3 | NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 2/2 2 2 7h3m |
1 2 3 4 | kubectl get services or kubectl get svc |
1 2 3 4 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-svc ClusterIP 10.96.71.39 <none> 80de/TCP 7h5m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h |
Now let’s try scale nginx-deployment and get pods
and try =))
1 2 | kubectl scale deployment --replicas 10 nginx-deployment |
Details of service nginx-svc
1 2 | kubectl describe svc/nginx-svc |
result:
1 2 3 4 5 6 7 8 9 10 11 12 13 | Name: nginx-svc Namespace: default Labels: <none> Annotations: <none> Selector: app=nginx-deployment Type: ClusterIP IP: 10.96.71.39 Port: http 80/TCP TargetPort: 8080/TCP Endpoints: 10.244.1.5:8080,10.244.2.8:8080 Session Affinity: None Events: <none> |
SSH into any worker node and run the following command
1 2 | curl 10.96.71.39 |
1 2 | curl 10.244.1.5:8080 |
are welcome nginx ...
Want to access the browser, you need to change the type: ClusterIP
=> type: NodePort
this will directly access the worker node (this way is warned not to use for security reasons). Another approach is to use the LoadBalancer
type of cloud services such as AWS, Azure, Google Cloud or MetalLB
software.
MetalLB provides network load balancing deployment for Kubernetes clusters that do not run on cloud service provider platforms, enabling the efficient use of the LoadBalancer Service in any cluster.
The final way to use Ingress
tools such as kubernetes-ingress
, nginx-ingress
, traefik
… to traefik
out proxy routing rules inside kubernetes.
CleanUp
Delete service and deployment
1 2 3 | kubectl delete svc/nginx-svc kubectl delete deploy/nginx-deployment |
Next
Use kubernetes-ingress
with sample project to deploy that external network, browser can access. In the future, I will have part of kubernetes deploy using AWS loadbalancer and many utilities to shorten system configuration. Since learning DevOps is quite expensive in terms of funding, it takes a few dollars on AWS just to deploy kubernetes types.
facebook: facebook.com/quanghung997