Cách gán Static Public IPs cho Kubernetes Nodes

11 min read

kubeip

Các node Kubernetes có thể được hưởng lợi từ việc có các Static Public IPs dành riêng trong các tình huống cụ thể.

KubeIP, một tiện ích mã nguồn mở, đáp ứng nhu cầu này bằng cách gán các địa chỉ public IP cho các node Kubernetes. Phiên bản mới nhất, KubeIP v2, mở rộng hỗ trợ từ Google Cloud’s GKE đến Amazon’s EKS, với một thiết kế sẵn sàng để chứa các nhà cung cấp đám mây khác. Nó hoạt động như một DaemonSet, cung cấp độ tin cậy cải thiện, tính linh hoạt cấu hình và dễ sử dụng hơn so với phương pháp điều khiển Kubernetes trước đó. KubeIP v2 hỗ trợ việc gán cả địa chỉ IPv4 và IPv6.

Bài viết này sẽ đào sâu vào các trường hợp sử dụng cụ thể cho KubeIP, so sánh nó với các cổng NAT của đám mây, và khám phá kiến trúc và cấu hình của KubeIP.

Use Cases

KubeIP hữu ích trong các tình huống khác nhau khi các node Kubernetes cần có địa chỉ IP tĩnh.

Dưới đây là một số trường hợp sử dụng phổ biến:

Gaming Applications

Trong các tình huống trò chơi, một console có thể cần thiết lập một kết nối trực tiếp đến một máy ảo đám mây để giảm thiểu số lượng nhảy mạng và độ trễ. Gán một địa chỉ public IP dành riêng cho node chứa máy chủ trò chơi cho phép console kết nối trực tiếp. Điều này có thể cải thiện trải nghiệm chơi game bằng cách giảm độ trễ và mất gói tin.

Whitelisting Agent IPs

Nếu bạn có nhiều agent hoặc dịch vụ đang chạy trên Kubernetes yêu cầu kết nối trực tiếp đến một máy chủ bên ngoài, và máy chủ đó cần đưa địa chỉ IP của các agent vào whitelist, việc sử dụng KubeIP để gán các địa chỉ public IP ổn định cho các node làm cho việc quản lý dễ dàng hơn so với việc cho phép các phạm vi CIDR rộng hơn. Điều này đặc biệt hữu ích trong các tình huống mà máy chủ bên ngoài có kiểm soát truy cập dựa trên IP nghiêm ngặt.

Tránh SNAT cho Một số Pods

Mặc định, các pod được gán các địa chỉ IP riêng tư từ phạm vi CIDR VPC. Khi chúng giao tiếp với các địa chỉ IPv4 bên ngoài, plugin Amazon VPC CNI dịch địa chỉ IP của pod thành địa chỉ IP riêng tư chính của giao diện mạng của node bằng cách sử dụng SNAT (dịch địa chỉ mạng nguồn).

Đôi khi, bạn có thể muốn tránh SNAT cho một số pods nhất định để các dịch vụ bên ngoài thấy các địa chỉ IP thực tế của pod. Gán các địa chỉ public IP cho các node bằng KubeIP và thiết lập hostNetwork: true trong pod spec sẽ đạt được điều này. Pod có thể giao tiếp trực tiếp với các dịch vụ bên ngoài bằng cách sử dụng địa chỉ public IP của node.

Kết nối Đầu vào Trực tiếp và Các Tình huống Mạng Tùy chỉnh

Gán các địa chỉ public IP cho các node bằng KubeIP cho phép một loạt các tình huống mạng. Ví dụ, bạn có thể chuyển tiếp dữ liệu trực tiếp đến các pod đang chạy trên các node đó, điều này hữu ích khi bạn cần tiết lộ các dịch vụ trên node ra internet mà không sử dụng một máy cân bằng tải truyền thống.

Một ví dụ về điều này là chạy một máy chủ web trên một pod và chuyển tiếp dữ liệu đến nó bằng cách sử dụng địa chỉ public IP của node.

Ngoài ra, KubeIP có thể được sử dụng để triển khai các tình huống mạng tùy chỉnh yêu cầu địa chỉ public IP trên các node. Ví dụ, bạn có thể tạo ra một máy cân bằng tải tùy chỉnh chuyển tiếp dữ liệu đến các node cụ thể dựa trên địa chỉ public IP. Sự linh hoạt này làm cho KubeIP trở thành một công cụ mạnh mẽ cho việc kiểm tra hoặc triển khai các giải pháp mạng tùy chỉnh trong Kubernetes.

IPv6 Support

KubeIP mở rộng chức năng của mình ra ngoài IPv4 bằng việc hỗ trợ gán các địa chỉ static public IPv6 cho các node. Tính năng này ngày càng quan trọng khi internet tiếp tục chuyển đổi sang IPv6 do sự cạn kiệt địa chỉ IPv4.

