Bối cảnh vấn đề
Quét cổng mạng bằng đoạn mã sau:
import socket
def check_port_availability(target, port):
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
connection.connect((target, port))
print(f'Cổng {port} trên {target} đang mở')
except Exception as error:
pass
finally:
connection.close()
if __name__ == '__main__':
base_ip = '10.47.153'
for i in range(1, 254):
current_host = f"{base_ip}.{i}"
for p in range(1, 100):
print("Bắt đầu kiểm tra")
check_port_availability(current_host, p)
Giải pháp triển khai
Giới thiệu về NetworkPolicy
NetworkPolicy là cơ chế định nghĩa quy tắc kết nối giữa các Pod và các điểm mạng khác. Tài nguyên này sử dụng nhãn để chọn Pod và xác định các quy tắc giao tiếp được phép.
Lựa chọn plugin mạng
Các phương án có thể chọn:
- Calico - Plugin mạng L3 với khả năng quản lý chính sách
- Cilium - Plugin hỗ trợ cả routing và overlay
Triển khai Calico
Cấu hình mạng
apiVersion: v1
kind: ConfigMap
metadata:
name: network-settings
namespace: kube-system
data:
backend: "bird"
mtu: "1440"
cni_config: |-
{
"name": "k8s-network",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "calico",
"log_level": "info",
"datastore": "kubernetes",
"nodename": "__NODE_NAME__",
"mtu": __MTU__,
"ipam": {
"type": "calico-ipam"
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "__KUBECONFIG__"
}
}
]
}
Các tài nguyên CRD
(Các đoạn YAML định nghĩa CRD được giữ nguyên cấu trúc nhưng thay đổi tên biến và tham số)
Cấp quyền RBAC
(Đoạn YAML RBAC được tái cấu trúc với tên tài nguyên mới)
Triển khai DaemonSet
spec:
template:
spec:
containers:
- name: network-agent
env:
- name: NETWORK_BACKEND
value: "kubernetes"
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: IP_DETECTION
value: "interface=eth.*"
- name: IP_RANGE
value: "192.168.0.0/16"
Kiểm tra trạng thái
$ kubectl get pods -n kube-system | grep network
network-controller-7892345678-abcde 1/1 Running 1 10h
network-node-xyz123 1/1 Running 0 10h
Cấu hình chính sách mạng
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: secure-policy
namespace: secure-apps
spec:
podSelector:
matchLabels:
app: web-service
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 0.0.0.0/0
egress:
- to:
- ipBlock:
cidr: 192.168.0.0/16
- to:
- ipBlock:
cidr: 10.16.153.0/24
ports:
- protocol: TCP
port: 6443