Traefik sebagai Pengontrol Ingress untuk K8S

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.


gambar


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

Source: https://habr.com/ru/post/id427655/


All Articles