Đố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
1 2 | nano nginx-deployment-service.yaml |
paste đoạn sau đây
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 |
Cuối cùng chạy
1 2 | kubectl apply -f nginx-deployment-service.yaml |
Vậy là deploy xong rồi, khá là dễ.
Kiểm tra deploy được chưa
1 2 | kubectl get pods |
thì ra được 2 pods
1 2 3 | 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
1 2 | 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
1 2 3 | 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
1 2 3 4 | kubectl get deployments or kubectl get deploy |
kết quả:
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 |
bây giờ chúng ta thử scale nginx-deployment và get pods
thử xem sao =))
1 2 | kubectl scale deployment --replicas 10 nginx-deployment |
Chi tiết của service nginx-svc
1 2 | kubectl describe svc/nginx-svc |
kết quả:
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 vào worker Node bất kỳ và chạy lệnh sau
1 2 | curl 10.96.71.39 |
1 2 | 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
1 2 3 | 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