Takip et

DigitalOcean Kubernetes Üzerinde Nginx Ingress ve Cert-Manager Kurulumu: Kapsamlı Bir Rehber

DigitalOcean Kubernetes Üzerinde Nginx Ingress ve Cert-Manager Kurulumu: Kapsamlı Bir Rehber Modern uygulama geliştirme ve dağıtım süreçlerin

DigitalOcean Kubernetes Üzerinde Nginx Ingress ve Cert-Manager Kurulumu: Kapsamlı Bir Rehber

Modern uygulama geliştirme ve dağıtım süreçlerinde Kubernetes, konteyner tabanlı iş yüklerini yönetmek için vazgeçilmez bir platform haline gelmiştir. Mikroservis mimarileri ve bulut yerel uygulamaların yükselişiyle birlikte, bu uygulamaların dış dünyaya güvenli ve verimli bir şekilde açılması kritik bir öneme sahiptir. Bu bağlamda, Nginx Ingress Controller ve Cert-Manager gibi araçlar, Kubernetes ekosisteminde temel taşlardan sayılır. Bu makalede, DigitalOcean Kubernetes (DOKS) üzerinde bu iki güçlü aracı nasıl kuracağımızı ve yapılandıracağımızı adım adım inceleyeceğiz. Amacımız, uygulamalarınıza hem güvenli HTTPS erişimi sağlamak hem de trafik yönlendirmesini merkezi bir şekilde yönetmektir.

Giriş: Kubernetes’te Trafik Yönetimi ve SSL Otomasyonu

Kubernetes, bir uygulamanın dağıtımını, ölçeklendirmesini ve yönetimini basitleştirse de, dış dünyadan gelen trafiği uygulamalara yönlendirme ve bu trafiği HTTPS ile güvence altına alma konuları özel bir yaklaşım gerektirir.

* Ingress: Kubernetes’te Ingress, küme içindeki servislere dışarıdan HTTP/HTTPS erişimi sağlayan bir API nesnesidir. Bir Ingress Controller (örneğin Nginx Ingress Controller) ise bu Ingress kurallarını uygulayan ve trafiği doğru servislere yönlendiren bir bileşendir. Geleneksel Load Balancer’ların aksine, Ingress Controller daha gelişmiş yönlendirme kuralları (host tabanlı, yol tabanlı), SSL sonlandırma ve daha birçok özellik sunar.
* Cert-Manager: Sertifika yönetimi, özellikle SSL/TLS sertifikalarının oluşturulması, yenilenmesi ve dağıtılması süreçleri genellikle manuel ve hataya açık olabilir. Cert-Manager, Kubernetes kümelerinde sertifika yönetimini otomatikleştirerek bu süreci basitleştirir. Let’s Encrypt gibi ücretsiz sertifika sağlayıcılarıyla entegre olarak, uygulamalarınız için otomatik olarak sertifika alabilir ve yenileyebilir.

DigitalOcean Kubernetes, yönetilen bir Kubernetes hizmeti sunarak altyapı karmaşıklığını azaltır. Bu sayede geliştiriciler, temel altyapı yönetimi yerine uygulama geliştirmeye odaklanabilirler. Bu makale, DOKS’un sağladığı avantajları kullanarak Nginx Ingress ve Cert-Manager’ı nasıl entegre edeceğimizi detaylandıracaktır.

Ön Koşullar

Bu rehbere başlamadan önce aşağıdaki ön koşulların karşılandığından emin olun:

