24 Şubat 2021 Çarşamba

~/.bashrc Dosyası - Her Yeni Kabuk İçin Çalışır

Giriş
Açıklaması şöyle. Her etkileşimli kabuk (interactive shell) açıldığında bu dosya okunur
~/.bashrc is appropriate for aliases. ~/.bash_profile is run only for login shells, ~/.bashrc is run for every interactive shell. And, yes, you need to re-source ~/.bashrc after editing it to take immediate effect.
Açıklaması şöyle. ssh ile bağlanınca bu dosya normalde çalışır.
(man bash) Bash attempts to determine when it is being run with its standard input connected to a network connection, as when executed by the remote shell daemon, usually rshd, or the secure shell daemon sshd. If bash determines it is being run in this fashion, it reads and executes commands from ~/.bashrc, if that file exists and is readable. It will not do this if invoked as sh. The --norc option may be used to inhibit this behavior, and the --rcfile option may be used to force another file to be read, but neither rshd nor sshd generally invoke the shell with those options or allow them to be specified.
Dosyanın içinde şöyle bir satır var. Yani ".bash_aliases" dosyasını da okur
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi
Bu Dosyanın Değişmesini Engelleme
Bazı kurulumlardan sonra bu dosyaya bir şeyler eklenebiliyor. Bunu engellemek için şöyle yaparız
If you end your .bashrc with
return 0
Bash will ignore any lines added after that, since .bashrc is handled like a sourced script:

hexdump komutu

-C seçeneği
Şöyle yaparız
$ hexdump -C demo
00000000  51 cc b4 cc 91 cc 8d cc  89 cc 86 cc 89 cd 9d cd  |Q...............|
00000010  9b cc 91 cc 95 cc 82 cc  aa cc 98 cc b3 cc a3 cc  |................|
00000020  a2 cc 9e cc a9 cc aa 0a                           |........|
00000028

23 Şubat 2021 Salı

Kubernetes Autoscaler

Giriş
Kubernetes için 3 tane autoscaler var. Bunlar şöyle
1. Horizontal Pod Autoscaler : Pod sayınını ölçeklendirir
2. Vertical Pod Autoscaler : İşlemci ve belleği ölçeklendirir
3. Cluster Autoscaler : Cluster'a node eklemeyi ölçeklendirir
Cluster Autoscaler
Eğer cluster'da yeni pod için kaynak yoksa, horizontal autocaler zaten işe yaramaz.

Horizontal Pod Autoscaler
Kaç tane POD'un çalışması gerektiğine karar veren bileşenin ismi "Horizontal Pod Autoscaler". CPU ve bellek kullanımına bakarak bir formül çalıştırır. Açıklaması şöyle.
Kubernetes’ Horizontal Pod Autoscaler (HPA) automatically scales the application workload by scaling the number of Pods in deployment (or replication controller, replica set, stateful set), based on observed metrics like CPU utilization, memory consumption, or with custom metrics provided by the application. 

HPA uses the following simple algorithms to determine the scaling decision, and it can scale the deployment within the defined minimum and the maximum number of replicas. 

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
Örnek - CPU
Şöyle yaparız
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hello-world
  namespace: default
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: hello-world
  targetCPUUtilizationPercentage: 50

Scale To Zero
Şu anda sıfır POD'a indirmek desteklenmiyor. Açıklaması şöyle.
Kubernetes’ default HPA is based on CPU utilization and desiredReplicas never go lower than 1, where CPU utilization cannot be zero for a running Pod. This is the same behavior for memory consumption-based autoscaling, where you cannot achieve scale to zero. However, it is possible to scale into zero replicas if you ignore CPU and memory utilization and consider other metrics to determine whether the application is idle. For example, a workload that only consumes and processes a queue can scale to zero if we can take queue length as a metric and the queue is empty for a given period of time. Of course, there should be other factors to consider like lower latency sensitivity and fast bootup time (warm-up time) of the workload to have a smooth user experience. 

But, the current Kubernetes current stable release (v1.19) does not support scale to zero, and you can find discussions to support this in the Kubernetes enhancements gitrepo.

15 Şubat 2021 Pazartesi

8 Şubat 2021 Pazartesi

kubectl scale seçeneği

--replicas seçeneği
pos sayısını artırmak için şöyle yaparız
kubectl scale --replicas=5 deployment/backend
5 tane pod olduğunu görmek için şöyle yaparız
kubectl get pods
pod sayısını düşürmek için şöyle yaparız
kubectl scale --replicas=1 deployment/backend
statefulsets seçeneği
Örnek
Şöyle yaparız
kubectl scale statefulsets <stateful-set-name> --replicas=<new-replicas>

Kubernetes ClusterIP Service - Servise Sadece Cluster İçindeki Pod/Servisler Erişebilir

