Kubernetes

Dieser Modus wird benötigt um langsam hoch zu skalieren

Erstelle einen HPA mit der folgender Konfiguration:

behavior:
  scaleUp:
    policies:
    - type: Pods
      value: 1
      periodSeconds: 300

Wenn die Anwendung mit 1 Pod gestartet wird, wird sie schrittweise vergrößert:

1 -> 2 -> 3 -> 4

Dieser Modus wird benötigt um bei schnellem Traffic aufkommen hoch zu skalieren und langsam Pods löschen um kein Risiko vom zu schnellem runter skalieren einzugehen.

Erstelle einen HPA mit der folgender Konfiguration:

behavior:
  scaleUp:
    policies:
    - type: Percent
      value: 900
      periodSeconds: 60
  scaleDown:
    policies:
    - type: Pods
      value: 1
      periodSeconds: 600 # (i.e., scale down one pod every 10 min)

Dieses Verhalten entspricht dem Muster für das Hochskalieren wie im vorherigen Beispiel. Allerdings wird auch das Verhalten beim runter skalieren angegeben. Das scaleUp-Verhalten ist schnell, wie im vorherigen Beispiel erläutert

Beim runter skalieren wird jedoch nur alle 10 Minuten ein Pod gelöscht.

1000 -> 1000 -> 1000 -> … (7 more min) -> 999

Dieser Modus wird benötigt um bei schnellem Traffic aufkommen hoch zu skalieren

Erstelle einen HPA mit der folgender Konfiguration:

behavior:
  scaleUp:
    policies:
    - type: Percent
      value: 900
      periodSeconds: 60

Die Zahl 900 bedeutet, dass das Neunfache der aktuellen Anzahl von Pods hinzugefügt werden kann, so dass die Anzahl der Replikate effektiv das Zehnfache der aktuellen Größe beträgt. Alle anderen Parameter werden nicht angegeben (es werden die Standardwerte verwendet)

Wenn die Anwendung mit 1 Pod gestartet wird, wird sie mit der folgenden Anzahl von Pods skaliert:

1 -> 10 -> 100 -> 1000

Auf diese Weise können sehr schnell maxReplicas erreicht werden.

Das Downskaling erfolgt auf die übliche Weise (siehe Stabilisierungsfenster im Abschnitt Stabilisierungsfenster weiter unten und die Algorithmusdetails in der offiziellen HPA-Dokumentation)

Folgende Tools werden lokal benötigt:

  • kubectl
  • kind und docker
  • helm

Cluster erstellen

kind create cluster
clusterctl init --infrastructure vsphere
clusterctl config cluster k8s-dev --kubernetes-version=v1.20.1 --control-plane-machine-count=3 --worker-machine-count=3 > deploy_dev.yaml
kubectl apply -f deploy_dev.yaml
kubectl get kubeadmcontrolplane --all-namespaces
clusterctl get kubeconfig k8s-dev > k8s-dev.kubeconfig
export KUBECONFIG=k8s-dev.kubeconfig

docker login
kubectl create secret generic regcred --from-file=.dockerconfigjson=/home/xforze/.docker/config.json --type=kubernetes.io/dockerconfigjson
kubectl create secret -n kube-system generic regcred --from-file=.dockerconfigjson=/home/xforze/.docker/config.json --type=kubernetes.io/dockerconfigjson
kubectl create secret -n tigera-operator generic tigera-pull-secret --from-file=.dockerconfigjson=/home/xforze/.docker/config.json --type=kubernetes.io/dockerconfigjson

# Install Weavenet
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"


# Install Calico
kubectl create -f https://docs.projectcalico.org/archive/v3.18/manifests/tigera-operator.yaml
kubectl create -f https://docs.projectcalico.org/archive/v3.18/manifests/custom-resources.yaml
</pre>

Add insecure Flag to vsphere-csi-driver

kubectl edit secret -n kube-system csi-vsphere-config
[Global]
insecure-flag = "true"

Add a Storageclass:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: example-vanilla-block-sc
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"  # Optional
provisioner: csi.vsphere.vmware.com
allowVolumeExpansion: true  # Optional: only applicable to vSphere 7.0U1 and above
parameters:
  datastoreurl: "ds:///vmfs/volumes/vsan:52cdfa80721ff516-ea1e993113acfc77/"  # Optional Parameter
  storagepolicyname: "vSAN Default Storage Policy"  # Optional Parameter
  csi.storage.k8s.io/fstype: "ext4"  # Optional Parameter

Add en example pvc:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-vanilla-block-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: example-vanilla-block-sc
kubectl run <podname> --image=nginx --generator=run-pod/v1 --dry-run -o yaml

kube-ps1

curl https://raw.githubusercontent.com/jonmosco/kube-ps1/master/kube-ps1.sh -o ~/kube-ps1.sh
echo "source ~/kube-ps1.sh" >> ~/.bashrc
echo "PS1='[\u@\h \W $(kube_ps1)]\$ '" >> ~/.bashrc

Krew:

Make sure that git is installed.
Run this command to download and install krew:

(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)

Add the $HOME/.krew/bin directory to your PATH environment variable. To do this, update your .bashrc file and append the following line:

echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"' >> ~/.bashrc

kubectx

kubectl krew install ctx
kubectl krew install ns