29 Nisan 2022 Cuma

Kubernetes securityContext Anahtar Kelimesi

capabilities Alanı
Örnek
Pod içindeki main isimli container'a AUDIT_WRITE hakkı vermek için şöyle yaparız
apiVersion: apps/v1
kind: Deployment
...
spec:
...
    spec:
      containers:
        - name: main
          securityContext:
            capabilities:
              add:
                - AUDIT_WRITE
Açıklaması şöyle. Yani normalde AUDIT_WRITE çok gerekli bir hak değil.
... in normal operation, even with root inside the container, Docker restricts the container’s Linux capabilities. This restriction includes things like CAP_AUDIT_WRITE, for example, which allows overwriting the Kernel’s audit logs — power that is highly unlikely needed by your containerized workloads.

privileged Alanı
privileged podları yasaklamak için kind: PodSecurityPolicy yazısına bakınız

Örnek - Normal Olmayan
Şöyle yaparız. Böylece işletim sisteminin her türlü yeteneğine erişebiliriz
apiVersion: v1
kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx securityContext: privileged: true
Örnek - Normal Olan
Şöyle yaparız.
apiVersion: v1
kind: Pod metadata: labels: run: pod-1 name: pod-1 spec: containers: - image: nginx name: pod-1 securityContext: privileged: false runAsNonRoot: true # advised by kubesec



26 Nisan 2022 Salı

minikube image load seçeneği

Giriş
Docker ile yapılandırılmış bir image'ı minikube ile kullanabilmek için iki seçenek var

1. minikube image load :  Docker image'ı minikube tarafından kullanılabilmesi içindir
2. minikube image build : Image'ı direkt minikube yapılandırır.

minikube image build bende çalışmadı. Sebebini bilmiyorum. Aldığım hata şöyle
>  minikube image  build -f .\docker\ubuntu\Dockerfile -t wildfly25 .
! Executing "docker container inspect minikube --format={{.State.Status}}" took an unusually
long time: 2.3699158s
unable to prepare context: unable to evaluate symlinks in Dockerfile path: 
lstat /var/lib/minikube/build/build.551082168/.\docker\ubuntu\Dockerfile: 
no such file or directory
minikube image load
Kullanım şöyle
minikube image rm image <imagename>:<version>  
minikube image load <imagename>:<version> --daemon
Örnek
Bir docker image yapılandıralım
docker build -f .\docker\ubuntu\Dockerfile -t wildfly25 .
minikube'ü başlatalım ve Docker image'ını yükleyelim ve pod'u başlatalım. Şöyle yaparız
minikube start
minikube image load  wildfly25
kubectl apply -f .\deploy.yaml
kubectl port-forward deployment/myapp 8080:8080
deploy.yaml şöyle. Burada imagePullPolicy : Never Bir örnek burada
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rwui
  labels:
    name: rwui
spec:
  selector:
    matchLabels:
      name: rwui
  template:
    metadata:
      labels:
        name: rwui
    spec:
      containers:
        - name: rwui
          image: wildfly25
          imagePullPolicy: Never
          ports:
            - containerPort: 22




25 Nisan 2022 Pazartesi

minikube service seçeneği - NodePort'a Erişim İçindir

Giriş
Belirtilen Nodeport servise bir tunnel oluşturur ve varsayılan tarayıcıyı açarak bu adrese yönlendirir. Minikube bir VM üzerinde çalıştığı için farklı bir IP adresine sahip ve yerel bilgisayardan direkt erişilemiyor. Erişmek için tunnel oluşturmak gerekiyor.

Örnek
Bir NodePort service açalım
--
apiVersion: v1
kind: Service
metadata:
 name: “nginx-service”
 namespace: “default”
spec:
 ports:
 — port: 80
 nodePort: 30001
 type: NodePort
 selector:
 app: “nginx”
Erişmek için şöyle yaparız
minikube service — url nginx-service

