ಕನ್ನಡ

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳ ಬಗ್ಗೆ ಆಳವಾದ ವಿವರಣೆ. ಇದು ಸಂಕೀರ್ಣ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಕಸ್ಟಮ್ ಸಂಪನ್ಮೂಲಗಳ ನಿರ್ವಹಣೆಯನ್ನು ಹೇಗೆ ಸರಳಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ವಿವರಿಸುತ್ತದೆ. ನಿಮ್ಮ ಸ್ವಂತ ಆಪರೇಟರ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಮತ್ತು ನಿಯೋಜಿಸಲು ಕಲಿಯಿರಿ.

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳು: ಕಸ್ಟಮ್ ರಿಸೋರ್ಸ್ ನಿರ್ವಹಣೆಯನ್ನು ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸುವುದು

ನಾವು ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿಯೋಜಿಸುವ ಮತ್ತು ನಿರ್ವಹಿಸುವ ರೀತಿಯಲ್ಲಿ ಕುಬರ್ನೆಟಿಸ್ ಕ್ರಾಂತಿಯನ್ನುಂಟುಮಾಡಿದೆ. ಆದಾಗ್ಯೂ, ಸಂಕೀರ್ಣ, ಸ್ಟೇಟ್‌ಫುಲ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು ಇನ್ನೂ ಸವಾಲಿನದ್ದಾಗಿರಬಹುದು. ಇಲ್ಲಿಯೇ ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳು ಬರುತ್ತವೆ, ಇದು ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ವಹಣೆಯನ್ನು ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸಲು ಮತ್ತು ಕುಬರ್ನೆಟಿಸ್‌ನ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ವಿಸ್ತರಿಸಲು ಪ್ರಬಲ ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತದೆ.

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳು ಎಂದರೇನು?

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್ ಒಂದು ಅಪ್ಲಿಕೇಶನ್‌-ನಿರ್ದಿಷ್ಟ ನಿಯಂತ್ರಕವಾಗಿದ್ದು, ಇದು ಸಂಕೀರ್ಣ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಕುಬರ್ನೆಟಿಸ್ API ಅನ್ನು ವಿಸ್ತರಿಸುತ್ತದೆ. ಇದನ್ನು ಒಂದು ನಿರ್ದಿಷ್ಟ ಅಪ್ಲಿಕೇಶನ್‌ಗಾಗಿ ವಿಶೇಷವಾಗಿ ವಿನ್ಯಾಸಗೊಳಿಸಲಾದ ಸ್ವಯಂಚಾಲಿತ ಸಿಸ್ಟಮ್ ನಿರ್ವಾಹಕ ಎಂದು ಯೋಚಿಸಿ. ಆಪರೇಟರ್‌ಗಳು ಒಂದು ನಿರ್ದಿಷ್ಟ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿರ್ವಹಿಸುವ ಡೊಮೇನ್ ಜ್ಞಾನವನ್ನು ಒಳಗೊಂಡಿರುತ್ತವೆ, ಇದು ನಿಮಗೆ ಅದನ್ನು ಡಿಕ್ಲರೇಟಿವ್, ಸ್ವಯಂಚಾಲಿತ ಮತ್ತು ಪುನರಾವರ್ತಿತ ರೀತಿಯಲ್ಲಿ ನಿರ್ವಹಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.

ಪಾಡ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳಂತಹ ಪ್ರಮುಖ ಸಂಪನ್ಮೂಲಗಳನ್ನು ನಿರ್ವಹಿಸುವ ಸಾಂಪ್ರದಾಯಿಕ ಕುಬರ್ನೆಟಿಸ್ ನಿಯಂತ್ರಕಗಳಿಗಿಂತ ಭಿನ್ನವಾಗಿ, ಆಪರೇಟರ್‌ಗಳು ಕಸ್ಟಮ್ ರಿಸೋರ್ಸ್ ಡೆಫಿನಿಷನ್ಸ್ (CRDs) ಮೂಲಕ ವ್ಯಾಖ್ಯಾನಿಸಲಾದ ಕಸ್ಟಮ್ ಸಂಪನ್ಮೂಲಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತವೆ. ಇದು ನಿಮ್ಮ ಸ್ವಂತ ಅಪ್ಲಿಕೇಶನ್‌-ನಿರ್ದಿಷ್ಟ ಸಂಪನ್ಮೂಲಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ಮತ್ತು ಅವುಗಳನ್ನು ಕುಬರ್ನೆಟಿಸ್ ಮೂಲಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ವಹಿಸಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳನ್ನು ಏಕೆ ಬಳಸಬೇಕು?

ಸಂಕೀರ್ಣ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಆಪರೇಟರ್‌ಗಳು ಹಲವಾರು ಪ್ರಮುಖ ಪ್ರಯೋಜನಗಳನ್ನು ನೀಡುತ್ತವೆ:

ಕಸ್ಟಮ್ ರಿಸೋರ್ಸ್ ಡೆಫಿನಿಷನ್ಸ್ (CRDs) ಅನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು

ಕಸ್ಟಮ್ ರಿಸೋರ್ಸ್ ಡೆಫಿನಿಷನ್ಸ್ (CRDs) ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳ ಅಡಿಪಾಯವಾಗಿದೆ. CRDಗಳು ನಿಮ್ಮ ಸ್ವಂತ ಕಸ್ಟಮ್ ಸಂಪನ್ಮೂಲ ಪ್ರಕಾರಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುವ ಮೂಲಕ ಕುಬರ್ನೆಟಿಸ್ API ಅನ್ನು ವಿಸ್ತರಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತವೆ. ಈ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಪಾಡ್‌ಗಳು ಅಥವಾ ಸೇವೆಗಳಂತಹ ಯಾವುದೇ ಇತರ ಕುಬರ್ನೆಟಿಸ್ ಸಂಪನ್ಮೂಲಗಳಂತೆ ಪರಿಗಣಿಸಲಾಗುತ್ತದೆ ಮತ್ತು `kubectl` ಮತ್ತು ಇತರ ಕುಬರ್ನೆಟಿಸ್ ಪರಿಕರಗಳನ್ನು ಬಳಸಿ ನಿರ್ವಹಿಸಬಹುದು.

CRDಗಳು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ ಎಂಬುದು ಇಲ್ಲಿದೆ:

  1. ನೀವು ನಿಮ್ಮ ಕಸ್ಟಮ್ ಸಂಪನ್ಮೂಲಕ್ಕಾಗಿ ಸ್ಕೀಮಾ ಮತ್ತು ಮೌಲ್ಯಮಾಪನ ನಿಯಮಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವ CRD ಅನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತೀರಿ.
  2. ನೀವು CRD ಅನ್ನು ನಿಮ್ಮ ಕುಬರ್ನೆಟಿಸ್ ಕ್ಲಸ್ಟರ್‌ಗೆ ನಿಯೋಜಿಸುತ್ತೀರಿ.
  3. ನೀವು ಅಪೇಕ್ಷಿತ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ, ನಿಮ್ಮ ಕಸ್ಟಮ್ ಸಂಪನ್ಮೂಲದ ಇನ್‌ಸ್ಟೆನ್ಸ್‌ಗಳನ್ನು ರಚಿಸುತ್ತೀರಿ.
  4. ಆಪರೇಟರ್ ಈ ಕಸ್ಟಮ್ ಸಂಪನ್ಮೂಲಗಳಲ್ಲಿನ ಬದಲಾವಣೆಗಳನ್ನು ಗಮನಿಸುತ್ತದೆ ಮತ್ತು ಅಪೇಕ್ಷಿತ ಸ್ಥಿತಿಯನ್ನು ನಿಜವಾದ ಸ್ಥಿತಿಯೊಂದಿಗೆ ಸಮನ್ವಯಗೊಳಿಸಲು ಕ್ರಮಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ.

