Bài viết này được chỉnh sửa lần cuối vào trước, và có thể cần cập nhật。
Học cách viết và hiểu một Kubernetes YAML files
Tổng quan
Ở bài viết trước mình đã nói sơ qua về kubenetes, trong bài viết này chúng ta sẽ tập trung vào cách viết và tạo một kubenetes pod, service,…
Ở đây mình sử dụng minikube để demo, các bạn có thể cài đặt theo hướng dẫn ở đây.
Pod
Pod là đơn vị nhỏ nhất trong kubenetes, bên trong nó sẽ chứa những container. Các container bên trong sẽ dùng chung một địa chỉ ip của pod và không gian port. Địa chỉ ip của pod chỉ là một địa chỉ ip nội bộ, không phải ip của cluster.
Thông thường, người ta sẽ chỉ chạy duy nhất một container bên trong một Pod, và chỉ có một vài trường hợp số ít, khi cần một số helper như ghi log hay một helper gì đó người ta mới chạy nhiều container bên trong một Pod.
Về miệc chạy multi container có thể xem thêm ở đây.
type: ClusterIP: Nếu ta chỉ định là ClusterIP thì service của chúng ta chỉ có thể truy cập bên trong cluster và không thể truy cập từ bên ngoài ví dụ như truy cập từ browser.
Ta sử dụng ClusterIP nếu service đó chỉ là một internal service. Ví dụ như một microservices, ta chỉ muốn nó chạy nội bộ và chỉ có microservices khác giao tiếp với nó.
> kubectl get all NAME READY STATUS RESTARTS AGE pod/nginx 1/1 Running 0 103m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/clusterip-service ClusterIP 10.111.124.5 <none> 80/TCP 12s
Ta thấy nó được cấp một địa chỉ ip, bây giờ các service khác ở trong cùng cluster có thể tương tác với nó bằng ip trên hoặc http://clusterip-service
type: NodePort
NodePort cho phép chúng ta expose port để có thể truy cập bên ngoài cụm, port expose ra sẽ được truy cập từ bằng nodePort. Ta chỉ có thể chỉ định NodePort nằm tròng khoảng 30000-32768.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/clusterip-service ClusterIP 10.111.124.5 <none> 80/TCP 60m service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h16m service/service-web NodePort 10.100.217.211 <none> 80:30007/TCP 63m > minikube ip 192.168.59.101 > curl 192.168.59.101:30007 StatusCode : 200 StatusDescription : OK
ReplicaSets
ReplicaSet được dùng để duy trì tính ổn định của Pod khi tạo ra nhiều bản sao của Pod đó. Nếu một Pod trong số Replicas đó crash thì server vẫn có thể duy trì nhờ vào các bản sao.
Viết một file Replicas type khá đơn giản, ta chỉ cần wrap Pod vào trong spec như sau:
Pod được quản lý bởi ReplicaSet nên ta có thể bỏ name của Pod trong phần metadata của Pod.
Tương tự như service, ta cầng dùng đến selector để chỉ định Pod nào cần Replica.
> kubectl get all NAME READY STATUS RESTARTS AGE pod/nginx-drb62 0/1 ContainerCreating 0 45s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 92m
NAME DESIRED CURRENT READY AGE replicaset.apps/nginx 1 1 0 45s
Pod đã được cấp tên ở trong replicaset nên đó là lý do ta không cần metadata name.
Deployment
Deployment là một khái niệm nâng cấp hơn của ReplicaSet, nó tương tự như ReplicaSet nhưng điểm khác biệt là giúp ứng dụng “rolling updates”. Rolling updates cho phép cập nhật của Deployments diễn ra mà không gây gián đoạn bằng cách cập nhật từng đợt Pod một cách tăng dần với các phiên bản mới.
Cách deployment rolling updates:
Giả sử ban đầu ta có một tập ReplicaSet từ deployment như sau:
Bây giờ ta muốn update Pod từ v1 thành v2, ta sửa file yaml và appy nó trên kube. Sau khi apply, kube sẽ tiến hành tạo một ReplicaSet mới với Pod v2:
Sau khi ReplicaSet mới được hoàn thiện, và sẵn sàng cho request. Kube sẽ tiến hành xóa các Pod trong ReplicaSet cũ, tuy nhiên ReplicaSet vẫn ở đấy với 0 Pod:
kubectl get all NAME READY STATUS RESTARTS AGE pod/nginx-deployment-5c5c46c579-db5dj 1/1 Running 0 9s pod/nginx-deployment-5c5c46c579-djcsk 1/1 Running 0 9s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 118m
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 2/2 2 2 9s
NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-5c5c46c579 2 2 2 9s
Bây giờ đổi version của nginx để xem cách deployment rolling update:
> kubectl get all pod/nginx-deployment-5c5c46c579-db5dj 1/1 Running 0 2m28s pod/nginx-deployment-5c5c46c579-djcsk 1/1 Running 0 2m28s pod/nginx-deployment-77dff7f778-5mqkn 0/1 Pending 0 2s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 120m
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 0/2 1 0 2m28s
NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-5c5c46c579 2 2 0 2m28s replicaset.apps/nginx-deployment-77dff7f778 1 1 0 2s > kubectl get all pod/nginx-deployment-5c5c46c579-db5dj 1/1 Running 0 2m30s pod/nginx-deployment-5c5c46c579-djcsk 1/1 Running 0 2m30s pod/nginx-deployment-77dff7f778-5mqkn 0/1 Pending 0 4s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 120m
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 0/2 1 0 2m30s
NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-5c5c46c579 2 2 0 2m30s replicaset.apps/nginx-deployment-77dff7f778 1 1 0 4s > kubectl get all pod/nginx-deployment-5c5c46c579-db5dj 1/1 Running 0 2m34s pod/nginx-deployment-5c5c46c579-djcsk 1/1 Running 0 2m34s pod/nginx-deployment-77dff7f778-5mqkn 0/1 Pending 0 8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 120m
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 0/2 1 0 2m35s
NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-5c5c46c579 2 2 0 2m35s replicaset.apps/nginx-deployment-77dff7f778 1 1 0 9s NAME READY STATUS RESTARTS AGE pod/nginx-deployment-5c5c46c579-db5dj 1/1 Running 0 2m38s pod/nginx-deployment-5c5c46c579-djcsk 1/1 Running 0 2m38s pod/nginx-deployment-77dff7f778-5mqkn 0/1 ContainerCreating 0 12s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 121m
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 2/2 1 2 2m39s
NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-5c5c46c579 2 2 2 2m39s replicaset.apps/nginx-deployment-77dff7f778 1 1 0 13s > kubectl get all NAME READY STATUS RESTARTS AGE pod/nginx-deployment-77dff7f778-5mqkn 1/1 Running 0 19s pod/nginx-deployment-77dff7f778-5vvtq 1/1 Running 0 6s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 121m
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 2/2 2 2 2m45s
NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-5c5c46c579 0 0 0 2m45s replicaset.apps/nginx-deployment-77dff7f778 2 2 2 19s
Ngoài ra ta có thể xem quá trình rollout đơn giản hơn bằng lệnh rollout:
1 2 3 4 5 6 7 8 9
> kubectl apply -f .\deployment.yaml deployment.apps/nginx-deployment configured > kubectl rollout status deployment nginx-deployment Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination... deployment "nginx-deployment" successfully rolled out