Örnek
İki pod çalıştıralım
kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
ve
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
Pod için şöyle yapalım
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
Diğer pod için şöyle yapalım
kubectl expose deployment hello-minikube --type=NodePort --port=8080
Tüm servisleri görmek için şöyle yaparız
minikube service list
Çıktısı şöyledir. Burada URL 192.168.49 ile başlıyor. Bu IP 172.17.0.3 de olabilirdi. Neticede yerel tarayıcıdan erişilemiyor. Erişmek için tunnel açmak yani port forwarding yapmak gerekir. Bizi ilgilendirenler Target Port alanı dolu olan Node Port servisler. Yani URL alanı dolu olan servisler.
>minikube service list
|----------------------|---------------------------|--------------|---------------------------|
|      NAMESPACE       |           NAME            | TARGET PORT  |            URL            |
|----------------------|---------------------------|--------------|---------------------------|
| default              | hello-minikube            |         8080 | http://192.168.49.2:30072 |
| default              | hello-node                |         8080 | http://192.168.49.2:30501 |
| default              | kubernetes                | No node port |
| kube-system          | kube-dns                  | No node port |
| kubernetes-dashboard | dashboard-metrics-scraper | No node port |
| kubernetes-dashboard | kubernetes-dashboard      | No node port |
|----------------------|---------------------------|--------------|---------------------------|
Sadece belli bir servisi tarayıcı ile açmak için şöyle yaparız
>minikube service hello-node
|-----------|------------|-------------|---------------------------|
| NAMESPACE |    NAME    | TARGET PORT |            URL            |
|-----------|------------|-------------|---------------------------|
| default   | hello-node |        8080 | http://192.168.49.2:30501 |
|-----------|------------|-------------|---------------------------|
* Starting tunnel for service hello-node.
|-----------|------------|-------------|------------------------|
| NAMESPACE |    NAME    | TARGET PORT |          URL           |
|-----------|------------|-------------|------------------------|
| default   | hello-node |             | http://127.0.0.1:52692 |
|-----------|------------|-------------|------------------------|
* Opening service default/hello-node in default browser...
! Because you are using a Docker driver on windows, the terminal needs to be open to run it.
Örnek
Şöyle yaparız. Burada vtctld2 dışarıya 3 NodePort sunuyor
>minikube service list
|-------------|-----------------------------------------|--------------|---------------------------|
|  NAMESPACE  |                  NAME                   | TARGET PORT  |            URL            |
|-------------|-----------------------------------------|--------------|---------------------------|
| default     | adv-vitess-cluster-az1-vtgate-498e7697  | No node port |
| default     | adv-vitess-cluster-az2-vtgate-9ea92c94  | No node port |
| default     | adv-vitess-cluster-etcd-07a83994-client | No node port |
| default     | adv-vitess-cluster-etcd-07a83994-peer   | No node port |
| default     | adv-vitess-cluster-vtctld-455ebae3      | No node port |
| default     | adv-vitess-cluster-vtgate-43485b64      | No node port |
| default     | adv-vitess-cluster-vttablet-87145749    | No node port |
| default     | adv-vtgate-az1                          | No node port |
| default     | adv-vtgate-az2                          | No node port |
| default     | kubernetes                              | No node port |
| default     | vtctld2                                 | port-1/15000 | http://192.168.49.2:30562 |
|             |                                         | port-2/15999 | http://192.168.49.2:31823 |
|             |                                         | port-3/3306  | http://192.168.49.2:30303 |
| kube-system | kube-dns                                | No node port |
|-------------|-----------------------------------------|--------------|---------------------------|

--url seçeneği
Örnek  - tunnel
Service ait sadece tunnel url'yi görmek ve daha sonra tarayıcı ile açmak için şöyle yaparız
>minikube service hello-node --url
* Starting tunnel for service hello-node.
|-----------|------------|-------------|------------------------|
| NAMESPACE |    NAME    | TARGET PORT |          URL           |
|-----------|------------|-------------|------------------------|
| default   | hello-node |             | http://127.0.0.1:52687 |
|-----------|------------|-------------|------------------------|
http://127.0.0.1:52687
! Because you are using a Docker driver on windows, the terminal needs to be open to run it.
2. kubectl port-forward Alternatifi
"minikube service" yerine "kubectl port-forward" kullanılır

Örnek
Şöyle yaparız. Artık servisimize http://127.0.0.1:30502/ adresinden erişebiliriz. Burada NodePort servisimiz 8080'i dinliyor. Biz de bunu dış dünyaya 30502 olarak açtık
>kubectl port-forward svc/hello-node 30502:8080
Forwarding from 127.0.0.1:30502 -> 8080
Forwarding from [::1]:30502 -> 8080
Eğer dış dünyaya da 8080 olarak açmak isteseydik şöyle yaparız
kubectl port-forward svc/hello-node 8080



20 Nisan 2022 Çarşamba

Kubernetes Master - Control Plane

Master Nod Bileşenleri Nedir?
Master Nod aynı zamanda Kubernetes Control Plane olarak ta adlandırılıyor. Açıklaması şöyle.
Kubernetes Control Plane
From a high level, a kubernetes architecture consists of a control plane (master), a distributed storage system for keeping the cluster state consistent (etcd), and a number of cluster nodes (Kubelets).
Master Node bileşenleri şöyle
The control plane is made up of five major components:
- Kube-apiserver
- Kube-controller-manager
- Kube-scheduler
- Etcd
- Cloud-controller-manager
Şeklen şöyle


Çoklu Master
Şekillerden de görülebildiği gibi Control Plane üzerinde birden fazla master olabilir. Açıklaması şöyle
Using multiple master nodes in your Kubernetes cluster lets you achieve high availability. If you have more masters, there is a lower likelihood of a failure that brings down your cluster.

Adding master nodes can also enhance performance because the critical Kubernetes components can leverage more hosting resources. For example, Kubernetes utilizes the shared resources of your masters to power the API server and scheduler. Thus, you can add one or several master nodes to boost your cluster’s performance.
Kube-apiserver Nedir?
Kubernetes API Server yazısına taşıdım.

Kube-scheduler 
Kubernetes Scheduler yazısına taşıdım.