ಉದಾಹರಣೆಗೆ, ನೀವು ಆಪರೇಟರ್ ಬಳಸಿ ಡೇಟಾಬೇಸ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿರ್ವಹಿಸಲು ಬಯಸುತ್ತೀರಿ ಎಂದುಕೊಳ್ಳಿ. ನೀವು `Database` ಎಂಬ CRD ಅನ್ನು `name`, `version`, `storageSize` ಮತ್ತು `replicas` ನಂತಹ ಫೀಲ್ಡ್‌ಗಳೊಂದಿಗೆ ವ್ಯಾಖ್ಯಾನಿಸಬಹುದು. ನಂತರ ಆಪರೇಟರ್ `Database` ಸಂಪನ್ಮೂಲಗಳಲ್ಲಿನ ಬದಲಾವಣೆಗಳನ್ನು ಗಮನಿಸುತ್ತದೆ ಮತ್ತು ಅದಕ್ಕೆ ಅನುಗುಣವಾಗಿ ಆಧಾರವಾಗಿರುವ ಡೇಟಾಬೇಸ್ ಇನ್‌ಸ್ಟೆನ್ಸ್‌ಗಳನ್ನು ರಚಿಸುತ್ತದೆ ಅಥವಾ ಅಪ್‌ಡೇಟ್ ಮಾಡುತ್ತದೆ.

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳು ಕಸ್ಟಮ್ ರಿಸೋರ್ಸ್ ಡೆಫಿನಿಷನ್ಸ್ (CRDs) ಅನ್ನು ಕಸ್ಟಮ್ ನಿಯಂತ್ರಕಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸುವ ಮೂಲಕ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ. ನಿಯಂತ್ರಕವು ಕಸ್ಟಮ್ ಸಂಪನ್ಮೂಲಗಳಲ್ಲಿನ ಬದಲಾವಣೆಗಳನ್ನು ಗಮನಿಸುತ್ತದೆ ಮತ್ತು ಅಪೇಕ್ಷಿತ ಸ್ಥಿತಿಯನ್ನು ನಿಜವಾದ ಸ್ಥಿತಿಯೊಂದಿಗೆ ಸಮನ್ವಯಗೊಳಿಸಲು ಕ್ರಮಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಈ ಪ್ರಕ್ರಿಯೆಯು ಸಾಮಾನ್ಯವಾಗಿ ಈ ಕೆಳಗಿನ ಹಂತಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ:

  1. ಈವೆಂಟ್‌ಗಳನ್ನು ಗಮನಿಸುವುದು: ಆಪರೇಟರ್ ರಚನೆ, ಅಳಿಸುವಿಕೆ, ಅಥವಾ ಅಪ್‌ಡೇಟ್‌ಗಳಂತಹ ಕಸ್ಟಮ್ ಸಂಪನ್ಮೂಲಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಈವೆಂಟ್‌ಗಳನ್ನು ಗಮನಿಸುತ್ತದೆ.
  2. ಸ್ಥಿತಿಯನ್ನು ಸಮನ್ವಯಗೊಳಿಸುವುದು: ಈವೆಂಟ್ ಸಂಭವಿಸಿದಾಗ, ಆಪರೇಟರ್ ಅಪ್ಲಿಕೇಶನ್‌ನ ಸ್ಥಿತಿಯನ್ನು ಸಮನ್ವಯಗೊಳಿಸುತ್ತದೆ. ಇದು ಅಪೇಕ್ಷಿತ ಸ್ಥಿತಿಯನ್ನು (ಕಸ್ಟಮ್ ರಿಸೋರ್ಸ್‌ನಲ್ಲಿ ವ್ಯಾಖ್ಯಾನಿಸಲಾಗಿದೆ) ನಿಜವಾದ ಸ್ಥಿತಿಯೊಂದಿಗೆ ಹೋಲಿಸುವುದನ್ನು ಮತ್ತು ಅವುಗಳನ್ನು ಸರಿಹೊಂದಿಸಲು ಕ್ರಮಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುವುದನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ.
  3. ಸಂಪನ್ಮೂಲಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು: ಅಪೇಕ್ಷಿತ ಸ್ಥಿತಿಯನ್ನು ಸಾಧಿಸಲು ಆಪರೇಟರ್ ಕುಬರ್ನೆಟಿಸ್ ಸಂಪನ್ಮೂಲಗಳನ್ನು (ಪಾಡ್‌ಗಳು, ಸೇವೆಗಳು, ನಿಯೋಜನೆಗಳು, ಇತ್ಯಾದಿ) ರಚಿಸುತ್ತದೆ, ಅಪ್‌ಡೇಟ್ ಮಾಡುತ್ತದೆ ಅಥವಾ ಅಳಿಸುತ್ತದೆ.
  4. ದೋಷಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು: ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಿರ ಸ್ಥಿತಿಯಲ್ಲಿ ಉಳಿಯುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಆಪರೇಟರ್ ದೋಷಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ ಮತ್ತು ವಿಫಲವಾದ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಮರುಪ್ರಯತ್ನಿಸುತ್ತದೆ.
  5. ಪ್ರತಿಕ್ರಿಯೆ ನೀಡುವುದು: ಆಪರೇಟರ್ ಆರೋಗ್ಯ ತಪಾಸಣೆ ಮತ್ತು ಸಂಪನ್ಮೂಲ ಬಳಕೆಯಂತಹ ಅಪ್ಲಿಕೇಶನ್‌ನ ಸ್ಥಿತಿಯ ಬಗ್ಗೆ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ನೀಡುತ್ತದೆ.

ರೀಕನ್ಸೈಲ್ ಲೂಪ್ (reconcile loop) ಆಪರೇಟರ್‌ನ ತರ್ಕದ ತಿರುಳಾಗಿದೆ. ಇದು ನಿರಂತರವಾಗಿ ಅಪ್ಲಿಕೇಶನ್‌ನ ಸ್ಥಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ಅಪೇಕ್ಷಿತ ಸ್ಥಿತಿಯನ್ನು ನಿರ್ವಹಿಸಲು ಕ್ರಮಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಈ ಲೂಪ್ ಅನ್ನು ಸಾಮಾನ್ಯವಾಗಿ ಅಗತ್ಯ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸುವ ರೀಕನ್ಸಿಲಿಯೇಷನ್ ಫಂಕ್ಷನ್ ಬಳಸಿ ಕಾರ್ಯಗತಗೊಳಿಸಲಾಗುತ್ತದೆ.

ನಿಮ್ಮ ಸ್ವಂತ ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್ ಅನ್ನು ನಿರ್ಮಿಸುವುದು

ಹಲವಾರು ಉಪಕರಣಗಳು ಮತ್ತು ಫ್ರೇಮ್‌ವರ್ಕ್‌ಗಳು ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತವೆ:

ಆಪರೇಟರ್ ಫ್ರೇಮ್‌ವರ್ಕ್ ಬಳಸಿ ಆಪರೇಟರ್ ನಿರ್ಮಿಸುವಲ್ಲಿ ಒಳಗೊಂಡಿರುವ ಹಂತಗಳ ಸರಳೀಕೃತ ಅವಲೋಕನ ಇಲ್ಲಿದೆ:

  1. ಕಸ್ಟಮ್ ರಿಸೋರ್ಸ್ ಡೆಫಿನಿಷನ್ (CRD) ಅನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಿ: ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ನ ಅಪೇಕ್ಷಿತ ಸ್ಥಿತಿಯನ್ನು ವಿವರಿಸುವ CRD ಅನ್ನು ರಚಿಸಿ. ಇದು ನಿಮ್ಮ ಕಸ್ಟಮ್ ಸಂಪನ್ಮೂಲಕ್ಕಾಗಿ ಸ್ಕೀಮಾ ಮತ್ತು ಮೌಲ್ಯಮಾಪನ ನಿಯಮಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ.
  2. ಆಪರೇಟರ್ ಕೋಡ್ ಅನ್ನು ರಚಿಸಿ: ನಿಮ್ಮ CRD ಆಧಾರದ ಮೇಲೆ ಆರಂಭಿಕ ಆಪರೇಟರ್ ಕೋಡ್ ಅನ್ನು ರಚಿಸಲು ಆಪರೇಟರ್ SDK ಬಳಸಿ. ಇದು ಅಗತ್ಯ ನಿಯಂತ್ರಕಗಳು ಮತ್ತು ಸಂಪನ್ಮೂಲ ವ್ಯಾಖ್ಯಾನಗಳನ್ನು ರಚಿಸುತ್ತದೆ.
  3. ರೀಕನ್ಸೈಲ್ ತರ್ಕವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಿ: ಅಪೇಕ್ಷಿತ ಸ್ಥಿತಿಯನ್ನು (ಕಸ್ಟಮ್ ರಿಸೋರ್ಸ್‌ನಲ್ಲಿ ವ್ಯಾಖ್ಯಾನಿಸಲಾಗಿದೆ) ನಿಜವಾದ ಸ್ಥಿತಿಯೊಂದಿಗೆ ಹೋಲಿಸುವ ಮತ್ತು ಅವುಗಳನ್ನು ಸರಿಹೊಂದಿಸಲು ಕ್ರಮಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುವ ರೀಕನ್ಸೈಲ್ ತರ್ಕವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಿ. ಇದು ನಿಮ್ಮ ಆಪರೇಟರ್‌ನ ಕಾರ್ಯಚಟುವಟಿಕೆಯ ತಿರುಳಾಗಿದೆ.
  4. ಆಪರೇಟರ್ ಅನ್ನು ನಿರ್ಮಿಸಿ ಮತ್ತು ನಿಯೋಜಿಸಿ: ಆಪರೇಟರ್ ಇಮೇಜ್ ಅನ್ನು ನಿರ್ಮಿಸಿ ಮತ್ತು ಅದನ್ನು ನಿಮ್ಮ ಕುಬರ್ನೆಟಿಸ್ ಕ್ಲಸ್ಟರ್‌ಗೆ ನಿಯೋಜಿಸಿ.
  5. ಪರೀಕ್ಷಿಸಿ ಮತ್ತು ಪುನರಾವರ್ತಿಸಿ: ನಿಮ್ಮ ಆಪರೇಟರ್ ಅನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಪರೀಕ್ಷಿಸಿ ಮತ್ತು ಅದರ ಕಾರ್ಯಚಟುವಟಿಕೆ ಮತ್ತು ವಿಶ್ವಾಸಾರ್ಹತೆಯನ್ನು ಸುಧಾರಿಸಲು ಕೋಡ್ ಅನ್ನು ಪುನರಾವರ್ತಿಸಿ.

ಆಪರೇಟರ್ ಫ್ರೇಮ್‌ವರ್ಕ್ ಬಳಸಿ ಒಂದು ಮೂಲಭೂತ ಉದಾಹರಣೆಯೊಂದಿಗೆ ವಿವರಿಸೋಣ. ನೀವು ಸರಳವಾದ `Memcached` ನಿಯೋಜನೆಯನ್ನು ನಿರ್ವಹಿಸುವ ಆಪರೇಟರ್ ಅನ್ನು ರಚಿಸಲು ಬಯಸುತ್ತೀರಿ ಎಂದು ಭಾವಿಸೋಣ.

1. CRD ಅನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಿ:

ಕೆಳಗಿನ CRD ವ್ಯಾಖ್ಯಾನದೊಂದಿಗೆ `memcached.yaml` ಫೈಲ್ ಅನ್ನು ರಚಿಸಿ:


apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: memcacheds.cache.example.com
spec:
  group: cache.example.com
  versions:
    - name: v1alpha1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                size:
                  type: integer
                  description: Size is the number of Memcached instances
              required: ["size"]
  scope: Namespaced
  names:
    plural: memcacheds
    singular: memcached
    kind: Memcached
    shortNames: ["mc"]

ಈ CRD `Memcached` ಸಂಪನ್ಮೂಲವನ್ನು `size` ಫೀಲ್ಡ್‌ನೊಂದಿಗೆ ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ, ಇದು ಚಾಲನೆ ಮಾಡಲು ಬೇಕಾದ Memcached ಇನ್‌ಸ್ಟೆನ್ಸ್‌ಗಳ ಸಂಖ್ಯೆಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ.

2. ಆಪರೇಟರ್ ಕೋಡ್ ಅನ್ನು ರಚಿಸಿ:

ಆರಂಭಿಕ ಆಪರೇಟರ್ ಕೋಡ್ ಅನ್ನು ರಚಿಸಲು ಆಪರೇಟರ್ SDK ಬಳಸಿ:


operator-sdk init --domain=example.com --repo=github.com/example/memcached-operator
operator-sdk create api --group=cache --version=v1alpha1 --kind=Memcached --resource --controller

ಇದು ನಿಮ್ಮ ಆಪರೇಟರ್‌ಗಾಗಿ ಅಗತ್ಯ ಫೈಲ್‌ಗಳು ಮತ್ತು ಡೈರೆಕ್ಟರಿಗಳನ್ನು ರಚಿಸುತ್ತದೆ, ಇದರಲ್ಲಿ ನಿಯಂತ್ರಕ ಕೋಡ್ ಮತ್ತು ಸಂಪನ್ಮೂಲ ವ್ಯಾಖ್ಯಾನಗಳು ಸೇರಿವೆ.

3. ರೀಕನ್ಸೈಲ್ ತರ್ಕವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಿ:

ರೀಕನ್ಸೈಲ್ ತರ್ಕವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು `controllers/memcached_controller.go` ಫೈಲ್ ಅನ್ನು ಸಂಪಾದಿಸಿ. ಈ ಫಂಕ್ಷನ್ `Memcached` ಸಂಪನ್ಮೂಲದಲ್ಲಿ ವ್ಯಾಖ್ಯಾನಿಸಲಾದ ಅಪೇಕ್ಷಿತ ಸ್ಥಿತಿಯನ್ನು ಆಧರಿಸಿ Memcached ನಿಯೋಜನೆಗಳನ್ನು ರಚಿಸುತ್ತದೆ, ಅಪ್‌ಡೇಟ್ ಮಾಡುತ್ತದೆ ಅಥವಾ ಅಳಿಸುತ್ತದೆ.


func (r *MemcachedReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
	log := r.Log.WithValues("memcached", req.NamespacedName)

	// Memcached ಇನ್‌ಸ್ಟೆನ್ಸ್‌ ಅನ್ನು ಪಡೆದುಕೊಳ್ಳಿ
	memcached := &cachev1alpha1.Memcached{}
	err := r.Get(ctx, req.NamespacedName, memcached)
	if err != nil {
		if errors.IsNotFound(err) {
			// ವಿನಂತಿ ಆಬ್ಜೆಕ್ಟ್ ಕಂಡುಬಂದಿಲ್ಲ, ರೀಕನ್ಸೈಲ್ ವಿನಂತಿಯ ನಂತರ ಅಳಿಸಿಹಾಕಿರಬಹುದು.
			// ಸ್ವಂತ ಆಬ್ಜೆಕ್ಟ್‌ಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಗಾರ್ಬೇಜ್ ಕಲೆಕ್ಟ್ ಆಗುತ್ತವೆ. ಹೆಚ್ಚುವರಿ ಕ್ಲೀನಪ್ ಲಾಜಿಕ್‌ಗಾಗಿ ಫೈನಲೈಸರ್‌ಗಳನ್ನು ಬಳಸಿ.
			// ಹಿಂತಿರುಗಿ ಮತ್ತು ಮರು-ಸರದಿ ಮಾಡಬೇಡಿ
			log.Info("Memcached ಸಂಪನ್ಮೂಲ ಕಂಡುಬಂದಿಲ್ಲ. ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಅಳಿಸಬೇಕಾಗಿರುವುದರಿಂದ ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತಿದೆ")
			return ctrl.Result{}, nil
		}
		// ಆಬ್ಜೆಕ್ಟ್ ಓದುವಾಗ ದೋಷ - ವಿನಂತಿಯನ್ನು ಮರು-ಸರದಿ ಮಾಡಿ.
		log.Error(err, "Memcached ಪಡೆಯಲು ವಿಫಲವಾಗಿದೆ")
		return ctrl.Result{}, err
	}

	// ಹೊಸ ನಿಯೋಜನೆ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ವಿವರಿಸಿ
	deployment := &appsv1.Deployment{
		ObjectMeta: metav1.ObjectMeta{
			Name:      memcached.Name,
			Namespace: memcached.Namespace,
		},
		Spec: appsv1.DeploymentSpec{
			Replicas: &memcached.Spec.Size,
			Selector: &metav1.LabelSelector{
				MatchLabels: map[string]string{
					"app": memcached.Name,
				},
			},
			Template: corev1.PodTemplateSpec{
				ObjectMeta: metav1.ObjectMeta{
					Labels: map[string]string{
						"app": memcached.Name,
					},
				},
				Spec: corev1.PodSpec{
					Containers: []corev1.Container{
						{
							Name:  "memcached",
							Image: "memcached:1.6.17-alpine",
							Ports: []corev1.ContainerPort{
								{
									ContainerPort: 11211,
								},
							},
						},
					},
				},
			},
		},
	}

	// Memcached ಇನ್‌ಸ್ಟೆನ್ಸ್‌ ಅನ್ನು ಮಾಲೀಕ ಮತ್ತು ನಿಯಂತ್ರಕವಾಗಿ ಹೊಂದಿಸಿ
	if err := ctrl.SetControllerReference(memcached, deployment, r.Scheme);
		err != nil {
			log.Error(err, "ನಿಯಂತ್ರಕ ರೆಫರೆನ್ಸ್ ಹೊಂದಿಸಲು ವಿಫಲವಾಗಿದೆ")
			return ctrl.Result{}, err
	}

	// ಈ ನಿಯೋಜನೆ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ
	found := &appsv1.Deployment{}
	err = r.Get(ctx, types.NamespacedName{
		Name:      deployment.Name,
		Namespace: deployment.Namespace,
	}, found)
	if err != nil && errors.IsNotFound(err) {
		log.Info("ಹೊಸ ನಿಯೋಜನೆಯನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ", "Deployment.Namespace", deployment.Namespace, "Deployment.Name", deployment.Name)
		err = r.Create(ctx, deployment)
		if err != nil {
			log.Error(err, "ಹೊಸ ನಿಯೋಜನೆಯನ್ನು ರಚಿಸಲು ವಿಫಲವಾಗಿದೆ", "Deployment.Namespace", deployment.Namespace, "Deployment.Name", deployment.Name)
			return ctrl.Result{}, err
		}

		// ನಿಯೋಜನೆಯನ್ನು ಯಶಸ್ವಿಯಾಗಿ ರಚಿಸಲಾಗಿದೆ - ಹಿಂತಿರುಗಿ ಮತ್ತು ಮರು-ಸರದಿ ಮಾಡಿ
		return ctrl.Result{Requeue: true}, nil
	} else if err != nil {
		log.Error(err, "ನಿಯೋಜನೆ ಪಡೆಯಲು ವಿಫಲವಾಗಿದೆ")
		return ctrl.Result{}, err
	}

	// ನಿಯೋಜನೆಯ ಗಾತ್ರವು ಸ್ಪೆಕ್‌ನಂತೆಯೇ ಇದೆಯೇ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ
	size := memcached.Spec.Size
	if *found.Spec.Replicas != size {
		log.Info("ನಿಯೋಜನೆಯನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ", "Deployment.Namespace", deployment.Namespace, "Deployment.Name", deployment.Name)
		found.Spec.Replicas = &size
		err = r.Update(ctx, found)
		if err != nil {
			log.Error(err, "ನಿಯೋಜನೆಯನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ", "Deployment.Namespace", deployment.Namespace, "Deployment.Name", deployment.Name)
			return ctrl.Result{}, err
		}
		// ಸ್ಪೆಕ್ ಅಪ್‌ಡೇಟ್ ಆಗಿದೆ - ಹಿಂತಿರುಗಿ ಮತ್ತು ಮರು-ಸರದಿ ಮಾಡಿ
		return ctrl.Result{Requeue: true}, nil
	}

	// ನಿಯೋಜನೆ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - ಮರು-ಸರದಿ ಮಾಡಬೇಡಿ
	log.Info("ರೀಕನ್ಸೈಲ್ ಅನ್ನು ಬಿಟ್ಟುಬಿಡಿ: ನಿಯೋಜನೆ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ", "Deployment.Namespace", deployment.Namespace, "Deployment.Name", deployment.Name)
	return ctrl.Result{}, nil
}

ಈ ಉದಾಹರಣೆಯು ರೀಕನ್ಸೈಲ್ ತರ್ಕದ ಅತ್ಯಂತ ಸರಳೀಕೃತ ಆವೃತ್ತಿಯಾಗಿದೆ. ಪ್ರೊಡಕ್ಷನ್-ಸಿದ್ಧ ಆಪರೇಟರ್‌ಗೆ ಹೆಚ್ಚು ದೃಢವಾದ ದೋಷ ನಿರ್ವಹಣೆ, ಲಾಗಿಂಗ್ ಮತ್ತು ಕಾನ್ಫಿಗರೇಶನ್ ಆಯ್ಕೆಗಳು ಬೇಕಾಗುತ್ತವೆ.

4. ಆಪರೇಟರ್ ಅನ್ನು ನಿರ್ಮಿಸಿ ಮತ್ತು ನಿಯೋಜಿಸಿ:

ಆಪರೇಟರ್ ಇಮೇಜ್ ಅನ್ನು ನಿರ್ಮಿಸಿ ಮತ್ತು `make deploy` ಬಳಸಿ ನಿಮ್ಮ ಕುಬರ್ನೆಟಿಸ್ ಕ್ಲಸ್ಟರ್‌ಗೆ ನಿಯೋಜಿಸಿ.

