באחד המדריכים, יצרנו קוברנטיס קלסטר עם 3 Nodes, כל Node הוא בעצם שרת/מכונה שמריץ קונטיינרים (Pod).
לכל קוברנטיס קלסטר חייב להיות לפחות Node אחד שהוא יהיה הNode המנהל – הוא מריץ בתוכו את הKubernetes API ואת שאר כלי הניהול של קוברנטיס, שאר הNodes מכונים Workers.
כל Node מורכב מPod אחד או יותר.
כדי לראות את רשימת הNodes שלנו נריץ את הפקודה הבאה:
kubectl get nodes
כדי לקבל פרטים נוספים על Node ספציפי נריץ את הפקודה הבאה:
Pods הוא היחידה הבסיסית ביותר של קוברנטיס. כל Pod מורכב מקונטיינר אחד או יותר (בדרכ יש קונטיינר אחד בכל POD אבל ניתן שיהיה יותר מקונטיינר אחד), כתובת IP בתוך הקוברנטיס קלסטר ואיחסון (Storage). כל Pod אחד או יותר יוצרים ביחד Node. קלסטר מורכב מNode אחד או יותר.
כשאנחנו מפעילים Pod, קוברנטיס בעצם מתזמן – Schedules Pod שיריץ אותו. הPod יריץ את כל הקונטיינטרים שם חלק מאותו Pod.
כדי ליצור POD, אנו משתמשים בקובץ YAML שמכיל את הפרטים של אותו POD. לדוגמא, אם נירצה ליצור POD שמריץ קונטיינר Nginx ניצור קובץ בשם ourtamlefilename.yaml לדוגמא עם הפרטים הבאים:
מכונה = Node לשם ההדגמה אנו ניצור kubernetes קלסטר שמורכב מ3 מכונות , 2 מכונות שיהיו הNODES ומכונה אחת שתהיה הNode Master שלנו. לשרת המסטר שלנו נקרא k8master , לשרת NODE הראשון נקרא k8node1 ולשני k8node2 ההפצה שבחרתי לעבוד איתה בהדגמה היא Ubuntu 18 LTS
בMASTER שלנו אנו נתקין: * Docker * Kubeadm * Kubelet * Kubectl * Control Plane
אחרי כמה דקות, נקבל פלט שמכיל את הפקודה אותה אני נצטרך להריץ אחכ בכל Node שלנו על מנת שהוא יוכל להצטרף לקלסטר. חשוב לשמור את הפקודה ואת הטוקן – כי בלעדיו לא תוכלו לצרף Nodes לCluster שלכם. במקרה שלי הפלט שהתקבל הוא
אחרי שהרצנו את הפקודה ב2 השרתים (ייתכן ותתבקשו להוסיף sudo) נריץ בשרת הMaster שלנו (k8master) שוב את הפקודה הבאה:
user@servername:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
servername1.serverdomain.com NotReady master 10m v1.12.7
servername2.serverdomain.com NotReady <none> 40s v1.12.7
servername3.serverdomain.com NotReady <none> 85s v1.12.7
ושימו לב שהפעם המסטר שלנו מזהה את 2 השרתים האחרים, כולם עדיין בסטטוס של NotReady.
kubeadm הוא כלי שמאפשר אוטומציה של חלק גדול של יצירת קלסטר, בתכלס – הופך את העבודה שלנו ביצירת קלסטר להרבה יותר קלה.
מה זה kubelet?
kubelet הוא שירות (Agent) שרץ בכל קוניינר שקיים בכל Node שלנו, כל שרת שיריץ קונטיינר זקוק לשירות kubelet.
מה זה kubectl?
kubectl הוא כלי command line שמאפשר לנו לתקשר עם הקלסטר (Cluster) שלנו ולנהל אותו.
על מנת להתקין את השירותים הנל, נריץ את הפקודות הבאות: (אני בחרתי להתקין את גירסת 1.12.7-00 , בהתאם לצורך שלכם – ייתכן ואתם תירצו להתקין גירסה אחרת. שימו לב, במידה ותיבחרו להתקין גירסה מתקדמת יותר, עקבו אחרי ההוראות הנוספות בלינק הזה, הדבר העיקרי הוא שגירסאות מתקדמות יותר לא יעבדו טוב במידה ומוגדר לכם שטח SWAP במערכת ההפעלה, לכן יש קודם לבטל את הSWAP.)
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat << EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet=1.12.7-00 kubeadm=1.12.7-00 kubectl=1.12.7-00
sudo apt-mark hold kubelet kubeadm kubectl
ולאחר מכן נוודא שההתקנה הצליחה על ידי הפקודה הבאה:
תמיד רציתם ממשק GUI שתוכלו לנהל באמצעות את הדוקרים שלכם ואת Docker Swarm? אז תכירו את Portainer!
בעיקרון כמעט כל מה שאתם יכולים לעשות דרך הDocker Command Line אתם יכולים לעשות באמצעות Portainer והבונוס שPortainer בגירסה הקהילתית שלו הוא חינמי לחלוטין
Portainer למעשה הוא קונטיינר בעצמו, לכן ניצור לו קונטיינר שיוכל לרוץ עליו.
הדבר הראשון שנעשה הוא ליצור Volume לPortainer, נריץ את הפקודה:
בשורה הזאת אנו מגדירים לקונטיינר שלנו את הVolume הראשון שלו שהוא בעצם חיבור הSocket לשרת DOCKER שלנו.
-v /var/run/docker.sock:/var/run/docker.sock \
שימו לב לשורה הזאת
v portainer_data:/data portainer/portainer
שבה בעצם אנו מגדירים לקונטיינר לעשות שימוש בVolume שיצרנו בשבילו. את זה אנחנו עושים בשביל לוודא שהתוכן של הקונטיינר שלנו יהיה persistence. כמו כן, אנו חושפים את פורט 9000 בקונטיינר של Portainer לפורט 8080 במחשב שלנו (או בשרת DOCKER).
נריץ את הפקודה הבאה כדי לראות את הקונטיינרים שלנו
docker container ls
ואכן אנו רואים את הקונטיינר שיצרנו.
ניכנס לכתובת: http://localhost:8080 (במידה ואנו במחשב הפיתוח שלנו) או לכתובת הIP הציבורית של שרת הDocker שלנו ונקבל את המסך בו אנו צריכים להגדיר שם משתמש וסיסמא לפאנל של Portainer
בדוגמה שלנו אנו משתמשים בשרת לוקאלי, לכן נבחר באפשרות Local ונלחץ על Connect.
והרי לנו מסך הבית של Portainer שכבר מציג לנו את שרת הDocker הלוקלאי שלנו
נלחץ לדוגמה על שרת הדוקר הלוקאלי שלנו ונקבל מידע מהיר
כאן אנו רואים כמה קונטיינרים יש לנו בשרת, IMAGES, רשתות, Volumes ועוד. לחיצה על כל אחת מהאפשרות תוביל למידע ואפשרויות נוספות.
כדי ליצור קונטיינר חדש לדוגמה, נלחץ על Containers
ובמסך הבא נלחץ על Add Container
ומשם נוכל ליצור את הקונטיינר שלנו. ממליץ לכם לחקור את כל האפשרויות המדהימות שPortainer נותן לנו ליצירה וניהול. מדובר בלי נוח ומומלץ בחום!
SNS – הוא שירות שמנהל שליחת הודעות, לדוגמה הודעות SMS, מיילים וכו.
את הטריגרים אנחנו יכולים ליצור באמצעות הAWS Console וגם כמובן באמצעות הAWS Cli, בהתאם למה שנוח לנו ובהתאם למה שנכון למיקרה והם מאפשרים לנו בעצם לקבל התראות על פעולות שקרו בGit Repo שלנו.
על מנת שנוכל ליצור טריגר לSNS כדי לקבל התראות CodeCommit עלינו לעמוד בתנאים הבאים: 1. הריפו שלנו בCodeCommit חייב להיות ממוקם באותו Region של הSNS Topic שלנו. 2. חייב להיות לנו SNS Topic קיים, ואם אין, אז כמובן צריכים ליצור אותו.
לצורך ההדגמה, יצרתי בCodeCommit ריפו בשם "GitRepoWithTriggersDemo"
עכשיו ניצור SNS Topic אליו נחבר את הטריגר שלנו: ניכנס לAWS SNS ונלחץ על הכפתור Create Topic
נכנס לAWS SNS ונילחץ על הכפתור Create Topic על מנת ליצור "נושא" חדש
נבחר שם לנושא שלנו, במיקרה שלי בחרתי את השם המקורי "MyDemoTopic", נגלול את המסך למטה ונלחץ על הכפתור הכתום "Create Topic"
נבחר שם לנושא שלנו, במיקרה שלי בחרתי את השם המקורי "MyDemoTopic"
אחרי שיצרנו את הSNS Topic, אנו צריכים לבחור את ה"מנויים" לנושא שלנו, "מנויים" הם אלו שיקבלו למעשה את ההודעות שאנו נפרסם בTopic. בדוגמה שלנו אנו נגדיר מנויים מסוג "דואר אלקטרוני", באותה מידה יכלנו כמובן להגדיר "SMS" אם היינו רוצים שהם יקבלו הודעת SMS. כדי להגדיר אותם נלחץ בתפריט הצדדי על Subscriptions ואז נלחץ על הלחצן "Create Subscription"
כדי להגדיר אותם נלחץ בתפריט הצדדי על Subscriptions ואז נלחץ על הלחצן "Create Subscription"
במסך הבא נבחר באפשרות Email ובEndPoint נזין את כתובת הדואר האלקטרוני אליה אנו רוצים שתישלח הודעה בכל פעם שנפרסם או ייתפרסם משהו בTopic שלנו.
נזין את כתובת הדואר האלקטרוני אליה אנו רוצים שתישלח הודעה בכל פעם שנפרסם או ייתפרסם משהו בTopic שלנו.
עכשיו ניכנס בחזרה למסך הRepo שלנו בCodeCommit, נלחץ על Settings, נבחר את הטאב Triggers ונלחץ על Create Trigger
נבחר שם לטריגר החדש שלנו, אני בחרתי "NewBranch", נסמן את סוג האירוע (EVENT) שאנו מעוניינים שהטריגר שלנו יאזין לו, במקרה שלנו "Create Branch Or Tag". בסוג השירות אליו אנו מעוניינים שהטריגר שלנו ייתחבר נבחר "Amazon SNS" – ואז נבחר את הSNS Topic הרלוונטי – במקרה שלנו קראנו לו MyDepoTopic
נלחץ על Test Trigger וניגש לתיבת הדואל שהגדרנו בשלב הקודם (למנוי) ונוודא שקיבלנו הודעת מייל. ואכן קיבלנו הודעה.
נלחץ על לחצן "Create Trigger" כדי לשמור ולהפעיל את הטריגר החדש שיצרנו.
הטריגר שלנו נוצר בהצלחה.
עכשיו, בכל פעם שניצור Branch חדש בריפו שלנו, כל מי שרשום לSNS Topic שמקשור לטריגר שלנו יקבל על כך הודעה.
קלי קלות!
מצאתם טעות? הערות? שאלות? הסתדרתם? נתקעתם? כתבו לי בתגובות!
הטריגרים בCodeCommit הם למעשה הייתרון המשמעותית ביותר לשימוש בCodeCommit לניהול הקוד שלנו לעומת שירותים כגון GitHub, GitLab, BitBucket וכו.
טריגרים מאפשרים לנו לבצע פעולות בצורה אוטומטיות כאשר קרה EVENT מסויים בקוד ריפו שלנו ולמעשה הם מופעלים בתגובה לאירועים שקורים בקוד שלנו. לדוגמה, כאשר מישהו דחף (GIT PUSH) שינויים לקוד, או כאשר נוצר(או נמחק) Branch (או (GIT TAG) חדש ועוד נוכל אנחנו והצוות שלנו או כל מי שנירצה לקבל על כך התראה.
דוגמאות:
* יצירת BRANCH חדש יכולה להפעיל טריגר SNS topic על מנת להודיע לכל האנשים הרלוונטיים בצוות שלנו שנוצר Branch חדש כדי שהחברים שלנו יידעו שכדאי להם לעשות git pull למחשב הפיתוח שלהם.
שירותים לדוגמה שהטריגרים יכולים להפעיל עבורנו:
* פונקציות למבדה (Lambada Functions) – וואו, כאן ניתן לעשות כבר דברים מדהימים! * SNS – AWS Simple Notification Service (שליחת הודעה בדואל, SMS וכו), אחד הייתרונות בחיבור לSNS הוא שזה מאפשר לנו להתחבר למעשה לכל השירותים אליהם SNS מתחבר כמו AWS SQS לדוגמה (Aws Simple Queue Service)
במידה ויש לנו כבר GIT REPO באחד מהספקים הפופולארים כמו GitHub,GitLab,BitBucket וכו ואנו מעוניינים להעביר את ניהול הקוד לCodeCommit, AWS מאפשרים לנו מספר אפשרויות:
1. העברת כל הREPO שלנו 2. העברת רק חלק מהBRANCHES 3. אנו יכולים להתחיל בהעברת רק חלק מהBRANCES ולאחר מכן להעביר את כל הREPO במידה ונירצה (הגירה בשלבים).
שימו לב! במידה וגודל הREPO שלנו גדול מ2GB,או שהREPO שלנו מכיל קבצים גדולים שלא ניתן לכווץ אותם (COMPRESS) בצורה טובה, ההמלצה היא להגר בשלבים ולא בבת אחת.
שם הריפו שבחרתי: avivtest התיאור: aviv התשובה שאנו אמורים לקבל צריכה להיות דומה למה שקיבלתי:
נוכל לוודא את זה על ידי כניסה לCodeCommit דרך ממשק AWS ושם ניראה את הREPO החדש שיצרנו.
יצירת שם משתמש וסיסמא למשתמש שלנו בAWS לCodeCommit
בנוסף, ניצור למשתמש שלנו בAWS שם משתמש וסיסמא לCodeCommit. לא לשכוח לתת למשתמש שלנו הרשאות לCodeCommit. נלחץ על IAM, ושם ניראה את רשימת המשתמשים הקיימים, ונלחץ על המשתמש שלנו, במיקרה שלי שם המשתמש הוא codecommit.
נלחץ על Security Credentials
ונגלול למטה עד לחלק של "HTTPS Git credentials for AWS CodeCommit" ונלחץ על "Generate"
לאחר שלחצנו על GENERATE, יוצגו לנו שם המשתמש והסיסמא, שימו לב, זאת הפעם היחידה שנוכל לראות את הפרטים האלו – לכן חשוב לשמור אותם.
דחיפת הREPO מהמחשב שלנו לREPO החדש בCodeCommit
עכשיו אנחנו צריכים לדחוף את הREPO מהמחשב שלנו לREPO שיצרנו בCodeCommit.
ניכנס לתיקייה בה ממוקמת הREPO שהורדנו למחשב. במקרה שלי שם התיקייה הוא DesignPatternsPHP
cd DesignPatternsPHP
בשביל לדחוף את הREPO מהמחשב לREPO החדש שיצרנו בAWS נקליט את הפקודה הבאה, נתבקש להזין את שם המשתמש והסיסמא שיצרנו בשלב הקודם.
כאשר https://git-codecommit.us-east-1.amazonaws.com/v1/repos/avivtest זאת הכתובת של הREPO שלי ב CodeCommit.
כדי לדעת מה הכתובת של הREPO שלכם בCodeCommit ניתן להיכנס למסך הREPOS של CodeCommit, ושם נלחץ על HTTPS ליד שם הREPO שלנו, זה יעתיק לנו את הכתובת.
זהו! ככה פשוט, עכשיו כשניכנס דרך AWS לREPO שלנו בCodeCommit נוכל לראות שהREPO שלנו כבר הועתקה לשם. עכשיו הREPO שלנו יושב בCodeCommit ונוכל להממשק באמצעות לשלל שירותי ה CI/CD של AWS בקלי קלות.
מצאתם טעות? הערות? שאלות? הסתדרתם? נתקעתם? כתבו לי בתגובות!