Với việc hỗ trợ IPv6 của KubeIP, bạn có thể gán các địa chỉ static public IPv6 cho các node Kubernetes của mình, cho phép chúng giao tiếp trực tiếp với các dịch vụ bên ngoài qua IPv6. Điều này đặc biệt hữu ích cho các ứng dụng yêu cầu kết nối IPv6. Ví dụ, nếu bạn đang phát triển hoặc triển khai một ứng dụng cần hỗ trợ IPv6, bạn có thể sử dụng KubeIP để cung cấp kết nối IPv6 cho các pod chạy ứng dụng của bạn.

Hơn nữa, IPv6 cung cấp một không gian địa chỉ lớn hơn, định dạng tiêu đề đơn giản hóa, hỗ trợ cải thiện cho các tiện ích và tùy chọn, định tuyến multicast tốt hơn và các cải tiến khác so với IPv4.

So sánh với Cloud NAT Gateways

NAT Gateway là các dịch vụ đám mây được quản lý cung cấp truy cập internet đi ra cho các tài nguyên trong các mạng con riêng tư bằng cách dịch địa chỉ IP riêng tư của chúng thành địa chỉ public IP. Chúng được thiết kế để cho phép các tài nguyên trong một mạng riêng tư khởi tạo kết nối đi ra internet trong khi vẫn giữ được sự riêng tư và bảo mật của các tài nguyên đó.

Tuy nhiên, các NAT Gateway không hỗ trợ kết nối đến từ bên ngoài, cũng như không gán trực tiếp địa chỉ public IP cho các tài nguyên. Điều này có nghĩa là trong khi chúng là giải pháp tuyệt vời cho việc cung cấp truy cập đi ra an toàn, chúng không được thiết kế để xử lý các tình huống cần kết nối đến từ bên ngoài hoặc khi các tài nguyên cần có địa chỉ public IP riêng của chúng.

Ngược lại, KubeIP gán các địa chỉ static public IP trực tiếp cho các node Kubernetes. Điều này cho phép kết nối đến từ bên ngoài được thiết lập trực tiếp đến các pod đang chạy trên các node đó bằng cách chuyển tiếp lưu lượng từ node đến pod. Điều này có thể đặc biệt hữu ích cho các ứng dụng cần được truy cập từ internet hoặc cho các tình huống mạng tùy chỉnh.

Ngoài ra, khi hostNetwork được kích hoạt, các pod có thể khởi tạo kết nối đi ra bằng cách sử dụng trực tiếp địa chỉ IP của máy chủ. Điều này có thể cải thiện hiệu suất mạng và đơn giản hóa việc xử lý sự cố mạng, tuy nhiên nên sử dụng cẩn thận do có các vấn đề liên quan đến bảo mật.

Tóm lại, trong khi các NAT Gateway là một giải pháp tuyệt vời cho truy cập đi ra an toàn, KubeIP cung cấp tính linh hoạt và kiểm soát bổ sung đối với cả kết nối đến và đi ra cho các pod và node cụ thể.

Cách KubeIP hoạt động

KubeIP chạy như một DaemonSet trên các node mong muốn của bạn. Trên mỗi node, nó:

Khám phá thông tin về node và nhà cung cấp đám mây bằng cách sử dụng Kubernetes Downward API.
Lấy khóa toàn cụm để đảm bảo chỉ có một node gán một IP vào một thời điểm, ngăn chặn các tình huống đua nhau và xung đột IP.

Chọn một IP tĩnh khả dụng từ pool được cấu hình bằng cách sử dụng bộ lọc và bộ chọn.
Gán IP cho giao diện mạng chính của node bằng cách sử dụng API của nhà cung cấp đám mây.
Nếu việc gán thất bại do lỗi, như mất kết nối mạng hoặc lỗi API, KubeIP sẽ thử lại việc gán đến một giới hạn được cấu hình.

Khi một node bị xóa, KubeIP sẽ giải phóng IP đã được gán trở lại cho pool, làm cho nó có sẵn cho các node khác.

KubeIP hỗ trợ cả IPv4 và IPv6, và nó có thể được cấu hình để sử dụng các pool khác nhau cho mỗi loại địa chỉ. Nó cũng hỗ trợ các pool IP tùy chỉnh cho các node hoặc nhóm node khác nhau, cung cấp tính linh hoạt trong quản lý IP.

KubeIP Architecture

KubeIP v2 được thiết kế với cấu trúc như một DaemonSet tiêu chuẩn của Kubernetes, điều này có nghĩa là nó chạy trên mỗi node trong cụm.

Thiết kế này cải thiện tính đáng tin cậy và dễ sử dụng so với thiết kế dựa trên bộ điều khiển trước đây. Nó cũng đơn giản hóa quá trình triển khai và đảm bảo mỗi node nhận được một public IP. Hơn nữa, bằng cách tận dụng các tính năng tiêu chuẩn của Kubernetes như bộ chọn node hoặc sự tương quan với node, bạn có thể kiểm soát KubeIP được triển khai trên những node nào. Điều này cho phép kiểm soát chi tiết IP, cho phép bạn gán các public IP cho các node cụ thể dựa trên yêu cầu của bạn.

