31 Ekim 2021 Pazar

Kubernetes Container Lifecycle Events

Lifecycle Hook
İki tane lifecycle hook var. Açıklaması şöyle
PostStart: This hook is executed right after a container is created. However, the hook might be invoked after the container's ENTRYPOINT is executed. The hook handler must not accept any parameters.

PreStop: This hook is executed immediately before a container is terminated due to any reason, such as resource contention, liveness probe failure, etc. You cannot pass any parameters to the handler, and the container will be terminated irrespective of the outcome of the handler.
Lifecycle Hook Handlers
Hook'a iki çeşit handler takabiliriz. Açıklaması şöyle
There are two types of handlers that you can attach to a lifecycle hook:

exec: It executes the specified command in the container's main process. The command is executed in parallel with the container's ENTRYPOINT instruction. If the hook takes too long or fails, the kubelet process will restart the container.

httpGet or tcpSocket: It sends an HTTP request or establishes a TCP socket connection against a specific endpoint on the container. Unlike the exec, which is executed by the container, this handler is executed by the kubelet process.
Örnek - postStart
Şöyle yaparız
apiVersion: v1
kind: Pod
metadata:
  name: sidecar-container-demo
spec:
  containers:
    - image: busybox
      command: ["/bin/sh"]
      args:
        [
          "-c",
          "while true; do echo echo $(date -u) 'Written by busybox sidecar container' >> /var/log/index.html; sleep 5;done",
        ]
      name: sidecar-container
      resources: {}
      volumeMounts:
        - name: var-logs
          mountPath: /var/log
      lifecycle:
        postStart:
          httpGet:
            path: /index.html
            port: 80
            host: localhost
            scheme: HTTP
    - image: nginx
      name: main-container
      resources: {}
      ports:
        - containerPort: 80
      volumeMounts:
        - name: var-logs
          mountPath: /usr/share/nginx/html
  dnsPolicy: Default
  volumes:
    - name: var-logs
      emptyDir: {}
Örnek - preStop
Şöyle yaparız
apiVersion: v1
kind: Pod
metadata:
  name: prestop-demo
spec:
  containers:
    - image: nginx
      name: nginx-container
      resources: {}
      ports:
        - containerPort: 80
      lifecycle:
        preStop:
          exec:
            command:
              - sh
              - -c
              - echo "Stopping container now...">/proc/1/fd/1 && nginx -s stop
  dnsPolicy: Default

30 Ekim 2021 Cumartesi

bash yönlendirme - redirection - Standard Output, Standard Error Birleştirme

Standard Output,  Standard Error Birleştirme Nedir
Açıklaması şöyle. Bu komut aslında bayağı karışık bir hal alabiliyor.
When you redirect something to &number, you are not opening a new file at all; you're reusing an already open file along with whatever mode it was opened.

The numbers refer to "open file" handles (file descriptors). So there is no technical difference between how >& and >>& (and indeed <&) would work – they all just mean "clone the existing file descriptor using dup()".

That is, 2>&1 indicates that file descriptor #1 (which you previously opened for appending using >>logfile) is cloned into number #2. And yes, 2<&1 works identically.
Bu yönlendirme POSIX uyumlu. Açıklaması şöyle.
So >out.txt 2>&1 is a POSIX-compliant way to redirect both standard output and standard error to out.txt.
Örnek
&>
veya
>&
şeklinde kullanılabilir. İlk kullanım tercih edilmeli. Şu kullanım ile aynıdır
>word 2>&1
1 - stdout
2 - stderr
akımlarıdır.

Bash'e özel
Bash'e özel şöyle yaparız
my_command_here arg1 arg2 |& less
Açıklaması şöyle
Note that |& is a Bashism. It does not work with /bin/sh (normally). If you want this in a portable shell script, use 2>&1 and a normal pipe instead.


Kullanım Örneleri
Klasik kullanımı daha kolay anlamak için birleştirme işlemlerini soldan başlayarak okumak lazım