* DigitalOcean Hesabı: Aktif bir DigitalOcean hesabınız olmalı.
* DigitalOcean Kubernetes Kümesi (DOKS): DigitalOcean üzerinde çalışan bir Kubernetes kümeniz olmalı. Eğer yoksa, DigitalOcean kontrol panelinden kolayca oluşturabilirsiniz.
* kubectl Kurulumu: Kubernetes kümenizle etkileşim kurmak için yerel makinenizde kubectl komut satırı aracının kurulu ve yapılandırılmış olması gerekir. Küme yapılandırma dosyasını (kubeconfig) DigitalOcean kontrol panelinden indirerek kubectl‘i kümenize bağlayabilirsiniz.
* helm Kurulumu: Kubernetes uygulamalarını yönetmek için bir paket yöneticisi olan Helm’in yerel makinenizde kurulu olması gerekmektedir. Helm 3 sürümü önerilir.
* Alan Adı (Domain Name): Uygulamalarınıza erişmek için kullanacağınız bir alan adına sahip olmanız ve bu alan adının DNS kayıtlarını yönetebiliyor olmanız gerekmektedir. Bu rehberde example.com gibi bir alan adı kullanacağız, siz kendi alan adınızı kullanmalısınız.
* doctl (İsteğe Bağlı): DigitalOcean API ile etkileşim kurmak için doctl komut satırı aracı isteğe bağlıdır ancak bazı işlemleri kolaylaştırabilir.

DigitalOcean Kubernetes Kümesi Oluşturma (Kısa Bakış)

Eğer henüz bir DOKS kümeniz yoksa, DigitalOcean kontrol paneli üzerinden veya doctl CLI aracıyla kolayca oluşturabilirsiniz.

DigitalOcean Kontrol Paneli Üzerinden:
1. DigitalOcean hesabınıza giriş yapın.
2. Sol menüden “Kubernetes” seçeneğine tıklayın.
3. “Create Kubernetes Cluster” butonuna tıklayın.
4. Bölge, Kubernetes sürümü, node havuzu boyutları ve sayısını seçerek kümenizi oluşturun.

doctl CLI ile:

doctl kubernetes cluster create  \
  --region  \
  --version  \
  --node-pool "name=worker-pool;size=;count="

Küme oluşturulduktan sonra, kubeconfig dosyasını indirip ~/.kube/config dizinine yerleştirerek kubectl‘i yapılandırın:

doctl kubernetes cluster kubeconfig save 

Kümenizin çalıştığını doğrulamak için:

kubectl get nodes

Nginx Ingress Controller Kurulumu

Nginx Ingress Controller, gelen trafiği Kubernetes servislerinize yönlendirmek için temel bileşendir. Helm kullanarak kurulumu oldukça basittir.

1. Helm Repository Ekleme

Öncelikle Nginx Ingress Controller’ın Helm repository’sini eklememiz gerekiyor:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

2. Nginx Ingress Controller’ı Kurma

Şimdi Ingress Controller’ı ingress-nginx adında ayrı bir namespace’e kuralım. DigitalOcean Kubernetes’te Ingress Controller’ı bir LoadBalancer tipi servis olarak dağıttığımızda, DigitalOcean otomatik olarak bir Load Balancer (Yük Dengeleyici) oluşturur ve bu Load Balancer’a bir genel IP adresi atar. Bu IP adresi, uygulamalarınıza dışarıdan erişim için kullanılacaktır.

helm install nginx-ingress ingress-nginx/ingress-nginx \
  --namespace ingress-nginx --create-namespace \
  --set controller.service.type=LoadBalancer \
  --set controller.service.externalTrafficPolicy=Local

* --namespace ingress-nginx --create-namespace: Ingress Controller’ı ingress-nginx adında bir namespace’e kurar ve eğer yoksa bu namespace’i oluşturur.
* --set controller.service.type=LoadBalancer: Bu ayar, DigitalOcean’da otomatik olarak bir Load Balancer oluşturulmasını sağlar.
* --set controller.service.externalTrafficPolicy=Local: Bu ayar, istemci kaynak IP adresinin korunmasına yardımcı olur ve trafiği yalnızca Ingress Controller’ın çalıştığı düğümlere yönlendirir.

3. Kurulumu Doğrulama ve Load Balancer IP Adresini Alma

Ingress Controller’ın başarıyla dağıtıldığını ve DigitalOcean Load Balancer’ın oluşturulduğunu doğrulamak için servisleri kontrol edin:

kubectl get svc -n ingress-nginx

Çıktı aşağıdaki gibi olacaktır:

NAME                           TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                      AGE
nginx-ingress-controller       LoadBalancer   10.245.X.Y      XXX.XXX.XXX.XXX   80:31448/TCP,443:32402/TCP   2m
nginx-ingress-defaultbackend   ClusterIP      10.245.A.B               80/TCP                       2m

nginx-ingress-controller servisinin EXTERNAL-IP sütununda gördüğünüz IP adresi, DigitalOcean Load Balancer’ınızın genel IP adresidir. Bu IP adresini bir yere not edin.

4. DNS Kaydı Oluşturma

Uygulamalarınıza alan adınız üzerinden erişebilmek için, alan adınızın DNS kayıtlarında bir A kaydı oluşturmanız gerekmektedir. Bu A kaydını, yukarıda elde ettiğiniz EXTERNAL-IP adresine işaret etmelisiniz.

Örneğin, app.example.com adresi üzerinden uygulamanıza erişmek istiyorsanız, DNS sağlayıcınızın kontrol panelinde aşağıdaki gibi bir kayıt oluşturmalısınız:
* Type: A
* Host: app (veya @ eğer ana alan adını kullanacaksanız)
* Value: XXX.XXX.XXX.XXX (Load Balancer’ınızın EXTERNAL-IP adresi)
* TTL: (Genellikle varsayılan değer bırakılabilir, örneğin 3600 saniye)

DNS değişikliklerinin internet genelinde yayılması biraz zaman alabilir (genellikle birkaç dakika ila birkaç saat).

Cert-Manager Kurulumu

Nginx Ingress Controller trafiği yönlendirecek olsa da, HTTPS trafiği için SSL/TLS sertifikalarına ihtiyacımız var. Cert-Manager, bu sertifikaları otomatik olarak yönetecek ve yenileyecektir.

1. Helm Repository Ekleme

Cert-Manager’ın Helm repository’sini ekleyin:

helm repo add jetstack https://charts.jetstack.io
helm repo update

2. Cert-Manager’ı Kurma

Cert-Manager’ı cert-manager adında ayrı bir namespace’e kuralım. Kurulum sırasında CRD’leri (Custom Resource Definitions) de yüklemesini sağlamak önemlidir.

helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager --create-namespace \
  --version v1.13.1 \
  --set installCRDs=true

* --version v1.13.1: Belirli bir Cert-Manager sürümünü yüklemenizi sağlar. En güncel kararlı sürümü kullanmak iyi bir pratiktir.
* --set installCRDs=true: Cert-Manager’ın çalışması için gerekli olan Custom Resource Definitions’ı (Issuer, Certificate, CertificateRequest vb.) kurar.

3. Kurulumu Doğrulama

Cert-Manager’ın tüm bileşenlerinin çalıştığını doğrulamak için pod’ları kontrol edin:

kubectl get pods -n cert-manager

Tüm pod’ların Running durumunda olması gerekir:

NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-5d465c87f4-xxxxx              1/1     Running   0          2m
cert-manager-cainjector-78c4d76c6d-yyyyy   1/1     Running   0          2m
cert-manager-webhook-7d77b878b-zzzzz       1/1     Running   0          2m

Issuer ve ClusterIssuer Konfigürasyonu

Cert-Manager, sertifikaları düzenlemek için Issuer veya ClusterIssuer kaynaklarını kullanır. Issuer, sertifikaları belirli bir namespace içinde düzenlerken, ClusterIssuer küme genelinde sertifika düzenleyebilir. Genellikle ClusterIssuer tercih edilir, böylece farklı namespace’lerdeki uygulamalar aynı sertifika sağlayıcıyı kullanabilir. Let’s Encrypt ile çalışacağımız için ClusterIssuer kullanacağız.

Önce Let’s Encrypt’in “staging” ortamını kullanarak sertifika almayı denemek iyi bir uygulamadır. Bu, Let’s Encrypt’in “rate limit”lerine takılmadan yapılandırmanızı test etmenizi sağlar.

1. Let’s Encrypt Staging ClusterIssuer Oluşturma

