27 Şubat 2022 Pazar

Kubernetes external-secrets Operator

Giriş
Açıklaması şöyle
Basically, it is a Kubernetes operator to read information from a third-party service like AWS Secrets Manager and automatically inject the values as Kubernetes Secrets. So, it doesn't change the way you use your secrets (no need for sidecars or annotations).
Kurmak için şöyle yaparız. Örneğin devamı yine aynı sayfada
helm repo add external-secrets https://charts.external-secrets.io

helm install external-secrets \
   external-secrets/external-secrets \
    -n external-secrets \
    --create-namespace

Kubernetes kind: NetworkPolicy

Network Policies
Açıklaması şöyle. Yani varsayılan davranışta herhangi bir kısıtlama yoktur. Her pod her pod ile ağ bağlantısı kurabilir
By default, Kubernetes allows communication from any pod to another pod within the same cluster. While this is ideal for service discovery, it provides zero network separation, allowing bad actors or compromised systems unlimited access to all resources. This becomes extremely problematic for teams using namespaces as the primary means of multi-tenancy inside Kubernetes.

To control the traffic flow between pods, namespaces, and external endpoints, use a CNI plugin that supports the NetworkPolicy API (e.g., CalicoFlannel, or cloud-specific CNI) for network isolation. Following the zero-trust model, the best practice is to implement a default deny-all policy to block all ingress and egress traffic unless it is specifically allowed by another policy.
Kullanım
podSelector ile kendi isim alanım içindeki belirtilen label'a sahip podları seçerim
namespaceSelector ile belirtilen isim alanını seçerim
ingress ve egress için policy belirtilir. ingress pod'a gelen bağlantı, egress ise poddan çıkan bağlantıdır
ingress altına from ile namespaceSelector ve  podSelector ile seçim kuralları yazılır
egress altın to ile namespaceSelector ve  podSelector ile seçim kuralları yazılır

Örnek
Şöyle yaparız. Bunun ismi default deny çünkü her türlü trafiği engelliyor
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: my-ns
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
1. Ingress
Örnek
Elimizde şöyle bir network policy olsun. Burada iki tane ingress network policy var. Birincisi her şeye izin veriyor. İkincisi sadece ismi a olan isim alanından izin veriyor.
#networkpolicy.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: namespace-a
spec:
  podSelector: {}
  policyTypes:
  - Ingress
---
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-namespace-a
  namespace: namespace-a
spec:
  podSelector:
    matchLabels:
      app: k8s-security-demo
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          team: a
Açıklaması şöyle
... we have created two network policies: one denies everything, the other allows access from within the namespace.
namespace-b'den bağlanamadığımızı ancak namespace-a'dan bağlanabildiğimizi görmek için şöyle yaparız
$ kubectl exec -n namespace-b -it testpod -- sh

$ curl k8s-security-demo.namespace-a
curl: (28) Failed to connect to k8s-security-demo.namespace-a port 80 after 129977 ms:
  Operation timed out
namespace-a'dan bağlanabildiğimizi görmek için şöyle yaparız
$ kubectl exec -n namespace-a -it testpod -- sh

$ curl k8s-security-demo.namespace-a
Hello, world!/ $
2. Egress
Örnek
Şeklen şöyle
-> (80) Web Server -> (5000) App Server -> 3306 DB Server
Şöyle yaparız. Web-Policy olarak web-server dışarıdan gelen her bağlantıyı kabul eder ve api-pod'un 5000 numaralı portuna gönderir.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web-policy
spec:
  podSelector:
    matchLabels:
      role: web
  policyTypes:
  - Egress
  egress:
    - to:
        - podSelector:
            matchLabels:
              name: api-pod
        - namespaceSelector:
            matchLabels:
              name: dev
      ports:
        - protocol: TCP
          port: 5000
Örnek - To Belirtilmemiş
Bu yanlış çünkü to kısmı belirtilmemiş. Dolayısıyla 80 numaralı port olmak kaydıyla her türlü adrese erişim verir.
# This is bad, because it allows connections to anything listening
# on port 80
apiVersion: networking.k8s.io/v1 
kind: NetworkPolicy 
metadata:   
  name: allow-cronjob-to-examplecom
  namespace: my-ns
spec: 
  podSelector:     
    matchLabels:       
      app.kubernetes.io/component: cronjob
  policyTypes:   
  - Egress   
  egress:   
  - ports:     
    - protocol: TCP       
      port: 80
