27 Aralık 2020 Pazar

Demilitarized Zone - DMZ

DMZ'nin Amacı Nedir?
Açıklaması şöyle. Yani sunucularımıza nasıl olsa saldırı olacak ancak tüm kurumdaki bilgisayarları da aynı tehlikeli bölgeye koymaya da gerek yok.
The reason to have a DMZ -- the purpose to all this isolation -- is to keep the public, internet facing services in a place that their compromise doesn't expose your entire enterprise. The DMZ is where you put the "dirty" systems -- the things people are going to attack. They're kept in their own network with their own set of extremely restrictive access rules where they can be monitored diligently.
DMZ'de bulunan bir web sunucu, iç ağda bulunan veri tabanına erişebilir. Böylece veri tabanı internete açılabilir. 

Genellikle iki çeşit DMZ konfigürasyonu var
1. Tek firewall kullanan DMZ
2. Çift firewall kullanan DMZ

Tek Firewall Kullanan DMZ
Açıklaması şöyle
The firewall has three interfaces each attached to a network. Hosts in the DMZ would need to traverse the firewall to reach systems in the private network,... . The private network can access the Internet and the DMZ to use its services or manage the servers.
Çift Firewall Kullanan DMZ
Genellikle şöyledir
Firewall 1<--> Sunucular (DMZ) <--> Firewall 2<--> Şirket İç Ağı
Açıklaması şöyle
Other DMZ designs use two serial firewalls, with the DMZ in between. This setup is more complicated but adds another layer of security. In the first design, if the firewall is compromised due to a vulnerability or is somehow misconfigured the private network might be exposed to attacks. With two firewalls between the external and the private network now two devices would need to be compromised to get access. We can add even more security employing two different firewall vendors so an exploit found in one is unlikely to be present in the other, although this also adds more complexity.
Açıklaması şöyle
Having one firewall for internal LANs, and one for DMZ(s) does provide greater isolation between the two. The DMZ(s) can be completely, physically, isolated from the rest of the enterprise. Rarely is that level of security and isolation required. (military, banks, etc.) 

24 Aralık 2020 Perşembe

kubectl get services seçeneği

Giriş
get services ve get svc aynı şeyler. 5 tane sütunlu bir çıktı verir. service ve pod farklı şeyler. Farkını gösteren bir şekil burada. Servis podlar tetikleyen yapıdır.
+---------------------+
| hello-world-service |
|                     |
|    10.15.242.210    |
+---------O-----------+
          |
          +-------------O--------------------------O
                        |                          |
              +---------O-----------+    +---------O-----------+
              |        pod 1        |    |        pod 2        |
              |                     |    |                     |
              |     hello-world     |    |     hello-world     |
              +---------------------+    +---------------------+
Örnek
Şöyle yaparız
kubectl get services --namespace yb-demo
Örnek
Şöyle yaparız
$ kubectl get svc
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
hello-world-service   ClusterIP   10.15.242.210   <none>        8080/TCP   5s
kubernetes            ClusterIP   10.15.240.1     <none>        443/TCP    7h
Örnek
Şöyle yaparız
kubectl get svc
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
sa-frontend-lb   LoadBalancer   10.101.244.40   <pending>     80:30708/TCP   7m

16 Aralık 2020 Çarşamba

snap komutu - Package Manager

Giriş
snap paketlerinin çıkış noktası .deb paketlerinin sadece tek bir Linux türevi ve sürümü için çalışması. Açıklaması şöyle
In Linux, packages are specifically built for a single version of a single distribution. With a lot of tweaking, it is possible to make one .deb package that runs on all Debian based systems, but this is complicated and limits developers.

If I create a deb package for Ubuntu 20.04, it will only work on that version. I also have to make a different package for 16.04, 18.04, 19.10 and so on. I already have to make four packages just for Ubuntu. I also need to make one for every Debian version, every Fedora version and every openSUSE version.

This means if I want to release a new version of my application, I have to create over 20 packages to cover the majority of Linux distributions, and that still won't cover every distro.
snap ile amaç snap paketleme sistemini kullanan her sistemde çalışacak tek bir paket yaratmak. 
Bu yüzden snap paketleri biraz daha büyük oluyor. Açıklaması şöyle
Difference between the packages

- APT packages are compiled and tested for a specific version of Ubuntu. During the lifetime of the Ubuntu version, the LibreOffice version will essentially remain the same. Only minor security updates are provided.

- snap versions, on the other hand, are containerized and thus will run in a range of Linux distributions without change. That is a significant advantage of the latter packaging version. That also makes it much more manageable to regularly update the package. Therefore, you will typically see that the snap is a newer version. A disadvantage is that snaps use more disk space and, currently, still are somewhat slower during initial startup.
Snap Alternatifleri
- "GNOME Software Center" kullanılabilir.
- "Ubuntu Software Center" kullanılabilir.
- Pip ve apt zaten diğer çok bilinen Package Manager'lar. Açıklaması burada.

Bu Nasıl Mümkün Oluyor?
debian paketleri bağımlı oldukları her dosyayı içermezler. snap paketleri ise yekpare bir pakettir. İhtiyaç duydukları her şeyi beraberinde getirir. Açıklaması şöyle
Snappy package contains all the required files, where .deb packages have dependencies to other packages.

The negative side is that snappy is bigger because it contains all the files. But the big advantage is that you don't get in trouble with other packages and if you remove this package, no other package will be affected by missing dependencies.
install seçeneği
Örnek
Şöyle yaparız
snap install onlyoffice-desktopeditors
Örnek
Şöyle yaparız
sudo snap install libreoffice
list seçeneği
Örnek
Şöyle yaparız
snap list
purge seçeneği

remove seçeneği
remove seçeneği ile alt seçenekler de kullanılabilir. Açıklaması şöyle
[remove command options]
      --no-wait     Do not wait for the operation to finish but just print the change id.
      --revision=   Remove only the given revision
      --purge       Remove the snap without saving a snapshot of its data
Örnek
snap yeteneğini tamamen kaldırmak için şöyle yaparız
sudo snap remove snap-store
Örnek
Şöyle yaparız. Burada --purge kullanılıyor
snap remove firefox --purge
Örnek
Şöyle yaparız
sudo snap remove vlc

sudo apt update && sudo apt install vlc








chroot komutu

Giriş
chroot bir Linux sistem çağrısıdır. Çalışan bir uygulamanın kök dizininin değiştirilmesini sağlar. chroot daha çok uygulamalar için sanal bir ortam hazırlamak için kullanılır. Bu sanal ortama chroot jail adı verilir.

Kodla
Örnek
Şöyle yaparız
#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
const char newroot[]="/path/to/chroot";
int main(int c, char **v, char **e) {
    int rc; const char *m;
    if ( (m="chdir" ,rc=chdir(newroot)) == 0
      && (m="chroot",rc=chroot(newroot)) == 0
      && (m="setuid",rc=setuid(getuid())) == 0 )
            m="execve", execve(v[1],v+2,e);
    perror(m);
    return 1;
}
Örnek
Yeni bir dizin yaratalım
mkdir -p /home/foo
/bin/bash uygulamalasını tüm dependency kütüphaneler ile bu dizine kopyalayalım ve çalıştıralım
chroot /home/foo /bin/bash
Yeni açılan bash sanal bir ortamda çalıştığı için diğer hiç bir uygulamayı (ls,mkdir gibi) bulamaz. 
Çıkmak için exit komutunu kullanırız.

 --userspec seçeneği
Açıklaması şöyle
Although you need to invoke chroot as root, the chroot option --userspec=USER:GROUP will run the command under the non-root UID/GID.

6 Aralık 2020 Pazar

dhcpd

Giriş
Konfigürasyon dosyası burada
/etc/dhcp/dhcpd6.conf
Örnek
Şöyle yaparız
default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.name-servers 3ffe:501:ffff:100:200:ff:fe00:3f3e;
option dhcp6.domain-search "test.example.com","example.com";
option dhcp6.info-refresh-time 21600;

