Kubernetes Networking | Cloud Native Viet

Hướng dẫn này cung cấp thông tin nền tảng tùy chọn, không dành riêng cho Calico.

Kubernetes định nghĩa một mô hình mạng giúp cung cấp sự đơn giản và nhất quán trên nhiều
môi trường mạng và triển khai mạng. Mô hình mạng Kubernetes cung cấp nền tảng để hiểu cách
các container, pod và service trong Kubernetes giao tiếp với nhau. Hướng dẫn này giải thích
các khái niệm chính và cách chúng phù hợp với nhau.

Trong hướng dẫn này, ta sẽ học được:

  • Các hành vi mạng cơ bản mà mô hình mạng Kubernetes định nghĩa.
  • Cách Kubernetes hoạt động với nhiều triển khai mạng khác nhau.
  • Kubernetes Service là gì?
  • Cách DNS hoạt động trong Kubernetes.
  • “NAT outgoing” là gì và khi nào cần sử dụng nó.
  • “Dual stack” là gì?

Kubernetes Network Model

Mô hình mạng của kubernetes chỉ định:

  • Mọi pod có địa chỉ IP riêng của nó
  • Các container bên trong 1 pod chia sẻ địa chỉ IP của Pod và có thể giao tiếp tự do với nhau
  • Các pod có thể giao tiếp với pod khác trong cluster sử dụng địa chỉ IP của Pod (không cần
    NAT)
  • Cô lập/cách ly (giới hạn việc giao tiếp của pod) thông qua Network policies

Kết quả là các pod có thể được đối xử gần giống như VM hoặc host (chúng đều có địa chỉ IP duy nhất)
và các container bên trong pod rất giống các process chạy trong VM hoặc host (chúng chạy trên cùng
network namespace và chia sẻ 1 địa chỉ IP). Mô hình này giúp các ứng dụng dễ dàng migrate
từ VM và host sang thành các Pod được quản lý bởi Kubernetes. Ngoài ra, bởi vì việc cô lập
được định nghĩa bởi network policy thay vì dựa trên cấu trúc mạng nên kiến trúc mạng này khá đơn giản
& dễ hiểu. Mô hình mạng này đôi lúc được gọi là “flat network

Lưu ý rằng mặc dù rất hiếm khi cần nhưng kubernetes cũng hỗ trợ khả năng ánh xạ host port
thông qua pod hoặc chạy pod trực tiếp trong network namespace của host và chia sẻ địa chỉ IP của host.

Cài đặt Kubernetes network

Network tích hợp sẵn mặc định của Kubernetes là Kubenet có thể cung cấp một số kết nối mạng
cơ bản. Tuy nhiên, ta thường sử dụng cài đặt mạng của bên thứ 3 cắm vào Kubernetes sử dụng CNI API

Có nhiều loại CNI plugin khác nhau với 2 loại chính:

  • network plugin: chịu trách nhiệm kết nối pod vào mạng
  • IPAM (IP Address Management) plugin: chịu trách nhiệm phân bổ địa chỉ IP cho Pod

Calico cung cấp cả network plugin và IPAM plugin nhưng cũng có thể tích hợp và hoạt động
thông suốt với một số CNI plugin khác bao gồm AWS, Azure và Google network CNI plugin
và host local IPAM plugin. Tính linh hoạt này cho phép ta lựa chọn tùy chọn mạng tốt nhất
phù hợp với nhu cầu và môi trường triển khai cụ thể. Tìm hiểu thêm trong
Hướng dẫn xác định các tùy chọn network tốt nhất

Kubernetes Services

Kubernetes services
cung cấp 1 cách đóng gói việc truy cập vào 1 nhóm các pod dưới dạng
network service. Nhóm các pod thường được định nghĩa sử dụng
label selector.
Bên trong cluster, network service thường được biểu diễn/đại diện là các Virtual IP address và kube-proxy
cân bằng tải các kết nối đến Virtual IP cho các pod trong nhóm đứng sau service. Virtual IP
được khám phá thông qua Kubernetes DNS. DNS name và địa chỉ Virtual IP là hằng số trong suốt vòng đời
của service thậm chí kể cả khi các pod nằm sau service có thể được tạo ra, phá hủy và số lượng pod
nằm sau service có thể thay đổi theo thời gian.