5. Memcached ಸಂಪನ್ಮೂಲವನ್ನು ರಚಿಸಿ:

ಕೆಳಗಿನ ವಿಷಯದೊಂದಿಗೆ `memcached-instance.yaml` ಫೈಲ್ ಅನ್ನು ರಚಿಸಿ:


apiVersion: cache.example.com/v1alpha1
kind: Memcached
metadata:
  name: memcached-sample
spec:
  size: 3

`kubectl apply -f memcached-instance.yaml` ಬಳಸಿ ಈ ಫೈಲ್ ಅನ್ನು ನಿಮ್ಮ ಕ್ಲಸ್ಟರ್‌ಗೆ ಅನ್ವಯಿಸಿ.

ಈಗ ಆಪರೇಟರ್ 3 Memcached ಇನ್‌ಸ್ಟೆನ್ಸ್‌ಗಳೊಂದಿಗೆ ನಿಯೋಜನೆಯನ್ನು ರಚಿಸುತ್ತದೆ.

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸಲು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು

ಪರಿಣಾಮಕಾರಿ ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸಲು ಎಚ್ಚರಿಕೆಯ ಯೋಜನೆ ಮತ್ತು ಕಾರ್ಯಗತಗೊಳಿಸುವಿಕೆ ಅಗತ್ಯ. ಗಮನದಲ್ಲಿಡಬೇಕಾದ ಕೆಲವು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು ಇಲ್ಲಿವೆ:

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳ ನೈಜ-ಪ್ರಪಂಚದ ಉದಾಹರಣೆಗಳು

ಅನೇಕ ಸಂಸ್ಥೆಗಳು ಪ್ರೊಡಕ್ಷನ್‌ನಲ್ಲಿ ಸಂಕೀರ್ಣ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳನ್ನು ಬಳಸುತ್ತಿವೆ. ಕೆಲವು ಉದಾಹರಣೆಗಳು ಇಲ್ಲಿವೆ:

ಇವು ಲಭ್ಯವಿರುವ ಅನೇಕ ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳ ಕೆಲವು ಉದಾಹರಣೆಗಳಾಗಿವೆ. ಕುಬರ್ನೆಟಿಸ್ ಅಳವಡಿಕೆ ಬೆಳೆಯುತ್ತಲೇ ಇರುವುದರಿಂದ, ಇನ್ನೂ ಹೆಚ್ಚು ಆಪರೇಟರ್‌ಗಳು ಹೊರಹೊಮ್ಮುವುದನ್ನು ನಾವು ನಿರೀಕ್ಷಿಸಬಹುದು, ಇದು ವ್ಯಾಪಕ ಶ್ರೇಣಿಯ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ನಿರ್ವಹಣೆಯನ್ನು ಸರಳಗೊಳಿಸುತ್ತದೆ.

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳಿಗಾಗಿ ಭದ್ರತಾ ಪರಿಗಣನೆಗಳು

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳು, ಕುಬರ್ನೆಟಿಸ್ ಕ್ಲಸ್ಟರ್‌ನಲ್ಲಿ ಚಾಲನೆಯಲ್ಲಿರುವ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ನಂತೆ, ಎಚ್ಚರಿಕೆಯ ಭದ್ರತಾ ಪರಿಗಣನೆಗಳ ಅಗತ್ಯವಿರುತ್ತದೆ. ಆಪರೇಟರ್‌ಗಳು ಕ್ಲಸ್ಟರ್ ಸಂಪನ್ಮೂಲಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಹೆಚ್ಚಾಗಿ ಉನ್ನತ ಸೌಲಭ್ಯಗಳನ್ನು ಹೊಂದಿರುವುದರಿಂದ, ಅನಧಿಕೃತ ಪ್ರವೇಶ ಮತ್ತು ದುರುದ್ದೇಶಪೂರಿತ ಚಟುವಟಿಕೆಯನ್ನು ತಡೆಗಟ್ಟಲು ಸೂಕ್ತ ಭದ್ರತಾ ಕ್ರಮಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದು ನಿರ್ಣಾಯಕವಾಗಿದೆ.

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳಿಗಾಗಿ ಕೆಲವು ಪ್ರಮುಖ ಭದ್ರತಾ ಪರಿಗಣನೆಗಳು ಇಲ್ಲಿವೆ:

ಈ ಭದ್ರತಾ ಕ್ರಮಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ಮೂಲಕ, ನೀವು ಭದ್ರತಾ ಉಲ್ಲಂಘನೆಗಳ ಅಪಾಯವನ್ನು ಗಮನಾರ್ಹವಾಗಿ ಕಡಿಮೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳನ್ನು ದುರುದ್ದೇಶಪೂರಿತ ಚಟುವಟಿಕೆಯಿಂದ ರಕ್ಷಿಸಬಹುದು.

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳ ಭವಿಷ್ಯ

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳು ವೇಗವಾಗಿ ವಿಕಸನಗೊಳ್ಳುತ್ತಿವೆ ಮತ್ತು ಕುಬರ್ನೆಟಿಸ್ ಪರಿಸರ ವ್ಯವಸ್ಥೆಯ ಹೆಚ್ಚು ಪ್ರಮುಖ ಭಾಗವಾಗುತ್ತಿವೆ. ಕುಬರ್ನೆಟಿಸ್ ಅಳವಡಿಕೆ ಬೆಳೆಯುತ್ತಲೇ ಇರುವುದರಿಂದ, ಆಪರೇಟರ್ ಕ್ಷೇತ್ರದಲ್ಲಿ ಇನ್ನೂ ಹೆಚ್ಚಿನ ನಾವೀನ್ಯತೆಯನ್ನು ನಾವು ನಿರೀಕ್ಷಿಸಬಹುದು.

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳ ಭವಿಷ್ಯವನ್ನು ರೂಪಿಸುತ್ತಿರುವ ಕೆಲವು ಪ್ರವೃತ್ತಿಗಳು ಇಲ್ಲಿವೆ:

ತೀರ್ಮಾನ

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳು ಸಂಕೀರ್ಣ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ನಿರ್ವಹಣೆಯನ್ನು ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸಲು ಮತ್ತು ಕುಬರ್ನೆಟಿಸ್‌ನ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ವಿಸ್ತರಿಸಲು ಪ್ರಬಲ ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತವೆ. ಕಸ್ಟಮ್ ಸಂಪನ್ಮೂಲಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುವ ಮೂಲಕ ಮತ್ತು ಕಸ್ಟಮ್ ನಿಯಂತ್ರಕಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ಮೂಲಕ, ಆಪರೇಟರ್‌ಗಳು ನಿಮಗೆ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಡಿಕ್ಲರೇಟಿವ್, ಸ್ವಯಂಚಾಲಿತ ಮತ್ತು ಪುನರಾವರ್ತಿತ ರೀತಿಯಲ್ಲಿ ನಿರ್ವಹಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಕುಬರ್ನೆಟಿಸ್ ಅಳವಡಿಕೆ ಬೆಳೆಯುತ್ತಲೇ ಇರುವುದರಿಂದ, ಆಪರೇಟರ್‌ಗಳು ಕ್ಲೌಡ್-ನೇಟಿವ್ ಭೂದೃಶ್ಯದ ಹೆಚ್ಚು ಪ್ರಮುಖ ಭಾಗವಾಗಲಿವೆ.

ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳನ್ನು ಅಳವಡಿಸಿಕೊಳ್ಳುವ ಮೂಲಕ, ಸಂಸ್ಥೆಗಳು ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ವಹಣೆಯನ್ನು ಸರಳಗೊಳಿಸಬಹುದು, ಕಾರ್ಯಾಚರಣೆಯ ಹೊರೆಯನ್ನು ಕಡಿಮೆ ಮಾಡಬಹುದು ಮತ್ತು ತಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಒಟ್ಟಾರೆ ವಿಶ್ವಾಸಾರ್ಹತೆ ಮತ್ತು ಸ್ಕೇಲೆಬಿಲಿಟಿಯನ್ನು ಸುಧಾರಿಸಬಹುದು. ನೀವು ಡೇಟಾಬೇಸ್‌ಗಳು, ಮಾನಿಟರಿಂಗ್ ಸಿಸ್ಟಮ್‌ಗಳು ಅಥವಾ ಇತರ ಸಂಕೀರ್ಣ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತಿರಲಿ, ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳು ನಿಮ್ಮ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಸುಗಮಗೊಳಿಸಲು ಮತ್ತು ಕುಬರ್ನೆಟಿಸ್‌ನ ಸಂಪೂರ್ಣ ಸಾಮರ್ಥ್ಯವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ಸಹಾಯ ಮಾಡಬಹುದು.

ಇದು ವಿಕಸನಗೊಳ್ಳುತ್ತಿರುವ ಕ್ಷೇತ್ರವಾಗಿದೆ, ಆದ್ದರಿಂದ ನಿಮ್ಮ ಸಂಸ್ಥೆಯಲ್ಲಿ ಕುಬರ್ನೆಟಿಸ್ ಆಪರೇಟರ್‌ಗಳನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಬಳಸಿಕೊಳ್ಳಲು ಇತ್ತೀಚಿನ ಬೆಳವಣಿಗೆಗಳು ಮತ್ತು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳೊಂದಿಗೆ ನವೀಕೃತವಾಗಿರುವುದು ನಿರ್ಣಾಯಕವಾಗಿದೆ. ಆಪರೇಟರ್‌ಗಳ ಸುತ್ತಲಿನ ಸಮುದಾಯವು ಉತ್ಸಾಹಭರಿತ ಮತ್ತು ಸಹಾಯಕವಾಗಿದೆ, ಯಶಸ್ವಿಯಾಗಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡಲು ಸಂಪನ್ಮೂಲಗಳು ಮತ್ತು ಪರಿಣತಿಯ ಸಂಪತ್ತನ್ನು ನೀಡುತ್ತದೆ.