ddrescue komutu

Giriş
fill-mode seçeneği
Açıklaması şöyle
When ddrescue is invoked with the option --fill-mode it operates in "fill mode", which is different from the default "rescue mode". That is, in "fill mode" ddrescue does not rescue anything. It only fills with data read from infile the blocks of outfile whose status character from mapfile coincides with one of the type characters specified in the argument to --fill-mode.

[…]

In fill mode mapfile is updated to allow resumability when interrupted or in case of a crash, but as nothing is being rescued mapfile is not destroyed. The status line is the only part of mapfile that is modified.

[…]

Example 2: Wipe only the good sectors, leaving the bad sectors alone. This way, the drive will still test bad (i.e., with unreadable sectors). This is the fastest way of wiping a failing drive, and is especially useful when sending the drive back to the manufacturer for warranty replacement.
Örnek
Şöyle yaparız
ddrescue --fill-mode=+ --force /dev/zero bad_drive mapfile

rev komutu - reverse İçindir

Giriş
Bu komut standart bi komut değil. Ayrıca kurmak gerekiyor. 
Verilen girdiyi tersine çevirir.

Örnek
Bir satıdaki en sonuncu tab delimited alanı almak için şöyle yaparız
rev | cut -f 1 | rev


1 Aralık 2020 Salı

openssl req aracı İle Self Signed Certificate Üretmek

Giriş
Self signed certificate üretmek için kullanılabilecek araçlardan birisi de openssl req komutu. Açıklaması şöyle.
This option outputs a self signed certificate instead of a certificate request. This is typically used to generate a test certificate or a self signed root CA.
Üretilen sertifika x509 formatında. Bu sertifikanın içine bakmak için "openssl x509" komutu kullanılabilir.

Örnek
Sertifikaya bakmak için şöyle yaparız
openssl x509 -in myserver.crt -text -noout

Java'daki keytool İle Karşılaştırması
Java'daki keytool private key ve sertifikayı tek bir dosya içinde kolayca topluyor. Bu dosya java uygulamalarından rahatça kullanılıyor. 

Ancak "openssl req" aracı iki tane farklı dosya üretiyor. 

Komut Çıktısı
İki tane dosya çıktısı olur "cert.pem" ve "privatekey.pem". Bu dosyalara bezen ".crt" ve ".key" uzantıları da veriliyor. Bir tanesi sertifika, diğeri de private key dosyasıdır.

Private key dosyasında modulus + public exponent + private exponent bilgisi vardır. Private key dosyasını incelemek için openssl rsa aracı kullanılabilir.

Pem Formatında Sertifikanın İçi
cert.pem şöyledir.
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Pem Formatında Private Key Dosyasının İçi
privatekey.pem şöyledir.
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,58E20DDB682C7B7A
...
-----END RSA PRIVATE KEY-----
Açıklaması şöyle
encoded and created in a Base-64 based PEM format which is not human-readable
Seçenekler
days :seçeneği ile sertifikanın kaç gün geçerli olacağı belirtilir.
newkey :seçeneği ile kullanılacak algoritma belirtilir. Genellikle rsa:1024 , rsa:2048 , rsa:4096 seçilir.
sha256 :  Sertifika içinde kullanılacak Signature Algorithm 'in ne olacağını belirtir. Bu parametre mecburi değildir. Basit bir açıklama şöyle
... the server sends a chain of certificates. Each certificate in the chain contains a public key, a name (a domain for the server, an organization name for a CA), some extra information, and a signature covering all that. The signature was created by the private key of the next certificate in the chain, and can be verified by that certificate's public key.
nodes : Açıklaması şöyle. Private key dosyasının şifrelenmemesini sağlar.
The option -nodes is not the English word "nodes", but rather is "no DES". When given as an argument, it means OpenSSL will not encrypt the private key in a PKCS#12 file.
keyout :seçeneği ile private key dosyası belirtilir.
out : seçeneği ile sertifika dosyası belirtilir.
x509: openssl req ile CSR veya sertifika üretilebilir. Sertifika üreteceğimizi belirtir.