letsencrypt-staging-clusterissuer.yaml adında bir dosya oluşturun:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    # E-posta adresinizi buraya girin. Let's Encrypt size sertifika yenileme bildirimlerini gönderecektir.
    email: your-email@example.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # ACME hesabınızın özel anahtarının saklanacağı Kubernetes Secret adı.
      name: letsencrypt-staging-private-key
    solvers:
    - http01:
        ingress:
          class: nginx

* email: Kendi e-posta adresinizi girmeniz zorunludur.
* server: Let’s Encrypt’in staging (test) ortamının URL’si.
* privateKeySecretRef: ACME hesabınızın özel anahtarının saklanacağı Secret’ın adı.
* solvers: Cert-Manager’ın alan adı sahipliğini nasıl doğrulayacağını belirtir. http01 challenge tipi, Ingress Controller üzerinden geçici bir web sunucusu başlatarak doğrulamayı yapar. ingress.class: nginx ise Nginx Ingress Controller’ı kullanacağımızı belirtir.

Bu dosyayı uygulayın:

kubectl apply -f letsencrypt-staging-clusterissuer.yaml

2. Let’s Encrypt Production ClusterIssuer Oluşturma

Staging ortamında testleriniz başarılı olduğunda, üretim ortamı için ClusterIssuer‘ı oluşturabilirsiniz. letsencrypt-production-clusterissuer.yaml adında bir dosya oluşturun:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-production
spec:
  acme:
    # E-posta adresinizi buraya girin. Let's Encrypt size sertifika yenileme bildirimlerini gönderecektir.
    email: your-email@example.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # ACME hesabınızın özel anahtarının saklanacağı Kubernetes Secret adı.
      name: letsencrypt-production-private-key
    solvers:
    - http01:
        ingress:
          class: nginx

Tek fark server URL’sinin https://acme-v02.api.letsencrypt.org/directory olmasıdır.

Bu dosyayı uygulayın:

kubectl apply -f letsencrypt-production-clusterissuer.yaml

ClusterIssuer‘larınızın durumunu kontrol edebilirsiniz:

kubectl get clusterissuers

Durumları Ready olarak görünmelidir.

Örnek Bir Uygulama Dağıtma

Şimdi Nginx Ingress Controller ve Cert-Manager’ı test etmek için basit bir uygulama dağıtalım. Bu, “Hello World” benzeri bir Nginx web sunucusu olacaktır.

1. Nginx Deployment Oluşturma

nginx-deployment.yaml adında bir dosya oluşturun:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-example
  labels:
    app: nginx-example
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-example
  template:
    metadata:
      labels:
        app: nginx-example
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

Bu dağıtım, nginx:latest imajını kullanarak iki adet Nginx pod’u oluşturur.

2. Nginx Service Oluşturma

Bu pod’lara erişimi sağlamak için bir ClusterIP tipi servis oluşturalım. nginx-service.yaml adında bir dosya oluşturun:

apiVersion: v1
kind: Service
metadata:
  name: nginx-example-service
spec:
  selector:
    app: nginx-example
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

Bu servis, app: nginx-example etiketine sahip pod’lara gelen trafiği 80 numaralı porttan yönlendirecektir.

Her iki dosyayı da uygulayın:

kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml

Uygulamanızın çalıştığını doğrulamak için:

kubectl get pods -l app=nginx-example
kubectl get svc nginx-example-service

Ingress Kaynağı Oluşturma

Şimdi Nginx Ingress Controller’ı, app.example.com adresinden gelen trafiği nginx-example-service‘e yönlendirmesi ve Cert-Manager’ı kullanarak bu alan adı için otomatik olarak bir SSL sertifikası alması için yapılandıracağız.