3. Ingress ve Egress
Şöyle yaparız. App Server, 5000 numaralı porta bağlantı kabul eder ve DB Server'ın 3306 numaralı portuna gönderir.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-policy
spec:
  podSelector:
    matchLabels:
      role: api
  policyTypes:
  - Ingress
  - Egress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              name: web-pod
          namespaceSelector:
            matchLabels:
              name: dev
      ports:
      - protocol: TCP
        port: 5000
  egress:
    - to:
        - podSelector:
            matchLabels:
              name: db-pod
        - namespaceSelector:
            matchLabels:
              name: dev
      ports:
        - protocol: TCP
          port: 3306
Şöyle yaparız. DB Server, 3306 numaralı portuna sadece App Server'dan bağlantıyı kabul eder ve DB belirli bir IP bloğuna gönderir.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-policy
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              name: api-pod
          namespaceSelector:
            matchLabels:
              name: dev
        - ipBlock:
            cidr: 192.168.5.10/32
      ports:
      - protocol: TCP
        port: 3306
  egress:
    - to:
        - ipBlock:
            cidr: 192.168.5.10/32
      ports:
        - protocol: TCP
          port: 80

25 Şubat 2022 Cuma

kubectl apply seçeneği

Giriş
apply ve create benzer seçenekler. Farklarının açıklaması şöyle
apply - makes incremental changes to an existing object
create - creates a whole new object (previously non-existing / deleted)

Örnek - pod çalıştırmak
Elimizde şöyle bir test-pod.yaml olsun
apiVersion: v1
kind: pod
metadata: 
  name: test-pod
spec: 
  serviceAccountName: testuser 
  container: 
  - name: alpine:3.7   
    command:   
    - "sh"   
    - "-c"   
    - "sleep 100"
Belirtilen token dosyasını kullanan pod başlatmak için şöyle yaparız
kubectl apply -f test-pod.yaml
--record seçeneği
Bu seçeneği true olarak kullanırsak komut satırından girilen şeyler kaydedilir. Daha sonra eski bir sürüme dönebiliriz. Eğer --record=true değilse geçmişe bakarsan, onu boş görürüz. Çıktısı şöyledir.
$ kubectl rollout history deployment/app
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>
Örnek
Açıklaması şöyle
Rollback is reverting deployment to an older version. Imagine there’s a bug with the new deployment, in this case, you’d want to get back to the older version.

Kubernetes creates a new replicaset with each deployment. When you use a newer version to deploy, a second replicaset is created. The old one will still remain in the system. Thus, when we need to rollback, Kubernetes just uses the old replicaset.
Şöyle yaparız
kubectl apply -f deployment.yml --record=true
Bunu yaptıktan sonra replicaset'e bakabiliriz.
kubectl get replicasets
Daha sonra geçmişe bakarız. Çıktısı şöyledir
kubectl rollout history deployment.v1.apps/nginx-deployment
The output is similar to this:

deployments "nginx-deployment"
REVISION    CHANGE-CAUSE
1           kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true
2           kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1 --record=true
3           kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.161 --record=true
Geçmişteki bir şeye dönmek istersek şöyle yaparız
kubectl rollout undo deployment basic-spring-app-deployment --to-revision=1
--recursive seçeneği
Örnek
Şöyle yaparız
kubectl apply -f . --recursive




Kubernetes namespace Anahtar Kelimesi

Giriş
Açıklaması şöyle
In Kubernetes, objects of the same kind are distinguished by their names. So, if you start two Pods, both should get a unique name. But clusters can be pretty big and since names are supposed to be unique within a cluster, we need a mechanism to prevent collisions. Something like lots of logical clusters within one physical cluster. Allow me to introduce you to namespaces!
Kubernetes açıklaması şöyle
Kubernetes supports multiple virtual clusters backed by the same physical cluster. These virtual clusters are called namespaces.
...
Namespaces provide a scope for names. Names of resources need to be unique within a namespace, but not across namespaces. Namespaces cannot be nested inside one another and each Kubernetes resource can only be in one namespace.

kubectl get pods seçeneği - Çalışmakta Olan Podları Gösterir

Giriş
Çalışmakta olan podları gösterir.  Aslında get seçeneği pod dışında bir sürü başka nesne için de kullanılabiliyor. Şöyle yaparız
$ kubectl get pods # or services, or roles

