cert-manager ile Ingress sertifika oluşturulması ve yönetilmesi






Günümüzde, Kubernetes ortamlarında güvenli iletişimi sağlamak için HTTPS kullanımı vazgeçilmezdir. Ancak, sertifika oluşturma, yenileme ve yönetimi gibi süreçler karmaşık ve zaman alıcı olabilir. İşte tam bu noktada, cert-manager imdadımıza yetişiyor!

Bu blog yazısında, Kubernetes ekosisteminin vazgeçilmez araçlarından biri olan cert-manager'ı yakından tanıyacak, ClusterIssuer ve Certificate gibi temel kavramları öğrenecek ve örneklerle nasıl kullanıldıklarını göreceğiz.

Cert-Manager Nedir?

Cert-manager, Kubernetes kümenizdeki sertifika yönetimini otomatikleştiren bir araçtır. Let's Encrypt, HashiCorp Vault, Venafi gibi çeşitli sertifika yetkilileriyle (CA) entegre olarak, TLS/SSL sertifikalarını otomatik olarak talep eder, alır, yeniler ve Kubernetes Secret'leri olarak saklar. Bu sayede, sertifika yaşam döngüsü yönetimiyle ilgili manuel işlemleri ortadan kaldırır ve güvenli iletişimi kolaylaştırır.

Cert-Manager'ın Temel Bileşenleri: ClusterIssuer ve Certificate

Cert-manager'ın işleyişini anlamak için iki önemli kaynağı incelememiz gerekiyor:

  • ClusterIssuer: Küme genelinde geçerli olan bir sertifika yetkilisi yapılandırmasıdır. Let's Encrypt, kendi CA'niz veya diğer desteklenen sağlayıcılar gibi farklı yetkilileri tanımlamanızı sağlar. ClusterIssuer, sertifika taleplerinde kullanılacak yetkiliyi ve kimlik doğrulama bilgilerini içerir.

    • Issuer: ClusterIssuer'dan farklı olarak namespaceler için geçerlidir.
  • Certificate: Belirli bir alan adı (veya adları) için sertifika talebini temsil eden bir kaynaktır. Certificate kaynağı, hangi ClusterIssuer'ın kullanılacağını, sertifikanın geçerlilik süresini, DNS adlarını ve diğer ayarları belirtir. Cert-manager, bu kaynağı izleyerek sertifika talebini oluşturur, yetkiliye gönderir ve alınan sertifikayı bir Kubernetes Secret'i olarak kaydeder.

Cert-Manager ile Sertifika Yönetimi Avantajları

  • Otomasyon: Sertifika oluşturma, yenileme ve güncelleme işlemleri otomatikleşir.
  • Kolaylık: Karmaşık sertifika yönetimi süreçleri basitleşir.
  • Güvenlik: Sertifikaların süresi dolmadan yenilenmesi sağlanarak güvenlik açıkları önlenir.
  • Esneklik: Farklı sertifika yetkilileriyle entegrasyon imkanı sunar.

Sonuç

Cert-manager, Kubernetes ortamlarında sertifika yönetimini kolaylaştıran ve güvenliği artıran güçlü bir araçtır. Bu blog yazısında, cert-manager'ın temel kavramlarını ve nasıl kullanıldığını örneklerle inceledik. Artık siz de Kubernetes kümenizde sertifika yönetimini otomatikleştirebilir ve uygulamalarınızı güvenli bir şekilde yayınlayabilirsiniz.

Ek Bilgiler

Videoda kullanılan kodlar

  • Helm ile cert-manager kurulumu
  • BASH
    
    helm install \
      cert-manager jetstack/cert-manager \
      --namespace cert-manager \
      --create-namespace \
      --version v1.17.0 \
      --set crds.enabled=true
    
        
  • ClusterIssuer ve Certificate objelerinin deploy edilmesi
  • YAML
    
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: selfsigned-cluster-issuer
    spec:
      selfSigned: {}
    ---
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: my-selfsigned-ca
      namespace: cert-manager
    spec:
      isCA: true
      commonName: my-selfsigned-ca
      secretName: root-secret
      privateKey:
        algorithm: ECDSA
        size: 256
      issuerRef:
        name: selfsigned-cluster-issuer
        kind: ClusterIssuer
        group: cert-manager.io
    ---
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: my-ca-issuer
    spec:
      ca:
        secretName: root-secret
    
        
  • Örnek ingress yaml
  • YAML / ingress.yml
    
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: longhorn-ingress
      namespace: longhorn-system
      annotations:
        cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
        cert-manager.io/duration: 24h
        cert-manager.io/subject-organizationalunits: "Longhorn IT Services"
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
          - longhorn.sercangezer.home
        secretName: longhorn-tls
      rules:
      - host: longhorn.sercangezer.home
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: longhorn-frontend
                port:
                  number: 80
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: prometheus-ingress
      namespace: monitoring
      annotations:
        cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
        cert-manager.io/email-sans: "sercangezer.public@gmail.com.tr"
        cert-manager.io/subject-countries: "Türkiye"
        cert-manager.io/subject-localities: "Ankara"
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
          - prometheus.sercangezer.home
        secretName: prometheus-tls
      rules:
      - host: prometheus.sercangezer.home
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kube-prometheus-stack-prometheus
                port:
                  number: 9090
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: grafana-ingress
      namespace: monitoring
      annotations:
        cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
          - grafana.sercangezer.home
        secretName: grafana-tls
      rules:
      - host: grafana.sercangezer.home
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kube-prometheus-stack-grafana
                port:
                  number: 80
    
        
  • Sertifika detaylarını öğrenebileceğimiz komut
  • BASH
    
    kubectl get secret root-secret -n cert-manager -o jsonpath="{.data['tls\.crt']}" | base64 --decode | openssl x509 -noout -text