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
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
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
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
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
systemctl reload openresty
Sửa kube config để trỏ tới pod mới: 6443
→ 6444
.
bash
sed -i -e 's/6443/6444/g' ~/.kube/config
Kiểm Tra Kết Quả
Chạy lệnh để kiểm tra:
bash
kubectl get node -v=6
Kiểm tra logs của Nginx:
bash
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
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
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.