$ kubectl describe pods  # or services, or roles

$ kubectl edit pods  # or services, or roles
Örnek
Default namespace içindeki pod'ları görmek için şöyle yaparız
kubectl get pods
Örnek
Kaynakları yaratmak için şöyle yaparız
kubectl create -f <yaml_file>
Daha sonra podlara bakalım. Şöyle yaparız. Burada iki tane pod görürüz.
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-world-5bb87c95-6h4kh   1/1       Running   0          7h
hello-world-5bb87c95-bz64v   1/1       Running   0          7h
Bu podlar SpringBoot uygulamaları. Birisine bash açıp, uygulamaya curl ile GET göndermek  için şöyle yaparız
$ kubectl exec -it hello-world-5bb87c95-6h4kh bash
$ (inside the pod) curl 10.15.242.210:8080
$ (inside the pod) Greetings from Spring Boot!
-A seçeneği
All namespaces anlamına gelir
Örnek
Şöyle yaparız
kubectl get po -A
Örnek
Şöyle yaparız
kubectl get pods --all-namespaces
-l seçeneği - label filter 
İsmi app ve frontend olan pod'ları listelemek için şöyle yaparız. Bu seçenek yerine --selector seçeneği de kullanılabilir.
kubectl get pods -l=app=frontend
-n seçeneği - namespace
Belirtilen namespace içindeki pod'ları görmek için şöyle yaparız
$ kubectl get pods -n gridgain
NAME                                READY   STATUS    RESTARTS   AGE
gridgain-cluster-5b69557db6-lcglw   1/1     Running   0          44m
gridgain-cluster-5b69557db6-xpw5d   1/1     Running   0          44m
-o seçeneği - custom-columns output format
Örnek - wide
Pod'un hangi worker node üzerinde olduğunu NODE sütununda gösterir. Şöyle yaparız
$ kubectl get pods -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES
demo-997c454df-kj4j7   1/1     Running   0          47s   10.244.2.2   minikube-m03   <none>           <none>
demo-997c454df-pzks9   1/1     Running   0          47s   10.244.1.3   minikube-m02   <none>           <none>
demo-997c454df-q7br7   1/1     Running   0          47s   10.244.1.2   minikube-m02   <none>           <none>
demo-997c454df-s4zrg   1/1     Running   0          47s   10.244.2.4   minikube-m03   <none>           <none>
demo-997c454df-shtgs   1/1     Running   0          47s   10.244.1.4   minikube-m02   <none>           <none>
demo-997c454df-v8c2q   1/1     Running   0          47s   10.244.2.3   minikube-m03   <none>           <none>
Örnek - custom-columns
Şöyle yaparız
$ kubectl get pods -A -o \
  custom-columns=NAMESPACE:metadata.namespace,NAME:metadata.name

NAMESPACE     NAME
fail          fail-856f678c66-dn282
interactive   interactive-797dbc7d9-ch9bd
kube-system   calico-kube-controllers-dc6cb64cb-pfhqr
kube-system   calico-node-nk854
kube-system   coredns-5644d7b6d9-9776g
kube-system   coredns-5644d7b6d9-zccn5
kube-system   csi-linode-controller-0
kube-system   csi-linode-node-82qgt
kube-system   kube-proxy-xxpvf
Örnek - custom-columns-file
custom-columns seçeneğini kullanarak her şeyi uzun uzun yazmak yerine istenilen çıktı formatı bir dosyaya kaydedilebilir. Şöyle yaparız.
$ cat pods.fmt
NAMESPACE NAME metadata.namespace metadata.name $ kubectl get pods -A -o custom-columns-file=pods.fmt NAMESPACE NAME fail fail-856f678c66-dn282 interactive interactive-797dbc7d9-ch9bd kube-system calico-kube-controllers-dc6cb64cb-pfhqr kube-system calico-node-nk854 kube-system coredns-5644d7b6d9-9776g kube-system coredns-5644d7b6d9-zccn5 kube-system csi-linode-controller-0 kube-system csi-linode-node-82qgt kube-system kube-proxy-xxpvf
--selector seçeneği
Örnek
Şöyle yaparız
$ kubectl get pods -n us-west4 --watch --selector app=k8ssandra-dc1-stargate

NAME                                       READY   STATUS             RESTARTS   AGE
k8ssandra-dc1-stargate-58bf5657ff-ns5r7    1/1     Running            0          15m