nginx-ingress.yaml adında bir dosya oluşturun:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-example-ingress
  annotations:
    # Cert-Manager'a bu Ingress için sertifika vermesini söyleyen annotation
    cert-manager.io/cluster-issuer: letsencrypt-production # Veya letsencrypt-staging
    # Nginx Ingress Controller için bazı ayarlar (isteğe bağlı)
    nginx.ingress.kubernetes.io/ssl-redirect: "true" # Tüm HTTP isteklerini HTTPS'ye yönlendirir
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  ingressClassName: nginx # Nginx Ingress Controller'ı kullanacağımızı belirtir
  rules:
  - host: app.example.com # Kendi alan adınızı buraya girin
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-example-service
            port:
              number: 80
  tls:
  - hosts:
    - app.example.com # Kendi alan adınızı buraya girin
    secretName: nginx-example-tls # Sertifikanın saklanacağı Kubernetes Secret adı

* cert-manager.io/cluster-issuer: letsencrypt-production: Cert-Manager’a, letsencrypt-production adlı ClusterIssuer‘ı kullanarak bu Ingress için bir sertifika almasını söyler. İlk testleriniz için letsencrypt-staging kullanmayı unutmayın.
* nginx.ingress.kubernetes.io/ssl-redirect: "true": HTTP üzerinden gelen tüm istekleri otomatik olarak HTTPS’ye yönlendirir.
* ingressClassName: nginx: Kubernetes 1.18 ve sonrası için önerilen Ingress Controller sınıfını belirtir.
* host: app.example.com: Uygulamanıza erişmek için kullanacağınız alan adıdır. Kendi alan adınızla değiştirin.
* backend: Gelen trafiğin yönlendirileceği Kubernetes servisini belirtir.
* tls: Bu bölüm, Cert-Manager’ın sertifika almasını ve bu sertifikayı belirtilen secretName altında saklamasını sağlar. Ingress Controller bu secret’ı kullanarak SSL sonlandırması yapacaktır.

Bu Ingress kaynağını uygulayın:

kubectl apply -f nginx-ingress.yaml

Sertifika Talebi ve Durumunu İzleme

Ingress kaynağını uyguladıktan sonra Cert-Manager otomatik olarak bir Certificate nesnesi oluşturacak ve Let’s Encrypt’ten sertifika talebinde bulunacaktır. Bu süreci izleyebilirsiniz:

# Oluşturulan Certificate nesnesini görüntüle
kubectl get certificate -n default # Uygulamanızın ve Ingress'inizin olduğu namespace

Certificate nesnesinin detaylarını incele (olası hatalar için)

kubectl describe certificate nginx-example-tls -n default

Cert-Manager'ın loglarını kontrol et (sorun giderme için)

kubectl logs -n cert-manager deploy/cert-manager-5d465c87f4-xxxxx # Kendi pod adınızla değiştirin

Sertifika başarıyla alındığında, kubectl get certificate çıktısında READY sütunu True olmalı ve SECRET sütununda nginx-example-tls secret’ının adı görünmelidir.

Test ve Doğrulama

Her şey yolunda gittiyse, şimdi tarayıcınızdan https://app.example.com (kendi alan adınızla değiştirin) adresine giderek uygulamanıza erişebilmelisiniz.

