מדריך לקוברנטס של ענן אביב

1. סקירה כללית

כשאנחנו בונים פתרון מיקרו-שירותים, גם Spring Cloud וגם Kubernetes הם פתרונות אופטימליים, מכיוון שהם מספקים רכיבים לפתרון האתגרים הנפוצים ביותר. עם זאת, אם נחליט לבחור ב- Kubernetes כמנהל המכולות הראשי ופלטפורמת הפריסה לפיתרון שלנו, אנו עדיין יכולים להשתמש בתכונות המעניינות של Spring Cloud בעיקר באמצעות פרויקט Spring Cloud Kubernetes.

פרויקט חדש יחסית זה מספק ללא ספק שילוב קל עם Kubernetes ליישומי Boot Boot. לפני שתתחיל, זה עשוי להיות מועיל לבחון כיצד לפרוס יישום Spring Boot ב- Minikube, סביבת Kubernetes מקומית.

במדריך זה אנו:

  • התקן את Minikube במחשב המקומי שלנו
  • פיתחו דוגמה לאדריכלות מיקרו-שירותים עם שני יישומי Spring Boot עצמאיים המתקשרים באמצעות REST
  • הגדר את היישום באשכול של צומת אחד באמצעות Minikube
  • פרוס את היישום באמצעות יאמל קבצי תצורה

2. תרחיש

בדוגמה שלנו אנו משתמשים בתרחיש של סוכני נסיעות המציעים עסקאות שונות ללקוחות שישאלו את שירות סוכני הנסיעות מעת לעת. נשתמש בו כדי להדגים:

  • גילוי שירות דרך אביב ענן קוברנטס
  • ניהול תצורה והזרקת Kubernetes ConfigMaps וסודות לתרמילי יישומים באמצעות Spring Cloud Kubernetes Config
  • איזון עומסים באמצעות רצועת הכלים של Spring Cloud Kubernetes

3. הגדרת סביבה

בראש ובראשונה אנחנו צריכים התקן את Minikube במחשב המקומי שלנו ורצוי מנהל התקן VM כגון VirtualBox. מומלץ לבחון את Kubernetes ואת התכונות העיקריות שלו לפני שתעקוב אחר הגדרת סביבה זו.

נתחיל באשכול המקומי Kubernetes בצומת יחיד:

התחלה של minikube - vm-driver = virtualbox

פקודה זו יוצרת מכונה וירטואלית המפעילה אשכול Minikube באמצעות מנהל ההתקן של VirtualBox. הקשר ברירת המחדל ב קובקטל יהיה עכשיו minikube. עם זאת, כדי להיות מסוגל לעבור בין הקשרים, אנו משתמשים:

kubectl config שימוש בהקשר minikube

אחרי שהתחלנו את Minikube, אנחנו יכולים התחבר ללוח המחוונים של Kubernetes כדי לגשת ליומנים ולפקח על השירותים, התרמילים, ה- ConfigMaps והסודות שלנו בקלות:

לוח מחוונים של minikube 

3.1. פְּרִיסָה

ראשית, בואו נקבל את הדוגמה שלנו מ- GitHub.

בשלב זה, אנו יכולים להריץ את סקריפט "deployment-travel-client.sh" מתיקיית האב, או לבצע כל הוראה בזה אחר זה כדי להבין את ההליך:

### בנה את המאגר mvn clean install ### set docker env eval $ (minikube docker-env) ### בנה את תמונות ה- docker ב- minikube cd-סוכנות נסיעות-שירות docker build -t-service-agency-service. cd ../client-service docker build - שירות לקוחות. cd .. ### סוד ומונגודב kubectl מחק -f סוכנות נסיעות-שירות / סוד.יאמל kubectl מחק -f סוכנות נסיעות-שירות / מונגו-פריסה. kubectl create -f סוכנות נסיעות שירות / mongo-deployment.yaml ### סוכנות נסיעות שירות kubectl מחק -f סוכנות נסיעות שירות / סוכנות נסיעות פריסה. yaml kubectl ליצור -f סוכנות נסיעות שירות / סוכנות נסיעות- deployment.yaml ### שירות לקוחות kubectl מחק configmap שירות לקוחות client kubectl delete - f client-service / client-service-deployment.yaml kubectl create -f client-service / client-config.yaml kubectl create - f client-service / client-service-deployment.yaml # בדוק שהתרמילים פועלים kubectl קבל תרמילים

4. גילוי שירות

פרויקט זה מספק לנו יישום עבור שירות גילוי ממשק בקוברנטס. בסביבת מיקרו-שירותים, בדרך כלל ישנם תרמילים מרובים המריצים את אותו השירות. Kubernetes חושף את השירות כאוסף של נקודות קצה שניתן לאחסן ולהגיע אליהם מתוך יישום אתחול האביב הפועל בתרמיל באותו אשכול Kubernetes.