Örnek
Klasik kullanım için şöyle yaparız. out.txt yeniden yaratılır ve hem stderr hem de stdout out.txt dosyasına yönlendirilir. Burada stderr çıktısı stdout'a yönlendiriliyor
my command > out.txt 2>&1  
Örnek - dev/null
Klasik kullanım için şöyle yaparız. Örnekte ise hem stdout hem de stderr /dev/null'a gönderiliyor. Böylece tüm çıktı /dev/null'a gönderilir. 
my command > /dev/null 2>&1  
Windows'ta /dev/null yerine sadece nul kullanılır.
your_dos_command 2> nul
Örnek - Biraz Karışık
Bu karışık kullanım C veya C++ dillerindeki pointer işlemlerine benziyor.  Eğer şöyle yaparsak, soldan okumaya başlarsak stderr önce stdout'a yönlendirilir, daha sonra stdout /dev/null'a gönderilir. Ancak stderr'i değiştirmedik. Yani halen stderr çıktısını ekranda görürüz.
command 2>&1 1>/dev/null
Benzer bir örnek şöyle
$ ( echo "this is stdout"; echo "this is stderr" >&2 ) 1>foo 2>&1 1>bar
$ cat foo
this is stderr
$ cat bar
this is stdout
Açıklaması şöyle
We can see that 2>&1 sends stderr to the "foo" file that stdout was redirected to, but when we redirect stdout to "bar" we don't alter stderr's destination. 

Örnek
Yönlendirmeyi kaldırmak için şöyle yaparız
exec 3>&-
Örnek
Şöyle yaparız. Burada stdout açıkça out.txt dosyasına yönlendiriliyor. stderr ise stdout'a yönlendiriliyor. Yani her şey out.txt dosyasına yazılıyor
my command 1 > out.txt 2>&1  
Örnek
Aynı şeyi şöyle yaparız.
my command &> out.txt
Örnek
Aynı şeyi şöyle yaparız.
my command 1>>out.txt 2>>out.txt
Örnek
Sadece bazı komutların çıktısını stdout'a diğerlerini /dev/null'a yönlendirmek için şöyle yaparız. exec bir bash built-in komutu
exec 3>&1 &>/dev/null
some_command
another_command
command_you_want_to_see >&3
command3
Açıklaması şöyle
You can use the exec command to redirect everything for the rest of the script.

You can use 3>&1 to save the old stdout stream on FD 3, so you can redirect output to that if you want to see the output.

29 Ekim 2021 Cuma

sed komutu

Giriş
sed kelimesi "stream editor" demek. Dosyadan okur ve bir şeyi değiştirerek ekrana basar. Eğer dosyayı değiştirmek istersek "-i" seçeneği ile çalıştırmak gerekir.

Birden Fazla Kademeli Sed
Noktalı virgül ile ayırırız. 
Örnek
Şöyle yaparız. Burada her kademe teker teker uygulanıyor
 sed 's/@/@A/g; s/\t/@B/g'
Örnek
Şöyle yaparız. Burada farklı olarak {...} kullanılıyor. Eşleşen kısım önce print ediliyor, daha sonra substitute ediliyor.
 sed '/é/{p;s//e/g;}'
Cümle Başına Konulan İşlemler
s/ İle Substitute
Cümlenin başına s koyarız

Örnek - Replace With Empty String
Baştaki 0 ve : karakterlerinden kurtulmak için şöyle yaparız
sed 's/^[0:]*//' file
Elimizde şöyle bir dosya olsun
00:00:30
00:01:30
00:30:00
01:30:00
30:00:00
Çıktı olarak şunu alırız
30
1:30
30:00
1:30:00
30:00:00
Örnek - Capture
Şöyle yaparız. Burada ilk 80 karakter yakalanıyor ve \1\n ile çıktıya veriliyor.
echo "..." | sed -E 's/(.{80}[^ ]*) /\1\n/g'

y/ İle Substitute
Cümlenin başına y koyarız. Açıklaması şöyle
... if your replacements are all single-character replacements, the y command is more efficient
Örnek
Şöyle yaparız. Eşleşen kısım önce print ediliyor, daha sonra substitute ediliyor.
 sed '/é/{p;y/é/e/;}'
Cümle Sonuna İşlemler
/d ile Delete
Cümlenin sonuna /d koyarız

/g ile Global
Normalde set satırdaki ilk eşleşmeyi bulup işini bitirince bir sonraki satıra geçer. Tüm eşleşmelerde iş yapsın istiyorsak cümlenin sonuna /g koyarız

/i ile Insensitive
Case insensitive olsun istersek cümlenin sonuna /i koyarız

/p ile Print
Cümlenin sonuna /p koyarız
Örnek
DEFINE ile başlayan satırları yazdırmak için şöyle yaparız. -n seçeneği sadece eşleşen satırları çıktı olarak verir
sed  -n -e '/^DEFINE/p' *.*
/q ile Quit
Cümlenin sonuna /q koyarız

Komut Seçenekleri
-E seçeneği
Sanırım düzenli ifade olduğunu belirtir

-n seçeneği
Sadece eşleşen satırları çıktı olarak verir

18 Ekim 2021 Pazartesi

/proc/PID/cmdline - procfs Dosya Sistemi

Giriş
Uygulamaya verilen komut satırı parametreleri okunabilir. Açıklaması şöyle
The overall accessibility and visibility of /proc/${pid} (including /proc/${pid}/cmdline) can be controlled using proc’s hidepid mount option, which was added in version 3.3 of the kernel. The gid mount option can be used to give full access to a specific group, e.g. so that monitoring processes can still see everything without running as root.

pvresize komutu

--setphysicalvolumesize seçeneği
Şöyle yaparız
pvresize /dev/vda2 --setphysicalvolumesize 132g

12 Ekim 2021 Salı

Kubernetes Probe'ları

Giriş
Kubernetes uygulamanın sağlıklı, hazır ve başladığını anlamak için 3 tane probe kullanır. Bunlar şöyle
liveness probe
readiness probe
startup probe
Açıklaması şöyle
Kubernetes has built-in probes for determining whether or not a Pod is alive and ready to serve incoming requests. This is known as the Health Check pattern, which is is supported in Quarkus using the SmallRye Health extension. The SmallRye Health extension is an implementation of the MicroProfile Health specification

Spring Boot applications can use the Kubernetes probes included in the Spring Boot Actuator starter; however, the Spring Boot Actuator only provides the endpoints and doesn't generate the necessary configuration or the required Kubernetes manifests. They will need to be created manually.

10 Ekim 2021 Pazar

sudoedit komutu

Örnek
Editor olarak VS Code kullanmak istiyorsak şöyle yaparız
SUDO_EDITOR="/snap/bin/code --wait" sudoedit /etc/fstab
Açıklaması şöyle. Yani sudoedit dosyanın kopyasını alır
Or you can use the sudoedit (or sudo -e) command, which works the same way as running 
crontab -e (where you edit a temporary file that are copied to the destination when you're 
done):

sudoedit /etc/hosts



8 Ekim 2021 Cuma

~/.inputrc Dosyası

Giriş
Bazı tuşlara kısa yol atamak için kullanılabilir.

Örnek
Şu satırı ekleriz. Böylece Ctrl + u tuşlarına basarsak bir üst dizine çıkarız
Control-u: "cd ../\n"

openssl rand aracı - Random Byte Üretir

Giriş
Random byte üretir. Açıklaması şöyle
SYNOPSIS
       openssl rand [-help] [-out file] [-rand file...]  [-writerand file]
       [-base64] [-hex] num

DESCRIPTION
   This command generates num random bytes using 
   cryptographically secure pseudo random number generator (CSPRNG).

Örnek
Şöyle yaparız.  20 tane hexadecimal sayı üretir.
$ /usr/bin/openssl rand -hex 20
51b40b347dfccefa9b4f8a13d36c4564760c2f82
Örnek
Şöyle yaparız.  741 byte'lık veri üretir.
/usr/bin/openssl rand -base64 741 > $TMPFILE
Örnek
Şöyle yaparız. 14 byte'lık rastgele veri üretir. Bunu da Base64 olarak kodekler.
openssl rand -base64 14