* Tarayıcınızda bir kilit simgesi görmelisiniz, bu da HTTPS bağlantısının güvenli olduğunu gösterir.
* Kilit simgesine tıklayarak sertifika detaylarını inceleyebilir ve Let’s Encrypt tarafından verildiğini doğrulayabilirsiniz.
* HTTP üzerinden (http://app.example.com) erişmeye çalıştığınızda otomatik olarak HTTPS’ye yönlendirildiğinizi görmelisiniz.

Sık Karşılaşılan Sorunlar ve Çözümleri

Kurulum sürecinde bazı sorunlarla karşılaşmanız olasıdır. İşte yaygın sorunlar ve çözüm ipuçları:

* DNS Yayılımı Sorunları: Alan adınızın EXTERNAL-IP adresine doğru şekilde işaret ettiğinden emin olun. DNS değişikliklerinin tam olarak yayılması biraz zaman alabilir. dig app.example.com veya nslookup app.example.com komutlarıyla DNS çözümlemesini kontrol edin.
* Cert-Manager Sertifika Alamıyor:
* kubectl describe certificate komutunun çıktısını inceleyin. Genellikle burada hatanın nedeni belirtilir.
* kubectl logs -n cert-manager deploy/cert-manager- komutuyla Cert-Manager pod’unun loglarını kontrol edin.
* ClusterIssuer yapılandırmanızdaki e-posta adresinin doğru olduğundan emin olun.
* http01 challenge için Ingress Controller’ınızın doğru şekilde çalıştığından ve 80 numaralı porttan erişilebilir olduğundan emin olun.
* Let’s Encrypt’in “rate limit”lerine takılmamak için önce staging ortamını kullandığınızdan emin olun.
* Ingress Controller Trafiği Yönlendirmiyor:
* kubectl get ingress komutuyla Ingress’inizin durumunu kontrol edin.
* kubectl describe ingress komutunun çıktısını inceleyin. Kuralların doğru servislere işaret ettiğinden emin olun.
* Nginx Ingress Controller pod’unun loglarını kontrol edin: kubectl logs -n ingress-nginx deploy/nginx-ingress-controller-.
* ingressClassName: nginx tanımının doğru olduğundan ve Nginx Ingress Controller’ın bu sınıfı kullandığından emin olun.
* Yanlış ClusterIssuer Kullanımı: Ingress tanımınızdaki cert-manager.io/cluster-issuer annotation’ının, oluşturduğunuz ClusterIssuer‘ın name alanıyla tam olarak eşleştiğinden emin olun.

Gelişmiş Konfigürasyonlar (Kısaca)

Bu rehber temel bir kurulumu kapsasa da, Nginx Ingress ve Cert-Manager daha gelişmiş senaryolar için de kullanılabilir:

Wildcard Sertifikalar (DNS-01 Challenge): .example.com gibi wildcard sertifikalar almak için Cert-Manager’ın DNS-01 challenge yöntemini kullanmanız gerekir. Bu, genellikle DNS sağlayıcınızın API’si ile entegrasyon gerektirir (DigitalOcean DNS için Cert-Manager’ın DigitalOcean DNS webhook’u kullanılabilir).
* Farklı Ingress Controller Seçenekleri: Kubernetes ekosisteminde Nginx dışında Contour, Traefik, HAProxy gibi farklı Ingress Controller’lar da mevcuttur. İhtiyaçlarınıza göre farklı birini seçebilirsiniz.
* GitOps Yaklaşımları: Tüm Kubernetes kaynaklarınızı (Deployment, Service, Ingress, Issuer vb.) Git repolarında tutarak ve Argo CD veya Flux CD gibi araçlarla otomatik olarak senkronize ederek GitOps prensiplerini uygulayabilirsiniz.
* Daha Fazla Ingress Kuralı: Tek bir Ingress kaynağı altında birden fazla host veya yol tabanlı kural tanımlayarak farklı uygulamaları veya aynı uygulamanın farklı bölümlerini yönlendirebilirsiniz.

Sonuç

Bu kapsamlı rehberde, DigitalOcean Kubernetes üzerinde Nginx Ingress Controller ve Cert-Manager’ı başarıyla kurmayı ve yapılandırmayı öğrendiniz. Artık uygulamalarınızı dış dünyaya güvenli ve verimli bir şekilde açabilir, trafiği yönlendirebilir ve Let’s Encrypt ile otomatik olarak SSL/TLS sertifikaları alıp yenileyebilirsiniz. Bu entegrasyon, Kubernetes tabanlı uygulamalarınız için güvenilir, otomatik ve ölçeklenebilir bir trafik yönetimi ve güvenlik altyapısı sağlar.

DigitalOcean Kubernetes’in sunduğu kolaylıklar sayesinde, karmaşık altyapı kurulumları yerine uygulama geliştirmeye odaklanabilir ve modern bulut yerel mimarilerin tüm avantajlarından faydalanabilirsiniz. Bu yetenekler, üretim ortamında çalışan uygulamalar için temel bir gereklilik olup, geliştiricilerin ve operasyon ekiplerinin iş yükünü önemli ölçüde azaltmaktadır. Gelecekte, daha gelişmiş trafik yönetimi ve güvenlik senaryoları için bu temel kurulumun üzerine inşa edebilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.