מה זה Kubernetes?

זהו פרוייקט אורכיסטרציה של קונטיינריים שנלקח מ- Google כפלטפורמט קוד פתוח. נבנה על בסיס לקחים שנלמדו בפיתוח וההפעלה של בורג ואומגה של Google. נבנה מהיסוד כאוסף של רכיבים אשר מתרכזים סביב פריסה, תחזוקה וקנה מידה של עומסי עבודה.
מה הוא עושה?
- אוטומצייה לעומסי עבודה
- פריסות Blue/Green
- מנהל אפליקציות Stateless/Stateful
- מספק מנגנון לגילוי שירותים
- משגר עבודות ומשימות מתוזמנות cronjobs
- שילוב ותמיכה קלה ביישומי צד שלישי
מושגי מפתח:
Pods
הרכיב הקטן ביותר ב- Kubernetes, פודים הם אחד או יותר קונטיינרים אשר משתפים ביניהם כאישות אחת דיסקים, רשת, שם מתחם ועוד… בנוסף הם חלופיים.
דוגמה ל- Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: nginx
image: nginx:stable-alpine
ports:
- containerPort: 80
Services
הם שיטה אחודה של גישה לעומסי עבודה אשר חשופים לעולם, סירביסים לעומת פודים אינם חלופיים. ניתן לגשת ל- Service דרך DNS פנימי service-name.namespace.svc.cluster.local.
סוגי Services
- ClusterIP (בררת מחדל)
- NodePort
- LoadBlancer
- ExternalName

kube-apiserver
הינו ממשק REST שפונה למישור הבקרה והנתונים של Kubernetes, כל הלקוחות היישומים האחרים מקיימים אינטרקציה עם Kubernetes אך ורק דרך שרת ה- API. הוא פועל כשומר הסף בגישה אל ה- Cluster בכך שהוא מטפל באימות, בקשות ולידציה ובקרת כניסה בנוסף להיותו חזית למערכת הנתונים.
etcd
הוא למעשה מערכת הנתונים של Kubernetes אשר שומרת אובייקטים ומידע על התצורה.
kubelet
משמש כסוכן על גבי כל אחד מהשרתים (Nodes) של Kubernetes אשר מנהל את מחזור החיים של כל אחד מהפודים שנימצאים על אותו שרת (Node).
kube-controller-manager
הוא התהליך הראשי שמנהל את כל לולאת הבקרה של רכיבי הליבה. כמו גם מנטר את המצב המצוי של ה- Cluster ומננוט לעבר המצב הרצוי.
kube-scheduler
הינו מנוע מילולי עשיר אשר מהעריך את דרישות עומס העבודה ומנסה למקם אותו על משאב תואם. דרישות עומס עבודה יכולות לכלול: דרישות בלליות לחומרה, תוויות ודרישות אחרות למשאבים מותאמים אישית.
kube-proxy
מנהל את כללי הרשת בכל שרת (Node), מבצע העברת חיבור או איזון עומסים עבור שירותי הליבה של Kubernetes.
Container runtime engine
זמן ריצה של קונטיינר הוא יישום תואם שמבצע ומנהל קונטיינרים.
Namespaces
הם אשכולות או סביבות לוגיות והם השיטה העיקרים לחלוקת ה- Cluster.
Labels
הם זוגות ערכים (key=value) המשמשים לזיהוי, תיאור וקיבוץ קבוצות עצמים ומשאבים קשורים.
Selectors
הם בוררים אשר משתמשים ב- Selectors לסינון או לבחירת אובייקטים ומשמשים בהם בכל רחבי ה- Kubernetes.
Test Application Deployment Example
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
namespace: production
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: test
image: nexus-docker-private-registry.example.com/test:latest
imagePullPolicy: Always
ports:
- containerPort: 8000
imagePullSecrets:
- name: nexus-registry-secret
---
apiVersion: v1
kind: Service
metadata:
name: test-service
namespace: production
spec:
ports:
- protocol: TCP
port: 80
targetPort: 8000
selector:
app: test
type: ClusterIP
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: production
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/issuer: "ca-issuer"
nginx.ingress.kubernetes.io/proxy-body-size: "100m"
spec:
tls:
- hosts:
- test.example.com
secretName: test-cert
rules:
- host: test.example.com
http:
paths:
- backend:
serviceName: test-service
servicePort: 80
לצורך הדוגמא צריך קודם כל להתקין nginx ingress controller, cert-manager ו-ליצור namespace בשם production.

Helm
Helm עוזר לנו לנהל יישומי Kubernetes, תרשימי Helm עוזרים לנו להגדיר, להתקין ולשדרג אפילו את ישומי ה- Kubernetes המורכבים ביותר.