Ömer Faruk URHAN
5 min readAug 22, 2020

KUBERNETES CLUSTER İÇİN TRAEFIK INGRESS CONTROLLER KURULUMU VE KONFİGÜRASYONU

Merhaba bu yazıda kubernetes (k8s) cluster üzerinde olması gereken bileşenlerden biri olan ingress controller bileşeninden bahsedecek ve yapılandıracağız.

İngress, kelime anlamı olarak giriş yeri, giriş yolu anlamlarına gelir. Dış dünyadan erişilecek tüm servisleri ayrı ayrı açmak yerine (expose) tek bir giriş noktası tanımlayarak gelen tüm istekleri host ve path alanlarına göre ilgili servislere iletmeyi sağlar. Bir nevi reverse proxy ve load balance görevlerini yerine getirir. Layer 7 seviyesinde cookie kullanarak session affinity sağlar. Ayrıca SSL sonlandırma yaparak her uygulama için ayrı ayrı pod seviyesinde SSL konfigürasyonu ile uğraşmanızın önüne geçer. Servis keşif özelliği ile k8s clusterda çalışan podların artması veye azalmasını öğrenerek gelen istekleri yönlendirir. K8S cluster için birden çok ingress controller seçeneği mevcuttur. Bu yazıda traefik ingress controller kurulumu ve konfigürasyonunu yapacağız.

Traefik “open-source” bir edge router olup kubernetes, docker, AWS, Mesos vb. cluster yapılarıyla doğrudan uyumlu olarak çalışabilmektedir. En faydalı özelliklerinden biri, servisleri otomatik algılayıp konfigürasyonu ona göre uyarlayabilmesidir. Traefik edge-routerı anlamak için temel kavramlarından bahsedelim:

1- Entrypoint kavramı: Dış dünyadan gelen istekleri karşılama biriminin adıdır. Örneğin http hizmeti veriyor iseniz, tcp 80'e bind ettiğiniz bir entrypoint gelen istekleri bu porttan karşılar. Aşağıdaki şekil bunu simule etmektedir.

2- Routers kavramı: Router entrypointten gelen isteği dinler (isteğe bağlı olarak bir veya birden çok entryointten gelen isteği dinleyebilir.) ve gelen isteğe kendi üzerinde daha önce oluşturulan kuralı uygulayarak arka tarafta yer alan servise yönlendirir. Şayet gelen isteğin üzerinde bir oynama yapılacak ise bu isteği middleware birimine yönlendirir. Aşağıdaki şekil bunu simule etmektedir.

3- Middleware kavramı: Middlewareler routerlara bağlı olarak çalışırlar. Routerlardan gelen istekler üzerinde değişiklik yapabilmektedirler. Örneğin gelen isteği (request) ve başlığı (header) değiştirebilir, yeniden yönlendirebilir (redirect), authentication ekleyebilir vb. Kullanımı isteğe bağlıdır. Aşağıdaki şekil bunu simule etmektedir.

4- Service kavramı: Servisler gelen isteği routerlardan alırlar ve isteklerin hedeflerine nasıl ulaştırılacağını belirlerler. Örneğin isteğin ulaşacağı hizmet sağlayıcılar (provider veya backend), load balance algoritması, sticky session, healt check, cookie ekleme vb. burada belirlenir. Aşağıdaki şekil bunu simule etmektedir.

5- Provider kavramı: Hizmet isteğinin ulaşacağı ve işleneceği son adres olarak tanımlanabilir. Traefik çeşitli providerları desteklemektedir. Örneğin docker, kubernetes, kv, rancher vb. Klasik load-balance yöntemlerinde backend olarak ifade edilen birime de karşılık gelebilir.

K8s için traefik iki farklı provider sunmaktadır. Bunlar kubernetes ingress ve kubernetes crd’ dir. (custom resource define) Kubernetes crd, traefik için k8s clusterda tanımlanmış çeşitli kaynaklardan oluşmaktadır. Kurulumumuzda kubernetes crd providerını kullanacağız. Kuruluma bu tanımları yaparak başıyoruz.

crd.yaml

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: ingressroutes.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: IngressRoute
plural: ingressroutes
singular: ingressroute
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: middlewares.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: Middleware
plural: middlewares
singular: middleware
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: ingressroutetcps.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: IngressRouteTCP
plural: ingressroutetcps
singular: ingressroutetcp
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: ingressrouteudps.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: IngressRouteUDP
plural: ingressrouteudps
singular: ingressrouteudp
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: tlsoptions.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: TLSOption
plural: tlsoptions
singular: tlsoption
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: tlsstores.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: TLSStore
plural: tlsstores
singular: tlsstore
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: traefikservices.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: TraefikService
plural: traefikservices
singular: traefikservice
scope: Namespaced

Aşağıdaki komutu çalıştırarak crd tanımlarını yapıyoruz.

kubectl create -f crd.yaml

K8s clusterda Traefik için servis hesabı, rol ve “role binding” tanımlıyoruz.

rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik-ingress-controller
---
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
- apiGroups:
- traefik.containo.us
resources:
- middlewares
- ingressroutes
- traefikservices
- ingressroutetcps
- ingressrouteudps
- tlsoptions
- tlsstores
verbs:
- get
- list
- watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: traefik-ingress-controller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
name: traefik-ingress-controller
namespace: default

Rol tabanlı erişim kontrolünü tanımlıyoruz.

kubectl create -f rbac.yaml

Son olarak traefik deploymentını ve servisini hazırlayarak k8s de traefik’i deploy ediyoruz.

traefik.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
name: traefik
labels:
app: traefik
spec:
replicas: 1
selector:
matchLabels:
app: traefik
template:
metadata:
labels:
app: traefik
spec:
serviceAccountName: traefik-ingress-controller
containers:
- name: traefik
image: traefik:v2.2
args:
- --log.level=DEBUG
- --api
- --api.insecure
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --providers.kubernetescrd #provider belirtiyoruz.
ports:
- name: web
containerPort: 80
- name: websecure
containerPort: 443
- name: admin
containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: traefik
spec:
type: LoadBalancer #servis tipi loadbalancer olarak belirliyoruz.
selector:
app: traefik
ports:
- protocol: TCP
port: 80
name: web
targetPort: 80
nodePort: 80
- protocol: TCP
port: 8080
name: admin
targetPort: 8080
nodePort: 8080
- protocol: TCP
port: 443
name: websecure
targetPort: 443
nodePort: 443

Traefik’i 3 adet entrypointle başlatıyoruz.(web, websecure, admin) Dıç dünyadan isteklerin traefik poduna ulaşabilmesi için Loadbalancer tipinde trafik servisi tanımlıyoruz.

kubectl create -f traefik.yaml

Not: Nodeportlar varsayılanda 30000. portun altında verilemez. 443, 80 gibi portları nodeport olarak kullanmak için “/etc/kubernetes/manifests/kube-apiserver.yaml” dosyasında container komutu olarak aşağıda kırmızı ile gösterilen satır eklenir.

Böylece traefik’i ingress controller olarak k8s clusterda yapılandırmış oluyoruz. Traefik’in barındırdığı “custom resource” ları ve bunların nasıl kullanılacağını bir sonraki yazıda anlatacağız. İyi çalışmalar.

Yararlanılan kaynaklar: