Top 25+ câu hỏi phỏng vấn Kubernetes mọi cấp độ (P2)

307

Bài viết được sự cho phép của tác giả Nguyễn Thành Nam

Kubernetes đã trở thành một công nghệ quan trọng trong lĩnh vực điện toán đám mây và DevOps. Để chuẩn bị cho các cuộc phỏng vấn liên quan đến Kubernetes, việc nắm vững các câu hỏi phổ biến là rất cần thiết. Bài viết này TopDev sẽ tổng hợp hơn 25 câu hỏi phỏng vấn Kubernetes ở mọi cấp độ, từ cơ bản đến nâng cao, giúp bạn tự tin hơn trong quá trình tìm kiếm cơ hội nghề nghiệp trong lĩnh vực này.

II. Câu hỏi phỏng vấn về Kubernetes​

11. Hoàn thành file thông số cấu hình sau để làm cho nó Ingress?​

metadata:
  name: someapp-ingress
spec:

Thực hiện:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: someapp-ingress
spec:
 rules:
 - host: my.host
   http:
     paths:
     - backend:
         serviceName: someapp-internal-service
         servicePort: 8080

12. Cấu hình TLS với Ingress?​

Thêm tls và secretName:

spec:
 tls:
 - hosts:
   - some_app.com
   secretName: someapp-secret-tls

13. Có vấn đề gì khi dùng namespace mặc định?​

Chỉ sử dụng namespace mặc định, sẽ trở nên khó khăn theo thời gian để có được cái nhìn tổng quan về tất cả các ứng dụng bạn có thể quản lý trong cụm của mình. Namespace giúp dễ dàng tổ chức các ứng dụng thành các nhóm có ý nghĩa, chẳng hạn như namespace của tất cả các ứng dụng giám sát và namespace cho tất cả các ứng dụng bảo mật, v.v.

Namespace cũng có thể hữu ích để quản lý môi trường Blue/Green trong đó mỗi namespace có thể bao gồm một phiên bản ứng dụng khác nhau và cũng chia sẻ tài nguyên trong namespace khác (namespace như logging, giám sát, v.v.).

Một trường hợp sử dụng khác cho namespace là một cụm có nhiều nhóm. Khi nhiều đội sử dụng cùng một cụm, họ có thể dẫm chân lên nhau. Ví dụ: nếu họ kết thúc việc tạo một ứng dụng có cùng tên, điều đó có nghĩa là một trong các nhóm sẽ ghi đè ứng dụng của nhóm kia vì không thể có hai ứng dụng trong Kubernetes có cùng tên (trong cùng một namespace).

14. Cho biết dịch vụ và namespace trong file sau?​

apiVersion: v1
kind: ConfigMap
metadata:
  name: some-configmap
data:
  some_url: silicon.chip

Trả lời: Dịch vụ là “silicon”, namespace là “chip”.

15. Operator là gì?​

“Các operator là mở rộng phần mềm cho K8s sử dụng các tài nguyên tùy chỉnh để quản lý các ứng dụng và các thành phần của chúng. Các operator tuân theo các nguyên tắc Kubernetes, đặc biệt là vòng điều khiển.”

16. Tại sao lại cần Operator?​

Quá trình quản lý các ứng dụng trong Kubernetes không đơn giản như quản lý các ứng dụng không trạng thái, trong đó việc đạt được trạng thái mong muốn và nâng cấp đều được xử lý theo cùng một cách cho mọi bản sao. Trong các ứng dụng trạng thái, việc nâng cấp mỗi bản sao có thể yêu cầu xử lý khác nhau do tính chất trạng thái của ứng dụng, mỗi bản sao có thể ở một trạng thái khác nhau. Do đó, chúng ta thường cần một operator để quản lý các ứng dụng trạng thái. Operator Kubernetes phải hỗ trợ việc này.

Điều này cũng sẽ giúp tự động hóa quy trình tiêu chuẩn trên nhiều cụm Kubernetes

  Một số khái niệm cần biết trong Kubernetes Architecture

  Cách sử dụng Lens để quản lý Kubernetes đỡ vất vả hơn

17. GKE là gì?​

GKE là Google Kubernetes Engine dùng cho quản lý và điều phối container Docker. Với sự trợ giúp của Google Public Cloud, ta còn có thể điều phối trên cụm container.

18. Ingress Default Backend là gì?​

Nó chỉ định những gì cần làm với một yêu cầu đến cụm Kubernetes không được ánh xạ tới bất kỳ backend nào, tức là phải làm gì khi không có quy tắc nào được xác định cho yêu cầu HTTP đến. Nếu backend mặc định không được xác định, bạn nên xác định nó để người dùng vẫn thấy một số loại thông báo thay vì một lỗi không rõ ràng.

19. Cách để chạy Kubernetes cục bộ?​

Kubernetes có thể được thiết lập cục bộ bằng cách sử dụng công cụ Minikube. Nó chạy một nhóm nút đơn trong một máy ảo trên máy tính. Do đó, nó cung cấp một cách hoàn hảo cho người dùng vừa mới học Kubernetes.

