Cách tạo một dịch vụ trong Kubernetes

theanh

Administrator
Nhân viên
Dịch vụ là lớp trừu tượng trên Pod. Nó định nghĩa một tập hợp logic các Pod. Nó cung cấp một địa chỉ IP và tên DNS duy nhất mà các pod có thể được truy cập. Nó được sử dụng để hiển thị các pod.

Có 3 loại Dịch vụ khác nhau trong Kubernetes:
  1. ClusterIP:
    Nó hiển thị dịch vụ trong cụm Kubernetes. Dịch vụ nàychỉ có thể truy cập được từ bên trong cụm. Không thể truy cập từ bên ngoài cụm.
  2. NodePort:
    Nó sẽ phơi bày dịch vụ trên một cổng tĩnh trên nút được triển khai. Dịch vụ này có thể được truy cập từ bên ngoài cụm bằng cách sử dụng NodeIP:Nodeport.
  3. Load Balancer:
    Phơi bày Dịch vụ bên ngoài bằng cách sử dụng bộ cân bằng tải của nhà cung cấp đám mây, điều này tạo ra một IP công khai trên nhà cung cấp Đám mây
  4. ExternalName:
    Nó ánh xạ Dịch vụ tới nội dung của trường externalName bằng cách trả về một bản ghi CNAME

Nhấp vàođâyđể biết thêm về Dịch vụ Kubernetes.

Trong bài viết này, chúng ta sẽ xem các bước để tạo Serice kiểu NodePort.

Điều kiện tiên quyết​

  1. Cụm Kubernetes có ít nhất 1 nút worker.
    Nếu bạn muốn tìm hiểu cách tạo Cụm Kubernetes, hãy nhấp vào đây. Hướng dẫn này sẽ giúp bạn tạo cụm Kubernetes với 1 Master và 2 Node trên AWS Ubuntu EC2 Instances.

Những gì chúng ta sẽ làm​

  1. Tạo aService

Tạo aService​

Đầu tiên, chúng ta sẽ tạo một triển khai bằng cách sử dụng định nghĩa sau mà dịch vụ sẽ chuyển hướng tất cả các yêu cầu đến đó.

Tạo một tệp mới và thêm nội dung sau vào đó, thao tác này sẽ tạo một triển khai cho Nginx.
Mã:
vim my-deployment.yml
Mã:
apiVersion: apps/v1
kind: Deployment
metadata: name: nginx
spec: strategy: type: Recreate selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22537%22%3E%3C/svg%3E




Để tạo một triển khai, hãy thực hiện lệnh sau.
Mã:
kubectl create -f my-deployment.yml

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%2264%22%3E%3C/svg%3E


Điều này sẽ tạo ra một triển khai cho Nginx với 3 bản sao.

Bạn có thể nhận được thông tin chi tiết về triển khai, bộ bản sao và pod bằng cách sử dụng lệnh sau lệnh.
Mã:
kubectl get deployment | grep nginx
Mã:
kubectl get pod | grep nginx

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22240%22%3E%3C/svg%3E


Trong ảnh chụp màn hình ở trên, bạn có thể thấy 3 bản sao của Nginx đã được tạo.



Bây giờ, hãy tạo định nghĩa Dịch vụ bằng cách sử dụng lệnh sau nội dung.
Mã:
vim my-service.yml
Mã:
apiVersion: v1
kind: Service
metadata: name: nginx namespace: default labels: app: nginx
spec: externalTrafficPolicy: Local ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: 
 app: nginx type: NodePort

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22587%22%3E%3C/svg%3E


Định nghĩa dịch vụ ở trên sẽ tạo một Dịch vụ loại NodePort bằng cách sử dụng không gian tên mặc định và chuyển hướng các yêu cầu đến Pod khớp với nhãn nginx, tức là các pod mà chúng ta đã tạo bằng bước tạo triển khai trước đó.

Thực hiện lệnh sau để tạo Dịch vụ.
Mã:
kubectl create -f my-service.yml

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22125%22%3E%3C/svg%3E




Lấy thông tin chi tiết về dịch vụ và kiểm tra NodePort mà dịch vụ sẽ được có sẵn.
Mã:
kubectl get service | grep nginx
Mã:
kubectl describe service nginx

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22376%22%3E%3C/svg%3E


Trong ảnh chụp màn hình ở trên, có thể thấy Dịch vụ khả dụng trên Cổng 30747. Điều này có thể khác đối với bạn vì cổng được chỉ định ngẫu nhiên từ phạm vi khả dụng.

Bây giờ, ứng dụng nginx có thể được truy cập thông qua dịch vụ này trên NodeIp:NodePort