Thiết kế mở rộng của KubeIP v2 cho phép dễ dàng tích hợp với các nhà cung cấp đám mây khác ngoài GKE và EKS, khiến nó trở thành một công cụ linh hoạt để quản lý các public IP trong môi trường đa đám mây.

Cấu hình KubeIP

KubeIP yêu cầu một tài khoản dịch vụ Kubernetes có quyền để lấy thông tin về các node và quản lý các thuê bao.

Trên mặt phía đám mây, nó cần một IAM role hoặc service account dịch vụ có quyền để gán/hủy gán và liệt kê các địa chỉ public IP và lấy thông tin về các node.

Dưới đây là một ví dụ về AWS IAM policy:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:AssociateAddress",
        "ec2:DisassociateAddress", 
        "ec2:DescribeInstances",
        "ec2:DescribeAddresses"
      ],
      "Resource": "*"
    }
  ]
}

Google Cloud IAM role:

title: "KubeIP Role"
description: "KubeIP required permissions"
stage: "GA"
includedPermissions:
- compute.instances.addAccessConfig
- compute.instances.deleteAccessConfig
- compute.instances.get
- compute.addresses.get
- compute.addresses.list
- compute.addresses.use
- compute.zoneOperations.get
- compute.subnetworks.useExternalIp
- compute.projects.get

Để chọn IP nào sẽ sử dụng, hãy chỉ định các bộ lọc bằng cú pháp giống như Cloud CLI/API để liệt kê IP. Ví dụ:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kubeip
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: kubeip
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: kubeip
    spec:
      serviceAccountName: kubeip-service-account
      terminationGracePeriodSeconds: 30
      priorityClassName: system-node-critical
      nodeSelector:
        nodegroup: public
        kubeip: "use"
      tolerations:
        - operator: "Exists"
          effect: "NoSchedule"
        - operator: "Exists"
          effect: "NoExecute"
      containers:
      - name: kubeip
        image: doitintl/kubeip-agent
        imagePullPolicy: Always
        resources:
          requests:
            cpu: "10m"
            memory: "32Mi"
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: LEASE_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: FILTER
          value: "Name=tag:kubeip,Values=reserved;Name=tag:environment,Values=prod"
        - name: LOG_LEVEL
          value: "debug"
        - name: LOG_JSON
          value: "true"

Điều này yêu cầu KubeIP trên AWS chỉ xem xét các IP có thẻ kubeip=reserved và environment=prod.

Bộ lọc KubeIP trên AWS hỗ trợ cú pháp bộ lọc giống như lệnh describe-addresses của AWS. Để biết thêm thông tin, vui lòng xem describe-addresses. Nếu bạn chỉ định nhiều bộ lọc, chúng sẽ được kết hợp bằng một AND, và yêu cầu sẽ chỉ trả về kết quả phù hợp với tất cả các bộ lọc được chỉ định. Dấu chấm phẩy phải phân tách các bộ lọc nhiều (;).

Bộ lọc KubeIP trên Google Cloud hỗ trợ cú pháp bộ lọc giống như lệnh gcloud compute addresses list của Google Cloud. Để biết thêm thông tin, vui lòng xem gcloud topic filter. Nếu bạn chỉ định nhiều bộ lọc, chúng sẽ được kết hợp bằng AND, và yêu cầu sẽ chỉ trả về kết quả phù hợp với tất cả các bộ lọc được chỉ định. Các bộ lọc nhiều phải được phân tách bằng dấu chấm phẩy (;).

KubeIP v2 là một công cụ mạnh mẽ để gán các địa chỉ IP công cộng tĩnh cho các node Kubernetes trên các nhà cung cấp đám mây. Nó cho phép một loạt các trường hợp sử dụng, từ các ứng dụng game đến các kịch bản mạng tùy chỉnh, và hỗ trợ cả địa chỉ IPv4 và IPv6. Thiết kế mở rộng và mô hình DaemonSet đơn giản hóa giúp việc triển khai và quản lý nó trong môi trường của bạn trở nên dễ dàng.

Xem thêm bài viết của mình tại đây

Avatar photo

Clean Code: Nguyên tắc viết hàm trong lập trình…

Trong quá trình phát triển phần mềm, việc viết mã nguồn dễ đọc, dễ hiểu là yếu tố then chốt để đảm bảo code...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc comment trong lập trình

Trong lập trình, code không chỉ là một tập hợp các câu lệnh để máy tính thực thi, mà còn là một hình thức...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc xử lý lỗi (Error Handling)

Trong quá trình phát triển phần mềm, việc xử lý lỗi không chỉ là một phần quan trọng mà còn ảnh hưởng trực tiếp...
Avatar photo Dat Tran Thanh
4 min read

Leave a Reply

Your email address will not be published. Required fields are marked *