לדוגמא, בדוגמה שלנו, יש לנו מספר העתקים של שירות סוכני הנסיעות, אליו ניתן לגשת משירות הלקוחות שלנו כ- // שירות סוכנויות נסיעות: 8080. עם זאת, זה באופן פנימי יתורגם לגישה לתרמילים שונים כגון סוכנות נסיעות-שירות-7c9cfff655-4hxnp.

רצועת הכלים של Spring Cloud Kubernetes משתמשת בתכונה זו כדי לטעון איזון בין נקודות הקצה השונות של השירות.

אנו יכולים להשתמש ב- Discovery Service בקלות על ידי הוספת תלות האביב-ענן-starter-kubernetes ביישום הלקוח שלנו:

 org.springframework.cloud spring-cloud-starter-kubernetes 

כמו כן, עלינו להוסיף @EnableDiscoveryClient ולהזריק את DiscoveryClient לתוך ה ClientController על ידי שימוש ב @Autowired בכיתה שלנו:

@SpringBootApplication @EnableDiscoveryClient מחלקה ציבורית יישום {public static void main (String [] args) {SpringApplication.run (Application.class, args); }}
@RestController מחלקה ציבורית ClientController {@ DiscoveryClient פרטי DiscoveryClient פרטי; }

5. ConfigMaps

בדרך כלל, שירותי מיקרו דורשים ניהול תצורה כלשהו. למשל, ביישומי Spring Cloud נשתמש בשרת Cloud Cloud Config.

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

בדוגמה שלנו, אנו משתמשים ב- ConfigMaps ב- שירות לקוחות יישום אתחול האביב. בואו ניצור לקוח-תצורה.קובץ yaml כדי להגדיר את ConfigMap של שירות לקוחות:

apiVersion: v1 לפי d kind: מטא נתונים של ConfigMap: שם: נתוני שירות לקוחות: application.properties: | - bean.message = טען מחדש! ההודעה מה- backend היא:% s

שירותים:% s

חשוב ששמו של ConfigMap יתאים לשם היישום כמפורט בקובץ "application.properties" שלנו. במקרה זה, זה שירות לקוחות. לאחר מכן עלינו ליצור את ConfigMap עבור שירות לקוחות בקוברנטס:

kubectl create -f client-config.yaml

עכשיו בואו ניצור מחלקת תצורה ClientConfig עם ה @תְצוּרָה ו @ConfigurationProperties ולהזריק לתוך ClientController:

@Configuration @ConfigurationProperties (קידומת = "שעועית") מחלקה ציבורית ClientConfig {private String message = "הודעה מה- backend היא:% s

שירותים:% s "; // getters and setters}

@RestController מחלקה ציבורית ClientController {@ תצורה פרטית ClientConfig פרטית; @GetMapping עומס מחרוזות ציבורי () {return String.format (config.getMessage (), "", ""); }}

אם איננו מציינים ConfigMap, עלינו לצפות לראות את הודעת ברירת המחדל המוגדרת בכיתה. עם זאת, כשאנחנו יוצרים את ConfigMap, הודעת ברירת מחדל זו נדרסת על ידי מאפיין זה.

בנוסף, בכל פעם שאנחנו מחליטים לעדכן את ConfigMap, ההודעה בדף משתנה בהתאם:

עריכת שירות הלקוחות של configmap

6. סודות

בואו נסתכל כיצד סודות עובדים על ידי התבוננות במפרט הגדרות החיבור של MongoDB בדוגמה שלנו. אנו ניצור משתנים סביבתיים ב- Kubernetes, אשר יוחדרו ליישום Spring Boot.

6.1. צור סוד

הצעד הראשון הוא ליצור סוד.יאמל קובץ, קידוד ה- שם משתמש ו סיסמה ל בסיס 64:

apiVersion: v1 סוג: מטא נתונים סודיים: שם: נתונים סודיים db: שם משתמש: dXNlcg == סיסמה: cDQ1NXcwcmQ =

בואו להחיל את התצורה הסודית על אשכול Kubernetes:

kubectl להחיל -f secret.yaml

6.2. צור שירות MongoDB

כעת עלינו ליצור את שירות MongoDB ואת הפריסה סוכנות נסיעות-deployment.yaml קוֹבֶץ. בפרט, בחלק הפריסה, נשתמש בסוד שם משתמש ו סיסמה שהגדרנו קודם:

apiVersion: הרחבות / v1beta1 סוג: פריסת מטא נתונים: שם: מונגו מפרט: עותקים משוכפלים: 1 תבנית: מטא נתונים: תוויות: שירות: מונגו שם: מונגוד-שירות מפרט: מכולות: - טענות: - מונוד - - תמונות קטנות: מונו: אחרון שם: mongo env: - שם: MONGO_INITDB_ROOT_USERNAME valueFrom: secretKeyRef: name: db-secret key: שם משתמש - name: MONGO_INITDB_ROOT_PASSWORD valueFrom: secretKeyRef: שם: db-secret key: סיסמה

כברירת מחדל, ה- מונגו: האחרונה תמונה תיצור משתמש עם שם משתמש ו סיסמה על בסיס נתונים בשם מנהל.

6.3. הגדר את MongoDB בשירות סוכנויות הנסיעות

חשוב לעדכן את מאפייני היישום כדי להוסיף את המידע הקשור למסד הנתונים. אמנם אנו יכולים לציין באופן חופשי את שם מסד הנתונים מנהל, כאן אנו מסתירים את המידע הרגיש ביותר כגון שם משתמש וה סיסמה:

spring.cloud.kubernetes.reload.enabled = spring.cloud.kubernetes.secrets.name = db-secret spring.data.mongodb.host = mongodb-service spring.data.mongodb.port = 27017 spring.data.mongodb. database = admin spring.data.mongodb.username = $ {MONGO_USERNAME} spring.data.mongodb.password = $ {MONGO_PASSWORD}

עכשיו, בואו נסתכל על שלנו פריסת סוכנויות נסיעות קובץ מאפיין כדי לעדכן את השירותים והפריסות עם שם המשתמש והסיסמה הנדרשים כדי להתחבר ל- שירות mongodb.

להלן החלק הרלוונטי בקובץ, עם החלק הקשור לחיבור MongoDB:

env: - שם: MONGO_USERNAME valueFrom: secretKeyRef: name: db-secret key: שם משתמש - name: MONGO_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password

7. תקשורת עם סרט

בסביבת מיקרו-שירותים, בדרך כלל אנו זקוקים לרשימת התרמילים בהם משוכפל השירות שלנו על מנת לבצע איזון עומסים. זה נעשה באמצעות מנגנון המסופק על ידי רצועת הכלים של Spring Cloud Kubernetes. מנגנון זה יכול לגלות ולהגיע באופן אוטומטי לכל נקודות הקצה של שירות ספציפיובהמשך הוא מאכלס סרט רשימת שרתים עם מידע על נקודות הקצה.

נתחיל בהוספת ה- אביב-ענן-סטרטר-קוברנטס-סרט תלות שלנו שירות לקוחות קובץ pom.xml:

 org.springframework.cloud spring-cloud-starter-kubernetes-ribbon 

השלב הבא הוא להוסיף את ההערה @ RibbonClient שלנו שירות לקוחות יישום:

@ RibbonClient (name = "שירות סוכנויות נסיעות")

כאשר מאוכלסת את רשימת נקודות הקצה, לקוח Kubernetes יחפש בנקודות הקצה הרשומות המתגוררות במרחב השמות / הפרויקט הנוכחי התואמות לשם השירות שהוגדר באמצעות @ RibbonClient ביאור.

עלינו גם להפעיל את לקוח הסרט במאפייני היישום:

ribbon.http.client.enabled = נכון

8. תכונות נוספות

8.1. היסטריקס

היסטריקס מסייע בבניית יישום סובלני וגמיש. מטרותיה העיקריות הן כישלון התאוששות מהיר ומהיר.

בפרט, בדוגמה שלנו, אנו משתמשים ב- Hystrix כדי ליישם את דפוס המפסק שרת לקוח על ידי הערת שיעור היישום Spring Boot עם @EnableCircuitBreaker.

בנוסף, אנו משתמשים בפונקציונליות ה- fallback על ידי הערת השיטה TravelAgencyService.getDeals () עם @HystrixCommand (). המשמעות היא שבמקרה של נפילה getFallBackName () ייקרא ויוחזר הודעת "Fallback":

@HystrixCommand (fallbackMethod = "getFallbackName", commandProperties = {@HystrixProperty (name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")}) מחרוזת ציבורית getDeals () {להחזיר this.restTemplate.getForObject ("/ / שירות סוכנויות נסיעות: 8080 / deals ", String.class); } מחרוזת פרטית getFallbackName () {להחזיר "Fallback"; }

8.2. מחוון בריאות תרמילים

אנו יכולים לנצל את מגף האביב אינדיקטור בריאות ומפעיל אתחול האביב לחשיפת מידע הקשור לבריאות למשתמש.

בפרט, מדד הבריאות של Kubernetes מספק:

  • שם תרמיל
  • כתובת ה - IP
  • מרחב שמות
  • חשבון שירות
  • שם צומת
  • דגל המציין האם יישום Spring Boot הוא פנימי או חיצוני ל- Kubernetes

9. מסקנה

במאמר זה אנו מספקים סקירה מעמיקה של פרויקט Kubernetes של Spring Cloud.

אז למה שנשתמש בזה? אם אנו שורשים את Kubernetes כפלטפורמת מיקרו-שירותים אך עדיין מעריכים את התכונות של Spring Cloud, אז Spring Cloud Kubernetes נותן לנו את המיטב משני העולמות.

קוד המקור המלא של הדוגמה זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found