Saat menerapkan Kubernetes di lingkungan perusahaan atau di balik firewall, sering kali diperlukan pengaturan server proxy untuk mengakses sumber daya eksternal. Ini sangat penting untuk mengunduh gambar kontainer, memperbarui paket, dan berinteraksi dengan API eksternal. Dalam panduan ini, kita akan membahas semua tingkat pengaturan proxy di Kubernetes — dari konfigurasi node hingga pod individu.
Mengapa perlu proxy di cluster Kubernetes
Cluster Kubernetes di lingkungan perusahaan sering kali beroperasi di jaringan terisolasi dengan akses internet yang terbatas. Server proxy menyelesaikan beberapa tugas kritis:
- Pengunduhan gambar kontainer — Docker Hub, Google Container Registry, dan registry pribadi memerlukan akses eksternal
- Pembaruan paket — instalasi dependensi melalui apt, yum, pip di dalam kontainer
- Akses ke API eksternal — integrasi dengan layanan cloud, pemantauan, dan pencatatan
- Keamanan — kontrol lalu lintas, penyaringan domain, pencatatan permintaan
- Cache — mempercepat permintaan berulang ke sumber daya yang sama
Tanpa pengaturan proxy yang benar, Anda akan menghadapi kesalahan seperti "image pull failed", "connection timeout", atau "network unreachable" saat mencoba menerapkan aplikasi. Ini sangat kritis untuk pipeline CI/CD otomatis, di mana setiap detik downtime berharga.
Penting: Untuk cluster perusahaan, disarankan untuk menggunakan proxy data center dengan bandwidth tinggi dan stabilitas koneksi, karena ini mempengaruhi kinerja seluruh infrastruktur.
Tingkat pengaturan proxy di Kubernetes
Kubernetes memiliki arsitektur bertingkat, dan proxy perlu diatur di setiap tingkat tergantung pada tugas:
| Tingkat | Apa yang diatur | Untuk apa diperlukan |
|---|---|---|
| Sistem Operasi | Variabel lingkungan sistem | Akses utilitas (curl, wget, apt) |
| Container Runtime (Docker/containerd) | Konfigurasi daemon | Pengunduhan gambar kontainer |
| kubelet | Parameter peluncuran kubelet | Interaksi dengan server API |
| Pods | Variabel lingkungan dalam manifest | Akses aplikasi ke API eksternal |
| kubectl | Variabel lingkungan klien | Mengelola cluster melalui proxy |
Setiap tingkat memerlukan pengaturan terpisah, dan melewatkan salah satu dari mereka dapat menyebabkan masalah. Misalnya, jika Anda hanya mengatur proxy untuk Docker, tetapi tidak untuk pod, maka gambar akan diunduh, tetapi aplikasi di dalam kontainer tidak dapat mengakses API eksternal.
Pengaturan proxy untuk Docker dan containerd
Container runtime adalah komponen pertama yang perlu diatur, karena ia bertanggung jawab untuk mengunduh gambar kontainer dari registry eksternal. Mari kita lihat pengaturan untuk kedua runtime populer ini.
Pengaturan proxy untuk Docker
Untuk Docker, Anda perlu membuat file drop-in systemd yang akan menambahkan variabel lingkungan ke layanan Docker:
# Membuat direktori untuk konfigurasi
sudo mkdir -p /etc/systemd/system/docker.service.d
# Membuat file dengan pengaturan proxy
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://proxy.company.com:8080"
Environment="HTTPS_PROXY=http://proxy.company.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.cluster.local,.svc"
EOF
# Memuat ulang konfigurasi systemd
sudo systemctl daemon-reload
# Memulai ulang Docker
sudo systemctl restart docker
# Memeriksa apakah pengaturan diterapkan
sudo systemctl show --property=Environment docker
Setelah itu, Docker akan dapat mengunduh gambar melalui server proxy. Anda dapat memeriksa fungsinya dengan perintah:
docker pull nginx:latest
Pengaturan proxy untuk containerd
Containerd digunakan di cluster Kubernetes modern sebagai container runtime utama. Pengaturan proxy untuknya sedikit berbeda:
# Membuat direktori untuk konfigurasi
sudo mkdir -p /etc/systemd/system/containerd.service.d
# Membuat file dengan pengaturan proxy
sudo tee /etc/systemd/system/containerd.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://proxy.company.com:8080"
Environment="HTTPS_PROXY=http://proxy.company.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.cluster.local,.svc"
EOF
# Memuat ulang konfigurasi
sudo systemctl daemon-reload
sudo systemctl restart containerd
# Memeriksa status
sudo systemctl status containerd
Tips: Jika Anda menggunakan registry kontainer pribadi, tambahkan domainnya ke NO_PROXY untuk menghindari penundaan yang tidak perlu dan masalah dengan sertifikat SSL.
Konfigurasi proxy untuk kubelet
Kubelet adalah agen Kubernetes yang berjalan di setiap node cluster. Ia juga memerlukan akses ke server API dan sumber daya eksternal. Pengaturan tergantung pada cara instalasi Kubernetes.
Untuk cluster kubeadm
Jika Anda menggunakan kubeadm, atur proxy melalui systemd:
# Membuat direktori untuk konfigurasi kubelet
sudo mkdir -p /etc/systemd/system/kubelet.service.d
# Membuat file dengan pengaturan proxy
sudo tee /etc/systemd/system/kubelet.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://proxy.company.com:8080"
Environment="HTTPS_PROXY=http://proxy.company.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,10.244.0.0/16,.cluster.local,.svc"
EOF
# Memuat ulang kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
Untuk Kubernetes yang dikelola (EKS, GKE, AKS)
Di layanan Kubernetes yang dikelola, pengaturan kubelet biasanya dilakukan melalui parameter peluncuran node atau skrip user data. Misalnya, untuk AWS EKS:
#!/bin/bash
# Skrip user data untuk node pekerja EKS
# Pengaturan proxy untuk sistem
cat <<EOF >> /etc/environment
HTTP_PROXY=http://proxy.company.com:8080
HTTPS_PROXY=http://proxy.company.com:8080
NO_PROXY=localhost,127.0.0.1,169.254.169.254,.ec2.internal,.cluster.local
EOF
# Pengaturan untuk kubelet
mkdir -p /etc/systemd/system/kubelet.service.d
cat <<EOF > /etc/systemd/system/kubelet.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.company.com:8080"
Environment="HTTPS_PROXY=http://proxy.company.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,169.254.169.254,.ec2.internal,.cluster.local"
EOF
systemctl daemon-reload
systemctl restart kubelet
Perhatikan penambahan 169.254.169.254 ke NO_PROXY — ini adalah alamat layanan metadata AWS yang harus dapat diakses tanpa proxy.
Pengaturan proxy di tingkat pod
Bahkan jika Anda telah mengatur proxy untuk Docker dan kubelet, aplikasi di dalam pod tidak akan secara otomatis menggunakan proxy. Anda perlu secara eksplisit menentukan variabel lingkungan dalam manifest Kubernetes.
Pengaturan melalui manifest Deployment
Cara paling sederhana adalah menambahkan variabel lingkungan ke spesifikasi kontainer:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-company/my-app:latest
env:
- name: HTTP_PROXY
value: "http://proxy.company.com:8080"
- name: HTTPS_PROXY
value: "http://proxy.company.com:8080"
- name: NO_PROXY
value: "localhost,127.0.0.1,.cluster.local,.svc,10.0.0.0/8"
ports:
- containerPort: 8080
Menggunakan ConfigMap untuk pengaturan terpusat
Agar tidak menduplikasi pengaturan proxy di setiap Deployment, buatlah ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: proxy-config
namespace: default
data:
HTTP_PROXY: "http://proxy.company.com:8080"
HTTPS_PROXY: "http://proxy.company.com:8080"
NO_PROXY: "localhost,127.0.0.1,.cluster.local,.svc,10.0.0.0/8"
Kemudian gunakan ConfigMap ini dalam Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
containers:
- name: app
image: my-company/my-app:latest
envFrom:
- configMapRef:
name: proxy-config
Pendekatan ini menyederhanakan manajemen: ketika alamat proxy berubah, cukup perbarui ConfigMap, dan setelah pod di-restart, pengaturan baru akan diterapkan secara otomatis.
Injeksi otomatis melalui MutatingWebhook
Untuk menambahkan variabel proxy secara otomatis ke semua pod, Anda dapat menggunakan MutatingAdmissionWebhook. Ini adalah pendekatan yang lebih maju yang memerlukan pengembangan layanan webhook Anda sendiri, tetapi memungkinkan pengelolaan pengaturan secara terpusat tanpa mengubah manifest aplikasi.
Konfigurasi NO_PROXY yang benar
Variabel NO_PROXY menentukan alamat dan domain mana yang harus melewati server proxy. Pengaturan NO_PROXY yang salah adalah penyebab paling umum masalah di cluster Kubernetes.
Pengecualian wajib untuk Kubernetes
Alamat dan rentang berikut SELALU harus ada di NO_PROXY:
| Alamat/Rentang | Tujuan |
|---|---|
localhost, 127.0.0.1 |
Koneksi lokal |
.cluster.local |
DNS internal cluster |
.svc |
Layanan Kubernetes |
10.0.0.0/8 |
Jaringan Pod (tergantung pada CNI) |
10.96.0.0/12 |
Jaringan Layanan (default) |
172.16.0.0/12 |
Jaringan pribadi Docker |
192.168.0.0/16 |
Jaringan lokal pribadi |
Contoh konfigurasi NO_PROXY lengkap
NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,10.96.0.0/12,.cluster.local,.svc,.default.svc,.default.svc.cluster.local,kubernetes.default.svc,kubernetes.default.svc.cluster.local
Perhatian: Beberapa aplikasi tidak mendukung notasi CIDR di NO_PROXY. Dalam kasus tersebut, gunakan wildcard: 10.* sebagai pengganti 10.0.0.0/8.
Pengaturan kubectl untuk bekerja melalui proxy
Jika Anda mengelola cluster dari workstation yang berada di belakang proxy, atur variabel lingkungan untuk kubectl:
# Untuk Linux/macOS - tambahkan ke ~/.bashrc atau ~/.zshrc
export HTTP_PROXY=http://proxy.company.com:8080
export HTTPS_PROXY=http://proxy.company.com:8080
export NO_PROXY=localhost,127.0.0.1,kubernetes.default.svc,.cluster.local
# Untuk Windows PowerShell
$env:HTTP_PROXY="http://proxy.company.com:8080"
$env:HTTPS_PROXY="http://proxy.company.com:8080"
$env:NO_PROXY="localhost,127.0.0.1,kubernetes.default.svc,.cluster.local"
Setelah itu, kubectl akan dapat terhubung ke server API cluster melalui proxy. Periksa fungsinya:
kubectl cluster-info
kubectl get nodes
Pengaturan proxy dengan otentikasi
Jika server proxy memerlukan otentikasi, tambahkan kredensial ke URL:
export HTTP_PROXY=http://username:password@proxy.company.com:8080
export HTTPS_PROXY=http://username:password@proxy.company.com:8080
Keamanan: Jangan simpan kata sandi dalam bentuk teks biasa di file konfigurasi. Gunakan variabel lingkungan atau rahasia Kubernetes untuk menyimpan kredensial proxy.
Diagnostik dan pemecahan masalah umum
Bahkan dengan pengaturan yang benar, masalah dapat muncul. Mari kita lihat kesalahan yang paling umum dan cara mengatasinya.
Kesalahan "ImagePullBackOff" saat mengunduh gambar
Gejala: Pod tidak dapat dijalankan, di event menunjukkan kesalahan "Failed to pull image" atau "connection timeout".
Diagnostik:
# Periksa event pod
kubectl describe pod <pod-name>
# Periksa pengaturan proxy di Docker/containerd
sudo systemctl show --property=Environment docker
sudo systemctl show --property=Environment containerd
# Coba unduh gambar secara manual di node
sudo docker pull nginx:latest
sudo crictl pull nginx:latest
Penyelesaian: Pastikan proxy diatur untuk container runtime dan domain registry gambar tidak ada di NO_PROXY.
Masalah dengan resolusi DNS di dalam cluster
Gejala: Pod tidak dapat saling menghubungi melalui nama DNS (misalnya, service-name.namespace.svc.cluster.local).
Diagnostik:
# Periksa DNS dari pod
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default
# Periksa variabel proxy di pod
kubectl exec -it <pod-name> -- env | grep PROXY
Penyelesaian: Tambahkan .cluster.local dan .svc ke NO_PROXY.
Kinerja lambat atau timeout saat mengakses API eksternal
Gejala: Aplikasi berjalan lambat atau mendapatkan timeout saat melakukan permintaan ke layanan eksternal.
Diagnostik:
# Periksa ketersediaan proxy dari pod
kubectl exec -it <pod-name> -- curl -v -x http://proxy.company.com:8080 https://www.google.com
# Ukur waktu respons
kubectl exec -it <pod-name> -- time curl -x http://proxy.company.com:8080 https://api.example.com
Penyelesaian: Masalah mungkin terletak pada kinerja server proxy. Pertimbangkan untuk menggunakan proxy residensial dengan lokasi geografis yang dekat untuk mengurangi latensi.
Kesalahan SSL/TLS saat bekerja melalui proxy
Gejala: Kesalahan seperti "certificate verify failed" atau "SSL handshake failed".
Penyebab: Beberapa server proxy melakukan inspeksi SSL (dekripsi lalu lintas HTTPS), yang memerlukan pemasangan sertifikat root proxy.
Penyelesaian:
# Buat ConfigMap dengan sertifikat proxy
kubectl create configmap proxy-ca-cert --from-file=ca.crt=/path/to/proxy-ca.crt
# Pasang sertifikat di pod dan tambahkan ke penyimpanan sistem
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
volumeMounts:
- name: proxy-ca
mountPath: /usr/local/share/ca-certificates/proxy-ca.crt
subPath: ca.crt
volumes:
- name: proxy-ca
configMap:
name: proxy-ca-cert
Praktik terbaik untuk proxy di produksi
Berdasarkan pengalaman menjalankan cluster Kubernetes di lingkungan perusahaan, berikut adalah rekomendasi untuk bekerja dengan proxy yang andal:
1. Gunakan server proxy yang sangat tersedia
Proxy menjadi titik kegagalan tunggal untuk seluruh cluster. Atur beberapa server proxy di belakang load balancer:
HTTP_PROXY=http://proxy-lb.company.com:8080
Di mana proxy-lb.company.com adalah load balancer di depan beberapa server proxy.
2. Pengelolaan konfigurasi terpusat
Gunakan ConfigMap atau Secret untuk menyimpan pengaturan proxy daripada menghardcode di setiap manifest:
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-proxy-config
namespace: kube-system
data:
HTTP_PROXY: "http://proxy-lb.company.com:8080"
HTTPS_PROXY: "http://proxy-lb.company.com:8080"
NO_PROXY: "localhost,127.0.0.1,.cluster.local,.svc,10.0.0.0/8"
3. Pemantauan dan peringatan
Atur pemantauan ketersediaan server proxy dan peringatan saat terjadi masalah:
- Waktu respons proxy (harus < 100ms untuk proxy lokal)
- Jumlah kesalahan koneksi ke proxy
- Jumlah event ImagePullBackOff di cluster
- Penggunaan CPU dan jaringan di server proxy
4. Dokumentasikan pengecualian NO_PROXY
Simpan dokumentasi tentang domain dan alamat IP yang ditambahkan ke NO_PROXY dan alasannya. Ini akan membantu dalam pemecahan masalah dan audit keamanan.
5. Uji perubahan di lingkungan dev
Sebelum mengubah pengaturan proxy di produksi, selalu uji di cluster dev/staging:
# Pod uji untuk memeriksa proxy
apiVersion: v1
kind: Pod
metadata:
name: proxy-test
spec:
containers:
- name: test
image: curlimages/curl:latest
command: ["sleep", "3600"]
env:
- name: HTTP_PROXY
value: "http://new-proxy.company.com:8080"
- name: HTTPS_PROXY
value: "http://new-proxy.company.com:8080"
# Periksa ketersediaan sumber daya eksternal
kubectl exec -it proxy-test -- curl -v https://registry.k8s.io
kubectl exec -it proxy-test -- curl -v https://docker.io
6. Gunakan berbagai jenis proxy untuk berbagai tugas
Untuk komponen kritis (pengunduhan gambar, API cluster), gunakan proxy cepat data center, dan untuk aplikasi yang memerlukan keragaman geografis IP — gunakan proxy residensial atau mobile.
7. Secara teratur perbarui daftar NO_PROXY
Saat menambahkan layanan baru atau mengubah topologi jaringan, perbarui NO_PROXY. Otomatiskan ini melalui Helm charts atau Kustomize:
# values.yaml untuk Helm chart
proxy:
enabled: true
http: "http://proxy.company.com:8080"
https: "http://proxy.company.com:8080"
noProxy:
- localhost
- 127.0.0.1
- .cluster.local
- .svc
- 10.0.0.0/8
- internal-service.company.com
Kesimpulan
Pengaturan proxy di cluster Kubernetes adalah tugas bertingkat yang memerlukan perhatian terhadap detail di setiap tingkat: dari sistem operasi dan container runtime hingga pod individu. Konfigurasi yang benar memastikan operasi cluster yang lancar, akses aman ke sumber daya eksternal, dan kepatuhan terhadap kebijakan keamanan perusahaan.
Poin-poin kunci yang perlu diingat:
- Atur proxy di semua tingkat: OS, container runtime, kubelet, pod
- Konfigurasikan NO_PROXY dengan benar, termasuk semua jaringan internal cluster
- Gunakan pengelolaan terpusat melalui ConfigMap
- Pantau ketersediaan dan kinerja server proxy
- Uji perubahan sebelum menerapkannya di produksi
Untuk cluster Kubernetes yang kritis, disarankan untuk menggunakan proxy data center yang andal dengan ketersediaan tinggi dan latensi rendah. Ini akan memastikan operasi infrastruktur yang stabil dan meminimalkan risiko downtime akibat masalah akses jaringan.
Jika terjadi masalah, gunakan pendekatan sistematis untuk diagnostik: periksa pengaturan di setiap tingkat, analisis log dan event, uji koneksi secara manual. Sebagian besar masalah dengan proxy di Kubernetes dapat diselesaikan dengan pengaturan variabel lingkungan dan NO_PROXY yang benar.