Czym tak naprawdę jest deployment, co może pójść nie tak i w jaki sposób możemy się przed tym zabezpieczyć, korzystając z Kubernetesa i jego ekosystemu. Zaczniemy od tego, jakie są rodzaje deploymentów, po czym wspomnimy dlaczego należy uważac z healthcheckami. Czym jest Circuit Breaker i jak może nam pomóc? Jak wygląda Canary Analysis w praktyce? Odpowiedzi na te wszystkie pytania z pewnością sprawią, że przycisk “Deploy To Production” przestanie być taki straszny.
3. Deployment?
Czy chodzi o…
- apps/v1/Deployment
- ten przycisk w Jenkinsie
- to samo co Release
- impreza w piątek po 16
- proces wdrażania nowej wersji aplikacji wraz z jej zależnościami
4. CI/CD, a po co komu to potrzebne?
“Dostajemy .war’a mailem, logujemy się na FTP, wrzucamy go tam, restart
Tomcata i gotowe” - wdrożenie w dużej firmie kurierskiej, rok 2014
11. Limity
● “famous” https://github.com/kubernetes/kubernetes/issues/67577
○ CFS quotas can lead to unnecessary throttling
#67577
○ naprawiony w wersji 4.18 (Kernel) (luty 2019)
○ wciąż wskazywany przy wielu zgłoszeniach
○ brak limitów jako “workaround”? risky...
● wycieki pamięci, obciążenie wszystkich rdzeni, brak kredytów EC2…
14. Healthchecks
● livenessProbe != readinessProbe
○ czy serwis jest gotowy i nawiązał połączenie z zależnościami? (readiness)
○ czy serwis nadal działa i może odpowiadać (tylko sam z siebie?) (liveness)
● zbyt agresywne/skomplikowane healthchecki
● uzależnione od zewnętrznych serwisów
● “pętla zależności”
○ API ➤ AuthService ➤ Database ➤ Storage Provider?
15. Service Mesh (Istio)
● jak wygląda droga żądania przez nasz klaster? (tracing)
● co “zamula”?
● szyfrowanie ruchu pomiędzy serwisami (mTLS)
● limity połączeń między serwisami
● re-try/timeout
● blue/green, canary deployments
20. Circuit Breaker Na Ratunek!
● max 1 połączenie TCP
● max 1 wiszące żądanie
● max 1 żądanie/połączenie
● odrzucaj nadmiarowe żądania
● wyrzuć endpoint z puli po 1 błędzie
● sprawdzaj czy endpoint jest gotowy na ponowne
sprawdzenie co 1 sekundę (czy
baseEjectionTime już minął)
● czekaj 3m zanim ponownie sprawdzisz czy
endpoint odpowiada
● wyrzuć do 100% błędnych endpointów z puli
21. Epic Fails
● https://k8s.af/
● 10 More Weird Ways to Blow Up Your Kubernetes - Airbnb - KubeCon NA 2020
○ involved: MutatingAdmissionWebhook, CPU Limits, OOMKill, kube2iam, HPA
○ impact: outages
● Why we switched from fluent-bit to Fluentd in 2 hours - PrometheusKube - blog post 2020
○ involved: fluent-bit, missing logs, Fluentd
○ impact: lost application logs in production
● Make your services faster by removing CPU limits - Buffer - blog post 2020
○ involved: kops, CPU Limit, CPU throttling
○ impact: high latency
● The case of the missing packet: An EKS migration tale - MindTickle - blog post 2020
○ involved: EKS, AWS CNI Plugin,
○ impact: frequent connection failures when talking to services outside the cluster
● Kubernetes Networking Problems Due to the Conntrack - loveholidays - blog post 2020
○ involved: GKE, conntrack, HAProxy
○ impact: high error rate on network-heavy services
● DNS issues in Kubernetes. Public postmortem #1 - Preply - blog post 2020
○ involved: conntrack, DNS, CoreDNS-autoscaler
○ impact: partial production outage
● How we failed to integrate Istio into our platform - Exponea - blog post 2019
○ involved: Istio, GKE, proxy injection
○ impact: stopped Istio rollout, developers' time spent
22. Canary Deployments
● RollingUpdate “na wypasie”
● powolne przekierowanie ruchu na nową wersję aplikacji, nieustannie
monitorując zachowanie nowej wersji pod kątem błędów, opóźnień, <insert
custom metric here> (Canary Analysis)
● definicja jak szybko, w jakich krokach ma postępować wdrożenie
● automatyczny rollback
● Argo Rollouts, Flagger (Flux v2), Istio, Kayenta (Spinnaker), NGINX Ingress...