Giriş
Diğer Servisler arasındaki fark şöyle. Yani NodePort ve LoadBalancer servisi cluster dışına açar, ancak ClusterIP açmaz.
ClusterIP: Exposes the service on a cluster-internal IP. Choosing this value makes the service only reachable from within the cluster. This is the default ServiceType

NodePort: Exposes the service on each Node’s IP at a static port (the NodePort). A ClusterIP service, to which the NodePort service will route, is automatically created. You’ll be able to contact the NodePort service, from outside the cluster, by requesting <NodeIP>:<NodePort>.

LoadBalancer: Exposes the service externally using a cloud provider’s load balancer. NodePort and ClusterIP services, to which the external load balancer will route, are automatically created.
servisleri görmek için kubectl get services kullanılır. Sorgularsak çıktı olarak şuna benzer bir şey alırız
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes          ClusterIP   10.96.0.1        <none>        443/TCP          58d
mongodb             ClusterIP   10.105.147.168   <none>        27017/TCP        6s
springbootmongodb   NodePort    10.108.143.94    <none>        8080:31636/TCP   16m
kind : Service 
type: ClusterIP
şeklinde kullanılır. type: ClusterIP yazmak zorunlu değildir, çünkü varsayılan servis tipi budur

Örnek - ClusterIP
Şeklen şöyle

Deployment şöyle
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpc-server
  labels:
    app: grpc-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app: grpc-server
  template:
    metadata:
      labels:
        app: grpc-server
    spec:
      containers:
        - name: grpc-server
          image: techdozo/grpc-lb-server:1.0.0
Service şöyle
apiVersion: v1
kind: Service metadata: name: grpc-server-service spec: type: ClusterIP selector: app: grpc-server ports: - port: 80 targetPort: 8001
Bu servise erişmek isteyen bir başka kod şöyle yapar
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpc-client
  labels:
    app: grpc-client
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grpc-client
  template:
    metadata:
      labels:
        app: grpc-client
    spec:
      containers:
        - name: grpc-client
          image: techdozo/grpc-lb-client:1.0.0
          env:
            - name: SERVER_HOST
              value: grpc-server-service:80
Açıklaması şöyle
The SERVER_HOST environment variable point to the DNS of the service grpc-server-service.

Örnek ClusterIP
Deployment için şöyle yaparız. Burada  webcenter/activemq isimli registry'den activemq eğer zaten indirilmemişse, indiriliyor.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: queue
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: queue
    spec:
      containers:
      - name: web
        image: webcenter/activemq:5.14.3
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 61616
        resources:
          limits:
            memory: 512Mi
Önüne bir servis için şöyle yaparız
apiVersion: v1
kind: Service
metadata:
  name: queue
spec:
  ports:
  - port: 61616 
    targetPort: 61616
  selector:
    app: queue
Açıklaması şöyle
- you created a load balancer that exposes port 61616
- the incoming traffic is distributed to all Pods (see deployment above) that has a label of type app: queue
- the targetPort is the port exposed by the Pods

Kubernetes Pod File

Örnek
Şöyle yaparız
apiVersion: v1
kind: Pod                                            # 1
metadata:
  name: sa-frontend                                  # 2
spec:                                                # 3
  containers:
    - image: rinormaloku/sentiment-analysis-frontend # 4
      name: sa-frontend                              # 5
      ports:
        - containerPort: 80                          # 6
Açıklaması şöyle
1. Kind: specifies the kind of the Kubernetes Resource that we want to create. In our case, a Pod.
2. Name: defines the name for the resource. We named it sa-frontend.
3. Spec is the object that defines the desired state for the resource. The most important property of a Pods Spec is the Array of containers.
4. Image is the container image we want to start in this pod.
5. Name is the unique name for a container in a pod.
6. Container Port:is the port at which the container is listening. This is just an indicator for the reader (dropping the port doesn’t restrict access).

kubectl get nodes seçeneği

Örnek
Şöyle yaparız
kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     <none>    11m       v1.9.0
Örnek
Şöyle yaparız
$ minikube>~> kubectl get nodes
NAME           STATUS   ROLES                  AGE     VERSION
minikube       Ready    control-plane,master   4m36s   v1.21.2
minikube-m02   Ready    <none>                 3m36s   v1.21.2
minikube-m03   Ready    <none>                 2m55s   v1.21.2
minikube-m04   Ready    <none>                 2m11s   v1.21.2

7 Şubat 2021 Pazar

cpufrequtils

Örnek - Bir değeri değiştirmek
Açıklaması şöyle
vi /etc/default/cpufrequtils

make like this: GOVERNOR="performance"
Şöyle yaparız
sudo systemctl restart cpufrequtils