1. -new seçeneği
Burada sadece -new seçeneği belirtiliyor. -newkey belirtilmiyor yani kullanılacak algoritmayı seçmiyoruz.
Örnek
Şöyle yaparız
openssl req -nodes -new -x509 -keyout private.pem -out server.cert
Çıktı olarak şunu alırız
Generating a 2048 bit RSA private key
..................................+++
..................................................................+++
writing new private key to 'private.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields, but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:US
State or Province Name (full name) []:IN
Locality Name (eg, city) []:Zionsville
Organization Name (eg, company) []:JVC
Organizational Unit Name (eg, section) []:Development
Common Name (eg, fully qualified host name) []:Planning Poker
Email Address []:<my-email-address-was-entered-here>
2. -newkey seçeneği
Kullanılacak algoritmayı seçiyoruz
Örnek -  rsa:4096
Şöyle yaparız
openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out
MyCertificate.crt -keyout MyKey.key
Örnek  rsa:2048
Şöyle yaparız.
openssl req -x509 -nodes -days 1825 -newkey rsa:2048 \
-keyout private/vsftpd.key \
-out certs/vsftpd.crt
Örnek - rsa:2048
Şöyle yaparız.
openssl req -x509 -newkey rsa:2048 -keyout privatekey.pem -out cert.pem -days XXX
Örnek  - rsa:2048
Şöyle yaparız.
openssl req -x509 -newkey rsa:2048 -keyout privatekey.pem -out cert.pem -days 30
Örnek - rsa:2048
Şöyle yaparız
openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \
  -keyout localhost-privatekey.pem -out localhost-certificate.pem
Örnek - rsa:1024
Host ismi vermek için şöyle yaparız
openssl req -x509 -newkey rsa:1024 -keyout privatekey.pem -out cert.pem -days 999
  -subj "/CN=localhost"
3. -keyout seçeneği
Örnek
Şöyle yaparız
openssl req -new \
    -newkey rsa:4096 \ # Kullanılacak algoritma
    -nodes \ # Private key dosyasını şifreleme
    -x509 \ # Self signed sertifika üret
    -days 3650 \  # 10 yıl geçerli olsun
    -keyout self_signed.key \ #Private key dosyası
    -out self_signed.pem \ # Sertifika dosyası
    -subj '/CN=TestCertificate/C=US/ST=CA/L=SF/O=Test' # Sertifikaya girdi

4. -key seçeneği
Örnek
Normalde private key vermeye gerek yoktur. Eğer kendimiz vermek istersek şöyle yaparız
# Generate private key
openssl genrsa -des3 -out myCA.key 2048
# Generate root certificate
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 825 -out myCA.pem
# Convert to Botan Format
openssl pkcs8 -topk8 -in myCA.key > myCAKey.pkcs8.pem

find komutu path seçeneği - glob/wildcard Kullanır

Giriş
Aranacak dizin ismini belirtir. Wildcard kullanılabilir. Başlanılan dizin çıktıya dahil edilir. Açıklaması şöyle
find includes the directories from which it starts
Örnek
Çıktıda . karakteri olduğunu görmek için şöyle yaparız
$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
Örnek
Çıktıda . yani başlangıç dizinini görmek istemiyorsak "-not -path ." veya "! -path ." şeklinde kullanırız. Şöyle yaparız
find . -maxdepth 1 -not -path . | wc -l
find $HOME -maxdepth 1 -not -path $HOME | wc -l
Örnek
Elimizde şöyle bir dizin yapısı olsun
a
├── b
│   └── e
├── c
│   └── e
└── d
Sadece c dizini içindeki e dizinlerini bulmak için şöyle yaparız
$ find . -path '*/c/e'
./a/c/e
Örnek
mp3 dosyalarını bir üst dizine taşımak için şöyle yaparız.
find . -path "*/flac/*" -name '*.mp3' -execdir mv -t ../ {} +

13 Kasım 2020 Cuma

Kubernetes Deployment File

Giri
Bazı notlarım şöyle

Deployment Nedir?
Açıklaması şöyle. Kaç tane Pod istediğimizi belirtiriz.
Although pods are the basic unit of computation in Kubernetes, they are not typically directly launched on a cluster. Instead, pods are usually managed by one more layer of abstraction: the deployment.
A deployment’s primary purpose is to declare how many replicas of a pod should be running at a time. When a deployment is added to the cluster, it will automatically spin up the requested number of pods, and then monitor them. If a pod dies, the deployment will automatically re-create it.
Pod ve Service Registry
Açıklaması şöyle
“Service” in Kubernetes serves the purpose of service discovery. If I deploy service with the name as name:shoppingcart-service and selector as app:shoppingcart-service-pod , all the pods having this as a label will be considered as a set of available pods for the shoppingcart-service .

The controller for the service selector continuously scans for pods that match its selector app:shoppingcart-service and then post any updates to an endpoint object also named shoppingcart-service. Kubernetes assigns this endpoint an IP address. The service is also associated with a DNS name.

Kubernetes provides in-built health check options, where it keeps a check on the health of all the available pods. If a pod is found unhealthy, it deregisters it from the list of service pods.
Örnek
Şöyle yaparız
apiVersion: extensions/v1beta1
kind: Deployment                                          # 1
metadata:
  name: sa-frontend
spec:
  selector:                                               # 2
    matchLabels:
      app: sa-frontend  
  replicas: 2                                             # 3
  minReadySeconds: 15
  strategy:
    type: RollingUpdate                                   # 4
    rollingUpdate: 
      maxUnavailable: 1                                   # 5
      maxSurge: 1                                         # 6
  template:                                               # 7
    metadata:
      labels:
        app: sa-frontend                                  # 8
    spec:
      containers:
        - image: rinormaloku/sentiment-analysis-frontend
          imagePullPolicy: Always                         # 9
          name: sa-frontend
          ports:
            - containerPort: 80
Açıklaması şöyle
1. Kind: A deployment.
2. Selector: Pods matching the selector will be taken under the management of this deployment.
3. Replicas is a property of the deployments Spec object that defines how many pods we want to run. So only 2.
4. Type specifies the strategy used in this deployment when moving from the current version to the next. The strategy RollingUpdate ensures Zero Downtime deployments.
5. MaxUnavailable is a property of the RollingUpdate object that specifies the maximum unavailable pods allowed (compared to the desired state) when doing a rolling update. For our deployment which has 2 replicas this means that after terminating one Pod, we would still have one pod running, this way keeping our application accessible.
6. MaxSurge is another property of the RollingUpdate object that defines the maximum amount of pods added to a deployment (compared to the desired state). For our deployment, this means that when moving to a new version we can add one pod, which adds up to 3 pods at the same time.
7. Template: specifies the pod template that the Deployment will use to create new pods. Most likely the resemblance with Pods struck you immediately.
8. app: sa-frontend the label to use for the pods created by this template.
9. ImagePullPolicy when set to Always, it will pull the container images on each redeployment.
Deployment Örnekleri
metadata/name Alanı
Kubernetes tarafından kullanılan deployment ismini belirtir
Örnek
Şöyle olsun
apiVersion : apps/v1
kind: Deployment
metadata:
  name: simple-app-deployment
...
Şöyle yaparız
kb get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
simple-app-deployment 2/2 2 2 2m23s
spec/replicas Alanı
ReplicaSet Nedir

