100 adet ileri seviye soru ve cevapla hazırlanmış kapsamlı arşiv
Kubernetes mimarisinin temel bileşenleri ve çalışma prensipleri
20 Soru
Pod ve container yönetimi, lifecycle ve yapılandırma
15 Soru
Uygulama dağıtımı, güncelleme stratejileri ve stateful uygulamalar
15 Soru
Kubernetes'de servisler, ağ iletişimi ve trafik yönetimi
15 Soru
Yapılandırma yönetimi ve hassas verilerin depolanması
10 Soru
Kalıcı veri depolama ve volume yönetimi
10 Soru
Kubernetes uygulamalarını paketleme ve yönetme
5 Soru
Kubernetes cluster'ını izleme ve log yönetimi
5 Soru
Kubernetes ortamında güvenlik önlemleri ve best practices
5 Soru
Kubernetes kullanımında ipuçları ve en iyi uygulamalar
5 Soru
Kubernetes mimarisinin temel bileşenleri ve çalışma prensipleri ile ilgili sorular ve cevaplar.
Cevap: Kubernetes, container'lı uygulamaları otomatikleştirmek, ölçeklendirmek ve yönetmek için kullanılan açık kaynaklı bir container orkestrasyon sistemidir.
Cevap: Kubernetes mimarisi Control Plane (Master) ve Worker (Node) bileşenlerinden oluşur.
Cevap: Kubernetes cluster'ı oluşturmak için farklı yöntemler kullanılabilir:
kubeadm ile cluster oluşturma örneği:
# Master node'da sudo kubeadm init --pod-network-cidr=10.244.0.0/16 # Worker node'ları master'a bağlamak için sudo kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash <hash>
Cevap: kubectl, Kubernetes cluster'ı ile etkileşim kurmak için kullanılan komut satırı aracıdır.
Temel kubectl komutları:
# Cluster bilgilerini görüntüleme kubectl cluster-info # Node'ları listeleme kubectl get nodes # Pod'ları listeleme kubectl get pods # Bir YAML dosyasından kaynak oluşturma kubectl create -f <dosya-adı>.yaml # Bir deployment oluşturma kubectl create deployment <deployment-adı> --image=<image-adı> # Pod loglarını görüntüleme kubectl logs <pod-adı> # Pod içinde komut çalıştırma kubectl exec -it <pod-adı> -- <komut> # Bir kaynağı silme kubectl delete deployment <deployment-adı>
Cevap: Namespace, aynı fiziksel cluster'da kaynakları mantıksal olarak ayırmak için kullanılan bir mekanizmadır.
Namespace oluşturma ve kullanma:
# Namespace oluşturma kubectl create namespace <namespace-adı> # Namespace içinde kaynak oluşturma kubectl create deployment <deployment-adı> --image=<image-adı> -n <namespace-adı> # Tüm namespace'leri listeleme kubectl get namespaces # Belirli bir namespace'deki kaynakları listeleme kubectl get pods -n <namespace-adı>
Cevap: Label, Kubernetes nesnelerine eklenen key-value çiftleridir. Selector ise bu label'lara göre nesneleri filtrelemek için kullanılır.
Örnek kullanım:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
tier: frontend
spec:
containers:
- name: my-container
image: nginx
Selector ile Pod'ları seçme:
# app=my-app label'ına sahip pod'ları listele kubectl get pods -l app=my-app # tier=frontend ve app=my-app label'larına sahip pod'ları listele kubectl get pods -l tier=frontend,app=my-app
Cevap: Annotation, Kubernetes nesnelerine eklenen metadata'dır. Label'dan farkı, selector ile kullanılamaması ve genellikle daha büyük veriler için kullanılmasıdır.
Örnek kullanım:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
annotations:
example.com/owner: "team-a"
example.com/created-by: "john.doe"
labels:
app: my-app
tier: frontend
spec:
containers:
- name: my-container
image: nginx
Cevap: etcd, Kubernetes cluster'ının durumunu saklayan dağıtık bir anahtar-değer deposudur.
etcd'yi yedekleme:
# etcd snapshot oluşturma ETCDCTL_API=3 etcdctl --endpoints=<etcd-ip>:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /tmp/etcd-snapshot.db
Cevap: Kubernetes API Server, cluster'ın tüm operasyonları için merkezi yönetim noktasıdır.
Cevap: Controller Manager, cluster durumunu denetleyen denetleyicileri çalıştıran bileşendir.
Cevap: Kubernetes Scheduler, yeni oluşturulan Pod'ları çalıştırmak için uygun Node'ları seçen bileşendir.
Cevap: Kubelet, her Node'da çalışan ve Node'daki container'ları yöneten bileşendir.
Cevap: Kube-proxy, her Node'da çalışan ve ağ kurallarını ve yük dengelemeyi yöneten bileşendir.
Cevap: RBAC (Role-Based Access Control), Kubernetes'te kullanıcıların ve servis hesaplarının yetkilendirilmesini sağlayan bir mekanizmadır.
RBAC örneği:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods namespace: default subjects: - kind: User name: jane apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
Cevap: ServiceAccount, Pod'ların Kubernetes API'sine erişmek için kullandığı bir hesaptır.
ServiceAccount oluşturma:
# ServiceAccount oluşturma kubectl create serviceaccount <serviceaccount-adı> # ServiceAccount listeleme kubectl get serviceaccounts # ServiceAccount detaylarını görüntüleme kubectl describe serviceaccount <serviceaccount-adı>
Cevap: Kubernetes Context, farklı cluster'lara ve namespace'lere erişim için kullanılan yapılandırmalardır.
Context yönetimi:
# Mevcut context'i görüntüleme kubectl config current-context # Tüm context'leri listeleme kubectl config get-contexts # Context değiştirme kubectl config use-context <context-adı> # Yeni context oluşturma kubectl config set-context <context-adı> --cluster=<cluster-adı> --user=<kullanıcı-adı> --namespace=<namespace-adı>
Cevap: kubeconfig dosyası, cluster'lara erişim için gerekli bilgileri içeren bir yapılandırma dosyasıdır.
Cevap: Taint, Node'lara uygulanan ve Pod'ların bu Node'larda çalışmasını kısıtlayan bir özelliktir. Tolerance ise Pod'ların Taint'leri tolere etmesini sağlayan bir özelliktir.
Taint ve Tolerance örneği:
# Node'a taint ekleme
kubectl taint nodes <node-adı> key=value:NoSchedule
# Pod'a tolerance ekleme
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
Cevap: Node Affinity, Pod'ların belirli Node'larda çalışmasını sağlayan bir kuraldır. Anti-Affinity ise Pod'ların belirli Node'larda çalışmamasını sağlayan bir kuraldır.
Node Affinity örneği:
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0
Cevap: Resource Quota, bir namespace içindeki kaynakların kullanımını sınırlayan bir nesnedir. Limit Range ise Pod ve Container'ların kaynak kullanımını sınırlayan bir nesnedir.
Resource Quota örneği:
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: my-namespace
spec:
hard:
pods: "10"
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "10"
limits.memory: 16Gi
Limit Range örneği:
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-memory-limit-range
namespace: my-namespace
spec:
limits:
- default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 128Mi
max:
cpu: "1"
memory: 1Gi
min:
cpu: 50m
memory: 64Mi
type: Container
Pod ve container yönetimi, lifecycle ve yapılandırma ile ilgili sorular ve cevaplar.
Cevap: Pod, Kubernetes'te dağıtım ve yönetim için en küçük birimidir. Bir veya daha fazla container'ı içerebilir.
Pod oluşturma örneği:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx-container
image: nginx:1.14.2
ports:
- containerPort: 80
Cevap: Bir Pod içinde birden fazla container kullanmanın çeşitli nedenleri vardır:
Multi-container Pod örneği:
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: app-container
image: my-app:1.0
ports:
- containerPort: 8080
- name: log-collector
image: fluentd:latest
volumeMounts:
- name: log-volume
mountPath: /var/log
volumes:
- name: log-volume
emptyDir: {}
Cevap: Kubernetes'te Pod'ların yaşam döngüsü şu aşamalardan oluşur:
Pod durumlarını görüntüleme:
# Pod durumlarını listeleme kubectl get pods # Pod detaylarını görüntüleme kubectl describe pod <pod-adı> # Pod durumunu izleme kubectl get pods -w
Cevap: Container Restart Policy, container'lar hata verdiğinde ne yapılacağını belirler.
Restart Policy örneği:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app:1.0
restartPolicy: OnFailure
Cevap: Init Container, ana container'lar başlamadan önce çalışan özel container'lardır.
Init Container örneği:
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
spec:
containers:
- name: my-app-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
Cevap: Kubernetes'te Pod'lara ve container'lara kaynak limitleri (CPU, memory) atamak için resources bölümü kullanılır.
Kaynak limitleri örneği:
apiVersion: v1
kind: Pod
metadata:
name: resource-pod
spec:
containers:
- name: resource-container
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Cevap: Liveness ve Readiness Probe, Kubernetes'in container'ların durumunu kontrol etmek için kullandığı mekanizmalardır.
Probe örneği:
apiVersion: v1
kind: Pod
metadata:
name: probe-pod
spec:
containers:
- name: probe-container
image: nginx
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
Cevap: Kubernetes'te Pod'lara ortam değişkenleri atamak için çeşitli yöntemler kullanılır.
Ortam değişkenleri örneği:
apiVersion: v1
kind: Pod
metadata:
name: env-pod
spec:
containers:
- name: env-container
image: nginx
env:
- name: DATABASE_URL
value: "postgresql://db:5432/mydb"
- name: API_KEY
valueFrom:
secretKeyRef:
name: api-secret
key: api-key
Cevap: Kubernetes'te Pod loglarını görüntülemek için kubectl logs komutu kullanılır.
Log görüntüleme komutları:
# Pod loglarını görüntüleme kubectl logs <pod-adı> # Pod loglarını takip etme kubectl logs -f <pod-adı> # Multi-container Pod'da belirli bir container'ın loglarını görüntüleme kubectl logs <pod-adı> -c <container-adı> # Önceki container'ın loglarını görüntüleme kubectl logs <pod-adı> --previous # Son 100 satırı görüntüleme kubectl logs --tail=100 <pod-adı> # Belirli bir zamandan sonraki logları görüntüleme kubectl logs --since=1h <pod-adı>
Cevap: Kubernetes'te Pod'larda hata ayıklama için çeşitli yöntemler kullanılır.
Hata ayıklama komutları:
# Pod detaylarını görüntüleme kubectl describe pod <pod-adı> # Pod içinde shell çalıştırma kubectl exec -it <pod-adı> -- /bin/bash # Yerel makineden Pod'a port yönlendirme kubectl port-forward <pod-adı> <local-port>:<pod-port> # Cluster olaylarını görüntüleme kubectl get events --sort-by=.metadata.creationTimestamp
Cevap: Kubernetes'te Pod'lara Volume bağlamak için volumes ve volumeMounts bölümleri kullanılır.
Volume bağlama örneği:
apiVersion: v1
kind: Pod
metadata:
name: volume-pod
spec:
containers:
- name: volume-container
image: nginx
volumeMounts:
- name: html-volume
mountPath: /usr/share/nginx/html
volumes:
- name: html-volume
emptyDir: {}
Cevap: Kubernetes'te Pod'lara ve container'lara güvenlik bağlamı atamak için securityContext bölümü kullanılır.
Güvenlik bağlamı örneği:
apiVersion: v1
kind: Pod
metadata:
name: security-context-pod
spec:
securityContext:
fsGroup: 2000
containers:
- name: security-context-container
image: nginx
securityContext:
runAsUser: 1000
runAsGroup: 3000
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
Cevap: Kubernetes'te Pod'lara kaynak kotası atamak için ResourceQuota nesnesi kullanılır.
Resource Quota örneği:
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: my-namespace
spec:
hard:
pods: "10"
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "10"
limits.memory: 16Gi
persistentvolumeclaims: "5"
Cevap: Kubernetes'te Pod'lara ağ politikası uygulamak için NetworkPolicy nesnesi kullanılır.
Network Policy örneği:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
Cevap: Kubernetes'te Pod'lara pod disruption budget (PDB) uygulamak için PodDisruptionBudget nesnesi kullanılır.
Pod Disruption Budget örneği:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: zookeeper
Uygulama dağıtımı, güncelleme stratejileri ve stateful uygulamalar ile ilgili sorular ve cevaplar.
Cevap: Deployment, Kubernetes'te Pod'ları ve ReplicaSet'leri yönetmek için kullanılan bir nesnedir.
Deployment oluşturma örneği:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Cevap: ReplicaSet, Kubernetes'te Pod'ların istenen sayıda çalışmasını sağlayan bir denetleyicidir. Deployment, ReplicaSet'leri yönetir.
Cevap: Kubernetes'te Deployment güncelleme stratejileri şunlardır:
Güncelleme stratejisi örneği:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
# ...
Cevap: Kubernetes'te Deployment geri almak için kubectl rollout undo komutu kullanılır.
Geri alma komutları:
# Deployment geçmişini görüntüleme kubectl rollout history deployment/<deployment-adı> # Deployment'ı önceki sürüme geri alma kubectl rollout undo deployment/<deployment-adı> # Deployment'ı belirli bir revizyona geri alma kubectl rollout undo deployment/<deployment-adı> --to-revision=<revizyon-numarası>
Cevap: StatefulSet, durumlu (stateful) uygulamaları yönetmek için kullanılan bir nesnedir. Deployment'dan farkları şunlardır:
Cevap: Headless Service, StatefulSet Pod'ları için ağ kimliği sağlayan bir Service türüdür.
Headless Service örneği:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
Cevap: Volume Claim Template, StatefulSet'teki her Pod için ayrı bir PersistentVolumeClaim oluşturan bir şablondur.
Volume Claim Template örneği:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Cevap: DaemonSet, her Node'da (veya belirli Node'larda) bir Pod çalıştıran bir nesnedir.
DaemonSet örneği:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
Cevap: Job, Kubernetes'te bir veya daha fazla Pod oluşturan ve bu Pod'ların başarıyla tamamlanmasını sağlayan bir nesnedir.
Job örneği:
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
Cevap: CronJob, Kubernetes'te zamanlanmış Job'lar oluşturan bir nesnedir.
CronJob örneği:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
Cevap: Kubernetes'te Deployment durumunu kontrol etmek için çeşitli komutlar kullanılır.
Durum kontrol komutları:
# Deployment durumunu görüntüleme kubectl rollout status deployment/<deployment-adı> # Deployment detaylarını görüntüleme kubectl describe deployment <deployment-adı> # Deployment geçmişini görüntüleme kubectl rollout history deployment/<deployment-adı> # Deployment revizyon detaylarını görüntüleme kubectl rollout history deployment/<deployment-adı> --revision=<revizyon-numarası>
Cevap: Kubernetes'te Deployment güncellemesini durdurmak için kubectl rollout pause komutu kullanılır.
Güncelleme durdurma komutları:
# Deployment güncellemesini durdurma kubectl rollout pause deployment/<deployment-adı> # Deployment güncellemesini devam ettirme kubectl rollout resume deployment/<deployment-adı>
Cevap: Kubernetes'te Deployment ölçeğini ayarlamak için kubectl scale komutu veya YAML dosyası kullanılır.
Ölçeklendirme komutları:
# Deployment ölçeğini ayarlama kubectl scale deployment <deployment-adı> --replicas=<replica-sayısı> # Otomatik ölçeklendirme (Horizontal Pod Autoscaler) oluşturma kubectl autoscale deployment <deployment-adı> --min=<minimum-replica> --max=<maksimum-replica> --cpu-percent=<cpu-yüzdesi>
Cevap: Kubernetes'te StatefulSet ölçeğini ayarlamak için kubectl scale komutu kullanılır.
Ölçeklendirme komutları:
# StatefulSet ölçeğini ayarlama kubectl scale statefulset <statefulset-adı> --replicas=<replica-sayısı> # StatefulSet ölçeğini artırma (sıralı olarak) kubectl scale statefulset <statefulset-adı> --replicas=<replica-sayısı> --current-replicas=<mevcut-replica-sayısı>
Cevap: Deployment ve StatefulSet arasında seçim yaparken şu faktörler dikkate alınmalıdır:
Kubernetes'de servisler, ağ iletişimi ve trafik yönetimi ile ilgili sorular ve cevaplar.
Cevap: Kubernetes'te Service, bir grup Pod'a ağ erişimi sağlayan bir nesnedir.
Service oluşturma örneği:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
Cevap: Kubernetes'te Service türleri şunlardır:
Cevap: ClusterIP Service, Kubernetes cluster'ı içinden erişilebilen bir IP adresi sağlar.
ClusterIP Service örneği:
apiVersion: v1
kind: Service
metadata:
name: my-internal-service
spec:
type: ClusterIP
selector:
app: my-app
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
Cevap: NodePort Service, her Node'un aynı portunu dışarıya açarak dışarıdan erişim sağlar.
NodePort Service örneği:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
nodePort: 30007
Cevap: LoadBalancer Service, bulut sağlayıcının load balancer'ını kullanarak dışarıdan erişim sağlar.
LoadBalancer Service örneği:
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
Cevap: ExternalName Service, dış bir servisin CNAME kaydını döndüren bir Service türüdür.
ExternalName Service örneği:
apiVersion: v1 kind: Service metadata: name: my-database-service spec: type: ExternalName externalName: my-database.example.com
Cevap: Kubernetes'te Ingress, cluster dışından HTTP ve HTTPS trafiğini cluster içine yönlendiren bir nesnedir.
Ingress örneği:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
Cevap: Kubernetes'te Ingress Controller, Ingress kaynaklarını uygulayan ve gelen trafiği yönlendiren bir bileşendir.
Nginx Ingress Controller kurulumu:
# Nginx Ingress Controller kurulumu kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
Cevap: Kubernetes'te Network Policy, Pod'lar arasındaki ağ trafiğini kontrol eden bir nesnedir.
Network Policy örneği:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
egress:
- to:
- podSelector:
matchLabels:
role: backend
Cevap: Kubernetes'te Headless Service, clusterIP'si olmayan ve doğrudan Pod'lara DNS sorguları yapılmasını sağlayan bir Service türüdür.
Headless Service örneği:
apiVersion: v1
kind: Service
metadata:
name: my-headless-service
spec:
clusterIP: None
selector:
app: my-app
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
Cevap: Kubernetes'te Service discovery, DNS ve environment variables kullanılarak çalışır.
Service discovery örneği:
# Service DNS sorgusu nslookup my-service.default.svc.cluster.local # Pod içinde environment variables görüntüleme kubectl exec -it <pod-adı> -- env | grep SERVICE
Cevap: Kubernetes'te EndpointSlice, bir Service'in arkasındaki Pod'ların IP adreslerini ve portlarını içeren bir nesnedir.
Cevap: Kubernetes'te Ingress için SSL/TLS yapılandırmak için Secret nesneleri kullanılır.
SSL/TLS yapılandırma örneği:
# TLS Secret oluşturma kubectl create secret tls my-tls-secret --key my-tls.key --cert my-tls.crt
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
tls:
- hosts:
- my-app.example.com
secretName: my-tls-secret
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
Cevap: Kubernetes'te Service için Session Affinity, bir istemcinin tüm isteklerini aynı Pod'a yönlendirmek için kullanılır.
Session Affinity örneği:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 9376
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 3600
Cevap: Kubernetes'te Ingress için path-based routing, farklı URL yollarını farklı servislere yönlendirmek için kullanılır.
Path-based routing örneği:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: path-routing-ingress
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Yapılandırma yönetimi ve hassas verilerin depolanması ile ilgili sorular ve cevaplar.
Cevap: Kubernetes'te ConfigMap, yapılandırma verilerini (örneğin, ortam değişkenleri, yapılandırma dosyaları) depolamak için kullanılan bir nesnedir.
ConfigMap oluşturma örneği:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
# key-value çiftleri olarak özellikler
database_url: "postgresql://db:5432/mydb"
# yapılandırma dosyası olarak
application.properties: |
server.port=8080
spring.datasource.url=jdbc:postgresql://db:5432/mydb
Cevap: Kubernetes'te Secret, hassas verileri (şifreler, API anahtarları, token'lar) depolamak için kullanılan bir nesnedir.
Secret oluşturma örneği:
apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: # base64 ile kodlanmış değerler username: YWRtaW4= # admin password: MWYyZDFlMmU2N2Rm # 1f2d1e2e67df
Cevap: Kubernetes'te ConfigMap ve Secret'ler farklı şekillerde oluşturulabilir.
YAML dosyası ile oluşturma:
# ConfigMap oluşturma kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2 # Dosyadan ConfigMap oluşturma kubectl create configmap my-config --from-file=path/to/config-file # Secret oluşturma kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secret # Dosyadan Secret oluşturma kubectl create secret generic my-secret --from-file=path/to/secret-file
Cevap: Kubernetes'te ConfigMap ve Secret'lar Pod'lara ortam değişkenleri veya volume olarak bağlanabilir.
Ortam değişkeni olarak kullanma:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: my-config
key: database_url
- name: PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
Volume olarak kullanma:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
volumeMounts:
- name: config-volume
mountPath: /etc/config
- name: secret-volume
mountPath: /etc/secret
volumes:
- name: config-volume
configMap:
name: my-config
- name: secret-volume
secret:
secretName: my-secret
Cevap: Kubernetes'te ConfigMap ve Secret'lar güncellendiğinde, bu değişikliklerin Pod'lara yansıması bağlama yöntemine bağlıdır.
ConfigMap güncelleme komutları:
# ConfigMap güncelleme kubectl edit configmap <configmap-adı> # ConfigMap'i dosyadan güncelleme kubectl create configmap <configmap-adı> --from-file=path/to/config-file --dry-run=client -o yaml | kubectl apply -f - # Secret güncelleme kubectl edit secret <secret-adı>
Cevap: Kubernetes'te farklı kullanım amaçları için çeşitli Secret türleri vardır.
Docker registry Secret örneği:
apiVersion: v1 kind: Secret metadata: name: registry-secret type: kubernetes.io/dockerconfigjson data: .dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5leGFtcGxlLmNvbSI6eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJwYXNzd29yZCIsImF1dGgiOiJjbUZqYjI1MFpXNTBhV1Y1UFNKT2FtTnZkWE5rTnpJPSJ9fX0=
Cevap: Kubernetes'te ConfigMap ve Secret'lar için Immutable seçeneği, bu nesnelerin değiştirilemez olmasını sağlar.
Immutable ConfigMap örneği:
apiVersion: v1 kind: ConfigMap metadata: name: my-immutable-config immutable: true data: key1: value1 key2: value2
Cevap: Kubernetes'te envFrom, ConfigMap veya Secret'teki tüm key-value çiftlerini ortam değişkenleri olarak Pod'a eklemek için kullanılır.
envFrom kullanımı örneği:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
envFrom:
- configMapRef:
name: my-config
- secretRef:
name: my-secret
- prefix: CONFIG_
configMapRef:
name: my-config-with-prefix
Cevap: Kubernetes'te subPath, ConfigMap veya Secret'teki tek bir dosyayı Pod'daki belirli bir yola bağlamak için kullanılır.
subPath kullanımı örneği:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
volumeMounts:
- name: config-volume
mountPath: /etc/config/my-config-file
subPath: my-config-file
volumes:
- name: config-volume
configMap:
name: my-config
items:
- key: my-config-file
path: my-config-file
Cevap: Kubernetes'te ConfigMap ve Secret'lar için en iyi güvenlik uygulamaları şunlardır:
Kalıcı veri depolama ve volume yönetimi ile ilgili sorular ve cevaplar.
Cevap: Kubernetes'te PersistentVolume (PV), cluster yöneticisi tarafından sağlanan bir depolama kaynağıdır.
PersistentVolume oluşturma örneği:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
Cevap: Kubernetes'te PersistentVolumeClaim (PVC), kullanıcıların depolama taleplerini belirtmek için kullandığı bir nesnedir.
PersistentVolumeClaim oluşturma örneği:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi
storageClassName: slow
Cevap: Kubernetes'te StorageClass, depolama kaynaklarının dinamik provision edilmesini sağlayan bir nesnedir.
StorageClass oluşturma örneği:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/aws-ebs parameters: type: gp2 replicationtype: "regional" reclaimPolicy: Retain allowVolumeExpansion: true mountOptions: - debug volumeBindingMode: Immediate
Cevap: Kubernetes'te PersistentVolume erişim modları, bir PV'ye nasıl erişilebileceğini belirler.
Cevap: Kubernetes'te PersistentVolume geri kazanım politikaları, PVC silindiğinde PV'ye ne olacağını belirler.
Cevap: Kubernetes'te farklı kullanım amaçları için çeşitli volume türleri vardır.
Cevap: Kubernetes'te Volume'ler Pod'lara volumes ve volumeMounts bölümleri kullanılarak bağlanır.
Volume bağlama örneği:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
volumeMounts:
- name: my-persistent-storage
mountPath: /data
- name: my-config-volume
mountPath: /etc/config
volumes:
- name: my-persistent-storage
persistentVolumeClaim:
claimName: my-pvc
- name: my-config-volume
configMap:
name: my-config
Cevap: Kubernetes'te StatefulSet'ler için Volume Claim Template, StatefulSet'teki her Pod için ayrı bir PersistentVolumeClaim oluşturan bir şablondur.
Volume Claim Template örneği:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Cevap: Kubernetes'te PersistentVolume'ları izlemek ve yönetmek için çeşitli komutlar kullanılır.
PersistentVolume yönetimi komutları:
# PersistentVolume'ları listeleme kubectl get pv # PersistentVolume detaylarını görüntüleme kubectl describe pv <pv-adı> # PersistentVolumeClaim'leri listeleme kubectl get pvc # PersistentVolumeClaim detaylarını görüntüleme kubectl describe pvc <pvc-adı> # StorageClass'ları listeleme kubectl get sc # StorageClass detaylarını görüntüleme kubectl describe sc <storageclass-adı> # PVC'yi PV ile eşleştirme durumunu kontrol etme kubectl get pv,pvc -o wide
Cevap: Kubernetes'te PersistentVolume boyutunu genişletmek için StorageClass ve PVC güncellemesi yapılır.
PVC boyutunu genişletme örneği:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-expandable-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi # Önceki değer 10Gi idi, 20Gi'ye çıkarıldı
storageClassName: expandable-storage
Kubernetes uygulamalarını paketleme ve yönetme ile ilgili sorular ve cevaplar.
Cevap: Helm, Kubernetes uygulamalarını paketlemek, yapılandırmak ve dağıtmak için kullanılan bir paket yöneticisidir.
Cevap: Helm Chart'ı, Kubernetes uygulamalarını paketlemek için kullanılan dosya koleksiyonudur.
Chart.yaml örneği:
apiVersion: v2
name: my-chart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.0.0"
keywords:
- my-app
- kubernetes
home: https://my-app.example.com
sources:
- https://github.com/my-org/my-app
maintainers:
- name: John Doe
email: john@example.com
Cevap: Helm 2 ve Helm 3 arasında önemli farklar vardır:
Cevap: Helm ile Chart oluşturmak ve paketlemek için şu adımlar izlenir:
Chart oluşturma:
# Yeni bir Chart oluşturma helm create my-chart # Mevcut bir dizinden Chart oluşturma helm create .
Chart paketleme:
# Chart'ı paketleme helm package my-chart # Chart'ı belirli bir dizine paketleme helm package my-chart -d /path/to/directory # Chart'ı imzlayarak paketleme helm package --sign --key keyname --keyring path/to/keyring my-chart
Cevap: Helm ile Chart'ları kurmak ve yönetmek için çeşitli komutlar kullanılır.
Chart kurulumu ve yönetimi:
# Depo ekleme helm repo add stable https://charts.helm.sh/stable # Depo güncelleme helm repo update # Chart kurulumu helm install my-release stable/nginx-ingress # Varsayılan değerleri özelleştirerek kurulum helm install my-release -f values.yaml stable/nginx-ingress # Sürüm yükseltme helm upgrade my-release stable/nginx-ingress # Sürüm geçmişi helm history my-release # Sürümü önceki bir sürüme geri alma helm rollback my-release 1 # Sürümü kaldırma helm uninstall my-release # Kurulu sürümleri listeleme helm list # Tüm sürümleri listeleme helm list --all
Kubernetes cluster'ını izleme ve log yönetimi ile ilgili sorular ve cevaplar.
Cevap: Kubernetes'te monitoring için çeşitli araçlar kullanılır:
Cevap: Kubernetes'te logging için çeşitli araçlar kullanılır:
Cevap: Kubernetes'te Prometheus kurulumu ve yapılandırması şu şekildedir:
Prometheus kurulumu:
# Helm kullanarak Prometheus kurulumu helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install prometheus prometheus-community/kube-prometheus-stack # Manuel kurulum için YAML dosyaları kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml
Prometheus yapılandırması:
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
namespace: monitoring
spec:
serviceMonitorSelector:
matchLabels:
team: frontend
resources:
requests:
memory: 400Mi
enableAdminAPI: false
Cevap: Kubernetes'te ServiceMonitor, Prometheus'un hangi servisleri izleyeceğini belirten bir nesnedir.
ServiceMonitor örneği:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-app-monitor
namespace: monitoring
labels:
app: my-app
spec:
selector:
matchLabels:
app: my-app
endpoints:
- port: web
interval: 30s
path: /metrics
Cevap: Kubernetes'te log toplama için çeşitli yöntemler kullanılır:
Fluentd DaemonSet ile log toplama örneği:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: logging
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd:v1.16-1
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
Kubernetes ortamında güvenlik önlemleri ve best practices ile ilgili sorular ve cevaplar.
Cevap: Kubernetes'te güvenlik için en iyi uygulamalar şunlardır:
Cevap: Kubernetes'te Pod Security Policy (PSP), Pod'ların oluşturulmasında güvenlik kısıtlamaları getiren bir nesnedir.
Pod Security Policy örneği:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
- 'persistentVolumeClaim'
runAsUser:
rule: 'MustRunAsNonRoot'
seLinux:
rule: 'RunAsAny'
fsGroup:
rule: 'RunAsAny'
Cevap: Kubernetes'te Pod Security Admission, Pod'ların oluşturulmasında güvenlik standartlarını zorunlu kılan bir admission controller'dır.
Pod Security Admission yapılandırma örneği:
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/enforce-version: v1.25
pod-security.kubernetes.io/audit: baseline
pod-security.kubernetes.io/audit-version: v1.25
pod-security.kubernetes.io/warn: privileged
pod-security.kubernetes.io/warn-version: v1.25
Cevap: Kubernetes'te Network Policy, Pod'lar arasındaki ağ trafiğini kontrol eden bir nesnedir.
Network Policy örneği:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 5432
egress:
- to:
- podSelector:
matchLabels:
role: backup
ports:
- protocol: TCP
port: 80
Cevap: Kubernetes'te container image güvenliği sağlamak için şu yöntemler kullanılır:
ImagePolicyWebhook örneği:
apiVersion: v1
kind: ValidatingWebhookConfiguration
metadata:
name: image-policy-webhook
webhooks:
- name: image-policy.example.com
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["pods"]
scope: "Namespaced"
clientConfig:
service:
name: image-policy-service
namespace: image-policy
path: "/validate"
admissionReviewVersions: ["v1", "v1beta1"]
timeoutSeconds: 5
Kubernetes kullanımında ipuçları ve en iyi uygulamalar ile ilgili sorular ve cevaplar.
Cevap: Kubernetes'te kaynak optimizasyonu için en iyi uygulamalar şunlardır:
Cevap: Kubernetes'te performans optimizasyonu için en iyi uygulamalar şunlardır:
Cevap: Kubernetes'te hata ayıklama için en iyi uygulamalar şunlardır:
Cevap: Kubernetes'te yüksek erişilebilirlik için en iyi uygulamalar şunlardır:
Cevap: Kubernetes'te maliyet optimizasyonu için en iyi uygulamalar şunlardır: