31 Temmuz 2023 Pazartesi

fieldRef'i Environment Olarak Kullanma

Giriş
Deployment içindeki bazı değerleri environment variable olarak eklemek mümkün
1. Pod valueFrom/fieldRef/fieldPath ile istenilen field değerini environment variable olarak yükler.

Örnek
Şöyle yaparız
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app-container
          image: my-app-image:latest
          ports:
            - containerPort: 8081
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
SpringBoot uygulamasından okumak için şöyle yaparız. Böylece POD ismine ortam değişkeni olarak erişebiliriz.
@RestController
@RequestMapping("/example")
public class MyController {

  @Value("${POD_NAME}")
  private String podName;

  @GetMapping("/getPodName")
  public void printPodName() {
    System.out.println(podName);
  }
}


27 Temmuz 2023 Perşembe

Fabric8 Kubernetes Client

Maven
Örnek - BOM
Şu satırı dahil ederiz
<dependency>
  <groupId>io.fabric8</groupId>
  <artifactId>kubernetes-client-bom</artifactId>
  <version>6.9.2</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>
Örnek
Şu satırı dahil ederiz
<dependency>
<groupId>io.fabric8</groupId> <artifactId>kubernetes-client</artifactId> <version>6.9.2</version> </dependency>
constructor
Şöyle yaparız
KubernetesClient kubernetesClient = new DefaultKubernetesClient().inNamespace(namespace);
namespaces metodu
Örnek
Şöyle yaparız
import io.fabric8.kubernetes.api.model.Namespace;
import io.fabric8.kubernetes.api.model.NamespaceBuilder;

public void createOrReplaceNamespace(String namespaceName) {
  Namespace namespace = new NamespaceBuilder()
    .withNewMetadata()
    .withName(namespaceName)
    .endMetadata()
    .build();
  kubernetesClient.namespaces().createOrReplace(namespace);
}
Örnek
Şöyle yaparız
public void deleteNamespace(String namespaceName) {
  kubernetesClient.namespaces().withName(namespaceName).delete();
}
pods metodu
Örnek
Şöyle yaparız
import io.fabric8.kubernetes.api.model.Pod;

public List<Pod> allPodsStartingWith(String prefix) {
  return kubernetesClient.pods().list().getItems().stream()
    .filter(p -> p.getMetadata().getName().startsWith(prefix))
    .collect(Collectors.toList());
}
Örnek
Şöyle yaparız
public void deletePod(String podName) {
  kubernetesClient.pods().withName(podName).delete();
}

public void deletePodForcefully(String podName) {
  kubernetesClient.pods().withName(podName).withGracePeriod(0).delete();
}
Örnek
Şöyle yaparız
public String getPodLog(String podName) {
  return kubernetesClient.pods().withName(podName).getLog();
}

public String getPodStatus(String podName) {
  Pod pod = kubernetesClient.pods().withName(podName).get();
  return pod.getStatus().getPhase();
}
services metodu
Örnek
Şöyle yaparız
import io.fabric8.kubernetes.api.model.LoadBalancerIngress;
import io.fabric8.kubernetes.api.model.Service;
import io.fabric8.kubernetes.api.model.apps.StatefulSetStatus;


public String getServiceExternalIp(String serviceName) {
  Service service = kubernetesClient.services().withName(serviceName).get();
  if (service == null) {
    throw new IllegalStateException("Service '" + serviceName + "' not found");
   }
   return getIngressIp(service);
}

private static String getIngressIp(Service service) {
  List<LoadBalancerIngress> ingress = service.getStatus().getLoadBalancer().getIngress();
  if (ingress != null && !ingress.isEmpty()) {
    return ingress.get(0).getIp();
  }
  throw new IllegalStateException("Ingress for '" + 
    service.getMetadata().getName() + "' not found");
}




Fabric8 Kubernetes Mock Server

Giriş
Bu kütüphane WireMock ile de kullanılabilir. Bir örnek burada

Bir yazı burada

Maven
Örnek - BOM
Şu satırı dahil ederiz
<dependency>
  <groupId>io.fabric8</groupId>
  <artifactId>kubernetes-client-bom</artifactId>
  <version>6.9.2</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>
Örnek
Şu satırı dahil ederiz
<dependency>
  <groupId>io.fabric8</groupId>
  <artifactId>kubernetes-server-mock</artifactId>
  <version>${fabric8.version}</version>
  <scope>test</scope>
</dependency>

14 Temmuz 2023 Cuma

4 Temmuz 2023 Salı

Probe Çeşitleri - Liveness Probe - Determines The Overall Health Of A Container

Giriş
Açıklaması şöyle
The liveness probe lets us test whether the application is alive. 
Bu probe sürekli çağrılır. Açıklaması şöyle
If the livenessProbe fails, Kubernetes takes corrective action, such as restarting the container or recreating the pod.
Liveness Probe vs Readiness Probe
1. Eğer Liveness Probe hatalı sonuç dönerse Pod yeniden başlatılır. 
2. Eğer Readiness Probe hatalı sonuç dönerse Pod yeniden başlatılmaz, sadece trafik almamaya başlar. Örneğin Pod'umuz harici bir kaynağa bağımlı olsun ve bu harici kaynakta bir bozulma başlasın. Bu durumda Pod "Not Ready" olarak işaretlenir ve trafik gelmemeye başlar

