Bukan rahasia lagi bahwa K8S memiliki komunitas yang sangat baik dan dokumentasi yang umumnya bagus. Di dalamnya Anda dapat dengan mudah menemukan jawaban untuk banyak pertanyaan. Tetapi seperti dokumentasi lain, itu tidak dapat mencakup semuanya. Pada artikel ini saya akan mencoba untuk memberikan petunjuk terperinci tentang cara menggunakan dan mengkonfigurasi Traefik untuk digunakan sebagai pengontrol Ingress.

Apa itu Ingress?
Ingress adalah objek API yang mengontrol akses eksternal ke layanan dalam sebuah cluster, terutama melalui HTTP / HTTPS. Agar sumber daya Ingress berfungsi, Anda memerlukan pengontrol Ingress. Jika Anda menggunakan GCE, maka kontroler Ingress sudah digunakan untuk panduan. Namun, jika Anda sendiri mengunduh cluster, misalnya dari kops
ke AWS, Anda harus menggunakan pengontrol Ingress sendiri. Di minikube, ini diselesaikan dengan memasukkan add-in Ingress.
Pengontrol masuknya
Peran pengontrol Ingress dapat dilakukan oleh NGINX Ingress Controller, Kong, Octavia Ingress Controller, dll. Pada artikel ini kami akan mempertimbangkan alat seperti Traefik dan melihat bagaimana Anda dapat menggunakannya sebagai pengontrol Ingress untuk layanan dalam sebuah cluster.
Mengapa
Mengapa menggunakan pengontrol Ingress jika Anda dapat memberikan akses ke setiap layanan melalui NodePort
atau LoadBalancer
? Singkatnya, ini memungkinkan satu titik pusat untuk mem-proxy semua lalu lintas. Artinya, menggunakan pengontrol Ingress, Anda hanya perlu satu LoadBalancer untuk Traefik dan tidak lebih. Bundel ini akan menyelesaikan semua lalu lintas.
Komponen traefik
Traefik mengumumkan dukungan untuk Kubernetes Ingress dalam versi 1.4. Namun, Traefik 1.7 yang baru-baru ini dirilis memiliki opsi publishService publishedService,
yang dapat memperbarui bidang status
di Ingress, yang tidak ada di versi sebelumnya. Berikut ini adalah daftar komponen yang akan diperlukan untuk beroperasi.
Buat:
- namespace
- akun layanan
- Rahasia TLS
- peran klaster
- pengikatan peran klaster
- configmap
- penyebaran
- layanan untuk http dan https
- layanan untuk dashboard Traefik
- Ingress
Namespace
Buat namespace:
kubectl create namespace traefik
Rahasia TLS
(kira-kira per. - dalam contoh di bawah ini, untuk beberapa alasan, penulis menduplikasi konfigurasi yang sama, lihat konfigurasi saat ini di file README yang disediakan oleh tautan di bawah)
Pertama buat sertifikat:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
Buat sertifikat TLS:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
Buat Rahasia:
kubectl create secret tls traefik-ui-tls-cert --key ./tls.key --cert ./tls.crt
Untuk kenyamanan, saya membuat file README dengan perintah ini dan mengunggahnya ke GitHub saya .
ConfigMap
--- apiVersion: v1 kind: ConfigMap metadata: name: traefik-configmap namespace: traefik data: traefik.toml: | defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile = "/ssl/tls.crt" KeyFile = "/ssl/tls.key" [entryPoints.traefik] address = ":8080" [entryPoints.traefik.auth.basic] users = ["admin:$apr1$zjjGWKW4$W2JIcu4m26WzOzzESDF0W/"] [kubernetes] [kubernetes.ingressEndpoint] publishedService = "traefik/traefik" [ping] entryPoint = "http" [api] entryPoint = "traefik"
Secara default, EntryPoint adalah port 80
dan 443
.
EntryPoint http
mendengarkan :80
dan tidak memiliki aturan tambahan
EntryPoint https
mendengarkan pada :443
dan berisi aturan untuk menghubungkan sertifikat TLS.
traefik
mendengarkan :8080
dan menggunakan otentikasi dasar. Nama pengguna adalah admin
, kata sandi adalah admin
.
Definisi titik akhir Ingress yang sesuai di Kubernetes dilakukan dengan menentukan publishService
dan harus terdiri dari nilai namespace
dan nama service
untuk Traefik. Dalam hal ini adalah traefik / traefik
.
ping
atau pemeriksaan kesehatan akan menggunakan entryPoint http
.
api
atau dashboard / ui akan menggunakan entryPoint traefik
.
Perhatikan bahwa Anda dapat mendefinisikan entryPoints tambahan dengan porta. Port ini dapat NodePort
proxy traffic ke port apa saja, alih-alih port dinamis dan NodePort
.
Clusterrole
Akun layanan untuk Traefik harus memiliki izin untuk memperbarui bidang Ingress status
. Ini adalah parameter penting, dan belum disajikan dalam dokumentasi resmi Traefik :
--- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update
6 baris terakhir sangat penting untuk operasi yang benar.
Penempatan
Penempatan sangat mudah. Mari kita secara singkat melalui blok utama:
volumes: - name: traefik-ui-tls-cert secret: secretName: traefik-ui-tls-cert - name: traefik-configmap configMap: name: traefik-configmap
Tentukan volumes
untuk ConfigMap dan Rahasia, yang kemudian dapat digunakan dalam volumeMounts
.
volumeMounts: - mountPath: "/ssl" name: "traefik-ui-tls-cert" - mountPath: "/config" name: "traefik-configmap"
Pemeriksaan kesehatan dilakukan pada port 80, sebagaimana didefinisikan dalam ConfigMap.
Buka port untuk semua entryPoints yang ditentukan dalam file konfigurasi:
ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: dashboard containerPort: 8080
Saya mengingatkan Anda bahwa beberapa contoh dan dokumentasi di Internet sudah ketinggalan zaman, jadi jangan lewatkan bagian args
diperlukan agar Traefik bekerja:
args: - --logLevel=INFO - --configfile=/config/traefik.toml
Jangan berikan flag dan argumen tambahan, seperti -api, -ping atau -kubernetes, karena ini akan mengesampingkan pengaturan yang ditentukan dalam file konfigurasi.
Layanan
Layanan pertama mendefinisikan Loadbalancer untuk entryPoints http
dan https
. Jika Anda melihat Grup Keamanan (Masuk) untuk LoadBalancer, Anda akan melihat port 80 dan 443 terbuka di sana. K8 akan membuat LoadBalancer dan menghubungkannya ke node yang dijalankan Traefik. Jika Anda ingin membuat ELB internal, seperti saya, Anda perlu mendefinisikan anotasi:
--- kind: Service apiVersion: v1 metadata: name: traefik namespace: traefik annotations: # service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 spec: selector: k8s-app: traefik-ingress ports: - protocol: TCP port: 80 name: http - protocol: TCP port: 443 name: https type: LoadBalancer
Layanan (untuk Dasbor)
Sekarang bagian yang menyenangkan! Karena Dashboard menggunakan otentikasi dasar, saya perlu https
. Untuk menggunakan SSL, kita perlu mengarahkan lalu lintas ke port :8080
, tempat Dashboard bekerja. Seperti yang Anda lihat, ini sangat sederhana. Semua keajaiban terjadi di Ingress.
--- kind: Service apiVersion: v1 metadata: name: traefik-dashboard namespace: traefik spec: selector: k8s-app: traefik-ingress ports: - port: 8080 name: dashboard
Ingress (untuk Dashboard)
Ajaibnya adalah memproksi lalu lintas aman ke Dashboard dilakukan melalui Traefik sendiri. Mengelola Traefik dalam Ingress dilakukan menggunakan anotasi Traefik :
--- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-dashboard-ingress namespace: traefik annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/frontend-entry-points: http,https traefik.ingress.kubernetes.io/redirect-entry-point: https traefik.ingress.kubernetes.io/redirect-permanent: "true" spec: rules: - host: traefik-ui.example.com http: paths: - path: / backend: serviceName: traefik-dashboard servicePort: 8080
Hanya butuh 4 anotasi sederhana dan jelas.
Tentu saja, untuk memastikan fungsionalitas penuh, Anda perlu membuat catatan DNS traefik-ui.example.com
, yang akan mengarah ke ELB Anda.
Apakah lebih baik jika ini dilakukan secara otomatis? Tidak masalah, saya akan menulis tentang pembuatan otomatis catatan DNS di artikel selanjutnya.
Referensi
File deployment.yaml yang sudah selesai dapat diunduh dari repositori Github saya. Jika Anda mengalami kesulitan selama proses pengaturan, jangan ragu untuk bertanya.
Kata perpisahan dari penerjemah
Baca artikel lain di blog kami:
Cadangan stateful di Kubernetes
Mencadangkan sejumlah besar proyek web heterogen
Bot Telegram untuk Redmine. Cara menyederhanakan hidup untuk diri sendiri dan orang