Deploy và tạo service Nginx trên kubernetes
Bài đăng này đã không được cập nhật trong 4 năm
Đố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
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
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.
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.
facebook: facebook.com/quanghung997
All rights reserved