kubectl api-versions seçeneği - API Gruplarını Gösterir

Giriş
Açıklaması şöyle
You can also check the list of available API groups and their versions using kubectl api-versions command:
Örnek
Şöyle yaparız
# kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta
apps/v1
...

kubectl api-resources seçeneği - Kurulu olan API'leri Gösterir

Giriş
Kurulu olan API'leri gösterir. Açıklaması şöyle
All interactions with Kubernetes objects, directly or indirectly, happen through Kubernetes API - a highly structured masterpiece of software design.
...
You can always check the list of available API resources using kubectl api-resources command
Çok fazla API var. Şeklen şöyle


Örnek
Şöyle yaparız
# kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
namespaces ns     v1 false Namespace
nodes no v1 false Node
pods po v1 true Pod
deployments deploy apps/v1 true Deployment
jobs batch/v1 true Job

22 Şubat 2022 Salı

Kubetnetes dockershim

Giriş
Kubernetes ile Docker Daemon arasında bağlantıyı kuran yazılımın bileşeninin ismi dockershim. Kubernetes bu bileşeni kaldırma (deprecate) kararı aldı

Kubernetes normalde container'lardan bağımsız olmak için Container Runtime Interface (CRI) denen bir yazılım bileşeni kullanıyor. Açıklaması şöyle
CRI is a plugin interface that gives kubelet the ability to use different OCI-compliant container runtimes (such as containerd, docker or cri-o),without needing to recompile Kubernetes

Docker CRI uyumlu değil. Ancak Kubernetes, Docker popüler olduğu için Docker'ı ihmal edemedi ve Docker ile uyumlu çalışmak için shim denilen bir katman daha geliştirdi. Bu katmanın docker için olanının ismi de tabii ki dockershim .)
Şeklen şöyle

Kubernetes artık bu shim katmanını idame etmeyeceğini duyurdu. Dolayısıyla bir zaman sonra Docker aradan çekilince şeklen şöyle bir şey olacaktır








20 Şubat 2022 Pazar

Kubernetes secretKeyRef Anahtar Kelimesi

Örnek
Şöyle yaparız
apiVersion: apps/v1 
kind: Deployment 
metadata: 
 name: back-end-project 
spec: 
 replicas: 1 
 selector: 
   matchLabels: 
     app: back-end-project 
 template: 
   spec: 
     containers: 
     - name: back-end-project 
       image: <path to docker container> 
       ports: 
       - containerPort: 80 
       env: 
       - name: SOME_ENV_VAR 
         valueFrom: 
           secretKeyRef: 
             name: secret-name 
             key: secret-key

Kubernetes allowPrivilegeEscalation Anahtar Kelimesi

Örnek
Şöyle yaparız
apiVersion: v1 
kind: Pod 
metadata: 
  name: backend-identity-service 
spec: 
  containers: 
  - name: backend-identity-service 
    image: path/to/docker/image/backend-identity-service:1.0.3 
    securityContext: 
allowPrivilegeEscalation: false


16 Şubat 2022 Çarşamba

kubectl port-forward seçeneği - Host'tan Pod'a Yönlendirir

Giriş
Host'tan pod'a port-forward işlemi yapar. İlk rakam host'un kullandığı, ikinci rakam ise pod'un kullandığıdır.

Söz dizimi şöyle
kubectl port-forward <pod_name> local_port:pod_port
Bu komutu hem pod hem de servis için kullanabiliriz. Şöyle yaparız
kubectl port-forward <ingress-pod-name> 8080:<ingress-port>
kubectl port-forward service/<service-name> 8080:<service-port>
Örnek
Şöyle yaparız. Host'un 15306 no'lu MySQL portuna bağlanırsam pod'un 3306 no'lu portuna yönlendirilirim.
kubectl port-forward --address localhost 
"$(kubectl get service --selector="planetscale.com/component=vtgate,
  !planetscale.com/cell" -o name | head -n1)" 
15306:3306
Örnek
Şöyle yaparız. Host'un 15999 no'lu portuna bağlanırsam pod'un 15999 no'lu portuna yönlendirilirim.
kubectl port-forward --address localhost 
  deployment/$(kubectl get deployment --selector="planetscale.com/component=vtctld" 
  -o=jsonpath="{.items..metadata.name}") 
  15999:15999