Kubernetes sservice cũng có thể định nghĩa cách 1 service có thể được truy cập từ bên ngoài cluster sử dụng:

  • node port nơi service có thể truy cập được thông qua 1 port cụ thể trên mọi node
  • hoặc 1 load balancer, network load balancer có thể cung cấp (hoặc không cung cấp)
    1 địa chỉ virtual IP cho service để truy cập được từ bên ngoài cluster.

Lưu ý rằng khi sử dụng Calico trong triển khai on-premise, ta cũng có thể quản bá địa chỉ IP
của service để cho phép các service có thể được truy cập 1 cách thuận tiện mà không cần
đi qua node port hay load balancer.

Kubernetes DNS

Mỗi Kubernetes cluster cung cấp 1 DNS service. Mọi Pod và mọi service được khám phá thông qua
Kubernetes DNS service. Ví dụ:

  • Service: my-svc.my-namespace.svc.cluster-domain.example
  • Pod: pod-ip-address.my-namespace.pod.cluster-domain.example
  • Pod được tạo ra bằng deployment sẽ expose dưới dạng 1 service:
    pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example

DNS service được cài đặt như là 1 Kubernetes Service và ánh xạ đến 1 hoặc nhiều DNS server Pod
(thường là Core DNS), nó được lập lịch giống như bất kỳ Pod nào. Các Pod trong cluster được cấu hình
sử dụng DNS service với 1 danh sách tìm kiếm DNS trong đó bao gồm namespace của chính bản thân Pod
và domain mặc định của cluster.

Điều này có nghĩa là nếu có 1 service tên foo trong Kubernetes namespace bar thì các pod trong
cùng namespace bar có thể truy cập service foo và các pod trong namespace khác có thể truy cập
service thông qua tên foo.bar

Kubernetes hỗ trợ nhiều tùy chọn để kiểm soát DNS trong các ngữ cảnh khác nhau. Tìm hiểu thêm trong
DNS cho Service và Pods của tài liệu Kubernets

NAT outgoing

Mô hình mạng Kubernetes chỉ định rằng các pod phải có thể giao tiếp trực tiếp với nhau sử dụng
địa chỉ IP của pod. Nhưng nó không bắt buộc rằng địa chỉ IP của Pod có thể định tuyến được
bên ngoài biên giới cluster. Nhiều cài đặt kubernetes network sử dụng
overlay network.
Thường với các triển khai này, khi 1 pod khởi tạo 1 kết nối đến 1 địa chỉ IP bên ngoài cluster thì node nơi pod
đang chạy sẽ sử dụng SNAT (Source Network Address Translation) để ánh xạ địa chỉ nguồn của gói tin
từ địa chỉ IP của Pod thành địa chỉ IP của Node. Cách này cho phép kết nối được định tuyến trên toàn bộ
mạng đến đích (bởi vì địa chỉ IP của node là có thể dịnh tuyến được ra bên ngoài cluster). Các gói tin
trả về trên kết nối sẽ được tự động ánh xạ ngược lại bởi node bằng cách thay thế địa chỉ IP của node
thành địa chỉ IP của Pod trước khi chuyển gói tin đến Pod.

Khi sử dụng Calico, tùy thuộc vào môi trường, thường ta có thể chọn chạy 1 overlay network hoặc
có các địa chỉ IP của pod hoàn toàn định tuyến được. Tìm hiểu thêm trong
Hướng dẫn xác định tùy chọn network tốt nhất
Ngoài ra, Calico có thể cho phép ta
cấu hình outgoing NAT
cho dãy địa chỉ IP cụ thể nếu cần.

Dual stack

Nếu ta muốn sử dụng IPv4 và IPv6 cùng lúc thì ta có thể bật chế độ
dual-stack của kubernetes.
Khi được bật, tất cả các pod sẽ được gán cả địa chỉ IPv4 và IPv6 và các service của Kubernetes
có thể chỉ định xem chúng nên expose địa chỉ IPv4 hay IPv6.

Link gốc