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