Ở đây, đó là:106.210.138.189:30747


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22147%22%3E%3C/svg%3E

Câu hỏi thường gặp về việc tạo dịch vụ trong Kubernetes​

Dịch vụ Kubernetes là gì và tại sao nó lại quan trọng?

Dịch vụ Kubernetes là một khái niệm trừu tượng xác định một tập hợp logic các Pod và chính sách để truy cập chúng. Dịch vụ cho phép giao tiếp giữa các thành phần khác nhau bên trong và bên ngoài cụm Kubernetes của bạn, cung cấp giao diện ổn định cho các Pod có thể thay đổi theo thời gian.

Làm thế nào để tạo Dịch vụ trong Kubernetes?

Để tạo Dịch vụ, bạn có thể sử dụng tệp YAML để xác định cấu hình Dịch vụ. Sau khi xác định, hãy áp dụng cấu hình đó bằng kubectl apply -f [filename.yaml]. Lệnh này tạo một Dịch vụ dựa trên các thông số kỹ thuật trong tệp YAML của bạn.

Các loại Dịch vụ khác nhau trong Kubernetes là gì?

Các loại chính là ClusterIP (mặc định, có thể truy cập trong cụm), NodePort (phơi bày Dịch vụ trên IP của mỗi Node tại một cổng tĩnh), LoadBalancer (tích hợp với bộ cân bằng tải dựa trên đám mây) và ExternalName (ánh xạ Dịch vụ thành tên DNS).

Làm cách nào để phơi bày Dịch vụ của tôi bên ngoài cụm Kubernetes?

Sử dụng Dịch vụ loại NodePort hoặc LoadBalancer. NodePort phơi bày Dịch vụ trên một cổng tĩnh trên IP của Node. LoadBalancer sử dụng bộ cân bằng tải của nhà cung cấp đám mây để hiển thị Dịch vụ.

Tôi có thể tạo Dịch vụ mà không cần tệp YAML không?

Có, bạn có thể sử dụng kubectl expose để tạo Dịch vụ từ dòng lệnh. Ví dụ: kubectl expose deployment [deployment-name] --type=LoadBalancer --name=[service-name].

Làm cách nào để xác định địa chỉ IP và cổng của Dịch vụ Kubernetes của tôi?

Sử dụng kubectl get services để liệt kê tất cả các Dịch vụ. Thao tác này sẽ hiển thị cho bạn địa chỉ IP nội bộ và cổng được gán cho từng Dịch vụ.

Dịch vụ khám phá Pod trong Kubernetes như thế nào?

Dịch vụ sử dụng nhãn để chọn Pod. Khi bạn xác định một Dịch vụ, bạn chỉ định một bộ chọn khớp với nhãn của các Pod mà bạn muốn dịch vụ đó nhắm mục tiêu.

Dịch vụ Kubernetes có thể cân bằng tải lưu lượng tới các Pod không?

Có, Dịch vụ sẽ tự động cân bằng tải lưu lượng tới tất cả các Pod khớp với bộ chọn của Dịch vụ.

Làm cách nào để cập nhật Dịch vụ trong Kubernetes?

Cập nhật tệp cấu hình YAML của Dịch vụ, sau đó áp dụng các thay đổi bằng cách sử dụng kubectl apply -f [filename.yaml]. Kubernetes sẽ cập nhật Dịch vụ theo các thông số kỹ thuật đã sửa đổi.

Điều gì sẽ xảy ra với Dịch vụ nếu các Pod mà nó nhắm mục tiêu bị xóa?

Dịch vụ vẫn tiếp tục tồn tại nhưng sẽ không chuyển tiếp lưu lượng cho đến khi các Pod mới khớp với bộ chọn của nó được tạo.

Làm cách nào để xóa Dịch vụ trong Kubernetes?

Sử dụng kubectl delete service [service-name] để xóa Dịch vụ. Điều này sẽ không ảnh hưởng đến các Pod, nhưng chúng sẽ không còn có thể truy cập được thông qua Dịch vụ đó nữa.

Một Dịch vụ trong Kubernetes có thể trải rộng trên nhiều không gian tên không?

Không, Dịch vụ là dành riêng cho không gian tên. Để giao tiếp qua các không gian tên, bạn cần sử dụng không gian tên như một phần của tên Dịch vụ DNS.

Kết luận​

Trong bài viết này, chúng tôi đã tạo một triển khai cho Nginx với 3 bản sao và tạo một Dịch vụ loại NodePort. Chúng tôi đã thấy cách ứng dụng Nginx được tạo bằng triển khai có thể được truy cập trên NodeIP:port.
 
Back
Bên trên