Triển khai thành phần mạng Calico trong cụm Kubernetes

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
Chúng ta chọn Calico do khả năng hỗ trợ NetworkPolicy và hiệu suất tốt.

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

Thẻ: Kubernetes calico networkpolicy yaml Security

Đăng vào ngày 4 tháng 6 lúc 05:37