במאמר הזה מובאת דוגמה לפריסת אפליקציה באשכול משתמשים שנוצר באמצעות Google Distributed Cloud (תוכנה בלבד) ל-VMware.
לפני שמתחילים
בדוגמה שמופיעה כאן, צריך אשכול משתמשים שמשתמש באיזון עומסים של MetalLB. הוראות ליצירת אשכול משתמשים מינימלי שמשתמש ב-MetalLB מפורטות במאמר יצירת אשכולות בסיסיים.
אתם יכולים להשתמש ב Google Cloud מסוף או בכלי שורת פקודה kubectl בתחנת העבודה של האדמין כדי לפרוס את האפליקציה.
המסוף
במסוף, נכנסים לדף Google Kubernetes Engine clusters overview.
ברשימת האשכולות, לוחצים על אשכול המשתמשים ומוודאים שאתם מחוברים לאשכול.
אם אתם לא מחוברים כבר לאשכול המשתמשים, אתם צריכים להתחבר אליו לפי ההוראות במאמר ניהול אשכולות ממסוף. Google Cloud
קונטיינרים
בקטע מאגר תגים חדש, בוחרים באפשרות תמונה קיימת של מאגר תגים.
בשדה Image path (נתיב התמונה), מזינים
us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0.לוחצים על Continue.
Configuration
בשדה Deployment name (שם הפריסה), מזינים
my-deployment.בשדה Namespace (מרחב שמות), מזינים
default.מזינים את שתי התוויות האלה:
- Key 1:
app, Value 1:metrics - Key 2:
department, Value 2sales
- Key 1:
בתפריט הנפתח Kubernetes cluster, בוחרים את האשכול.
לוחצים על Continue.
Expose
מסמנים את התיבה Expose deployment as a new service (חשיפת הפריסה כשירות חדש).
בשדה Port 1 (יציאה 1), מזינים
80.בשדה יציאת יעד 1, מזינים
8080. זה הערך המתאים כי קובץ ה-hello-appמאזין ליציאת TCP 8080 כברירת מחדל. כדי לראות את זה, צריך לבדוק את קובץ ה-Dockerfile ואת קוד המקור של האפליקציה.בשדה פרוטוקול 1, בוחרים באפשרות
TCP.בקטע סוג השירות, בוחרים באפשרות
LoadBalancer.
בתחתית הדף, לוחצים על הלחצן פריסה.
הצגת פרטי הפריסה והשירות
כשהפריסה מוכנה, הדף פרטי הפריסה נפתח בקטע עומסי עבודה של Kubernetes במסוף Google Cloud . בדף הזה אפשר לראות פרטים על הפריסה ועל שלושת ה-Pods שלה.
בקטע Exposing services (חשיפת שירותים), לוחצים על שם השירות שחושף את הפריסה. בתרגיל הזה, השם הוא
my-deployment-service.ייפתח הדף פרטי השירות. בדף הזה אפשר לראות פרטים על השירות. לדוגמה, אפשר לראות שכל Pod עם התוויות
app: metricsו-department: salesהוא חבר בשירות. תזכורת: ל-Pods ב-my-deploymentיש את התוויות האלה.
אפשר לראות גם ערך של כתובת ה-IP של מאזן העומסים. כתובת ה-IP של מאזן העומסים הוגדרה אוטומטית במאזן העומסים של האשכול.
העברה אוטומטית בשירות
נניח שלקוח מחוץ לאשכול שולח בקשה לכתובת ה-IP של מאזן העומסים ביציאת TCP מספר 80. הבקשה מנותבת למאזן העומסים של האשכול. מאזן העומסים מעביר את הבקשה אל Pod חבר ביציאת TCP 8080. כדאי לזכור שכל Pod ב-my-deployment כולל קונטיינר שמקשיב ביציאת TCP 8080.
בדיקת השירות
עוברים למכונה שבה אפשר לנתב את כתובת ה-IP של מאזן העומסים.
כדי להתקשר לשירות, מזינים את כתובת ה-IP של מאזן העומסים בדפדפן או משתמשים בפקודה כמו curl. לדוגמה:
curl [LOAD_BALANCER_IP]:80
הפלט מציג הודעה Hello, world!. לדוגמה:
curl 203.0.113.1:80 Hello, world! Version: 2.0.0 Hostname: my-deployment-dbd86c8c4-9wpbv
מחיקת הפריסה
נכנסים לדף Workloads בקטע Kubernetes Engine במסוף.
ברשימת הפריסות, בוחרים באפשרות my-deployment.
בחלק העליון של הדף, לוחצים על מחיקה. הפעולה הזו מוחקת גם את הפריסה וגם את שירות החשיפה.
שורת הפקודה
חיבור לתחנת העבודה של האדמין
יוצרים חיבור SSH לתחנת העבודה של האדמין. מבצעים את השלבים הבאים בתחנת העבודה של האדמין.
יצירת פריסה
הנה מניפסט של פריסה:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
selector:
matchLabels:
app: metrics
department: sales
replicas: 3
template:
metadata:
labels:
app: metrics
department: sales
spec:
containers:
- name: hello
image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
מעתיקים את קובץ המניפסט לקובץ בשם my-deployment.yaml, ויוצרים את ה-Deployment:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-deployment.yaml
USER_CLUSTER_KUBECONFIG הוא הנתיב של קובץ ה-kubeconfig עבור אשכול המשתמשים.
לקבל מידע בסיסי על הפריסה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployment my-deployment
הפלט מראה שלפריסת ה-Deployment יש שלושה Pods שכולם זמינים:
NAME READY UP-TO-DATE AVAILABLE AGE my-deployment 3/3 3 3 27s
מציגים ברשימה את ה-Pods בפריסה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods
הפלט מראה שלפריסת ה-Deployment יש שלושה פודים פעילים:
NAME READY STATUS RESTARTS AGE my-deployment-54944c8d55-4srm2 1/1 Running 0 6s my-deployment-54944c8d55-7z5nn 1/1 Running 0 6s my-deployment-54944c8d55-j62n9 1/1 Running 0 6s
קבלת מידע מפורט על הפריסה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployment my-deployment --output yaml
בפלט מוצגים פרטים על מפרט הפריסה והסטטוס:
kind: Deployment
metadata:
...
generation: 1
name: my-deployment
namespace: default
...
spec:
...
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: metrics
department: sales
...
spec:
containers:
- image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
imagePullPolicy: IfNotPresent
name: hello
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 3
conditions:
‑ lastTransitionTime: "2019-11-11T18:44:02Z"
lastUpdateTime: "2019-11-11T18:44:02Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
‑ lastTransitionTime: "2019-11-11T18:43:58Z"
lastUpdateTime: "2019-11-11T18:44:02Z"
message: ReplicaSet "my-deployment-54944c8d55" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 3
replicas: 3
updatedReplicas: 3
תאר את הפריסה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG describe deployment my-deployment
הפלט מציג פרטים בפורמט נוח לקריאה על הפריסה, כולל ReplicaSet המשויך:
Name: my-deployment Namespace: default CreationTimestamp: Mon, 11 Nov 2019 10:43:58 -0800 Labels:... Selector: app=metrics,department=sales Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=metrics department=sales Containers: hello: Image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0 Port: Host Port: Environment: Mounts: Volumes: Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: NewReplicaSet: my-deployment-54944c8d55 (3/3 replicas created)
יצירת שירות מסוג LoadBalancer
אחת הדרכים לחשוף את הפריסה ללקוחות מחוץ לאשכול היא ליצור שירות Kubernetes מסוג LoadBalancer.
זוהי דוגמה למניפסט של שירות מסוג LoadBalancer:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: metrics
department: sales
type: LoadBalancer
ports:
‑ port: 80
targetPort: 8080
לצורך התרגיל הזה, אלה הדברים החשובים שצריך להבין לגבי השירות:
כל פוד שיש לו את התווית
app: metricsואת התוויתdepartment: salesהוא חבר בשירות. שימו לב: ל-Pods ב-my-deploymentיש את התוויות האלה.כשלקוח שולח בקשה לשירות ביציאת TCP 80, הבקשה מועברת ל-Pod של חבר ביציאת TCP 8080.
לכל Pod של חבר חייב להיות מאגר שמקשיב ליציאת TCP 8080.
כברירת מחדל, מאגר הנתונים hello-app מאזין ליציאת TCP 8080. אפשר לראות את זה בקובץ ה-Dockerfile ובקוד המקור של האפליקציה.
שומרים את המניפסט בקובץ בשם my-service.yaml ויוצרים את השירות:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-service.yaml
USER_CLUSTER_KUBECONFIG הוא הנתיב של קובץ ה-kubeconfig עבור אשכול המשתמשים.
כשיוצרים את השירות, מערכת Google Distributed Cloud מגדירה באופן אוטומטי את כתובת loadBalancerIP במאזן העומסים של האשכול.
צפייה בשירות:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get service my-service --output yaml
הפלט אמור להיראות כך:
kind: Service
metadata:
...
name: my-service
namespace: default
...
spec:
allocateLoadBalancerNodePorts: true
clusterIP: 10.96.1.39
clusterIPs:
- 10.96.1.39
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- nodePort: 31184
port: 80
protocol: TCP
targetPort: 8080
selector:
app: metrics
department: sales
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 203.0.113.1
בפלט הקודם אפשר לראות שלשירות יש clusterIP ו-loadBalancerIP. יש בו גם port וtargetPort.
המאפיין clusterIP לא רלוונטי לתרגיל הזה. loadBalancerIP היא כתובת ה-IP שבה לקוחות מחוץ לאשכול יכולים להשתמש כדי להתקשר לשירות.
לדוגמה, נשתמש בערכים שמוצגים בפלט הקודם. כלומר, נניח שכתובת ה-IP של השירות היא loadBalancerIP = 203.0.113.1, יציאת ה-TCP היא port = 80, ויציאת ה-UDP היא targetPort = 8080.
לקוח שולח בקשה לכתובת 203.0.113.1 ביציאת TCP מספר 80. הבקשה מנותבת למאזן העומסים של האשכול. מאזן העומסים מעביר את הבקשה לתא חבר ביציאת TCP 8080.
מתקשרים לשירות:
curl LOAD_BALANCER_IP
הפלט יציג את ההודעה Hello, world!:
curl 203.0.113.1 Hello, world! Version: 2.0.0 Hostname: my-deployment-dbd86c8c4-9wpbv
מחיקת השירות
מחיקת השירות:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete service my-service
כדי לוודא שהשירות נמחק:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get services
הפלט לא יכלול יותר את my-service.
מחיקת הפריסה
מחיקת הפריסה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete deployment my-deployment
מוודאים שהפריסה נמחקה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployments
הפלט לא יכלול יותר את my-deployment.