Örnek
Şöyle yaparız
kubectl -n mynamespace port-forward podname 5005:5005
Forwarding from ....
Örnek
Şöyle yaparız.
kubectl port-forward svc/springbootmongodb 8080:8080

15 Şubat 2022 Salı

Probe Çeşitleri

Giriş
3 tane temel probe var.
1. Startup
2. Readiness
3. Liveness

Şeklen şöyle


Startup Probe
Startup Probe yazısına taşıdım

Readiness Probe
Readiness Probe yazısına taşıdım

Liveness Probe
Liveness Probe yazısına taşıdım

Süreler
Alanlar şöyle
- initialDelaySeconds : Probe'un ilk başlama süresini geciktirir
- timeoutSeconds : Probe'un cevap vermesini ne kadar bekleyeceğimizi belirtir.
- failureThreshold : Probe başarısız ise kaç defa daha tekrar deneyeceğimizi belirtir.
- successThreshold : Probe'un kaç tane başarılı sonuç döndükten sonra gerçekten başarılı kabul edileceğini belirtir.
- periodSeconds : Probe'un kaç saniye bir çalıştırılacağını belirtir.
Açıklaması şöyle
The first one is the initial delay (initialDelaySeconds) which defines the amount of time in seconds to wait before executing the probe for the first time. This interval is particularly good when we have applications with lots of dependencies and/or large loading time. If this property is not set, the probe will be executed as soon as the container is loaded.

After this initial delay, the probe is executed and kubelet waits for a certain amount of time for a result before assuming a fail for timeout (timeoutSeconds). Keep in mind that if you have a short timeout, you may have false results just because your application had no time enough to process the action. The default value is 1 second which is enough for most situations but I highly recommend to define a realistic value for each application.

If the probe fails, kubelet tries again how many times as set in the failureThreshold property, this way any temporary unavailability won’t cause the probe to put the container in a failed state. Only after the last consecutive failed attempt the container will be considered failed. If not set, the default number of attempts is 3.

In some situations a single successful result may not be enough to really ensure the health of our container. In this case, the successThreshold property sets how many consecutive times the action needs to be successful to change the state of a container from failed to successful.

We can also set the interval between one execution and another, in seconds, using the periodSeconds property. If not set, the probe will be executed every 10 seconds.

Probe Actions
httpGet
Shell Command

httpGet Probe Action
Söz dizimi şöyle
<probe-type>:
   httpGet:
     path: /my/healthcheck/endpoint?param=value
     port: 8080
     httpHeaders:
     - name: SomeHeaderName
       value: someHeaderValue
     - name: AnotherHeaderName
       value: "Another Header Value"
   initialDelaySeconds: 5
   periodSeconds: 10
   (...)
Örnek - path + port
Şöyle yaparız
apiVersion: v1
kind: Pod
metadata:
 name: simple-webapp
 labels:
 name: simple-webapp
spec:
 containers:
 — name: simple-webapp
 image: simple-webapp
 ports:
 — containerPort: 8080
 livenessProbe:
  httpGet: 
      path: /api/healthy
      port: 8080
  initialDelaySeconds: 10
  periodSeconds: 5
  failureThreshold: 8
 readinessProbe:
  httpGet: 
      path: /api/ready
      port: 8080
  initialDelaySeconds: 10
  periodSeconds: 5
  failureThreshold: 8
Örnek - path + port
Şöyle yaparız
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: backend
      annotations:
        prometheus.io/scrape: 'true'
    spec:
      containers:
      - name: backend
        image: spring-boot-hpa
        imagePullPolicy: IfNotPresent
        env:
        - name: ACTIVEMQ_BROKER_URL
          value: "tcp://queue:61616"
        - name: STORE_ENABLED
          value: "false"
        - name: WORKER_ENABLED
          value: "true"
        ports:
        - containerPort: 8080
        livenessProbe:
          initialDelaySeconds: 5
          periodSeconds: 5
          httpGet:
            path: /health
            port: 8080
        resources:
          limits:
            memory: 512Mi
Örnek - httpHeaders
Şöyle yaparız
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3
Shell Command Probe Action
Örnek
Şöyle yaparız
<probe-type>:
   exec:
     command:
     - /app/bin/myFantasticConsoleApp.exe
     - param1
     - "param 2"
   initialDelaySeconds: 5
   periodSeconds: 10
   (...)
TCP Port Check
Örnek
Şöyle yaparız
<probe-type>:
   tcpSocket:
     port: 5677
   initialDelaySeconds: 5
   periodSeconds: 10
   (...)