Açıklaması şöyle. spec/replicas altında belirtilir
Bir poddan kaç tane olacağını replicaset ile belirtiyoruz. İstediğiniz anda bir pod’u kesintisiz bir şekilde scale edebilir yada azaltabiliriz.
Örnek
Şöyle yaparız
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springbootmongodb
  labels:
    app: springbootmongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springbootmongodb
  template:
    metadata:
      labels:
        app: springbootmongodb
    spec:
      containers:
      - name: springbootmongodb
        image: mytest/springbootmongodb
      - name: mongo
        image: mongo
Pod ile Docker imajını eşleştirmek için 
deployment tanımındaki spec/template/metadata/labels/app ile 
kind:Service tanımındaki spec/selector/app
alanları kullanılır
Örnek
Şöyle yaparız. Deployment alanında kullanılacak container belirtiliyor. imaj ismi marounbassam/hello-spring
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: hello-world
        visualize: "true"
    spec:
      containers:
      - name: hello-world-pod
        image: marounbassam/hello-spring
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  labels:
    visualize: "true"
  name: hello-world-service
spec:
  selector:
    app: hello-world
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 8080
  type: ClusterIP
İki tane pod elde ederiz
+---------------------+
| hello-world-service |
|                     |
|    10.15.242.210    |
+---------O-----------+
          |
          +-------------O--------------------------O
                        |                          |
              +---------O-----------+    +---------O-----------+
              |        pod 1        |    |        pod 2        |
              |                     |    |                     |
              |     hello-world     |    |     hello-world     |
              +---------------------+    +---------------------+
containers
Açıklaması şöyle
describes the container’s specification like the name, the image and the exposed port.
containers/livenessProbe
Açıklaması şöyle
Among its many components, the Kubelet ensures that the containers are running and replaced with a healthy instance, anytime it goes down. This is detected using two properties:

- Liveness Check: An endpoint indicating that the application is available. The Kubelet uses liveness probes to know when to restart a container.
- Readiness Check: The Kubelet uses readiness probes to know when a container is ready to start accepting traffic.
Örnek
Şöyle yaparız
apiVersion: apps/v1 
kind: Deployment
...
        livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 8080
            initialDelaySeconds: 15
            periodSeconds: 5
        readinessProbe:  
            httpGet:
              path: /actuator/health/readiness
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5
containers/imagePullPolicy Alanı
Açıklaması şöyle.
The default pull policy is IfNotPresent which causes the kubelet to skip pulling an image if it already exists. If you would like to always force a pull, set it to Always
Açıklaması şöyle.
This option comes in handy if you deploy your application too often (Typical use case is CI/CD).
Örnek
Şö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
Örnek
Şöylee yaparız
apiVersion: v1
kind: Pod
metadata:
  name: demo
spec:
  containers:
    - name: image-name
      image: my-image:0.0.1
      imagePullPolicy: Always # <<--here
containers/readinessProbe
Örnek
Şöyle yaparız
apiVersion: v1
kind: Namespace
metadata:
  name: demo-ns
---
apiVersion: v1
kind: Pod
metadata:
  name: worker
  namespace: demo-ns
  labels:
    app: nine-to-five
spec:
  containers:
    - name: nine-to-five
      image: nine-to-five:1.0.0
      ports:
        - name: health-check
          containerPort: 5000
          hostPort: 5000
      readinessProbe:
        tcpSocket:
          port: health-check
        initialDelaySeconds: 5
        failureThreshold: 2
        timeoutSeconds: 3
        periodSeconds: 10
      livenessProbe:
        tcpSocket:
          port: health-check
        initialDelaySeconds: 15
        failureThreshold: 2
        timeoutSeconds: 3
        periodSeconds: 20
containers/resources
Şöyle yaparız
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world2-deployment
  labels:
    app: hello-world2
spec:
  selector:
    matchLabels:
      app: hello-world2
  replicas: 2
  template:
    metadata:
      labels:
        app: hello-world2
    spec:
      containers:
      - name: hello-world2
        image: bhargavshah86/kube-test:v0.1
        ports:
        - containerPort: 80
        resources:
          limits:
            memory: 256Mi
            cpu: "250m"
          requests:
            memory: 128Mi
            cpu: "80m"