Kube-controller-manager
Açıklaması şöyle. Worker'ları ve pod'ları izler. Eğer bir pod çökerse, kube-scheduler'ı kullanarak yeni pod yaratılmasını sağlar.
The Controller Manager is a daemon that runs the core control loops, watches the state of the cluster, and makes changes to drive status toward the desired state. The Cloud Controller Manager integrates into each public cloud for optimal support of availability zones, VM instances, storage services, and network services for DNS, routing and load balancing.
etcd Nedir? - Veri tabandır
Açıklaması şöyle. Cluster seviyesindeki tüm değişiklikleri kaydeder.
Consistent and highly-available key value store used as Kubernetes’ backing store for all cluster data.
If your Kubernetes cluster uses etcd as its backing store, make sure you have a back up plan for those data.
Açıklaması şöyle
Kubernetes uses etcd as it’s main backend database. It stores all configuration data in key-value format in etcd. If you lose etcd, your Kubernetes will stop working. Kubernetes uses etcd to store its actual state and desired state of the system. It then uses etcd watch functionality to monitor changes and based on that reconcile actual v/s desired state.
Açıklaması şöyle. Yani ekranda bilgi gösteren her şey etcd veri tabanından geliyor.
Basically, every info for a “kubectl get XXX" comes from the etcd server and is therefore rightly termed as the brain of any kubernetes cluster.
Cloud-controller-manager Nedir?
Açıklaması şöyle.
The cloud controller manager lets you link your cluster into your cloud provider’s API, and separates out the components that interact with that cloud platform from components that only interact with your cluster.
Note: If you are running Kubernetes on your own premises, or in a learning environment inside your own PC, the cluster does not have a cloud controller manager.
The following controllers can have cloud provider dependencies:
Node controller: For checking the cloud provider to determine if a node has been deleted in the cloud after it stops responding
Route controller: For setting up routes in the underlying cloud infrastructure
Service controller: For creating, updating and deleting cloud provider load balancers

13 Nisan 2022 Çarşamba

kubectl create deployment seçeneği

Giriş
Bu komutun sonucunu görmek için kubectl get deployments kullanılır

Açıklaması şöyle. Yani deploymen kaç tane pod istediğimizi belirtir.
A Deployment provides declarative updates for Pods and ReplicaSets. You describe a desired state in a Deployment, and the Deployment Controller changes the actual state to the desired state at a controlled rate. You can define Deployments to create new ReplicaSets or to remove existing Deployments and adopt all their resources with new Deployments.
deploy ve deployment aynı şey. Söz dizimi şöyle
kubectl create deployment NAME --image=image -- [COMMAND] [args...]
--image seçeneği
Örnek
Şöyle yaparız. Burada "kubectl expose ..." ile deployment için service oluşturuyoruz
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment hello-minikube --type=NodePort --port=8080
kubectl port-forward service/hello-minikube 7080:8080

kubectl get deployment hello-minikube -o yaml

kubectl delete deploy hello-minikube
Örnek
Şöyle yaparız
kubectl create deployment echoserver --image=k8s.gcr.io/echoserver:1.4

kubectl expose deployment echoserver --port 80 --target-port 8080
--port seçeneği
Açıklaması şöyle. Yani aslında sadece bilgi amaçlı bir seçenek.
As port has no effect on what’s running inside the pods and how to reach them (it’s purely informal), you could just omit this parameter. If you need to reach your pod on port 8080 from another pod, you still need to create a service :
Örnek
Şöyle yaparız. Burada "kubectl expose ..." ile deployment için NodePort service oluşturuyoruz
kubectl create deployment spring-boot-k8s --image=springboot-k8s-app:1.0 --port=8080

kubectl expose deployment spring-boot-k8s --type=NodePort
--replicas seçeneği
Örnek
Şöyle yaparız
# this is much faster

kubectl create deploy mydeploy --image=nginx --port=80 --replicas=4 

#than

kubectl create deployment mydeploy --image=nginx --port=80

kubectl scale deployment mydeploy --replicas=4
Örnek
Şöyle yaparız
$ kubectl create deployment test-deploy --image=nginx --replicas=3





4 Nisan 2022 Pazartesi

kubectl get secrets seçeneği

Giriş
Açıklaması şöyle.
The command to display available tokens
Şöyle yaparız
kubectl get secrets


kubectl create secret generic seçeneği

Giriş
kubectl get secret + service account 
ile ile secret'lar listelenir.

--from-file seçeneği
Örnek
Şöyle yaparız
kubectl create secret generic test --from-file=appsettings.json --dry-run -oyaml |
kubectl apply -f -
--from-literal seçeneği
Örnek
Şöyle yaparız
$ kubectl get secrets
$ kubectl create secret generic — help
$ kubectl create secret generic mysql — from-literal=password=root
$ kubectl get secrets mysql -o yaml
Örnek
Şöyle yaparız
kubectl create secret generic cassandra-admin-secret 
  --from-literal=username=cassandra-admin 
  --from-literal=password=cassandra-admin-password -n us-west4

Kubernetes Control Plane

Giriş
Açıklaması şöyle
... Kubernetes has a primary node — the control plane — which runs across multiple machines to provide fault-tolerance

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