14 Şubat 2022 Pazartesi

kubectl scale seçeneği

Giriş
Replica sayısını değiştirir

Örnek
Şöyle yaparız
$ kubectl scale deployment/POD_NAME — replicas=N
Örnek
Şöyle yaparız
#İhtiyaç olunca  
kubectl scale --replicas=5 deployment/backend
#İhtiyaç kalmayınca
kubectl scale --replicas=1 deployment/backend

2 Şubat 2022 Çarşamba

minikube - Yerel Kubernetes Cluster

Giriş
Açıklaması şöyle. Windows ve Linux'ta çalışabilir.
minikube is a local Kubernetes cluster packaged as a virtual machine. It’s great if you’re on Windows, Linux, and Mac as it takes five minutes to create a cluster.
Not : minikube kurmak istemiyorsak Docker Desktop kullanılabilir. 
Settings menüsünde Kubernetes sekmesinde "Enable Kubernetes" seçeneği var

VM Tipleri
Minikube farklı VM'ler ile çalıştırabilir. Bunlar şöyle. Yardım sayfasında "Defaults to autodetect" deniyor
$ minikube config defaults driver
* virtualbox - Windows/Linux İçin
* vmwarefusion - Mac İçin
* kvm2 - Linux İçin
* vmware
* none
* docker
* podman
* ssh
none için açıklama şöyle
Minikube also supports a --driver=none option that runs the Kubernetes components on the host and not in a VM. Using this driver requires Docker and a Linux environment but not a hypervisor.
WSL2 ile şöyle gösteriyor yani docker kullanıyor. Minisihft ise örneğin vmware kullanıyor
~$ minikube start
😄  minikube v1.25.2 on Ubuntu 20.04
✨  Automatically selected the docker driver
Container Tipleri
Açıklaması şöyle
Minikube supports multiple container runtimes (CRI-O, containerd, docker)
Kubernetes Sürümleri
Minikube farklı Kubernetes sürümlerini çalıştırabilir. Açıklaması şöyle
Minikube works on every platform and lets you configure lots of options. If you’re running Linux then you can turn off the VM so it runs natively.

The other cool thing is that it supports every Kubernetes version so you can exactly match the versions you’re running on your laptop to the version you’re running on your servers.
Add-on Tipleri
Şu özellikleri destekler
Minikube supports multiple features such as LoadBalancer, filesystem mounts, and FeatureGates.
Liste şöyle
addon-manager, coredns, dashboard, default-storageclass, efk, freshpod, heapster, ingress, kube-dns, metrics-server, nvidia-driver-installer, nvidia-gpu-device-plugin, registry, registry-creds, storage-provisioner
Node Sayısı
Normalde tek node'lu cluster çalıştırır. Açıklaması şöyle
Minikube runs a single-node Kubernetes cluster and lets you interact with the cluster by writing kubectl commands.
Diğer Alternatifler
Minikube yerine k3d ve kind kullanılabilir. Minishift ise OpenShift alternatifi olabilir.

Linux Kurulum
Şöyle yaparız. Burada cp ve chmod ile kuruluyor.
# Install minikube binary
$ wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ sudo cp minikube-linux-amd64 /usr/local/bin/minikube
$ sudo chmod +x /usr/local/bin/minikube

# Install kubectl binary
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
$ sudo chmod +x kubectl
$ sudo mv kubectl /usr/local/bin/
Örnek
Şöyle yaparız. Burada install ile kuruluyor.
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-PLATFORM-amd64
$ sudo install minikube-PLATFORM-amd64 /usr/local/bin/minikube
Başlatmak
Örnek
$ minikube start --driver=docker
Her şey kube-system isim alanı (namespace) altında çalışır. Görmek için şöyle yaparız
$ kubectl top pod --all-namespaces
NAMESPACE     NAME                          CPU(cores) MEMORY(bytes)
default       hello-node-55b49fb9f8-fzb5q      0m           10Mi
kube-system   coredns-5c98db65d4-jjz8s         4m           11Mi
kube-system   coredns-5c98db65d4-txdpc         4m           13Mi
kube-system   etcd-minikube                    29m          43Mi
kube-system   heapster-b6n49                   0m           16Mi
kube-system   influxdb-grafana-sq7nb           1m           37Mi
kube-system   kube-addon-manager-minikube      8m           5Mi
kube-system   kube-apiserver-minikube          47m          254Mi
kube-system   kube-controller-manager-minikube 20m          35Mi
kube-system   kube-proxy-cvcdj                 2m           9Mi
kube-system   kube-scheduler-minikube          2m           10Mi
kube-system   kubernetes-dashboard-7b8ddcb5m   0m           14Mi
kube-system   metrics-server-84bb785897-nt4xs  0m           8Mi
kube-system   storage-provisioner              0m           27Mi
Kullanım
Adımlar burada
1. "minikube start" seçeneğiyle bir cluster başlat. Başladıktan sonra "minikube status" seçeneğiyle kontrol et
2. "kubectl create deployment ..." ile deployment yap
3. bir service yap
4. İşin bitince sırasıyla service'i ve deployment' ı sil
5. "minikube stop" ile cluster'ı durdur
6. "minikube delete" ile cluster'ı sil

