AKS, Istio & CertManager

By | November 27, 2023

Bu makalede AKS üzerinde Istio’yu nasıl enable edeceğinizi ve cert manager entegrasyonunu nasıl yapacağınızı ele alacağım. Tenik içerikli bir makale olacak, şimdiden uyarmış olayım 🙂

Öncelikle bir aks cluster oluşturmak için gerekli olan resource group’u aşağıdaki komutu kullanarak oluşturalım.

az group create --name azureservicemesh --location westeurope

AKS kurulumu için gerekli olan az komutunu aşağıdaki gibi çalıştırabiliriz.

az aks create \
 --location westeurope \
 --name azureservicemesh \
 --resource-group azureservicemesh \
 --network-plugin azure  \
 --kubernetes-version 1.28  \
 --node-vm-size Standard_DS3_v2 \
 --node-count 2 \
 --auto-upgrade-channel rapid \
 --node-os-upgrade-channel  NodeImage \
 --enable-asm

Gerekli kubeconfig dosyasını local config dosyamıza yazmak için aşağıdaki az komutunu çalıştırmamız yeterli olacaktır.

az aks get-credentials \
  --resource-group azureservicemesh \
  --name azureservicemesh \
  --overwrite-existing

AKS kurulumunun ardından sample bir application’ı aşağıdaki definition dosyasını kullanarak deploy edelim.

kubectl apply -f - <<EOF
---
apiVersion: v1
kind: Service
metadata:
  name: echoserver
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    run: echoserver
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver
spec:
  replicas: 1
  selector:
    matchLabels:
      run: echoserver
  template:
    metadata:
      labels:
        run: echoserver
    spec:
      containers:
      - name: echoserver
        image: gcr.io/google_containers/echoserver:1.10
        ports:
        - containerPort: 8080
        readinessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 6
          periodSeconds: 10
        resources:
          requests:
            memory: "40Mi"
            cpu: "20m"
EOF

Uygulama deployment işleminin ardından gerekli olan ingress konfigürasyonu ile devam edebiliriz. Öncelikle istio ile kullanıcak ingress class’ımıza ait objeyi oluşturmamız gerekir. Bu sebeple aşağıdaki definition file’ını cluster’ımız üzerinde apply edebiliriz.

kubectl apply -f - <<EOF
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: istio
spec:
  controller: istio.io/ingress-controller
EOF

Istio’yu helm aracılığı ile deploy etmek için aşağıdaki komutu çalıştırmak yeterli olacaktır. Burada dikkat edilmesi gereken durum my-istio-ingress place holder’ını kendi dns’iniz ile değiştirmeniz gerekmektedir.

kubectl create namespace istio-system
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update
helm install istio-ingressgateway istio/gateway \
  --set revision=asm-1-17 \
  --set service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=my-istio-ingress \
  -n istio-system --wait

Bu işlemin ardından gerekli olan ingress objesini daha önce oluşturmuş olduğunuz ingress class’ı kullanarak oluşturabilirsiniz.

kubectl apply -f - <<EOF
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echoserver
spec:
  ingressClassName: istio
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: echoserver
            port:
              number: 8080
EOF

İşlemlerin tamamlanmasının ardından TLS sertifikası entegrasyonu için certmanager kurulumu yapmanız gerekir. Bu sebeple cluster üzerine öncelikle certmanager deployment’ı yapmamız gerekir. Certmanager kurulumu için aşağıdaki helm komut setini çalıştırmanız yeterli olacaktır.

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm upgrade cert-manager jetstack/cert-manager \
    --install \
    --create-namespace \
    --wait \
    --namespace cert-manager \
    --set installCRDs=true

Kurulum ardından otomatik sertifika issue edilmesi için gerekli olan bir kaç konfigürasyon adımını aşağıdaki definition’ları apply ederek yapabilirsiniz.

Replace example.com with a valid email
kubectl apply -f - <<EOF
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    email: example@example.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-prod-issuer-account-key
    solvers:
      - http01:
          ingress:
            class: istio
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: echoserver-tls-secret
  namespace: istio-system
spec:
  dnsNames:
  - my-istio-ingress.eastus.cloudapp.azure.com
  issuerRef:
    group: cert-manager.io
    kind: ClusterIssuer
    name: letsencrypt-prod
  secretName: echoserver-tls-secret
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echoserver
spec:
  ingressClassName: istio
  tls:
    - hosts:
        - my-istio-ingress.eastus.cloudapp.azure.com
      secretName: echoserver-tls-secret
  rules:
  - host: my-istio-ingress.eastus.cloudapp.azure.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: echoserver
            port:
              number: 8080
EOF

  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod

Klasik olarak istio gateway entegrasyonunu bu şekilde yapabilirsiniz. addon olarak aks üzerine ekleme işlemini diğer makalede anlatacağım.

Fırat

Leave a Reply

Your email address will not be published. Required fields are marked *