Kubernetes Ingress Service

Giriş
Açıklaması şöyle. OpenShift terminolojisinde Ingress yerine Route kelimesi kullanılıyor.
Ingress is actually NOT a type of service. Instead, it sits in front of multiple services and act as a “smart router” or entrypoint into your cluster.
Şeklen şöyle. Burada ingress olarak nginx kullanılıyor.


Örnek
Şöyle yaparız
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
   ingress.kubernetes.io/rewrite-target: /
 name: web-ingress
spec:
  rules:
  - host: kubernetes.foo.bar
    http:
      paths:
      - backend:
          serviceName: appsvc
          servicePort: 80
        path: /app
Daha sonra /etc/nginx.conf şöyle yaparız
server {
    server_name kubernetes.foo.bar;
    ...
}

7 Ekim 2021 Perşembe

Helm - The Kubernetes Package Manager

Helm Nedir
Açıklaması şöyle
Helm is a software package manager similar to the DNF package manager in Fedora and the Windows Package Manager. Package managers allow developers to install software tools and maintain them (e.g., upgrade, delete, and patch) quickly using a command-line interface or graphical user interface (GUI).

Developers can install a particular collection of files representing Kubernetes resources by using a Helm chart. When the chart is installed, it is managed by a release. The developer can delete or upgrade the release on demand to make application deployment changes.
Açıklaması şöyle
The deployment of a microservice to a K8s cluster might become challenging as it is related to creating a number of various K8s resources such as pods, replica sets, services, config maps, secrets, etc. Helm helps with that.
Nasıl Çalışır
Açıklaması şöyle. Yani Helm ile değişkenler farklı bir yaml dosyasında tanımlanıyor. Helm bu değerleri şablon yalm dosyalarında kullanıyor
The basic idea of Helm is to enable reusability of Kubernetes YAML artifacts through templatization. Helm allows defining Kubernetes YAMLs with marked up properties. The actual values for these properties are defined in a separate file. Helm takes the templatized YAMLs and the values file and merges them before deploying the merged YAMLs into a cluster. The package consisting of templatized Kubernetes YAMLs and the values file is called a ‘Helm chart’. Helm project has gained considerable popularity as it solves one of the key problems that enterprises face — creating custom YAMLs for deploying the same application workload with different settings, or deploying it in different environments (dev/test/prod).
Kurulum
Şöyle yaparız
# Linux - Çalışmıyor
sudo snap install helm --classic

# Mac
brew install kubernetes-helm

# Windows - Çalışıyor
choco install kubernetes-helm
Helm 2 vs Helm 3
Açıklaması şöyle
Helm had major shift from server-side architecture (Helm v2) to client-side architecture (Helm v3). Tiller was the server-side component that managed Helm Charts and later it moved to a client-side model where all operations are perform via the Helm 3 CLI while relying on k8s RBAC for authorization and security features.
Şeklen şöyle Yani Tiller bileşeni kaldırılmış


Genel Kullanım
Örnek
Şöyle yaparız
helm create ...
helm upgrade ...
helm history ...
Örnek
Şöyle yaparız
helm create helm-myapp
helm lint helm-myapp
helm package helm-myapp helm install helm-myapp-0.1.0.tgz helm list
Şeklen şöyle


Chart
Helm terminolojisinde bir uygulamayı kubernetes'e kurmak için gereken tüm farklı kubernetes kaynaklarını temsil eder. Deployment + Service + Volume vs. gibi. Bunları hepsi bir chart altında toplanır

helm komutu yazısına bakabilirsiniz

Helm Chart Repositories
Açıklaması şöyle
A Helm chart repositories or REPO is a simple HTTP site that serves an index.yaml file and .tar.gz packaged charts. The helm command has subcommands available to help package charts and create the required index.yaml file. These files can be served by any web server, object storage service, or a static site host such as GitHub Pages.

Helm normally comes with pre-defined Charts which can be found Git Hub Repository