addons seçeneği
Listelemek için şöyle yaparız
$ minikube addons list
- addon-manager: enabled
- dashboard: enabled
- default-storageclass: enabled
- efk: disabled
- freshpod: disabled
- gvisor: disabled
- heapster: enabled
- ingress: disabled
- logviewer: disabled
- metrics-server: disabled
- nvidia-driver-installer: disabled
- nvidia-gpu-device-plugin: disabled
- registry: disabled
- registry-creds: disabled
- storage-provisioner: enabled
- storage-provisioner-gluster: disabled
Örnek
Şöyle yaparız
minikube addons enable ingress
config seçeneği
Config dosyasındaki ayarları gösterir veya değiştirir.
Örnek
Şöyle yaparız
minikube config set cpus 8
minikube config set memory 24000
minikube config set driver hyperkit
Ayarları görmek için şöyle yaparız
$ minikube config view
- cpus: 8
- driver: hyperkit
- memory: 24000
dashboard seçeneği
Açıklaması şöyle
You can also monitor your Kubernetes cluster via the browser and visually interpret the cluster state by accessing the Kubernetes dashboard from Minikube.
Şöyle yaparız
minikube dashboard
delete seçeneği
Şöyle yaparız
minikube delete
docker-env seçeneği
docker-env seçeneği yazısına taşıdım

image load seçeneği
image load seçeneği yazısına taşıdım

service seçeneği
service seçeneği yazısına taşıdım

start seçeneği
Açıklaması şöyle. Kubernetes'i Docker içinde çalıştırır. Tek düğümlü bir cluster başlatılır
By default, minikube will run the latest Kubernetes in the docker container if you are not specifying VM-DRIVER. ... 
Once you run minikube start, you will have a single node cluster running in docker.
Örnek
Şöyle yaparız
$ minikube start
 minikube v1.14.0 on Darwin 10.15.7
 ...
 Preparing Kubernetes v1.19.2 on Docker 19.03.12 ...
 Verifying Kubernetes components...
 Enabled addons: storage-provisioner, default-storageclass
 Done! kubectl is now configured to use "minikube" by default
-n ile node
Örnek
Açıklaması şöyle
running four-node cluster with calico as CNI and using containerd runtime.
Şöyle yaparız
$ minikube start -n=4 --cni='calico' --container-runtime='containerd' 
 ...
 Preparing Kubernetes v1.21.2 on containerd 1.4.6 ...
Örnek
Minukube'ü bir VM içinde çalıştırmak için şöyle yaparız. Burada kvm2 Linux VM'i içinde çalışıyor
minikube start -n=3 --cni='calico' --container-runtime='containerd' --vm-driver kvm2 
--cpus ile işlemci
Örnek
Şöyle yaparız
minikube start -—cpus=4 -—memory=5000
--memory ile bellek
Örnek
8 GB bellek kullanan bir cluster için şöyle yaparız
minikube start \
  --memory 8096 \
  --extra-config=controller-manager.horizontal-pod-autoscaler-upscale-delay=1m \
  --extra-config=controller-manager.horizontal-pod-autoscaler-downscale-delay=2m \
  --extra-config=controller-manager.horizontal-pod-autoscaler-sync-period=10s
ssh seçeneği
minikube ssh seçeneği yazısına taşıdım

status seçeneği
Ayarları görmek için şöyle yaparız
$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
stop seçeneği
Şöyle yaparız
minikube stop
version seçeneği
Kurulu minikube sürümünü gösterir.

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...