20. Cân bằng tải với Kubernetes?​

Cân bằng tải là một trong những cách phổ biến và tiêu chuẩn để hiển thị các dịch vụ. Có hai loại cân bằng tải trong K8s và chúng là:

  • Internal load balancer: Loại cân bằng này tự động cân bằng tải và phân bổ các pod với tải đến cần thiết.
  • External load balancer: Loại cân bằng này hướng lưu lượng truy cập từ các tải bên ngoài đến các pod backend.

21. File cấu hình triển khai bên dưới nghĩa là gì?​

spec:
  containers:
    - name: USER_PASSWORD
      valueFrom:
        secretKeyRef:
          name: some-secret
          key: password

Giải thích

Biến môi trường USER_PASSWORD sẽ lưu giá trị từ khoá mật khẩu được gọi trong “some-secret”. Nói cách khác bạn tham chiếu một giá trị từ một Kubernetes Secret.

22. Sự khác biệt giữa Docker Swarm và Kubernetes?​

  • Quy trình cài đặt của K8s rất phức tạp nhưng nếu nó được cài đặt một lần thì cụm này rất mạnh mẽ. Mặt khác, quá trình cài đặt Docker Swarm rất đơn giản nhưng cụm không mạnh mẽ chút nào.
  • Kubernetes có thể xử lý quy mô tự động nhưng Docker Swarm không thể xử lý tự động mở rộng các nhóm dựa trên tải đến.
  • Kubernetes là một Framework đầy đủ. Vì nó duy trì trạng thái cụm ổn định hơn nên tự động thay đổi tỷ lệ không nhanh như Docker Swarm.

23. Cách khắc phục sự cố nếu POD không lên lịch?​

Trong bộ lập lịch của K8 chịu trách nhiệm tạo các pod vào các nút. Có nhiều yếu tố có thể dẫn đến POD không thể khởi động. Phổ biến nhất là hết tài nguyên, hãy sử dụng các lệnh như kubectl description <POD> -n <Namespace> để xem lý do tại sao POD không được khởi động. Ngoài ra, hãy theo dõi kubectl để nhận các sự kiện để xem tất cả các sự kiện đến từ cụm.

24. Cách chạy POD trên một nút cụ thể?​

Các cách khác nhau để làm điều đó:

  • nodeName: chỉ định tên của nút trong cấu hình thông số POD, nó sẽ cố chạy POD trên nút đã chỉ định.
  • nodeSelector: Gán một nhãn cụ thể cho nút có tài nguyên đặc biệt và sử dụng cùng một nhãn trong thông số POD để POD sẽ chỉ chạy trên nút đó.
  • nodeaffinitiesWhileSchedulingIgnoredDuringExecutionfavouriteDuringSchedulingIgnoredDuringExecution là các yêu cầu cứng và mềm để chạy POD trên các nút cụ thể. Điều này sẽ thay thế nodeSelector trong tương lai. Nó phụ thuộc vào các nhãn nút.

25. Các cách khác nhau để cung cấp kết nối mạng bên ngoài cho K8 là gì?​

Theo mặc định, POD sẽ có thể kết nối với mạng bên ngoài nhưng ngược lại, chúng ta cần thực hiện một số thay đổi. Các tùy chọn sau có sẵn để kết nối với POD từ thế giới bên ngoài.

  • Nodeport (hiển thị cổng trên mỗi nút cho giao tiếp với chúng)
  • Load balancers (Lớp L4 của giao thức TCP/IP)
  • Ingress (Lớp L7 của giao thức TCP/IP)

Một phương thức khác là dùng kube-proxy để hiển thị dịch vụ với IP cụm trên cổng hệ thống cục bộ.

$ kubectl proxy --port=8080

26. Làm thế nào chúng ta có thể chuyển tiếp cổng ‘8080 (container) -> 8080 (service) -> 8080 (ingress) -> 80 (browser) và nó có thể được thực hiện như thế nào?​

Ingress đang để lộ cổng 80 ra bên ngoài để trình duyệt truy cập và kết nối với dịch vụ lắng nghe trên 8080. Theo mặc định, ingress sẽ lắng nghe trên cổng 80. “Ingress controller” là một nhóm nhận lưu lượng truy cập bên ngoài và xử lý quá trình ingress và được định cấu hình bởi tài nguyên ingress. Vì vậy, bạn cần phải cấu hình ingress selector và nếu không có ‘ingress controller selector’ được đề cập thì không có bộ ingress controller nào sẽ quản lý quá trình ingress.

Config ingress có thể như sau:

host: abc.org
http:
paths:
backend:
serviceName: abc-service
servicePort: 8080
Then the service will look like
kind: Service
apiVersion: v1
metadata:
name: abc-service
spec:
ports:
protocol: TCP
port: 8080 # port to which the service listens to
targetPort: 8080

Bài viết gốc được đăng tải tại blog.thanhnamnguyen.dev

Xem thêm:

Xem thêm các việc làm CNTT hấp dẫn trên TopDev