Örnek
Şöyle yaparız
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: my-image:latest
          ports:
            - containerPort: 8080
          livenessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 15
            failureThreshold: 3
 Açıklaması şöyle
In the above example, a livenessProbe is defined for the container “my-container” running on port 8080. It checks the “/health” endpoint every 15 seconds, starting 10 seconds after the container starts. If the probe fails for three consecutive times, Kubernetes considers the container unhealthy and takes corrective action, such as restarting the container.
timeoutSeconds Alanı
Açıklaması şöyle. Probe cevabın belirtilen sürede gelmesini bekler. Eğer cevap geç gelirse başarısız kabul edilir.
Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1.

successThreshold Alanı
Örnek
Şöyle yaparız
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 10
  periodSeconds: 15
  successThreshold: 3
Açıklaması şöyle
In the above example, the livenessProbe sends an HTTP GET request to /health on port 8080 every 15 seconds, starting 10 seconds after the container starts. The successThreshold is set to 3, meaning that the probe must succeed three consecutive times for the container to be considered healthy. If the probe fails three times in a row, Kubernetes takes corrective action, such as restarting the container.


Probe Çeşitleri - Readiness Probe - Determines Whether Container Is Ready To Receive Traffic Or Not

Giriş
Açıklaması şöyle. Pod hemen hizmet sunmaya başlamaz. Önce Readiness Probe başarılı bir sonuç dönmelidir. 
The readiness probe is employed to determine whether the application is ready to receive traffic. 
Örneğin Pod'un bağımlı olduğu diğer Pod'ların hazır olup olmadığı kontrol edilir. Açıklaması şöyle
The most common use of this probe is to check if all dependencies of a pod are available. For example, if your application depends on a database, two other services and a message bus, you could implement a method to verify all these external components are ready. In case of failure, you can even provide different codes and responses for different kinds of fails to track down what component is failing.
Bu probe tek bir sefer değil sürekli çağrılır. Açıklaması şöyle. Yani bu probe kısa ve hızlı çalışmalıdır.
... some developers seems to ignore or forget the fact that this probe is not executed only during the startup of a container. It will be repeatedly executed and every time if fails the container will be removed from the list of available services for requests. Thus this probe should not execute long/heavy tasks to avoid overloading services. A busy service also my take longer to execute the probe and return false failures due to timeout.
timeoutSeconds Alanı
Açıklaması şöyle. Probe cevabın belirtilen sürede gelmesini bekler. Eğer cevap geç gelirse başarısız kabul edilir.
Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1.

successThreshold Alanı
Açıklaması şöyle. Readiness Probe belirtilen sayı kadar başarılı olduktan sonra container ready kabul edilir
The successThreshold for readinessProbe determines the number of consecutive successful probe responses required to mark the container as ready. If the probe succeeds for the specified number of consecutive times, Kubernetes considers the container ready and includes it in the load balancer rotation to start receiving traffic.

Örnek
Şöyle yaparız
readinessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 10
  successThreshold: 2
Açıklaması şöyle.
In the above example, the readinessProbe sends an HTTP GET request to /health on port 8080 every 10 seconds, starting 5 seconds after the container starts. The successThreshold is set to 2, meaning that the probe must succeed two consecutive times for the container to be considered ready.
Readiness'i Kontrol Etmek İçin Yöntemler
Açıklaması şöyle.
The readinessProbe can be configured to use different methods to determine the container’s readiness. Some common methods include executing a command inside the container, making an HTTP request to a specific endpoint, or checking a TCP socket.
httpGet
Kullanlan alanlar şöyle
httpGet/path
httpGet/port
initialDelaySeconds
periodSeconds

Örnek - SpringBoot
application.properties dosyasında şöyle yaparız
management.endpoint.health.probes.enabled=true
Böylece iki tane endpoint etkin hale geliyor. Bunlar şöyle
/actuator/health/liveness
/actuator/health/readiness
Şöyle yaparız
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-boot-actuator-app
spec:
  selector:
    matchLabels:
      app: spring-boot-actuator-app
  replicas: 2
  template:
    metadata:
      labels:
        app: spring-boot-actuator-app
    spec:
      containers:
        - name: spring-boot-actuator-app
          image: spring-boot-actuator-app:0.0.1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 8080
            initialDelaySeconds: 3
            periodSeconds: 3
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 8080
            initialDelaySeconds: 3
            periodSeconds: 3
Örnek
Şöyle yaparız
readinessProbe:
  httpGet:
    path: /actuator/health/readiness
    port: 8080
  periodSeconds: 1
  failureThreshold: 3
  initialDelaySeconds: 10
  timeoutSeconds: 1

Cluster Propotional Autoscaler - ReplicaSet Ekler/Siler

Giriş Açıklaması şöyle CPA aims to horizontally scale the number of Pod replicas based on the cluster’s scale. A common example is DNS ser...