1. Giới Thiệu Về Networking Trong Kubernetes
Kubernetes cung cấp một mô hình mạng phức tạp nhưng mạnh mẽ để các container trong cluster có thể giao tiếp với nhau. Mô hình này giải quyết các vấn đề như:
- Tự động cấp phát IP cho từng Pod.
- Cung cấp kết nối giữa các Pods trong cùng hoặc khác Node.
- Cấu hình Service để cân bằng tải và khám phá dịch vụ.
- Thiết lập chính sách bảo mật mạng giữa các ứng dụng.
Hiểu rõ về networking trong Kubernetes giúp bạn tối ưu hệ thống, giảm thiểu lỗi và nâng cao bảo mật.
2. CNI (Container Network Interface) – Cách Kubernetes Quản Lý Mạng
a. CNI là gì?
CNI (Container Network Interface) là chuẩn để kết nối mạng giữa các container. Kubernetes sử dụng CNI plugins để tạo, quản lý và gỡ bỏ mạng của Pods.
b. Các loại CNI phổ biến
Mỗi CNI có cách xử lý networking khác nhau, phù hợp với từng nhu cầu cụ thể:
CNI Plugin | Đặc Điểm |
---|---|
Flannel | Đơn giản, dễ triển khai, sử dụng VXLAN để tạo mạng Overlay |
Calico | Hỗ trợ policy-based networking, tốt cho bảo mật và hiệu năng |
Cilium | Dùng eBPF để tăng hiệu năng và bảo mật |
WeaveNet | Hỗ trợ mạng phân tán với encryption built-in |
Canal | Kết hợp Flannel + Calico |
Chọn CNI nào?
- Nếu muốn hiệu suất cao, chọn Calico hoặc Cilium.
- Nếu cần dễ triển khai, chọn Flannel.
- Nếu cần bảo mật mạnh mẽ, chọn Cilium với eBPF.
c. Cấu hình CNI trong Kubernetes
Cài đặt Flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Cài đặt Calico:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
3. Cách Hoạt Động Của Kubernetes Networking
a. Pod-to-Pod Communication
Kubernetes đảm bảo mỗi Pod có một địa chỉ IP duy nhất và có thể giao tiếp với bất kỳ Pod nào khác trong cùng Cluster mà không cần NAT.
Kiểm tra IP của Pod:
kubectl get pods -o wide
Dùng ping
để kiểm tra kết nối giữa Pods:
kubectl exec -it <pod-name> -- ping <pod-ip>
b. Service: Kết Nối Pods Một Cách Ổn Định
Mỗi Pod có IP riêng, nhưng khi Pod chết đi, IP thay đổi. Để khắc phục, Kubernetes cung cấp Service.
Có các loại Service chính:
- ClusterIP: Chỉ truy cập trong Cluster.
- NodePort: Mở port trên Node để truy cập từ bên ngoài.
- LoadBalancer: Dùng cloud provider để tạo LB.
- ExternalName: Trỏ domain đến một dịch vụ bên ngoài.
Tạo một Service kiểu ClusterIP:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
Triển khai:
kubectl apply -f service.yaml
4. Debug Lỗi Networking Trong Kubernetes
a. Kiểm Tra Kết Nối Giữa Các Pods
kubectl exec -it <pod-name> -- curl <service-name>:<port>
b. Kiểm Tra Network Policies
Nếu Pod không thể kết nối với nhau, kiểm tra chính sách mạng:
kubectl get networkpolicy -n <namespace>
Nếu có chính sách hạn chế, hãy sửa lại hoặc thêm exception.
c. Debug DNS Trong Kubernetes
Khi một Pod không thể resolve DNS:
kubectl exec -it <pod-name> -- nslookup my-service
Nếu thất bại, kiểm tra CoreDNS logs:
kubectl logs -n kube-system -l k8s-app=kube-dns
5. Bảo Mật Mạng Trong Kubernetes
a. Network Policies: Chặn Truy Cập Không Mong Muốn
Ví dụ chặn tất cả traffic vào một Pod trừ những traffic từ một app cụ thể:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-specific-app
spec:
podSelector:
matchLabels:
app: my-app
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: trusted-app
Triển khai policy:
kubectl apply -f network-policy.yaml
b. Sử Dụng Istio Để Tăng Cường Bảo Mật
Istio giúp kiểm soát traffic giữa các microservices bằng mTLS. Cài đặt Istio:
istioctl install --set profile=default
Áp dụng policy chỉ cho phép traffic được mã hóa:
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICT
6. Monitoring & Tối Ưu Networking Trong Kubernetes
a. Sử Dụng Prometheus + Grafana Để Giám Sát
Cài đặt Prometheus:
kubectl apply -f https://github.com/prometheus-operator/kube-prometheus/blob/main/manifests/setup
Cấu hình để theo dõi traffic giữa các Pods:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
b. Debug Traffic Bằng eBPF & Cilium
Cilium sử dụng eBPF để giám sát network mà không ảnh hưởng hiệu năng. Cài đặt Cilium:
kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/v1.12/install/kubernetes/quick-install.yaml
Kiểm tra kết nối giữa các Pods:
cilium monitor --type drop
Kết Luận
Networking trong Kubernetes rất phức tạp, nhưng khi hiểu rõ, bạn có thể:
- Tối ưu hiệu suất kết nối giữa các Pods.
- Tăng cường bảo mật bằng Network Policies và Istio.
- Debug lỗi nhanh chóng và hiệu quả.
Bạn có thể tiếp tục tìm hiểu sâu hơn về Service Mesh, eBPF, hay monitoring network để tối ưu hệ thống hơn nữa!