Deploy và tạo service Nginx trên kubernetes không truy cập browser

23rd Mar 2022
Table of contents

Đối với việc deploy nginx lên kubernetes thì giống như hello word của ngôn ngữ lập trình. Sau đó học gì thì học, cứ chạy được cái đã

Từ bây giờ đa phần chúng ta sẽ làm việc chủ yếu với thằng Master Node này

Khởi tạo file .yaml

nano nginx-deployment-service.yaml

paste đoạn sau đây

apiVersion: apps/v1
# ở đây phiên bản cũ hơn của kubernetes có dạng extensions/v1beta1
kind: Deployment
# kind là loại Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  # 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
  selector:
    matchLabels:
      app: nginx-deployment
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-deployment
      # image của container docker
        image: nginx
        ports:
        # port bên trong container
        - containerPort: 8080
---
apiVersion: v1
# kind là loại Service
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
  # port bên ngoài của pods mà các pods có thể giao tiếp được với nhau
  - port: 80
  # port target với 8080 của deployment
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
  # dựa theo app : nginx-deployment ở labels trên kia sẽ map với service này
    app: nginx-deployment
  type: ClusterIP

Cuối cùng chạy

kubectl apply -f nginx-deployment-service.yaml

Vậy là deploy xong rồi, khá là dễ.

Kiểm tra deploy được chưa

kubectl get pods

thì ra được 2 pods

nginx-deployment-8c8ff9b4f-dn7jj   1/1     Running   0          7h2m
nginx-deployment-8c8ff9b4f-nnj6l   1/1     Running   0          7h2m

bây giờ bạn thử xóa 1 pods xem chuyện gì xảy ra

kubectl delete pod nginx-deployment-8c8ff9b4f-nnj6l

Bạn nên nhớ rằng các pods của nginx-deployment có thể rải rác chia đều qua 2 worker node kia. Câu hỏi đặt ra, điều gì 1 server worker node bị shutdown ? Mình nghĩ câu hỏi này có thể tìm thấy qua hình ảnh trực quan này

Kubernetes

ví dụ pod có địa chỉ 10.10.10.2 chết vì lý do worker node shutdown, nó sẽ tự sinh ra 1 pods mới là 10.10.10.5 ở 1 node khác và Service vẫn hoạt động bình thường.

sau đó get pods thì ngay lập tức 1 pods mới được tạo 9s trước gần như được bảo toàn realtime

nginx-deployment-8c8ff9b4f-dn7jj   1/1     Running   0          7h6m
nginx-deployment-8c8ff9b4f-q2pg5   1/1     Running   0          9s

Chạy thử vài lệnh xem thế nào

kubectl get deployments
or
kubectl get deploy

kết quả:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           7h3m

kubectl get services
or
kubectl get svc

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

bây giờ chúng ta thử scale nginx-deployment và get pods thử xem sao =))

kubectl scale deployment --replicas 10 nginx-deployment

Chi tiết của service nginx-svc

kubectl describe svc/nginx-svc

kết quả:

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 vào worker Node bất kỳ và chạy lệnh sau

curl 10.96.71.39

curl 10.244.1.5:8080

đều ra welcome nginx ...

Muốn browser truy cập được thì cần phải thay đổi type: ClusterIP => type: NodePort cái này sẽ truy cập trực tiếp vào worker node (cách này được cảnh báo không nên dùng vì an toàn bảo mật). Còn cách tiếp cận nữa là sử dụng type là LoadBalancer của các dịch vụ cloud như AWS, Azure, Google Cloud hoặc phần mềm MetalLB

Kubernetes

MetalLB cung cấp triển khai cân bằng tải mạng cho các cụm Kubernetes không chạy trên nền tảng nhà cung dịch vụ cloud, cho phép sử dụng hiệu quả Dịch vụ LoadBalancer trong bất kỳ cụm nào.

MetalLB cung cấp triển khai cân bằng tải mạng cho các cụm Kubernetes không chạy trên nền tảng nhà cung dịch vụ cloud, cho phép sử dụng hiệu quả Dịch vụ LoadBalancer trong bất kỳ cụm nào.

Cách cuối cùng sử dụng các công cụ Ingress như kubernetes-ingress, nginx-ingress, traefik... để định tuyển phân ra các quy tắc định tuyến proxy bên trong kubernetes.

Kubernetes

CleanUp

Xóa service và deployment

kubectl delete svc/nginx-svc
kubectl delete deploy/nginx-deployment

Tiếp theo

Sử dụng kubernetes-ingress với project mẫu để deploy mà mạng ngoài, browser truy cập được. Tương lai mình sẽ có phần deploy kubernetes sử dụng loadbalancer AWS và nhiều tiện ích rút ngắn config hệ thống. Từ lúc học DevOps khá tốn kém về mặt kinh phí, mất mấy USD trên AWS chỉ để deploy kubernetes các kiểu.

Bạn thấy bài viết này như thế nào?
1 reaction

Add new comment

Image CAPTCHA
Enter the characters shown in the image.
Câu nói tâm đắc: “Điều tuyệt với nhất trong cuộc sống là làm được những việc mà người khác tin là không thể!”

Related Articles

I've used Redis in production for almost a decade. Here are my top 5 use cases where it shines:

Bài viết này mình chia sẻ cách đóng gói ứng dụng trong một image của Docker và chạy image đó trên Google Kubernetes Engine cluster sử dụng Load-Balanced để có thể scale theo nhu cầu của người dùng.