0
0
Lập trình
Admin Team
Admin Teamtechmely

Sử Dụng Nginx Làm Proxy Cho Kube-API Server và Ghi Nhận Audit Logs Request - Response

Đăng vào 1 tuần trước

• 3 phút đọc

Chủ đề:

K8Snginxopenresty

Bài Toán:

Một ý tưởng thú vị về việc sử dụng Nginx làm reverse proxy cho KubeAPI nảy ra:

  • Có thể sử dụng Nginx làm proxy cho KubeAPI không?
  • Liệu có thể kết nối các cụm cluster khác nhau thông qua cùng một IP:port nhưng khác domain không?

Thực Hiện:

Phần 1: Nginx Proxy Pass Tới Kube-API

Kiến trúc: Admin → Nginx → KubeAPI

Bước 1.1: Cài Đặt OpenResty (Hoặc Nginx)

Bạn có thể cài đặt Nginx hoặc OpenResty, nhưng tôi khuyến nghị OpenResty để sử dụng cho phần tiếp theo.

Đối với CentOS:

bash Copy
cd /etc/yum.repo.d/
curl -O https://openresty.org/package/centos/openresty.repo
yum install openresty
systemctl start openresty
systemctl enable openresty

Đối với Ubuntu:

bash Copy
wget -O - https://openresty.org/package/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/openresty.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/openresty.gpg] http://openresty.org/package/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/openresty.list > /dev/null
apt-get update
apt-get -y install --no-install-recommends openresty
systemctl start openresty
systemctl enable openresty

Bước 1.2: Cấu Hình Nginx

Chúng ta sẽ sử dụng chứng chỉ có sẵn trong kube-apiserver.

bash Copy
cat /etc/kubernetes/manifests/kube-apiserver.yaml
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key

Tiến hành thêm cấu hình proxy sau vào file nginx.conf:

bash Copy
upstream kubeapi_cluster {
    server 192.168.88.12:6443 max_fails=3 fail_timeout=5s;
    server 192.168.88.13:6443 max_fails=3 fail_timeout=5s;
    server 192.168.88.14:6443 max_fails=3 fail_timeout=5s;
}

server {
    listen 6443 ssl;
    server_name _;

    ssl_certificate /etc/kubernetes/pki/apiserver.crt;
    ssl_certificate_key /etc/kubernetes/pki/apiserver.key;

    location / {
        proxy_pass https://kubeapi_cluster/;
        proxy_http_version 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_ssl_server_name on;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Scheme $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_connect_timeout 600s;
        proxy_send_timeout 600s;
        proxy_read_timeout 600s;
        proxy_ssl_certificate /etc/kubernetes/pki/apiserver-kubelet-client.crt;
        proxy_ssl_certificate_key /etc/kubernetes/pki/apiserver-kubelet-client.key;
    }
}

Sau đó, reload lại OpenResty Nginx:

bash Copy
systemctl reload openresty

Sửa kube config để trỏ tới pod mới: 64436444.

bash Copy
sed -i -e 's/6443/6444/g' ~/.kube/config

Kiểm Tra Kết Quả

Chạy lệnh để kiểm tra:

bash Copy
kubectl get node -v=6

Kiểm tra logs của Nginx:

bash Copy
tail /usr/local/openresty/nginx/logs/access.log -n 1

Phần 2: Nginx Đóng Vai Trò Audit Logs

Cấu hình bổ sung cho nginx.conf để ghi nhận logs request và response:

bash Copy
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    log_format log_req_resp escape=none '$remote_addr - $remote_user [$time_local]'
           ' "$request" $status $body_bytes_sent ${request_time}ms'
           '| PRINT_REQUEST_BODY: $request_body '
           '| PRINT_REQUEST_HEADER:"$req_header" '
           '| PRINT_RESPONSE_HEADER:"$resp_header" '
           '| PRINT_RESPONSE_BODY:"$resp_body" ';

    access_log logs/access.log log_req_resp;

    ... (cấu hình server như trên)...
}

Kết Quả Audit Logs

Chạy lại lệnh:kubectl get node -v=6 và kiểm tra logs:

bash Copy
tail -n1 /var/log/nginx/access.log

Kết quả cho thấy thông tin về request và response đã được ghi lại. Mặc dù không đẹp bằng việc bật Kube AuditLogs, nhưng đây là một giải pháp thay thế hữu ích. Để tránh làm đầy ổ cứng, bạn có thể sử dụng logrotate để quản lý lưu trữ logs.

Kết Luận

Bài viết này chỉ mang tính chất tham khảo và chưa áp dụng thực tế. Hy vọng các bạn có thể áp dụng ý tưởng này vào dự án của mình.

Tài Liệu Tham Khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào