ElasticSearch, Docker ve Kubernetes konularında hazırlanmış kapsamlı soru-cevap arşivi
30 adet ileri seviye ElasticSearch sorusu ve cevabı
25 adet ileri seviye Docker sorusu ve cevabı
25 adet ileri seviye Kubernetes sorusu ve cevabı
Senior Java/Spring Boot Developer ve DevOps rollerine yönelik ileri seviye ElasticSearch mülakat soruları ve cevapları.
ElasticSearch, dağıtık, full-text search ve analiz motorudur. Büyük veri üzerinde hızlı arama, filtreleme ve analiz yapmayı sağlar.
Index, ilişkisel veritabanındaki "database" gibidir. Belgeler (documents) burada saklanır.
Yeni index oluşturma:
curl -X PUT "localhost:9200/products" -H 'Content-Type: application/json' -d'
{
"settings": { "number_of_shards": 3, "number_of_replicas": 2 },
"mappings": { "properties": { "name": { "type": "text" } } }
}'
Index detaylarını görmek:
curl -X GET "localhost:9200/products/_settings?pretty"
text field)keyword field)Örnek:
curl -X GET "localhost:9200/products/_search" -H 'Content-Type: application/json' -d'
{
"query": { "match": { "name": "laptop" } }
}'
Mapping, field tiplerini ve analiz biçimlerini tanımlar. Yanlış mapping performans sorunlarına yol açar.
Örnek:
curl -X PUT "localhost:9200/users" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"username": { "type": "keyword" },
"bio": { "type": "text" }
}
}
}'
Analyzer, metni tokenize eder.
Analyzer test:
curl -X GET "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{ "analyzer": "standard", "text": "Spring Boot Developer" }'
Wildcard (*) kullanmak, tüm index'i tarar ve maliyetlidir. Büyük veri setlerinde slow query sorunlarına yol açar. Alternatif: prefix query veya n-gram analyzer.
Çok sayıda document insert/update işlemini tek istekte yapmaya yarar.
Bulk insert:
curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' -d'
{ "index": { "_index": "products", "_id": "1" } }
{ "name": "Laptop", "price": 1200 }
{ "index": { "_index": "products", "_id": "2" } }
{ "name": "Phone", "price": 800 }
'
ElasticSearch NoSQL tabanlıdır, join işlemleri yoktur. Alternatif:
Cluster sağlığını görmek için:
curl -X GET "localhost:9200/_cluster/health?pretty"
Durumlar:
Snapshot, index/cluster backup yöntemidir.
Snapshot repo oluşturma:
curl -X PUT "localhost:9200/_snapshot/my_backup" -H 'Content-Type: application/json' -d'
{ "type": "fs", "settings": { "location": "/mount/backups" } }'
Index için shard ayarı:
curl -X PUT "localhost:9200/products/_settings" -H 'Content-Type: application/json' -d'
{ "index": { "number_of_replicas": 3 } }'
Örnek:
{
"query": {
"bool": {
"must": { "match": { "name": "laptop" } },
"filter": { "term": { "price": 1200 } }
}
}
}
_cat APICluster node listesi:
curl -X GET "localhost:9200/_cat/nodes?v"
Index'lerin yaşlanma politikaları ile otomatik silinmesini, taşınmasını sağlar.
Tek node ElasticSearch:
docker run -d --name es01 -p 9200:9200 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:8.14.3
K8s manifest örneği:
apiVersion: apps/v1
kind: Deployment
metadata:
name: elasticsearch
spec:
replicas: 1
selector:
matchLabels: { app: elasticsearch }
template:
metadata:
labels: { app: elasticsearch }
spec:
containers:
- name: es
image: docker.elastic.co/elasticsearch/elasticsearch:8.14.3
ports:
- containerPort: 9200
env:
- name: discovery.type
value: single-node
Varsayılan olarak 1s. Her 1 saniyede bir index verileri search için görünür olur.
Ayarlamak:
curl -X PUT "localhost:9200/products/_settings" -H 'Content-Type: application/json' -d'
{ "index": { "refresh_interval": "30s" } }'
SQL GROUP BY benzeri, veri üzerinde toplu analiz yapılmasını sağlar.
Ortalama fiyat:
{
"aggs": { "avg_price": { "avg": { "field": "price" } } }
}
ElasticSearch Java tabanlıdır. JVM heap belleği index performansını doğrudan etkiler.
jvm.options dosyasında:
-Xms8g -Xmx8g
Profile API:
curl -X GET "localhost:9200/products/_search" -H 'Content-Type: application/json' -d'
{ "profile": true, "query": { "match": { "name": "laptop" } } }'
Bir index'ten diğerine veri kopyalar.
Örnek:
curl -X POST "localhost:9200/_reindex" -H 'Content-Type: application/json' -d'
{ "source": { "index": "old_products" }, "dest": { "index": "new_products" } }'
Alias, index'e takma addır. Versiyonlama ve migration için kullanılır.
Örnek:
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{ "actions": [ { "add": { "index": "products_v2", "alias": "products" } } ] }
'
Büyük log sistemlerinde cost optimization sağlar.
Aşırı memory kullanımında query'leri durdurarak cluster'ın çökmesini engeller.
Circuit breaker limit:
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{ "persistent": { "indices.breaker.request.limit": "60%" } }'
Versiyon kontrol:
curl -X GET "localhost:9200"
keyword vs text farkına dikkat etSenior seviye Docker mülakat soruları ve cevapları.
Komut:
docker images # mevcut imajları listeler docker ps -a # çalışan/duran containerları listeler
Image üretmek için kullanılan talimat dosyasıdır.
Örnek:
FROM openjdk:17 WORKDIR /app COPY target/app.jar app.jar CMD ["java", "-jar", "app.jar"]
Build komutu:
docker build -t myapp:1.0 .
Verilerin container silinse bile kalıcı olmasını sağlar.
Komut:
docker volume create mydata docker run -v mydata:/var/lib/mysql mysql:8
bridge (varsayılan, containerlar arası iletişim)host (container host ağını paylaşır)none (ağsız container)Komut:
docker network ls docker run --network=host nginx
Farklı aşamalarda build yaparak gereksiz bağımlılıkları imajdan atmak.
Örnek:
FROM maven:3.8.5 AS build WORKDIR /app COPY . . RUN mvn package -DskipTests FROM openjdk:17 WORKDIR /app COPY --from=build /app/target/app.jar app.jar CMD ["java", "-jar", "app.jar"]
docker logs -f container_id
Birden fazla servisi YAML dosyası ile yönetmeye yarar.
Örnek docker-compose.yml:
version: "3"
services:
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
app:
build: .
ports:
- "8080:8080"
Çalıştırma:
docker-compose up -d
Image saklanan merkez.
Kurulum:
docker run -d -p 5000:5000 registry:2
docker exec -it container_id /bin/bash
noalwaysunless-stoppedon-failureHEALTHCHECK CMD curl --fail http://localhost:8080/health || exit 1
docker run -m 512m --cpus="1.0" nginx
docker history myapp:1.0
docker system prune -a
Kullanılmayan container, network ve imajları siler.
Docker'ın kendi orchestration aracı. Servisler cluster içinde yönetilir.
Swarm veya Kubernetes için çoklu host arasında çalışan network türü.
Gizli bilgileri güvenli saklar.
docker stats
Canlı CPU, bellek, network tüketimi gösterir.
Container'ın çalıştığı anı snapshot alıp durdurup tekrar başlatma özelliği.
docker inspect image_id
Senior seviye Kubernetes mülakat soruları ve cevapları.
Container orkestrasyon aracıdır. Otomatik scaling, self-healing, service discovery sağlar.
Kubernetes'te en küçük deploy edilebilir birimdir.
Pod'ların belirlenen sayıda çalışmasını garanti eder.
Komut:
kubectl get rs
ReplicaSet + rollout + rollback desteği ile pod yönetir.
Kaynakları mantıksal olarak ayırmak için kullanılır.
kubectl create ns prod
HTTP(S) routing kuralları tanımlar.
Stateful uygulamaları yönetir (DB gibi).
Her node üzerinde 1 pod çalıştırır. (örn. log agent)
CPU/memory metriklerine göre pod sayısını artırır/azaltır.
kubectl autoscale deployment myapp --cpu-percent=50 --min=2 --max=10
Pod'un belirli node üzerinde çalışmasını sağlar.
Pod'ların API server'a erişimi için kimlik doğrulama mekanizmasıdır.
Role-Based Access Control, yetkilendirme sistemidir.
Kubernetes'in tüm verilerini sakladığı dağıtık key-value store'dur.
kubectl get pods -A
kubectl logs -f pod_name
kubectl rollout undo deployment myapp
kubectl get componentstatuses kubectl get nodes
Kubernetes için paket yöneticisidir. Chart'lar ile uygulama dağıtımı yapılır.