Alternate repos can be added with the helm repo add command. Some popular alternate repositories are Bitnami Helm Charts which provide some charts that aren’t covered in the official stable repo.
Örnek
Şöyle yaparız
$ mkdir charts
$ helm package ansible -d charts
Successfully packaged chart and saved it to: charts\ansible-0.1.tgz

$ helm repo index charts

index.yaml şöyledir
apiVersion: v1
entries:
  ansible:
  - apiVersion: v1
    appVersion: "1.1"
    created: "2021-08-02T10:25:28.8208129+05:30"
    description: Helm Chart for Ansible.
    digest: 7f02792923971dbdbc0478bc3180ee7cd6ea3623bb1c5666d6a827c62ee6560d
    name: ansible
    urls:
    - ansible-0.1.tgz
    version: "0.1"
generated: "2021-08-02T10:25:28.7883963+05:30"


3 Ekim 2021 Pazar

clock_gettime metodu

Giriş
Şu satırı dahil ederiz.
#include <time.h>
clock_gettime ile birçok saat çeşidi gelmektedir.
Açıklaması şöyle
POSIX only requires that CLOCK_REALTIME be present, other clocks are optional.
Monotonic Saat - CLOCK_MONOTONIC
Örnek
Şöyle yaparız
clock_gettime(CLOCK_MONOTONIC, & spec);
Örnek
Şöyle yaparız.
struct timespec start, end;
for(i = 0; i < pkt_count; ++i)
{

  clock_gettime(CLOCK_MONOTONIC, &start);        
  ...
  clock_gettime(CLOCK_MONOTONIC, &end);        

  printf("%.3f ", timespec_diff_usec(&end, &start));
}   
timespec_diff_usec() metodu burada tanmlı.

Monotonic Saat - CLOCK_MONOTONIC_RAW
CLOCK_MONOTONIC_RAW Linux'a mahsus bir saat ve direkt donanımla konuştuğu yazılı ancak bu cümleden tam ne kast ediliyor bilmiyorum.
Örnek
Şöyle yaparız.
struct timespec tp;
clock_gettime(CLOCK_MONOTONIC_RAW, &tp);
Sistem Saati - CLOCK_REALTIME
Epoch'tan beri geçen süreyi yani UTC saati almak için CLOCK_REALTIME saatini kullanmak gerekir. Bu metod ile saniye + nanosaniye seviyesinde ölçüm yapmak mümkündür. Yani gettimeofday metoduna göre daha hassastır.
Bu metod sonucu ikinci parametre olan struct timespec'i doldurarak verir.
Örnek
Şöyle yaparız
#include <unistd.h>
#include <time.h>

int main()
{
    // Çıktı olarak 876,764,530 saniye döner
    printf("time returns %d seconds\n", time(NULL);)
   
    //Çıktı olarak 876,764,530 saniye 000,0674,633 nanosaniye döner
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    printf("%d seconds and %ld nanoseconds\n", ts.tv_sec, ts.tv_nsec);
}
Örnek
Bir başka örnekte ise sistemin verdiği saati 5 saniye ileri alınıyor.
struct timespec start;
clock_gettime(CLOCK_REALTIME, &start); start.tv_sec+=5; //5 saniye ileri al
Örnek
Şöyle yaparız.
struct timespec  ts;

if (clock_gettime(CLOCK_REALTIME, &ts))
{
  ...  
}
Örnek
clock_gettime POSIX eş zamanlılık API'leri ile kullanılır. Şöyle yaparız.
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!my_condition && ret == 0)
  ret = pthread_cond_timedwait (&cond, &mutex, &ts);
Kullanılan CPU Saati - CLOCK_PROCESS_CPUTIME_ID
Açıklaması şöyle. Uygulamanın kullandığı CPU zamanını ölçer.
Most operating systems have some clocks that will only count while your process is running. These are not standardized, but on POSIX systems you could consider using clock_gettime() with CLOCK_PROCESS_CPUTIME_ID.
Örnek
Şöyle yaparız
timespec time1, time2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
...
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);