{"id":27435,"date":"2026-07-29T20:29:27","date_gmt":"2026-07-29T20:29:27","guid":{"rendered":"https:\/\/umang.pk\/2026\/07\/29\/%da%a9%d8%a8%d8%b1%d9%86%db%8c%d9%b9%d8%b3-%d8%a2%d9%be%d8%b1%db%8c%d9%b9%d8%b1-%da%a9%db%8c%d8%b3%db%92-%d8%a8%d9%86%d8%a7%db%8c%d8%a7-%d8%ac%d8%a7%d8%a6%db%92-%da%88%d9%88%db%8c%d9%84%d9%be%d8%b1\/"},"modified":"2026-07-29T20:29:28","modified_gmt":"2026-07-29T20:29:28","slug":"%da%a9%d8%a8%d8%b1%d9%86%db%8c%d9%b9%d8%b3-%d8%a2%d9%be%d8%b1%db%8c%d9%b9%d8%b1-%da%a9%db%8c%d8%b3%db%92-%d8%a8%d9%86%d8%a7%db%8c%d8%a7-%d8%ac%d8%a7%d8%a6%db%92-%da%88%d9%88%db%8c%d9%84%d9%be%d8%b1","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/07\/29\/%da%a9%d8%a8%d8%b1%d9%86%db%8c%d9%b9%d8%b3-%d8%a2%d9%be%d8%b1%db%8c%d9%b9%d8%b1-%da%a9%db%8c%d8%b3%db%92-%d8%a8%d9%86%d8%a7%db%8c%d8%a7-%d8%ac%d8%a7%d8%a6%db%92-%da%88%d9%88%db%8c%d9%84%d9%be%d8%b1\/","title":{"rendered":"\u06a9\u0628\u0631\u0646\u06cc\u0679\u0633 \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2: \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc\u0646\u0688 \u0628\u06a9"},"content":{"rendered":"\n<div id=\"\">\n<p>Kubernetes \u0627\u06cc\u0633\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u0633\u06cc\u0679 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0628\u0634\u0645\u0648\u0644 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u060c \u062e\u062f\u0645\u0627\u062a \u0627\u0648\u0631 \u0646\u0648\u0688\u0633\u06d4<\/p>\n<p>\u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u0627\u0633\u06cc \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0648\u0633\u0627\u0626\u0644 \u062a\u06a9 \u0628\u0691\u06be\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba Kubernetes \u06a9\u0648 \u0688\u06cc\u0641\u0627\u0644\u0679 \u0633\u06d2 \u0645\u0639\u0644\u0648\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0633 \u0633\u06d2 \u0648\u06c1 \u06a9\u0633\u0679\u0645 \u0633\u0633\u0679\u0645\u0632 (\u0627\u06a9\u062b\u0631 \u0628\u06cc\u0631\u0648\u0646\u06cc) \u06a9\u0648 \u0627\u0633\u06cc \u0627\u0639\u0644\u0627\u0646\u0627\u062a\u06cc \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0645\u0646\u0638\u0645 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0633 \u0637\u0631\u062d \u0648\u06c1 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0627 \u0646\u0638\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u06a9\u0648 \u0686\u0627\u0631 \u062d\u0635\u0648\u06ba \u0645\u06cc\u06ba \u062a\u0642\u0633\u06cc\u0645 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2: \u0622\u067e\u0631\u06cc\u0679\u0631 \u062f\u0631\u0627\u0635\u0644 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u06cc \u0627\u0646\u0627\u0679\u0648\u0645\u06cc\u060c \u0627\u0633\u06d2 \u0634\u0631\u0648\u0639 \u0633\u06d2 \u0628\u0646\u0627\u0646\u0627\u060c \u0627\u0648\u0631 \u0627\u0633\u06d2 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<h3 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h3>\n<h2 id=\"heading-part-1-introduction\">\u062d\u0635\u06c1 1: \u062a\u0639\u0627\u0631\u0641<\/h2>\n<h3 id=\"heading-what-is-an-operator\">\u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u06cc\u0627 \u06c1\u06d2\u061f<\/h3>\n<p>Kubernetes \u0627\u0633 \u0631\u06cc\u0627\u0633\u062a \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633\u06d2 \u06c1\u0645 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0635\u0644 \u062d\u0627\u0644\u062a \u0633\u06d2\u06d4 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u062e\u0644\u0627 \u06a9\u0648 \u067e\u064f\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0630\u0645\u06c1 \u062f\u0627\u0631 \u06c1\u06d2\u060c \u0686\u0627\u06c1\u06d2 \u0648\u06c1 \u0627\u0633 \u067e\u0648\u0688 \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06d2 \u0631\u06c1\u0627 \u06c1\u0648 \u062c\u0633\u06d2 \u06c1\u0645 \u0646\u06d2 \u062e\u062a\u0645 \u06a9\u06cc\u0627 \u06c1\u06d2 \u06cc\u0627 \u0627\u0633 \u067e\u0648\u0688 \u06a9\u0648 \u0633\u06a9\u0691\u0646\u0627 \u06c1\u06d2 \u062c\u0633\u06d2 \u06c1\u0645 \u0645\u0632\u06cc\u062f \u0646\u06c1\u06cc\u06ba \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0634\u0627\u06c1\u062f\u06c1\u060c \u0645\u0648\u0627\u0632\u0646\u06c1\u060c \u0627\u0648\u0631 \u0627\u062f\u0627\u06a9\u0627\u0631\u06cc \u06a9\u0627 \u06cc\u06c1 \u0644\u0648\u067e <strong>\u0645\u0641\u0627\u06c1\u0645\u062a<\/strong>. \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0645\u0637\u0644\u0648\u0628\u06c1 \u0627\u0635\u0644 \u062d\u0627\u0644\u062a \u06a9\u0648 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u0627\u060c \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u0627 \u06a9\u06c1 \u0622\u06af\u06d2 \u06a9\u06cc\u0627 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06c1\u0631 \u0628\u0627\u0631 \u0627\u0633 \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u06d2 \u0686\u0644\u0646\u06d2 \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06af\u0646\u062a\u06cc \u06a9\u0631\u0646\u0627\u060c \u0642\u0637\u0639 \u0646\u0638\u0631 \u0627\u0633 \u0633\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0627 \u0628\u062f\u0644 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u0644\u0648\u067e \u06a9\u0648 \u0632\u06cc\u0627\u062f\u06c1 \u0644\u0686\u06a9\u062f\u0627\u0631 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u0627\u0633 \u0628\u0627\u062a \u067e\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0646\u06d2 \u06c1\u0631 \u0648\u0627\u0642\u0639\u06c1 \u062f\u06cc\u06a9\u06be\u0627 \u06c1\u06d2\u060c \u0622\u067e \u0635\u0631\u0641 \u0627\u0633 \u0628\u0627\u062a \u067e\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0627\u0633\u06d2 \u0648\u0627\u067e\u0633 \u0628\u0644\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u0644\u0648\u067e \u0627\u0646 \u0648\u0633\u0627\u0626\u0644 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646\u06c1\u06cc\u06ba Kubernetes \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u0633\u0645\u062c\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u0627\u06cc\u06a9 \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u0645\u06cc\u06ba \u0645\u0637\u0644\u0648\u0628\u06c1 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06cc \u062d\u0627\u0644\u062a \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u062c\u0627\u0646\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u067e\u0648\u0631\u0627 \u062a\u0635\u0648\u0631 \u06c1\u06d2\u06d4 \u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u0645\u06cc\u06ba \u0628\u0627\u0642\u06cc \u0633\u0628 \u06a9\u0686\u06be (\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2\u060c \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631\u06cc\u06ba\u060c \u062d\u062a\u0645\u06cc \u0634\u06a9\u0644 \u062f\u06cc\u0646\u06d2 \u0648\u0627\u0644\u06d2\u060c \u0631\u06cc\u0627\u0633\u062a\u06cc \u062d\u0627\u0644\u0627\u062a) \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645 \u067e\u0631 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0627\u06cc\u06a9 \u0644\u0648\u067e \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2 \u062c\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0635\u0631\u0641 Kubernetes \u062c\u0627\u0646\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06c1\u0645 \u0646\u06d2 \u0627\u0646 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-operator-vs-controller-vs-crd\">\u0622\u067e\u0631\u06cc\u0679\u0631 \u0628\u0645\u0642\u0627\u0628\u0644\u06c1 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0628\u0645\u0642\u0627\u0628\u0644\u06c1 CRD<\/h3>\n<p>\u06cc\u06c1 \u062a\u06cc\u0646\u0648\u06ba \u0627\u0635\u0637\u0644\u0627\u062d\u0627\u062a \u0627\u06a9\u062b\u0631 \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u06d2 \u0628\u062f\u0644\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0648\u06c1 \u0627\u06cc\u06a9 \u06c1\u06cc \u0646\u0638\u0627\u0645 \u06a9\u06cc \u062a\u06cc\u0646 \u0645\u062e\u062a\u0644\u0641 \u067e\u0631\u062a\u0648\u06ba \u06a9\u0648 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<ul>\n<li>\n<p><strong>CustomResourceDefinition (CRD)<\/strong>: \u0627\u06cc\u06a9 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u062c\u0648 \u0646\u0626\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0633\u06a9\u06be\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 Kubernetes API \u0633\u0631\u0648\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0631\u062c\u0633\u0679\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 CRD \u0628\u0630\u0627\u062a \u062e\u0648\u062f \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627\u06d4 \u06cc\u06c1 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0641\u0627\u0631\u0645 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 API \u0633\u0631\u0648\u0631 \u06a9\u0648 \u0627\u0633\u0679\u0648\u0631\u060c \u062a\u0635\u062f\u06cc\u0642 \u0627\u0648\u0631 \u067e\u06cc\u0634 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u06a9\u0646\u0679\u0631\u0648\u0644\u0631<\/strong>: \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u062c\u0648 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0642\u0633\u0645 \u067e\u0631 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0634\u0646 \u0644\u0648\u067e \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0628\u0644\u0679 \u0627\u0646 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0633\u06d2 \u0644\u06d2 \u06a9\u0631 \u0627\u06cc\u06a9 \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u062a\u06a9 \u062c\u0648 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0642\u0633\u0645 \u06a9\u0648 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>PostgresCluster<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0622\u067e\u0631\u06cc\u0679\u0631<\/strong>: \u0627\u06cc\u06a9 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06cc\u0627 \u0686\u06be\u0648\u0679\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u06a9\u0627 \u0645\u062c\u0645\u0648\u0639\u06c1 \u062c\u0648 \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u0646\u0634\u0627\u0646\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u067e\u0646\u06d2 \u067e\u0648\u0631\u06d2 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u06a9\u0648 \u0645\u0646\u0638\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u0648\u0645\u06cc\u0646 \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u06a9\u0627\u0641\u06cc \u0639\u0644\u0645 \u06a9\u0648 \u0627\u0646\u06a9\u0648\u0688 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0628\u0634\u0645\u0648\u0644 \u067e\u0631\u0648\u0648\u06cc\u0698\u0646\u0646\u06af\u060c \u0627\u067e \u06af\u0631\u06cc\u0688\u060c \u0627\u0648\u0631 \u0641\u06cc\u0644 \u0627\u0648\u0648\u0631\u060c \u0627\u0646\u0633\u0627\u0646\u0648\u06ba \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u062a\u0645\u0627\u0645 \u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u062a\u0645\u0627\u0645 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u06cc\u06a9 CRD \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06c1\u06d2 \u062c\u0648 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-why-not-just-a-helm-chart-a-cronjob-or-a-script\">\u06c1\u06cc\u0644\u0645 \u0686\u0627\u0631\u0679\u060c \u06a9\u0631\u0648\u0646 \u062c\u0627\u0628\u060c \u06cc\u0627 \u0627\u0633\u06a9\u0631\u067e\u0679 \u06a9\u06cc\u0648\u06ba \u0646\u06c1\u06cc\u06ba\u061f<\/h3>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u067e\u0686 \u0686\u0627\u0631\u0679<\/strong> YAML \u067e\u0631 \u0633\u06cc\u0679 \u0648\u06cc\u0644\u06cc\u0648 \u0631\u06cc\u0646\u0688\u0631 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0644\u06af\u0627\u0626\u06cc\u06ba\u06d4 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0627\u0633 \u067e\u0631 \u0646\u0638\u0631 \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u0627 \u06a9\u0648\u0626\u06cc \u0637\u0631\u06cc\u0642\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u062a\u062e\u0644\u06cc\u0642 \u0634\u062f\u06c1 \u0648\u0633\u06cc\u0644\u06c1 \u062d\u0630\u0641 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u0628\u0691\u06be \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06c1\u06cc\u0644\u0645 \u06a9\u0648 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u067e\u062a\u06c1 \u0646\u06c1\u06cc\u06ba \u0686\u0644\u06d2 \u06af\u0627 \u062c\u0628 \u062a\u06a9 \u0622\u067e \u0627\u0633\u06d2 \u0646\u06c1\u06cc\u06ba \u0686\u0644\u0627\u062a\u06d2\u06d4 <code>helm upgrade<\/code> \u062f\u0648\u0628\u0627\u0631\u06c1 \u06c1\u0627\u062a\u06be \u0633\u06d2\u06d4<\/p>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u06a9\u0631\u0648\u0646 \u06a9\u0627\u0645<\/strong> \u06cc\u06c1 \u06af\u0631\u06cc\u0646\u0648\u0644\u0631\u06cc\u0679\u06cc \u06a9\u06cc \u0642\u06cc\u0645\u062a \u067e\u0631 \u0644\u0648\u067e \u0628\u06cc\u06a9\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u06cc\u06a9 \u0648\u0642\u0641\u06c1 \u062a\u06a9 \u062a\u0639\u0637\u0644\u060c \u067e\u06be\u0627\u0646\u0633\u06cc\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u06a9\u0648\u0626\u06cc \u062d\u0627\u0644\u062a \u0646\u06c1\u06cc\u06ba \u06af\u0632\u0631\u062a\u06cc\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06a9\u0631\u0648\u0646 \u062c\u0627\u0628 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0631\u0648\u0646 \u062c\u0627\u0628 \u0645\u06cc\u06ba \u0631\u06cc\u0627\u0633\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u067e\u0631 \u0631\u062f\u0639\u0645\u0644 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u06a9\u0648\u0626\u06cc \u0637\u0631\u06cc\u0642\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0648\u0631 <strong>\u0627\u06cc\u06a9 \u0648\u0642\u062a\u06cc \u0627\u0633\u06a9\u0631\u067e\u0679<\/strong> \u06cc\u06c1 \u0635\u0631\u0641 \u0627\u0633 \u0648\u0642\u062a \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06cc\u0627 CI \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0631\u0646\u0632 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0628\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u0632\u06cc\u062f \u0628\u0631\u0622\u06ba\u060c \u067e\u06c1\u0644\u06cc \u0642\u0633\u0645 \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0648 \u0634\u0627\u0630 \u0648 \u0646\u0627\u062f\u0631 \u06c1\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u0627\u0648\u0631 \u0630\u06c1\u0646 \u0645\u06cc\u06ba \u0631\u06a9\u06be \u06a9\u0631 \u0644\u06a9\u06be\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-why-an-operator-wins-here\">\u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u06cc\u06c1\u0627\u06ba \u06a9\u06cc\u0648\u06ba \u062c\u06cc\u062a\u062a\u06d2 \u06c1\u06cc\u06ba:<\/h4>\n<p>\u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0627\u0648\u0631 \u062a\u0631\u062a\u06cc\u0628 \u0648\u0627\u0631 \u06c1\u06cc\u06ba\u06d4 \u062c\u06cc\u0633\u06d2 \u06c1\u06cc \u06a9\u0648\u0626\u06cc \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u0648\u0633\u06cc\u0644\u06c1 \u0628\u0646\u062a\u0627 \u06c1\u06d2\u060c \u0627\u067e \u0688\u06cc\u0679 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u062d\u0630\u0641 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 API \u0633\u0631\u0648\u0631 \u0622\u067e \u06a9\u0648 \u0645\u0637\u0644\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0646\u06c1 \u0635\u0631\u0641 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0648\u0642\u062a\u060c \u0628\u0644\u06a9\u06c1 \u0627\u0633 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u067e\u0648\u0631\u06cc \u0632\u0646\u062f\u06af\u06cc \u0645\u06cc\u06ba \u0627\u06cc\u0688\u062c\u0633\u0679\u0645\u0646\u0679 \u06a9\u0631\u062a\u0627 \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u0646 \u0631\u06cc\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u06c1\u06d2 \u062c\u0648 \u0622\u067e\u0633 \u0645\u06cc\u06ba \u0645\u0644\u0646\u06d2 \u0645\u06cc\u06ba \u0648\u0642\u062a \u0644\u06cc\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0648\u0642\u062a \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0628\u06c1\u06c1 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0642\u06cc\u0645\u062a \u067e\u0631 \u0622\u062a\u0627 \u06c1\u06d2. \u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u0627\u067e\u0646\u06d2 \u06a9\u0631\u062f\u0627\u0631 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0631\u0633\u0627\u0626\u06cc \u06a9\u0646\u0679\u0631\u0648\u0644 (RBAC)\u060c \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06d2 \u0637\u0631\u06cc\u0642\u0648\u06ba\u060c \u0627\u0648\u0631 \u0645\u0634\u0627\u06c1\u062f\u0627\u062a\u06cc \u0633\u0637\u062d\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0637\u0648\u06cc\u0644 \u0639\u0631\u0635\u06d2 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0639\u0645\u0644 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0686\u0627\u0631\u0679 \u06cc\u0627 \u0627\u0633\u06a9\u0631\u067e\u0679 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba \u062a\u0639\u0645\u06cc\u0631 \u0627\u0648\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0642\u0631\u06cc\u0628 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u06a9\u0627 \u0645\u0633\u0626\u0644\u06c1 \u0648\u0627\u0642\u0639\u06cc \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u06a9\u0686\u06be YAML \u067e\u06cc\u0634 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06c1\u06cc\u0644\u0645 \u0686\u0627\u0631\u0679\u0633 \u0635\u062d\u06cc\u062d \u0679\u0648\u0644 \u06c1\u06cc\u06ba\u06d4 \u062c\u0628 \u0686\u06cc\u0632\u0648\u06ba \u06a9\u0648 \u0645\u0633\u062a\u0642\u0644 \u0637\u0648\u0631 \u067e\u0631 \u062f\u0631\u0633\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0686\u06cc\u0644\u0646\u062c \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u0635\u062d\u06cc\u062d \u0646\u062a\u0627\u0626\u062c \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u0627 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u06a9\u06d2 \u0628\u0627\u0642\u06cc \u062d\u0635\u06d2 \u06a9\u0627 \u0645\u0642\u0635\u062f \u06cc\u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-part-2-anatomy-of-an-operator\">\u062d\u0635\u06c1 2: \u0622\u067e\u0631\u06cc\u0679\u0631 \u062a\u062c\u0632\u06cc\u06c1<\/h2>\n<p>\u0627\u06af\u0644\u0627\u060c \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u06c1\u0645 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0634\u0646 \u0644\u0648\u067e \u06a9\u0648 \u062a\u0641\u0635\u06cc\u0644 \u0633\u06d2 \u062f\u06cc\u06a9\u06be\u06cc\u06ba\u060c \u0622\u0626\u06cc\u06d2 \u0627\u0646 \u067e\u0631\u0632\u0648\u06ba \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u062d\u0642\u06cc\u0642\u062a \u0645\u06cc\u06ba \u0627\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba: \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u0648\u0633\u0627\u0626\u0644 \u062e\u0648\u062f\u060c \u0648\u06c1 \u0645\u0634\u06cc\u0646 \u062c\u0648 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u062c\u0648 \u06cc\u06c1 \u0633\u0628 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-custom-resource\">\u0627\u067e\u0646\u06cc \u0645\u0631\u0636\u06cc \u06a9\u06d2 \u0648\u0633\u0627\u0626\u0644<\/h3>\n<p>\u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u06a9\u0648 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06d2 \u0633\u06a9\u06d2\u060c \u0627\u0633\u06d2 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u06a9\u06c1 API \u0633\u0631\u0648\u0631 \u06a9\u0633 \u0642\u0633\u0645 \u06a9\u0627 \u0645\u0648\u0627\u062f \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 CRD \u06a9\u0627 \u0627\u0646\u062f\u0631\u0627\u062c \u0622\u067e \u06a9\u0648 \u0628\u062a\u0627\u0626\u06d2 \u06af\u0627 \u06a9\u06c1 \u06cc\u06c1 \u06a9\u06cc\u0633\u0627 \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0645\u0627\u0645 \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u0648\u0633\u0627\u0626\u0644 \u0627\u06cc\u06a9 \u06c1\u06cc ID \u0641\u06cc\u0644\u0688 \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u062a\u0645\u0627\u0645 Kubernetes \u0627\u0634\u06cc\u0627\u0621 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2 (<code>kind<\/code>, <code>name<\/code>, <code>namespace<\/code>, <code>labels<\/code>\u0648\u063a\u06cc\u0631\u06c1)\u060c \u0627\u0648\u0631 \u062f\u0648 \u0641\u06cc\u0644\u0688\u0632 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u0646\u0627 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u06c1\u0645 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2: \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0627\u0648\u0631 \u0631\u06cc\u0627\u0633\u062a\u06d4 \u06cc\u06c1 \u062a\u0642\u0633\u06cc\u0645 \u0627\u06cc\u06a9 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0634\u0646 \u0644\u0648\u067e \u067e\u0631 \u0646\u0642\u0634\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<ul>\n<li>\n<p><strong>\u0642\u06cc\u0627\u0633 \u0622\u0631\u0627\u0626\u06cc<\/strong> \u06cc\u06c1 \u0645\u0637\u0644\u0648\u0628\u06c1 \u062d\u0627\u0644\u062a \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u062c\u0648 \u06a9\u0648\u0626\u06cc \u0648\u0633\u06cc\u0644\u06c1 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u0627\u0633 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0633\u06d2 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0635\u0631\u0641 \u0627\u0633\u06d2 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0635\u0648\u0631\u062a \u062d\u0627\u0644<\/strong> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u0634\u062f\u06c1 \u0631\u06cc\u0627\u0633\u062a \u06c1\u06d2\u06d4 \u0646\u062a\u0627\u0626\u062c \u0627\u0648\u0631 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u06a9\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0644\u06a9\u06be\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u06a9\u0644\u0627\u0626\u0646\u0679 \u062c\u0648 \u0631\u06cc\u0627\u0633\u062a \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633 \u06a9\u06d2 \u0627\u0631\u062f \u06af\u0631\u062f \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 \u0631\u06cc\u0627\u0633\u062a \u06a9\u0648 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0639\u0644\u06cc\u062d\u062f\u06c1 \u0627\u062c\u0627\u0632\u062a\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u067e\u0646\u06d2 \u0630\u06cc\u0644\u06cc \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u062e\u0631\u06cc \u062d\u0635\u06c1 \u0631\u062c\u0633\u0679\u0631\u06cc\u0634\u0646 \u06c1\u06d2\u06d4 API \u0633\u0631\u0648\u0631 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0628\u0627\u062a \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062a\u0645\u0627\u0645 \u06a9\u0644\u0627\u0626\u0646\u0679\u0633 \u06a9\u0648 \u0627\u0646\u06a9\u0648\u0688 \u0627\u0648\u0631 \u0688\u06cc \u06a9\u0648\u0688 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0634\u062a\u0631\u06a9\u06c1\u060c \u0645\u062a\u0641\u0642\u06c1 \u0637\u0631\u06cc\u0642\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0648\u06c1 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u067e\u0631 \u0627\u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633\u06a9\u06cc\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631 \u0644\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u06c1\u0645\u0627\u0631\u06cc \u0627\u0642\u0633\u0627\u0645 \u0635\u0631\u0641 \u062a\u0639\u0631\u06cc\u0641\u06cc\u06ba \u06c1\u06cc\u06ba \u062c\u0648 \u06a9\u0648\u0626\u06cc \u0641\u0631\u0627\u06c1\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4 \u06cc\u06c1 API \u0633\u0631\u0648\u0631 \u06a9\u0648 \u0627\u0646\u06c1\u06cc\u06ba \u0628\u0627\u0644\u06a9\u0644 \u0627\u0633\u06cc \u0637\u0631\u062d \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u067e\u06cc\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0637\u0631\u062d \u06cc\u06c1 \u067e\u0648\u0688\u0632 \u06cc\u0627 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u0648\u06ba \u06a9\u06cc \u062e\u062f\u0645\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062d\u0635\u06c1 3 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 \u062c\u0628 \u0622\u067e \u0627\u0633\u06d2 \u062d\u0642\u06cc\u0642\u06cc \u0632\u0646\u062f\u06af\u06cc \u0645\u06cc\u06ba \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0631\u062c\u0633\u0679\u0631\u06cc \u06a9\u06cc\u0633\u06cc \u062f\u06a9\u06be\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-watching-for-change\">\u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u06cc\u06ba<\/h3>\n<p>\u0622\u0631\u06a9\u06cc\u0633\u0679\u0631\u06cc\u0679\u0631 API \u0633\u0631\u0648\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u0644\u0648\u067e \u0645\u06cc\u06ba \u067e\u0648\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 &quot;\u06a9\u06cc\u0627 \u0627\u0628\u06be\u06cc \u062a\u06a9 \u06a9\u0686\u06be \u0628\u062f\u0644\u0627 \u06c1\u06d2\u061f&#8221; \u0627\u0633 \u06a9\u0648 \u0631\u0648\u06a9\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0646 \u0679\u06a9\u0691\u06d2 \u0645\u0644 \u06a9\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0646\u06c1\u06cc\u06ba <strong>\u0645\u062e\u0628\u0631<\/strong> API \u0633\u0631\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u0637\u0648\u06cc\u0644 \u0627\u0644\u0645\u062f\u062a \u06af\u06be\u0691\u06cc \u06a9\u06be\u0648\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u06cc \u06af\u0626\u06cc \u0642\u0633\u0645 \u06a9\u06cc \u062a\u0645\u0627\u0645 \u0627\u0634\u06cc\u0627\u0621 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0645\u0642\u0627\u0645\u06cc \u0627\u0646-\u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u06cc\u0634 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u06d2 \u0634\u0627\u0645\u0644 \u06c1\u0648\u0646\u06d2\u060c \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u062d\u0630\u0641 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06c1\u06cc \u0627\u0646\u06c1\u06cc\u06ba \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u0641\u06c1\u0631\u0633\u062a<\/strong> \u0686\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 API \u0633\u0631\u0648\u0631 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u067e\u0646\u06d2 \u06a9\u06cc\u0634\u06d2 \u0633\u06d2 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0622\u0631\u06a9\u06cc\u0633\u0679\u0631\u06cc\u0679\u0631 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 &quot;\u06a9\u06cc\u0627 \u06cc\u06c1 \u0648\u0633\u06cc\u0644\u06c1 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u061f&#8221; \u0645\u0642\u0627\u0645\u06cc \u0646\u0642\u0634\u06c1 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0627\u062e\u0631\u0627\u062c\u0627\u062a \u06a9\u06cc\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u06a9\u0627\u0644\u0632 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631<\/strong> \u06cc\u06c1 \u0645\u062e\u0628\u0631 \u0627\u0648\u0631 \u0635\u0644\u062d \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0648\u0627\u0642\u0639 \u06c1\u06d2\u06d4 \u062c\u0628 \u0645\u062e\u0628\u0631 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u062f\u06cc\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0648\u06c1 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u0648 \u06a9\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u06cc\u06c1 \u062e\u0648\u062f \u0627\u0634\u06cc\u0627\u0621 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u06a9\u0644\u06cc\u062f\u06cc\u06ba\u060c \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0646\u0627\u0645 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u0627\u06cc\u06a9 \u06a9\u0627\u0631\u06a9\u0646 \u0642\u0637\u0627\u0631 \u0633\u06d2 \u06a9\u0644\u06cc\u062f \u0646\u06a9\u0627\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u0645\u06cc\u06ba \u0645\u0635\u0627\u0644\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0642\u0637\u0627\u0631 \u06c1\u0645\u0627\u0631\u06d2 \u0644\u06cc\u06d2 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u0648\u0631 \u0631\u06cc\u0679 \u06a9\u0648 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0627\u0633\u06cc \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 10 \u0641\u0648\u0631\u06cc \u0627\u067e \u0688\u06cc\u0679\u0633 \u06a9\u0648 10 \u0641\u0627\u0644\u062a\u0648 \u0645\u0641\u0627\u06c1\u0645\u062a\u0648\u06ba \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0627\u06cc\u06a9 \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u0622\u0626\u0679\u0645 \u062a\u06a9 \u06a9\u0645 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/07\/1785356967_33_\u06a9\u0628\u0631\u0646\u06cc\u0679\u0633-\u0622\u067e\u0631\u06cc\u0679\u0631-\u06a9\u06cc\u0633\u06d2-\u0628\u0646\u0627\u06cc\u0627-\u062c\u0627\u0626\u06d2-\u0688\u0648\u06cc\u0644\u067e\u0631\u0632-\u06a9\u06d2-\u0644\u06cc\u06d2-\u0627\u06cc\u06a9-\u06c1\u06cc\u0646\u0688.png\" alt=\"\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2\u060c \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646\u0632\" style=\"display:block;margin:0 auto\" width=\"880\" height=\"420\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u06cc\u06c1\u06cc \u0648\u062c\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u0648 \u0686\u0627\u0628\u06cc\u0627\u06ba \u0645\u0644\u062a\u06cc \u06c1\u06cc\u06ba \u0646\u06c1 \u06a9\u06c1 \u0627\u0634\u06cc\u0627\u0621\u06d4 \u062c\u0628 \u062a\u06a9 \u06a9\u0627\u0631\u06a9\u0646 \u0642\u0637\u0627\u0631 \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u06a9\u0644\u06cc\u062f \u0627\u0679\u06be\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0639\u062a\u0631\u0627\u0636 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648 \u0686\u06a9\u0627 \u06c1\u0648 \u06af\u0627\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06c1\u0645\u06cc\u0634\u06c1 \u0627\u0633 \u0628\u0627\u062a \u067e\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u062e\u0648\u062f \u0645\u0648\u062c\u0648\u062f\u06c1 \u062d\u0627\u0644\u062a \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633\u06d2 \u06a9\u0633 \u0686\u06cc\u0632 \u0646\u06d2 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u06cc\u0627\u06d4<\/p>\n<h3 id=\"heading-manager\">\u0645\u06cc\u0646\u06cc\u062c\u0631<\/h3>\n<p>\u0645\u06cc\u0646\u06cc\u062c\u0631 \u0648\u06c1 \u0639\u0645\u0644 \u06c1\u06d2 \u062c\u0648 \u0627\u0633 \u0633\u0628 \u06a9\u0627 \u0645\u0627\u0644\u06a9 \u06c1\u06d2: \u0645\u0634\u062a\u0631\u06a9\u06c1 \u06a9\u06cc\u0634 \u062c\u0633\u06d2 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0622\u0628\u0627\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0648\u06c1 \u06a9\u0644\u0627\u0626\u0646\u0679 \u062c\u0646\u06c1\u06cc\u06ba \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u0627\u0634\u06cc\u0627\u0621 \u06a9\u0648 \u067e\u0691\u06be\u0646\u06d2 \u0627\u0648\u0631 \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0631\u06cc\u0627\u0633\u062a\u060c \u0627\u0633\u0679\u06cc\u062c\u0646\u06af\u060c \u0627\u0648\u0631 \u0645\u06cc\u0679\u0631\u06a9\u0633 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u062c\u0648 \u0628\u0627\u0642\u06cc \u06a9\u0644\u0633\u0679\u0631 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646\u0644 \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u0645\u0627\u0688\u0631\u06cc\u0679\u0631\u0632 \u062c\u0648 \u06c1\u0645 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0688\u0645\u0646\u0633\u0679\u0631\u06cc\u0679\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0633\u062a\u06cc\u0627\u0628\u06cc \u06a9\u06cc \u0648\u062c\u0648\u06c1\u0627\u062a \u06a9\u06cc \u0628\u0646\u0627\u0621 \u067e\u0631\u060c \u0627\u06af\u0631 \u0622\u067e \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u06cc \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0646\u0642\u0644 \u0686\u0644\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u0646\u06c1\u06cc\u06ba \u0686\u0627\u06c1\u062a\u06d2 \u06a9\u06c1 \u062f\u0648\u0646\u0648\u06ba \u0646\u0642\u0644\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0648\u0642\u062a \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0686\u06cc\u0632 \u06a9\u0648 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u062f\u0648\u0691\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0646\u062a\u0638\u0645 \u0627\u0633 \u06a9\u0648 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <strong>\u0644\u06cc\u0688\u0631 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628<\/strong>. \u0646\u0642\u0644\u06cc\u06ba \u0644\u06cc\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0642\u0627\u0628\u0644\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0628\u0627\u0644\u06a9\u0644 \u0627\u06cc\u06a9 \u06a9\u0648 \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0641\u0639\u0627\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u062c\u0628 \u06a9\u06c1 \u062f\u06cc\u06af\u0631 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0628\u06cc\u06a9\u0627\u0631 \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u0644\u06cc\u0688\u0631 \u0627\u0646 \u06a9\u06cc \u062a\u062c\u062f\u06cc\u062f \u06a9\u0631\u0646\u0627 \u0628\u0646\u062f \u0646\u06c1 \u06a9\u0631 \u062f\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0627\u0633 \u06a9\u06cc \u0627\u0635\u0644 \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062d\u0635\u06c1 4 \u0645\u06cc\u06ba \u0628\u062d\u062b \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4 \u0627\u0628\u06be\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u06cc\u06c1 \u062c\u0627\u0646\u0646\u0627 \u06a9\u0627\u0641\u06cc \u06c1\u06d2 \u06a9\u06c1 \u0645\u06cc\u0646\u06cc\u062c\u0631\u0632 \u06c1\u06cc \u0627\u0633 \u06a9\u0648 \u0645\u0645\u06a9\u0646 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-reconciliation-loop\">\u0645\u0641\u0627\u06c1\u0645\u062a \u0644\u0648\u067e<\/h3>\n<p>\u06cc\u06c1 \u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0627\u0633 \u0644\u0648\u067e \u06a9\u0648 \u0627\u0686\u06be\u06cc \u0637\u0631\u062d \u0633\u0645\u062c\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e\u0631\u06cc\u0679\u0631 \u062c\u0648 \u06a9\u0686\u06be \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0633 \u0645\u06cc\u06ba \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0627\u0633\u06d2 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u06d2 \u0627\u0646\u0679\u0631\u06cc \u067e\u0648\u0627\u0626\u0646\u0679 \u06a9\u0648 \u0635\u0631\u0641 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0627\u0648\u0631 \u0646\u0627\u0645 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0628\u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0648\u0636\u0627\u062d\u062a\u06cc\u06ba\u060c \u0634\u0631\u0627\u0626\u0637 \u06cc\u0627 \u0627\u062e\u062a\u0644\u0627\u0641\u0627\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u0648 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u0648 \u062e\u0648\u062f \u0644\u06cc\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0627\u0633 \u06a9\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062c\u0648 \u0627\u0633 \u06a9\u06cc \u062d\u0642\u06cc\u0642\u06cc \u062d\u0627\u0644\u062a \u0645\u06cc\u06ba \u0645\u0634\u0627\u06c1\u062f\u06c1 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0627 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062d\u062f \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0630\u06cc\u0644 \u06a9\u06cc \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u06cc \u0648\u062c\u06c1 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-idempotency\">\u0628\u06d2 \u062d\u0633\u06cc<\/h4>\n<p>\u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u0635\u0631\u0641 \u0686\u0627\u0628\u06cc\u0627\u06ba \u0644\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06c1\u06cc \u0686\u06cc\u0632 \u067e\u0631 \u0645\u062a\u0639\u062f\u062f \u0628\u0627\u0631 \u06a9\u0627\u0644 \u06a9\u06cc \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06d2 (\u067e\u06d2 \u062f\u0631 \u067e\u06d2\u060c \u062a\u0631\u062a\u06cc\u0628 \u0633\u06d2 \u0628\u0627\u06c1\u0631\u060c \u06cc\u0627 \u0627\u06cc\u06a9 \u0637\u0648\u06cc\u0644 \u0648\u0642\u0641\u06c1 \u06a9\u06d2 \u0628\u0639\u062f)\u060c \u0627\u0633 \u0633\u06d2 \u0642\u0637\u0639 \u0646\u0638\u0631 \u06a9\u06c1 \u06cc\u06c1 \u06a9\u062a\u0646\u06cc \u06c1\u06cc \u0628\u0627\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u0646\u062a\u06cc\u062c\u06c1 \u0646\u06a9\u0627\u0644\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0627\u06cc\u06a9 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u062c\u0648 \u0622\u0646\u06a9\u06be \u0628\u0646\u062f \u06a9\u0631 \u06a9\u06d2 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06c1\u0631 \u0628\u0627\u0631 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u06cc\u0633\u06d2 \u06c1\u06cc \u06cc\u06c1 \u062f\u0648 \u0628\u0627\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u0679\u0648\u0679 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u0648 \u062f\u0648\u0633\u0631\u06cc \u06a9\u0627\u0644 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4<\/p>\n<p>\u062d\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u0645\u06cc\u0634\u06c1 \u0645\u0648\u062c\u0648\u062f\u06c1 \u062d\u06cc\u062b\u06cc\u062a \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0633\u06d2 \u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u0628\u0646\u0627\u0626\u06cc\u06ba \u062c\u0628 \u06cc\u06c1 \u063a\u0627\u0626\u0628 \u06c1\u0648\u060c \u0627\u0633\u06d2 \u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u06cc\u06ba \u062c\u0628 \u06cc\u06c1 \u0645\u062e\u062a\u0644\u0641 \u06c1\u0648\u060c \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u062d\u0630\u0641 \u06a9\u0631\u06cc\u06ba \u062c\u0628 \u06cc\u06c1 \u0645\u0648\u062c\u0648\u062f \u0646\u06c1 \u06c1\u0648\u06d4<\/p>\n<h4 id=\"heading-event-driven-reconciliation\">\u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0627\u0633\u06a9\u06cc\u0644\u0646\u06af<\/h4>\n<p>\u067e\u06cc\u0645\u0627\u0646\u06c1 \u0633\u0627\u0632\u06cc \u06a9\u0648 \u0648\u0633\u06cc\u0644\u06c1 \u06a9\u06d2 \u0645\u0648\u0627\u0641\u0642 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0642\u0648\u0627\u0639\u062f \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642\u060c \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u0648 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0645\u0644\u06a9\u06cc\u062a \u06c1\u06d2 \u06cc\u0627 \u0627\u0633 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2\u06d4 \u0645\u0632\u06cc\u062f \u0628\u0631\u0622\u06ba\u060c \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u0645\u062a\u0648\u0627\u062a\u0631 \u0631\u06cc \u0633\u0646\u06a9\u0631\u0648\u0646\u0627\u0626\u0632\u06cc\u0634\u0646 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 \u0644\u0648\u067e \u0634\u06cc\u0688\u0648\u0644 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u0627\u06af\u0631 \u06af\u06be\u0691\u06cc \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u0628\u0627\u0644\u06a9\u0644 \u0628\u06be\u06cc \u0646\u06c1 \u06c1\u0648\u06ba\u06d4 \u06cc\u06c1 \u0627\u0633 \u0648\u0642\u062a \u0627\u06c1\u0645 \u06c1\u06d2 \u062c\u0628 \u0631\u06cc\u0627\u0633\u062a \u0627\u0646 \u0648\u062c\u0648\u06c1\u0627\u062a \u06a9\u06cc \u0628\u0646\u0627 \u067e\u0631 \u0686\u0644\u06cc \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06d2 \u062c\u0646 \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u06af\u06be\u0691\u06cc \u0646\u06c1\u06cc\u06ba \u067e\u06a9\u0691\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-requeues\">Requiem<\/h4>\n<p>\u0628\u0639\u0636 \u0627\u0648\u0642\u0627\u062a \u0627\u06cc\u06a9 \u0648\u0627\u062d\u062f \u0645\u0631\u0628\u0648\u0637 \u062a\u0631\u0633\u06cc\u0644 \u06a9\u0633\u06cc \u06a9\u0627\u0645 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u06a9\u06be\u0691\u0627 \u06a9\u0627\u0645 \u0627\u0628 \u0628\u06be\u06cc \u06a9\u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062c\u0627\u0631\u06cc \u06c1\u06d2\u06d4 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u0688\u062c\u0633\u0679\u0631 \u0627\u0633\u06d2 \u0646\u0627\u06a9\u0627\u0645\u06cc \u0646\u06c1 \u0633\u0645\u062c\u06be\u06d2 \u0627\u0648\u0631 \u062a\u0627\u062e\u06cc\u0631 \u06a9\u06d2 \u0628\u0639\u062f \u0648\u0627\u067e\u0633 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u0646 \u0686\u06cc\u0632\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2 \u062c\u0648 \u0627\u06cc\u06a9 \u06a9\u0627\u0644 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u06a9\u0679\u06be\u0627 \u06c1\u0648\u0646\u06d2 \u0645\u06cc\u06ba \u0648\u0642\u062a \u0644\u06cc\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h4 id=\"heading-error-handling\">\u06c1\u06cc\u0646\u0688\u0644\u0646\u06af \u0645\u06cc\u06ba \u062e\u0631\u0627\u0628\u06cc<\/h4>\n<p>\u063a\u0644\u0637\u06cc \u0648\u0627\u067e\u0633 \u06a9\u0631\u0646\u0627 \u06a9\u0686\u06be \u0627\u06cc\u0633\u0627 \u06c1\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u062a\u0627\u062e\u06cc\u0631 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u06cc\u06a9 \u06a9\u0641\u0627\u06cc\u062a\u06cc \u0628\u06cc\u06a9 \u0622\u0641 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u06d4 \u0644\u06c1\u0630\u0627 \u0627\u06cc\u06a9 \u0645\u0641\u0627\u06c1\u0645\u062a \u062c\u0648 \u0645\u0633\u062a\u0642\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0627\u06a9\u0627\u0645 \u0631\u06c1\u062a\u06cc \u06c1\u06d2 \u0648\u06c1 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0628\u0631\u0628\u0627\u062f \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0648 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0646 \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0641\u0631\u0642 \u06a9\u0631\u0646\u0627 \u0627\u0686\u06be\u0627 \u062e\u06cc\u0627\u0644 \u06c1\u06d2 \u062c\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06cc\u06ba (\u062c\u06cc\u0633\u06d2 \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u06cc\u0627 \u0644\u0627\u06a9 \u062a\u0646\u0627\u0632\u0639\u0627\u062a) \u0627\u0648\u0631 \u062c\u0648 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba (\u062c\u06cc\u0633\u06d2 \u063a\u0644\u0637 \u0648\u0636\u0627\u062d\u062a\u06cc\u06ba \u062c\u0646\u06c1\u06cc\u06ba \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633\u0679\u06cc\u0679\u0633 \u06a9\u0646\u0688\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0634\u0627\u0646 \u0632\u062f \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2)\u06d4<\/p>\n<h4 id=\"heading-drift-correction\">\u0628\u06c1\u0627\u0624 \u06a9\u06cc \u0627\u0635\u0644\u0627\u062d<\/h4>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0645\u0646\u062f\u0631\u062c\u06c1 \u0628\u0627\u0644\u0627 \u0633\u0628 \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u0627 \u0644\u0648\u067e \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0679\u06be\u06cc\u06a9 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0627\u0633 \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0641\u0631\u0642 \u0646\u06c1\u06cc\u06ba \u067e\u0691\u062a\u0627 \u06a9\u06c1 \u0688\u0631\u0641\u0679 \u06a9\u0633\u06cc \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u0622\u06cc\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0633\u06d2 \u0686\u0644\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u06a9\u06cc\u0648\u0646\u06a9\u06c1 reconcile \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u067e\u0631 \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0631\u062f \u0639\u0645\u0644 \u0638\u0627\u06c1\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0631 \u0628\u0627\u0631 \u067e\u0648\u0631\u06d2 \u0641\u0631\u0642 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0645\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>kubectl edit<\/code>\u06cc\u06c1 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u06cc\u0627 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0646\u0638\u0627\u0645 \u06c1\u06d2 \u062c\u0648 \u062e\u0648\u062f \u0631\u06cc\u0627\u0633\u062a \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0644\u06cc \u0627\u06cc\u0688\u062c\u0633\u0679\u0645\u0646\u0679\u060c \u062c\u0648 \u0648\u0627\u0686 \u0627\u06cc\u0648\u0646\u0679 \u06cc\u0627 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631\u06cc \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0633\u06cc \u0641\u0631\u0642 \u06a9\u0648 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0686\u06cc\u06a9 \u06a9\u0631\u06d2 \u06af\u06cc \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0627\u0633\u06cc \u0637\u0631\u062d \u0628\u0646\u062f \u06a9\u0631\u06d2 \u06af\u06cc\u06d4<\/p>\n<h2 id=\"heading-part-3-building-the-operator\">\u062d\u0635\u06c1 3: \u0628\u0644\u0688\u0646\u06af \u0622\u067e\u0631\u06cc\u0679\u0631\u0632<\/h2>\n<p>\u0627\u0628 \u062a\u06a9 \u0633\u0628 \u06a9\u0686\u06be \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u0628 \u06c1\u0645 \u062c\u0627\u0646\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u06a9\u06cc\u0627 \u06c1\u06cc\u06ba\u060c \u0627\u0646 \u06a9\u06d2 \u0627\u0631\u062f\u06af\u0631\u062f \u06a9\u06cc \u0627\u0635\u0637\u0644\u0627\u062d\u0627\u062a \u06a9\u06cc\u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0634\u0646 \u0644\u0648\u067e \u06a9\u0646 \u062d\u0635\u0648\u06ba \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0628 \u06c1\u0645 \u06cc\u06c1 \u0633\u0628 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0628\u0646\u0627\u0646\u06d2 \u062c\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 <strong>\u0648\u06cc \u0627\u06cc\u0645 \u0627\u0648 \u0622\u067e\u0631\u06cc\u0679\u0631<\/strong>. \u06cc\u06c1 \u0622\u067e\u0631\u06cc\u0679\u0631 \u06c1\u06d2 \u062c\u0648 \u0627\u0633 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>VirtualMachine<\/code> \u0645\u0648\u06a9 \u06a9\u0644\u0627\u0624\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u062a\u0639\u0627\u0648\u0646 \u06cc\u0627\u0641\u062a\u06c1 \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u0648\u0633\u0627\u0626\u0644 \u0628\u06be\u06cc \u0686\u06be\u0648\u0679\u06cc HTTP \u062e\u062f\u0645\u0627\u062a \u06c1\u06cc\u06ba \u062c\u0648 \u062d\u0642\u06cc\u0642\u06cc \u062e\u062f\u0645\u0627\u062a \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06d2 \u0644\u06cc\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-yaml\">apiVersion: compute.example.com\/v1\nkind: VirtualMachine\nspec:\n  image: ubuntu-22.04\n  cpu: 2\n  memory: 4Gi\nstatus:\n  phase: Running\n  id: vm-123\n<\/code><\/pre>\n<p>\u06c1\u0645 \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0648\u0628\u0631\u0646\u06cc\u0679\u0633 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0648\u0631\u0686\u0648\u0626\u0644 \u0645\u0634\u06cc\u0646 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>kubectl apply<\/code> \u0622\u067e YAML \u0641\u0627\u0626\u0644\u06cc\u06ba \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0644\u0627\u0624\u0688 \u06a9\u0646\u0633\u0648\u0644 \u06cc\u0627 \u0639\u0644\u06cc\u062d\u062f\u06c1 CLI \u06a9\u0648 \u0686\u06be\u0648\u0626\u06d2 \u0628\u063a\u06cc\u0631 VMs \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>VVMoperator \u06a9\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u06cc\u06c1\u06cc \u0645\u062d\u0631\u06a9 \u06c1\u06d2\u06d4 Kubernetes \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0679\u0648\u0644\u0632 \u0645\u06cc\u06ba \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0686\u06cc\u0632 \u0628\u0646 \u062c\u0627\u062a\u06cc \u06c1\u06d2 (<code>kubectl<\/code>RBAC\u060c GitOps \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646\u0632) \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u062c\u0627\u0646\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0627\u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/07\/1785356967_746_\u06a9\u0628\u0631\u0646\u06cc\u0679\u0633-\u0622\u067e\u0631\u06cc\u0679\u0631-\u06a9\u06cc\u0633\u06d2-\u0628\u0646\u0627\u06cc\u0627-\u062c\u0627\u0626\u06d2-\u0688\u0648\u06cc\u0644\u067e\u0631\u0632-\u06a9\u06d2-\u0644\u06cc\u06d2-\u0627\u06cc\u06a9-\u06c1\u06cc\u0646\u0688.png\" alt=\"VMOperator \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631\" style=\"display:block;margin:0 auto\" width=\"1000\" height=\"520\" loading=\"lazy\" title=\"\"><\/p>\n<h3 id=\"heading-setup\">\u062a\u0631\u062a\u06cc\u0628<\/h3>\n<p>\u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0642\u0627\u0645\u06cc \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc\u060c \u0642\u0633\u0645 \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0633\u0628 \u0633\u06d2 \u0622\u0633\u0627\u0646 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">kind create cluster --name vmoperator\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0639\u0644\u0627\u0648\u06c1\u060c \u06c1\u0645 \u0627\u0633 \u062d\u0635\u06d2 \u0645\u06cc\u06ba Go \u06a9\u0648 \u0628\u0637\u0648\u0631 \u0622\u067e\u0631\u06cc\u0679\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4 <code>kubectl<\/code> \u0630\u06cc\u0644 \u0645\u06cc\u06ba \u0641\u0631\u0636\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u0644\u0627\u0633\u06a9 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0627\u0648\u0631 \u0627\u0632\u06af\u0631 \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">pip install flask\n<\/code><\/pre>\n<h3 id=\"heading-mock-provider\">\u0641\u0631\u0636\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1<\/h3>\n<p>\u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u0648\u0688 \u0644\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06c1\u0645\u06cc\u06ba \u0627\u06cc\u0633\u06cc \u0686\u06cc\u0632 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u062c\u0633\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631 \u0633\u06a9\u06d2\u06d4 \u0641\u0631\u0636\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06cc HTTP \u0633\u0631\u0648\u0633 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u062a\u06cc\u0646 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06cc \u062d\u0645\u0627\u06cc\u062a \u0635\u0631\u0641 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0644\u063a\u062a \u0633\u06d2 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u062a\u0645\u0627\u0645 VM \u0627\u0633 \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06c1\u0648\u06ba \u06af\u06d2: <code>Provisioning<\/code> \u0627\u0648\u0631 \u0627\u0633\u06d2 \u067e\u0644\u0679 \u062f\u06cc\u06ba\u06d4 <code>Running<\/code> \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u0648 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u0645\u0627\u0646\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u0631\u0627\u0626\u06d2 \u0634\u0645\u0627\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u067e\u0631 \u0645\u062c\u0628\u0648\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688\u0632 \u06a9\u0627\u0641\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u0645 \u0627\u0633\u06d2 \u0627\u0632\u06af\u0631 \u0645\u06cc\u06ba \u0644\u06a9\u06be \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u06af\u0648 \u0646\u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u0627 \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u06d2 \u06a9\u0648\u0688 \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u062a\u0639\u0644\u0642 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0635\u0631\u0641 \u0645\u0630\u0627\u0642 \u06a9\u06d2 \u0645\u0642\u0627\u0635\u062f \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">import random\nimport string\nimport threading\nimport time\n\nfrom flask import Flask, jsonify, request\n\napp = Flask(__name__)\nvms = {}  # in-memory store, keyed by VM id\n\ndef provision(vm):\n    time.sleep(5)  # simulate provisioning taking time\n    vm[\"phase\"] = \"Running\"\n\n@app.post(\"\/vms\")\ndef create_vm():\n    body = request.get_json()\n    vm_id = \"vm-\" + \"\".join(random.choices(string.digits, k=6))\n    vm = {\"id\": vm_id, \"image\": body[\"image\"], \"phase\": \"Provisioning\"}\n    vms[vm_id] = vm\n\n    threading.Thread(target=provision, args=(vm,), daemon=True).start()  # flips to Running in the background\n\n    return jsonify(vm)\n\n@app.get(\"\/vms\/<vm_id>\")\ndef get_vm(vm_id):\n    vm = vms.get(vm_id)\n    if vm is None:\n        return \"\", 404\n    return jsonify(vm)\n\n@app.delete(\"\/vms\/<vm_id>\")\ndef delete_vm(vm_id):\n    vms.pop(vm_id, None)\n    return \"\", 204\n\nif __name__ == \"__main__\":\n    app.run(port=8080, threaded=True)\n<\/vm_id><\/vm_id><\/code><\/pre>\n<p>\u0622\u067e \u0627\u0633\u06d2 \u0627\u067e\u0646\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0633 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0639\u0645\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0646 \u0628\u0646\u062f\u0631\u06af\u0627\u06c1\u0648\u06ba \u067e\u0631 \u0633\u0646\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646 \u067e\u0631 \u0622\u067e \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 Kubernetes \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0628\u06be\u06cc \u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0646\u0642\u0637\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 Kubernetes \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u06a9\u0644\u0627\u0624\u0688 API \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-defining-the-virtualmachine-crd\">\u0648\u0631\u0686\u0648\u0626\u0644 \u0645\u0634\u06cc\u0646 \u0633\u06cc \u0622\u0631 \u0688\u06cc \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641<\/h3>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u0626\u06d2 \u06a9\u0686\u06be \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0633 \u0686\u06cc\u0632 \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u06c1 <code>VirtualMachine<\/code> \u0642\u0633\u0645 \u062d\u0635\u06c1 2 \u0645\u06cc\u06ba \u062a\u0635\u0631\u06cc\u062d\u0627\u062a \u0627\u0648\u0631 \u0634\u0631\u0627\u0626\u0637 \u06a9\u06cc \u0628\u0627\u0644\u06a9\u0644 \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-go\">type VirtualMachineSpec struct {\n\tImage  string `json:\"image\"`\n\tCPU    int    `json:\"cpu\"`\n\tMemory string `json:\"memory\"`\n}\n\ntype VirtualMachineStatus struct {\n\tID    string `json:\"id,omitempty\"`    \/\/ provider-assigned id, empty until first provisioned\n\tPhase string `json:\"phase,omitempty\"` \/\/ mirrors the provider's lifecycle phase\n}\n\ntype VirtualMachine struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec   VirtualMachineSpec   `json:\"spec,omitempty\"`\n\tStatus VirtualMachineStatus `json:\"status,omitempty\"`\n}\n\ntype VirtualMachineList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []VirtualMachine `json:\"items\"`\n}\n<\/code><\/pre>\n<p><code>TypeMeta<\/code>    \u0644\u06d2 \u062c\u0627\u0646\u0627 <code>kind<\/code> \u0627\u0648\u0631 <code>apiVersion<\/code>\u06c1\u0631 Kubernetes \u0622\u0628\u062c\u06cc\u06a9\u0679 (\u0628\u0644\u0679 \u0627\u0646 \u06cc\u0627 \u06a9\u0633\u0679\u0645) \u0645\u06cc\u06ba \u0648\u06c1\u06cc \u062f\u0648 \u0641\u06cc\u0644\u0688\u0632 \u0622\u067e \u06a9\u0648 \u0628\u062a\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06cc\u06c1 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>ListMeta<\/code>    \u06cc\u06c1 \u0641\u06c1\u0631\u0633\u062a \u06a9\u06cc \u0642\u0633\u0645 \u0633\u06d2 \u0645\u0633\u0627\u0648\u06cc \u06c1\u06d2\u06d4 <code>resourceVersion<\/code> \u0627\u0648\u0631 <code>continue<\/code> \u0635\u0641\u062d\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 (\u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 <code>name<\/code>\/<code>namespace<\/code>)\u06d4 \u06cc\u06c1\u06cc \u0648\u062c\u06c1 \u06c1\u06d2\u06d4 <code>VirtualMachineList<\/code> \u0627\u0646\u062f\u0631\u0627\u062c <code>ListMeta<\/code> \u0627\u0633 \u06a9\u06d2 \u0622\u06af\u06d2 <code>TypeMeta<\/code> \u062c\u0628\u06a9\u06c1 <code>VirtualMachine<\/code> \u0627\u067e\u0646\u06d2 \u0627\u0646\u062f\u0631 \u0628\u0646\u0627\u06cc\u0627 <code>ObjectMeta<\/code>.<\/p>\n<p>\u062a\u0645\u0627\u0645 \u0627\u0642\u0633\u0627\u0645 \u062c\u0648 \u06c1\u0645 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2: <code>runtime.Object<\/code>\u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0646\u0641\u0627\u0630\u06d4 <code>DeepCopyObject<\/code>. \u06cc\u06c1 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u06c1\u0645\u0627\u0631\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u060c \u0644\u06cc\u06a9\u0646 \u0686\u0648\u0646\u06a9\u06c1 \u06c1\u0645 \u06cc\u06c1 \u062e\u0648\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u06a9\u0648\u0688 \u062f\u0631\u0627\u0635\u0644 \u0627\u0633 \u0637\u0631\u062d \u0646\u0638\u0631 \u0622\u0626\u06d2 \u06af\u0627: <code>VirtualMachine<\/code>. \u0628\u0627\u0642\u06cc \u0627\u0633\u06cc \u0645\u06a9\u06cc\u0646\u06cc\u06a9\u0644 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-go\">func (in *VirtualMachine) DeepCopyObject() runtime.Object {\n\tout := VirtualMachine{\n\t\tTypeMeta:   in.TypeMeta,\n\t\tObjectMeta: *in.ObjectMeta.DeepCopy(), \/\/ ObjectMeta already knows how to copy itself\n\t\tSpec:       in.Spec,                   \/\/ no pointers or slices in Spec, a plain copy is safe\n\t\tStatus:     in.Status,\n\t}\n\treturn &out\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1\u0627\u06ba CRD \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06c1\u06d2 \u062c\u0648 API \u0633\u0631\u0648\u0631 \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: apiextensions.k8s.io\/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: virtualmachines.compute.example.com\nspec:\n  group: compute.example.com\n  scope: Namespaced\n  names:\n    kind: VirtualMachine\n    listKind: VirtualMachineList\n    plural: virtualmachines\n    singular: virtualmachine\n    shortNames: [vm] # lets us type `kubectl get vm` instead of the full plural\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {} # splits status into its own subresource, see Part 2\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            spec:\n              type: object\n              required: [image, cpu, memory]\n              properties:\n                image: { type: string }\n                cpu: { type: integer }\n                memory: { type: string }\n            status:\n              type: object\n              properties:\n                phase: { type: string }\n                id: { type: string }\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>subresources.status<\/code> \u0644\u0627\u0626\u0646\u06cc\u06ba \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0631\u06cc\u0627\u0633\u062a \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0627\u067e \u0688\u06cc\u0679 \u067e\u0627\u062a\u06be \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0639\u0644\u06cc\u062d\u062f\u06c1 \u0630\u06cc\u0644\u06cc \u0648\u0633\u0627\u0626\u0644 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062d\u0635\u06c1 2 \u0645\u06cc\u06ba \u06cc\u06c1 \u062d\u062f \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u06cc\u0627 \u0644\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u06cc\u0627 \u0635\u0631\u0641 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u0644\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u06c1 <code>names<\/code> \u0627\u06cc\u06a9 \u0628\u0644\u0627\u06a9 \u0628\u06be\u06cc \u06a9\u06cc\u0627 \u06c1\u06d2\u061f <code>kubectl<\/code> \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u0627\u060c <code>kubectl get virtualmachines<\/code> \u06cc\u06c1 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 <code>plural<\/code> \u0648\u06c1 \u06cc\u06c1\u06cc \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>shortNames<\/code> \u06a9\u06cc\u0648\u0646\u06a9\u06c1 <code>kubectl get vm<\/code> \u06cc\u06c1 \u0628\u06be\u06cc \u0627\u0633\u06cc \u0637\u0631\u062d \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>kubectl get po<\/code> \u067e\u06be\u0644\u06cc\u0648\u06ba \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-reconciler\">\u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631<\/h3>\n<p>\u062b\u0627\u0644\u062b \u06a9\u0627 \u06a9\u0631\u062f\u0627\u0631 \u06a9\u0627\u063a\u0630 \u067e\u0631 \u0686\u06be\u0648\u0679\u0627 \u06c1\u06d2\u06d4 <code>VirtualMachine<\/code>\u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0645\u0645\u0627\u062b\u0644 VM \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u062d\u0642\u06cc\u0642\u062a \u06a9\u06cc \u0639\u06a9\u0627\u0633\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 HTTP API \u06a9\u0648 \u0686\u06be\u0648\u0679\u06d2 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u0644\u067e\u06cc\u0679\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u062b\u0627\u0644\u062b \u062e\u0648\u062f \u0627\u0633\u06d2 \u067e\u0691\u06be \u0633\u06a9\u06d2\u06d4<\/p>\n<pre><code class=\"language-go\">func (r *VirtualMachineReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {\n\tvar vm computev1.VirtualMachine\n\tif err := r.Get(ctx, req.NamespacedName, &vm); err != nil {\n\t\treturn ctrl.Result{}, client.IgnoreNotFound(err) \/\/ object was deleted, nothing left to do\n\t}\n\n\tif vm.Status.ID == \"\" {\n\t\t\/\/ no VM yet, this is the first time we've seen this object\n\t\tcreated, err := r.Provider.Create(ctx, vm.Spec.Image)\n\t\tif err != nil {\n\t\t\treturn ctrl.Result{}, err\n\t\t}\n\n\t\tvm.Status.ID = created.ID\n\t\tvm.Status.Phase = created.Phase\n\t\tif err := r.Status().Update(ctx, &vm); err != nil {\n\t\t\treturn ctrl.Result{}, err\n\t\t}\n\n\t\treturn ctrl.Result{RequeueAfter: 2 * time.Second}, nil \/\/ check back shortly instead of blocking here\n\t}\n\n\t\/\/ VM already exists, poll the provider for whatever it knows right now\n\tcurrent, err := r.Provider.Get(ctx, vm.Status.ID)\n\tif err != nil {\n\t\treturn ctrl.Result{}, err\n\t}\n\n\tvm.Status.Phase = current.Phase\n\tif err := r.Status().Update(ctx, &vm); err != nil {\n\t\treturn ctrl.Result{}, err\n\t}\n\n\tif current.Phase != \"Running\" {\n\t\treturn ctrl.Result{RequeueAfter: 2 * time.Second}, nil \/\/ still provisioning, keep polling\n\t}\n\n\treturn ctrl.Result{}, nil\n}\n<\/code><\/pre>\n<p>\u062f\u0648 \u0628\u0627\u062a\u06cc\u06ba \u0642\u0627\u0628\u0644 \u0630\u06a9\u0631 \u06c1\u06cc\u06ba\u06d4 \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0686\u0648\u0646\u06a9\u06c1 \u0622\u067e \u0646\u06d2 \u0627\u067e\u0646\u06cc \u06af\u06be\u0691\u06cc \u06cc\u06c1\u0627\u06ba \u0631\u062c\u0633\u0679\u0631 \u06a9\u06cc \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u0648 \u0627\u0633 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>VirtualMachine<\/code>. API \u0633\u0631\u0648\u0631 \u0622\u067e \u06a9\u0648 \u0627\u0633 \u0648\u0642\u062a \u0645\u0637\u0644\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0627\u06cc\u06a9 API \u062a\u062e\u0644\u06cc\u0642 \u06cc\u0627 \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0648 \u067e\u06c1\u0644\u06cc \u06a9\u0627\u0644 \u06a9\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0648\u0633\u0631\u0627\u060c \u06c1\u0631 \u0634\u0627\u062e \u06a9\u0627 \u0627\u062e\u062a\u062a\u0627\u0645 \u0627\u06cc\u06a9 \u062a\u062d\u0631\u06cc\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06c1\u0648\u062a\u0627 \u06c1\u06d2: <code>vm.Status<\/code>\u06c1\u0645 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0627 \u0646\u0642\u0634\u06c1 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06c1\u0645\u06cc\u06ba \u0648\u0633\u0627\u0626\u0644 \u0633\u06d2 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2\u06d4 Kubernetes \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0633\u06d2 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0628\u0627\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u0627 \u0648\u0627\u062d\u062f \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 VM \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06af\u0648\u0631\u0646\u0631 \u0646\u06d2 \u0627\u0633\u06d2 \u0627\u067e\u0646\u06cc \u062d\u06cc\u062b\u06cc\u062a \u0645\u06cc\u06ba \u0644\u0627\u06af \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-failure-handling-amp-retries\">\u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u0646\u0627 \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u0627<\/h3>\n<p>\u0627\u0648\u067e\u0631 \u0648\u0627\u0644\u0627 \u062b\u0627\u0644\u062b \u0627\u067e\u0646\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0633\u06cc \u0686\u06cc\u0632 \u06a9\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 <code>r.Provider.Create<\/code> \u06cc\u0627 <code>r.Provider.Get<\/code> \u0627\u06af\u0631 \u06cc\u06c1 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2 (\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u06a9\u06cc \u062e\u0631\u0627\u0628\u06cc \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u06cc\u0627 \u0641\u0631\u0636\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u0628\u06be\u06cc \u062a\u06a9 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2)\u060c \u06cc\u06c1 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u063a\u0644\u0637\u06cc \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06c1\u06d2\u06d4 \u063a\u0644\u0637\u06cc \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc \u06c1\u0645\u0627\u0631\u06cc \u062c\u0627\u0646\u0628 \u0633\u06d2 \u0627\u06cc\u06a9\u0633\u067e\u0648\u0646\u06cc\u0646\u0634\u0644 \u0628\u06cc\u06a9 \u0622\u0641 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0631\u0646 \u0679\u0627\u0626\u0645 \u0633\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0644\u0648\u067e\u0633 \u0633\u06d2 \u0646\u0645\u0679\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0622\u067e \u0627\u06cc\u0633\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u06cc\u06ba \u06af\u06d2 \u062c\u0648 \u0645\u0633\u0644\u0633\u0644 \u0646\u0627\u0642\u0627\u0628\u0644 \u0631\u0633\u0627\u0626\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0686\u06cc\u0632 \u062c\u0633 \u0633\u06d2 \u06c1\u0648\u0634\u06cc\u0627\u0631 \u0631\u06c1\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2 \u0648\u06c1 \u06c1\u06d2 \u062a\u0645\u0627\u0645 \u0646\u0627\u06a9\u0627\u0645\u06cc\u0648\u06ba \u06a9\u0627 \u0627\u0633\u06cc \u0637\u0631\u062d \u0639\u0644\u0627\u062c \u06a9\u0631\u0646\u0627\u06d4 \u0627\u067e\u0646\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0633\u06d2 \u0628\u0627\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u0644\u06cc\u0646\u0627 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>VirtualMachine<\/code> \u062c\u0633 \u06a9\u0627 <code>spec.image<\/code> \u0633\u067e\u0644\u0627\u0626\u0631 \u0627\u0633\u06d2 \u06a9\u0628\u06be\u06cc \u0642\u0628\u0648\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u06d2 \u06af\u0627\u06d4 \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0627\u06cc\u06a9 \u0645\u0635\u0631\u0648\u0641 \u0644\u0648\u067e \u0628\u0646\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u06a9\u0628\u06be\u06cc \u06a9\u0627\u0645\u06cc\u0627\u0628 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627\u06d4<\/p>\n<p>\u0645\u06cc\u06ba \u0627\u0633\u06d2 \u0631\u06cc\u0627\u0633\u062a\u06cc \u062d\u0627\u0644\u0627\u062a \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0633 \u0627\u0645\u062a\u06cc\u0627\u0632 \u06a9\u0648 \u062e\u0627\u0631\u062c\u06cc \u0634\u06a9\u0644 \u062f\u06cc\u0646\u06d2 \u06a9\u06cc \u0645\u0634\u0642 \u067e\u0631 \u0686\u06be\u0648\u0691 \u062f\u0648\u06ba \u06af\u0627\u06d4 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0628\u0627\u0644\u0627 \u0627\u06cc\u0688\u062c\u0633\u0679\u0631 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0641\u06a9\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u0626\u06d2 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0646\u0627\u06a9\u0627\u0645\u06cc \u0645\u0648\u0688 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0641\u0631\u0636\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u06cc\u06a9\u0633\u0631 \u0645\u0633\u062a\u0631\u062f \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-finalizer\">\u062e\u062a\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627<\/h3>\n<p>\u0627\u06af\u0631 \u06c1\u0645 \u062d\u0630\u0641 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>VirtualMachine<\/code> \u0641\u06cc \u0627\u0644\u062d\u0627\u0644\u060c Kubernetes \u0627\u0634\u06cc\u0627\u0621 \u06a9\u0648 \u0628\u06d2 \u062f\u062e\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u062a\u06cc\u0645 VMs \u06a9\u0648 \u067e\u06cc\u0686\u06be\u06d2 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u062e\u06cc\u0627\u0644 \u0645\u06cc\u06ba \u0627\u0628 \u0628\u06be\u06cc \u0686\u0644 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0679\u0631\u0645\u06cc\u0646\u06cc\u0679\u0631 \u0627\u0633 \u062e\u0644\u0627 \u06a9\u0648 \u067e\u0627\u0679\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u0634\u06cc\u0627\u0621 \u06a9\u06cc \u0627\u06cc\u06a9 \u062a\u0627\u0631 \u06c1\u06d2 \u062c\u0648 Kubernetes \u06a9\u0648 \u0628\u062a\u0627\u062a\u06cc \u06c1\u06d2\u060c &quot;\u062c\u0628 \u062a\u06a9 \u0645\u06cc\u06ba \u0622\u067e \u06a9\u0648 \u0646\u06c1 \u06a9\u06c1\u0648\u06ba \u0627\u0633\u06d2 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u062d\u0630\u0641 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4&#8221;<\/p>\n<pre><code class=\"language-go\">const vmFinalizer = \"compute.example.com\/vm-cleanup\"\n\nfunc (r *VirtualMachineReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {\n\tvar vm computev1.VirtualMachine\n\tif err := r.Get(ctx, req.NamespacedName, &vm); err != nil {\n\t\treturn ctrl.Result{}, client.IgnoreNotFound(err)\n\t}\n\n\tif !vm.DeletionTimestamp.IsZero() {\n\t\t\/\/ being deleted, deprovision through the provider before letting it go\n\t\tif controllerutil.ContainsFinalizer(&vm, vmFinalizer) {\n\t\t\tif vm.Status.ID != \"\" {\n\t\t\t\tif err := r.Provider.Delete(ctx, vm.Status.ID); err != nil {\n\t\t\t\t\treturn ctrl.Result{}, err\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontrollerutil.RemoveFinalizer(&vm, vmFinalizer) \/\/ safe to let the delete proceed now\n\t\t\treturn ctrl.Result{}, r.Update(ctx, &vm)\n\t\t}\n\t\treturn ctrl.Result{}, nil\n\t}\n\n\tif !controllerutil.ContainsFinalizer(&vm, vmFinalizer) {\n\t\tcontrollerutil.AddFinalizer(&vm, vmFinalizer) \/\/ register before we ever provision anything\n\t\tif err := r.Update(ctx, &vm); err != nil {\n\t\t\treturn ctrl.Result{}, err\n\t\t}\n\t}\n\n\t\/\/ ... provisioning logic from before\n\treturn ctrl.Result{}, nil\n}\n<\/code><\/pre>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>kubectl delete<\/code> \u06a9\u0648 <code>VirtualMachine<\/code> \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u0641\u0627\u0626\u0646\u0644\u0627\u0626\u0632\u0631 \u06c1\u06d2 \u062a\u0648 \u0627\u0633\u06d2 \u06c1\u0679\u0627\u06cc\u0627 \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0628\u0644\u06a9\u06c1 \u0633\u06cc\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>deletionTimestamp<\/code> \u0627\u0648\u0631 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0648\u06d4<\/p>\n<p>\u0627\u06af\u0644\u06cc \u06a9\u0627\u0644 \u0645\u06cc\u06ba\u060c \u0622\u0631\u06a9\u06cc\u0633\u0679\u0631\u06cc\u0679\u0631 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 VM \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u0646\u062f \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0641\u0627\u0626\u0646\u0644\u0627\u0626\u0632\u0631 \u06a9\u0648 \u06c1\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u0645\u0642\u0627\u0645 \u067e\u0631\u060c Kubernetes \u0622\u062e\u0631 \u0645\u06cc\u06ba \u0627\u0639\u062a\u0631\u0627\u0636 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0641\u0627\u0626\u0646\u0644\u0627\u0626\u0632\u0631 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u06af\u0627\u0631\u0646\u0679\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u0635\u0641\u0627\u0626\u06cc \u0686\u0644\u06d2 \u06af\u06cc\u06d4<\/p>\n<h3 id=\"heading-predicate\">\u067e\u06cc\u0634 \u06af\u0648\u0626\u06cc<\/h3>\n<p>\u0645\u0630\u06a9\u0648\u0631\u06c1 \u0628\u0627\u0644\u0627 \u0645\u0627\u0688\u0631\u06cc\u0679\u0631 \u0645\u06cc\u06ba \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0679\u06be\u06cc\u06a9 \u0679\u06be\u06cc\u06a9 \u06a9\u06cc\u0691\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062c\u0628 \u0628\u06be\u06cc \u0645\u062c\u06be\u06d2 \u0641\u0648\u0646 \u0622\u062a\u0627 \u06c1\u06d2\u06d4 <code>r.Status().Update<\/code>\u062a\u062d\u0631\u06cc\u0631 \u0628\u0630\u0627\u062a \u062e\u0648\u062f \u0627\u0639\u062a\u0631\u0627\u0636 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u062e\u0648\u062f \u0646\u06af\u0631\u0627\u0646\u06cc \u06a9\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0645\u0641\u0627\u06c1\u0645\u062a \u06a9\u0648 \u0648\u0627\u067e\u0633 \u0628\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0627\u0633\u06d2 \u0648\u06cc\u0633\u0627 \u06c1\u06cc \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06cc\u06c1 \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0646\u06c1\u06cc\u06ba \u06af\u06be\u0648\u0645\u06d2 \u06af\u0627\u06d4 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0627\u0633\u06cc \u062d\u0627\u0644\u062a \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0645\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u06cc\u06c1 \u0645\u0633\u062a\u062d\u06a9\u0645 \u0646\u06c1 \u06c1\u0648 \u062c\u0627\u0626\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u06c1\u0645\u0627\u0631\u06cc \u0627\u067e\u0646\u06cc \u062a\u062d\u0631\u06cc\u0631 \u06a9\u06d2 \u062c\u0648\u0627\u0628 \u0645\u06cc\u06ba \u0627\u06cc\u0688\u062c\u0633\u0679\u0645\u0646\u0679 \u06a9\u0631\u0646\u0627 \u0627\u0628 \u0628\u06be\u06cc \u0627\u06cc\u06a9 \u0641\u0636\u0648\u0644 \u0645\u0634\u0642 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06cc\u0634\u06cc\u0646 \u06af\u0648\u0626\u06cc \u0627\u0646 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0648 \u0641\u0644\u0679\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0648 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06a9\u0648\u0688 \u06a9\u06d2 \u0686\u0644\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u0641\u0627\u06c1\u0645\u062a \u06a9\u06cc \u0642\u0637\u0627\u0631 \u0644\u06af\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-go\">func (r *VirtualMachineReconciler) SetupWithManager(mgr ctrl.Manager) error {\n\treturn ctrl.NewControllerManagedBy(mgr).\n\t\tFor(&computev1.VirtualMachine{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). \/\/ drop status only events\n\t\tComplete(r)\n}\n<\/code><\/pre>\n<p><code>generation<\/code>    \u06cc\u06c1 \u0635\u0631\u0641 \u0627\u0633 \u0648\u0642\u062a \u0628\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u062c\u0628: <code>spec<\/code> \u062a\u0628\u062f\u06cc\u0644\u06cc \u0627\u0633\u0679\u06cc\u0679\u0633 \u0627\u067e \u0688\u06cc\u0679\u0633 \u06a9\u0648 \u0686\u06be\u0648\u0627 \u0646\u06c1\u06cc\u06ba \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>GenerationChangedPredicate<\/code> \u0627\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06c1\u0645 \u0627\u0633 \u0648\u0627\u0642\u0639\u06c1 \u06a9\u0648 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0633 \u0646\u06d2 \u0635\u0631\u0641 \u0631\u06cc\u0627\u0633\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u06cc\u0627 \u062a\u06be\u0627\u060c \u0644\u06c1\u0630\u0627 \u06c1\u0645\u0627\u0631\u06cc \u0627\u067e\u0646\u06cc \u062a\u062d\u0631\u06cc\u0631\u06cc\u06ba \u062f\u0648\u0628\u0627\u0631\u06c1 \u0645\u062a\u062d\u0631\u06a9 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u062a\u0628 \u06c1\u06cc \u0627\u0639\u062a\u062f\u0627\u0644 \u067e\u0631 \u0648\u0627\u067e\u0633 \u0622\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0645\u0639\u0646\u06cc \u062e\u06cc\u0632 \u062a\u0628\u062f\u06cc\u0644\u06cc \u0622\u062a\u06cc \u06c1\u06d2 \u06cc\u0627 \u062c\u0628 \u0622\u067e \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-owned-resources\">\u0645\u0644\u06a9\u06cc\u062a \u06a9\u06d2 \u0648\u0633\u0627\u0626\u0644<\/h3>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>VirtualMachine<\/code> \u0648\u062c\u0648\u062f <code>Running<\/code> \u06a9\u06c1\u06cc\u06ba \u062e\u0648\u062f \u06c1\u06cc \u06cc\u06c1 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0627\u0631\u0622\u0645\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u062a\u0648 \u0622\u0626\u06cc\u06d2 \u0622\u067e\u0631\u06cc\u0679\u0631 \u0628\u06be\u06cc \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>Secret<\/code> VM \u06a9\u06d2 \u06a9\u0646\u06a9\u0634\u0646 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-go\">func (r *VirtualMachineReconciler) reconcileConnectionSecret(ctx context.Context, vm *computev1.VirtualMachine) error {\n\tsecret := &corev1.Secret{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      vm.Name + \"-connection\",\n\t\t\tNamespace: vm.Namespace,\n\t\t},\n\t\tStringData: map[string]string{\"id\": vm.Status.ID},\n\t}\n\n\tif err := controllerutil.SetControllerReference(vm, secret, r.Scheme); err != nil {\n\t\treturn err \/\/ ties the Secret's lifecycle to this VirtualMachine\n\t}\n\n\treturn r.Patch(ctx, secret, client.Apply, client.ForceOwnership, client.FieldOwner(\"vmoperator\")) \/\/ create or update, either way\n}\n<\/code><\/pre>\n<p><code>SetControllerReference<\/code>    \u06cc\u06c1 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u06cc\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 <strong>\u0632\u06cc\u0631 \u0645\u0644\u06a9\u06cc\u062a \u0648\u0633\u0627\u0626\u0644<\/strong>\u0645\u0627\u0644\u06a9 \u06a9\u06d2 \u062d\u0648\u0627\u0644\u06c1 \u067e\u0631 \u0645\u06c1\u0631 \u0644\u06af\u0627\u0626\u06cc\u06ba\u06d4 <code>Secret<\/code> \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0634\u0627\u0631\u06c1 <code>VirtualMachine<\/code>.<\/p>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0645\u0641\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u06cc\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062d\u0630\u0641 \u06a9\u0631\u0646\u0627 <code>VirtualMachine<\/code> \u0627\u0628 \u06cc\u06c1 cascades \u0627\u0648\u0631 Kubernetes \u06a9\u0648\u0691\u0627 \u06a9\u0631\u06a9\u0679 <code>Secret<\/code> \u06cc\u06c1 \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0641\u0627\u0626\u0646\u0644\u0627\u0626\u0632\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u06a9\u0644\u0633\u0679\u0631 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0648\u0631 \u0627\u06af\u0631 \u06c1\u0645 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>Owns(&corev1.Secret{})<\/code> \u067e\u06c1\u0644\u0648 \u0628\u06c1 \u067e\u06c1\u0644\u0648 <code>For(&computev1.VirtualMachine{})<\/code> \u06a9\u0648 <code>SetupWithManager<\/code>\u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u06cc\u06ba \u06cc\u0627 \u062d\u0630\u0641 \u06a9\u0631\u06cc\u06ba\u06d4 <code>Secret<\/code> \u06cc\u06c1 \u0627\u067e\u0646\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0644\u06a9\u06cc\u062a \u06a9\u06cc \u0627\u06cc\u0688\u062c\u0633\u0679\u0645\u0646\u0679 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>VirtualMachine<\/code>. \u0644\u06c1\u0630\u0627 \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u0627\u0633\u06d2 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062d\u0630\u0641 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06c1\u0645 \u0627\u0633\u06d2 \u067e\u06c1\u0686\u0627\u0646 \u0644\u06cc\u06ba \u06af\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u0646\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u06c1\u06cc \u067e\u06cc\u0679\u0631\u0646\u060c <code>SetControllerReference<\/code> \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba <code>Owns()<\/code> \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u062f\u0648\u0633\u0631\u0627 \u0645\u0644\u06a9\u06cc\u062a\u06cc \u0648\u0633\u06cc\u0644\u06c1 \u0628\u0646\u062a\u0627 \u06c1\u06d2\u06d4 <code>Service<\/code> \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba VMs \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 \u0648\u0627\u0642\u0639 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062f\u0648 \u0645\u062e\u062a\u0644\u0641 \u0642\u0633\u0645 \u06a9\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06c1\u06cc\u06ba \u062c\u0648 \u0627\u06cc\u06a9 \u06a9\u06cc \u0645\u0644\u06a9\u06cc\u062a \u06c1\u06cc\u06ba\u06d4 <code>VirtualMachine<\/code>\u0628\u0633 <strong>\u06a9\u062b\u06cc\u0631 \u0645\u0644\u06a9\u06cc\u062a\u06cc \u0648\u0633\u0627\u0626\u0644<\/strong> \u0645\u06cc\u0631\u0627 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u0645\u0637\u0644\u0628 \u06c1\u06d2\u06d4 \u0645\u062e\u062a\u0644\u0641 \u0627\u0642\u0633\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u062f\u0648 \u0628\u0627\u0631 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-cross-resource-reconciliation\">\u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc\u06d4<\/h3>\n<p>\u06c1\u0631 <code>VirtualMachine<\/code> \u0627\u0628 \u062a\u06a9 \u06c1\u0645 \u0627\u06cc\u06a9 \u06c1\u0627\u0631\u0688 \u06a9\u0648\u0688\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u0627\u062a \u0686\u06cc\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062d\u0642\u06cc\u0642\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u0648\u06ba \u0645\u06cc\u06ba\u060c \u06cc\u06c1 \u0642\u0627\u0628\u0644 \u062a\u0631\u062a\u06cc\u0628 \u06c1\u0648\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0634\u0627\u0630 \u0648 \u0646\u0627\u062f\u0631 \u06c1\u06cc \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 <code>VirtualMachine<\/code>s \u0627\u06cc\u06a9 \u06c1\u06cc AWS \u0627\u06a9\u0627\u0624\u0646\u0679 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u0627\u0648\u0631 \u0627\u0633\u0646\u0627\u062f \u06a9\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 Azure \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 100 \u0645\u0632\u06cc\u062f \u06c1\u0648\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u0645 \u06c1\u06cc\u06ba <code>endpoint<\/code> \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0645\u06cc\u062f\u0627\u0646 <code>VirtualMachineSpec<\/code>\u062a\u0627\u06c1\u0645\u060c \u0627\u06af\u0631 \u0622\u067e \u0627\u067e\u0646\u06d2 \u0627\u0633\u0646\u0627\u062f \u06a9\u0648 \u06af\u06be\u0645\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u06cc\u0627 \u0679\u0627\u0626\u067e\u0646\u06af \u06a9\u06cc \u063a\u0644\u0637\u06cc \u06a9\u0648 \u062f\u0631\u0633\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u0648 \u06c1\u0631 \u0686\u06cc\u0632 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u0646\u0627 \u067e\u0691\u06d2 \u06af\u06cc\u06d4 <code>VirtualMachine<\/code> \u0627\u06cc\u06a9 \u0648\u0642\u062a \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0627\u0633\u06d2 \u0627\u0633 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u0686\u06cc\u0632 \u0645\u06cc\u06ba \u06a9\u06be\u06cc\u0646\u0686\u06cc\u06ba \u06af\u06d2 \u062a\u0648 \u0628\u06c1\u062a \u0633\u06d2 \u0644\u0648\u06af \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4 <code>VirtualMachine<\/code>\u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0622\u067e \u0627\u0633\u06d2 \u0646\u0627\u0645 \u0633\u06d2 \u062d\u0648\u0627\u0644\u06c1 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 \u0627\u06cc\u06a9 \u06c1\u06cc \u062a\u0631\u0645\u06cc\u0645 \u062a\u0645\u0627\u0645 \u0627\u0634\u06cc\u0627\u0621 \u067e\u0631 \u067e\u06be\u06cc\u0644 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0628 \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06cc \u0686\u06be\u0648\u0679\u06cc \u0633\u06cc \u0622\u0631 \u0688\u06cc \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-go\">type ProviderConfigSpec struct {\n\tEndpoint string `json:\"endpoint\"`\n}\n<\/code><\/pre>\n<p>\u0627\u0648\u0631 <code>providerRef<\/code> \u0645\u06cc\u062f\u0627\u0646 <code>VirtualMachineSpec<\/code> \u0627\u0633 \u06a9\u06d2 \u0646\u0627\u0645 \u0633\u06d2 \u0627\u06cc\u06a9 \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 \u062f\u0644\u0686\u0633\u067e \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u06a9\u0648\u0626\u06cc \u0646\u0626\u06cc \u0642\u0633\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06cc\u0633\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0628: <code>ProviderConfig<\/code> \u062a\u0628\u062f\u06cc\u0644\u06cc<\/p>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>VirtualMachine<\/code> \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u06a9\u06be\u062a\u06d2 <code>ProviderConfig<\/code> \u06cc\u06c1 \u0622\u0633\u0627\u0646 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0646\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0645\u0627\u0644\u06a9 \u06a9\u0627 \u06a9\u0648\u0626\u06cc \u062d\u0648\u0627\u0644\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>Owns()<\/code> \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0648\u06ba \u06af\u0627\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u06c1\u0645 \u0627\u0642\u0633\u0627\u0645 \u06a9\u0627 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06c1\u0631 \u0648\u0627\u0642\u0639\u06c1 \u06a9\u0648 \u062a\u0645\u0627\u0645 \u0648\u0627\u0642\u0639\u0627\u062a \u0633\u06d2 \u0646\u0642\u0634\u06c1 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>VirtualMachine<\/code> \u0627\u0633 \u0633\u06d2 \u06a9\u06cc\u0627 \u0645\u0631\u0627\u062f \u06c1\u06d2:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/07\/1785356967_921_\u06a9\u0628\u0631\u0646\u06cc\u0679\u0633-\u0622\u067e\u0631\u06cc\u0679\u0631-\u06a9\u06cc\u0633\u06d2-\u0628\u0646\u0627\u06cc\u0627-\u062c\u0627\u0626\u06d2-\u0688\u0648\u06cc\u0644\u067e\u0631\u0632-\u06a9\u06d2-\u0644\u06cc\u06d2-\u0627\u06cc\u06a9-\u06c1\u06cc\u0646\u0688.png\" alt=\"\u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0645\u0631\u0628\u0648\u0637 \u0641\u06cc\u0646 \u0622\u0624\u0679\" style=\"display:block;margin:0 auto\" width=\"820\" height=\"380\" loading=\"lazy\" title=\"\"><\/p>\n<pre><code class=\"language-go\">func (r *VirtualMachineReconciler) SetupWithManager(mgr ctrl.Manager) error {\n\treturn ctrl.NewControllerManagedBy(mgr).\n\t\tFor(&computev1.VirtualMachine{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})).\n\t\tOwns(&corev1.Secret{}).\n\t\tOwns(&corev1.Service{}).\n\t\tWatches(\n\t\t\t&computev1.ProviderConfig{}, \/\/ not owned, so Owns() won't catch its changes\n\t\t\thandler.EnqueueRequestsFromMapFunc(r.findVirtualMachinesForProviderConfig),\n\t\t).\n\t\tComplete(r)\n}\n\nfunc (r *VirtualMachineReconciler) findVirtualMachinesForProviderConfig(ctx context.Context, obj client.Object) []reconcile.Request {\n\tvar vms computev1.VirtualMachineList\n\tif err := r.List(ctx, &vms, client.InNamespace(obj.GetNamespace())); err != nil {\n\t\treturn nil\n\t}\n\n\tvar requests []reconcile.Request\n\tfor _, vm := range vms.Items {\n\t\tif vm.Spec.ProviderRef == obj.GetName() { \/\/ only re-enqueue VMs that actually reference this config\n\t\t\trequests = append(requests, reconcile.Request{NamespacedName: client.ObjectKeyFromObject(&vm)})\n\t\t}\n\t}\n\treturn requests\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06c1\u06d2 <strong>\u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc\u06d4<\/strong>: \u0627\u06cc\u06a9 \u0648\u0633\u06cc\u0644\u06c1 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u062f\u06cc\u06af\u0631 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0627\u067e\u0646\u0627\u0646\u06d2 \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0635\u0631\u0641 \u0641\u06cc\u0644\u0688 \u0648\u06cc\u0644\u06cc\u0648\u0632 \u0633\u06d2 \u0645\u0646\u0633\u0644\u06a9 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0645\u0644\u06a9\u06cc\u062a \u0633\u06d2 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1\u06cc\u06ba \u0633\u06d2 \u0627\u0633 \u067e\u0648\u0631\u06d2 \u0645\u0646\u0635\u0648\u0628\u06d2 \u06a9\u0627 \u062a\u06be\u06cc\u0645 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 <code>ProviderConfig<\/code> \u0627\u0633 \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u0627 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0648\u0631\u0698\u0646 AWS\u060c Azure\u060c \u06cc\u0627 GCP \u067e\u0631 \u062d\u0642\u06cc\u0642\u06cc \u0627\u0633\u0646\u0627\u062f \u0627\u0648\u0631 \u062d\u0642\u06cc\u0642\u06cc \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u06c1\u0648\u0646\u0627 \u06c1\u06d2\u06d4 \u0641\u0631\u0636\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u0627\u0633\u06cc \u062d\u062f \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-rbac\">\u0622\u0631 \u0628\u06cc \u0627\u06d2 \u0633\u06cc<\/h3>\n<p>\u0645\u0646\u062f\u0631\u062c\u06c1 \u0628\u0627\u0644\u0627 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0627\u0633 \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u06d2 \u06af\u0627\u06d4 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0635\u0631\u0641 \u0627\u0646 \u0622\u0626\u0679\u0645\u0632 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0646\u06c1\u06cc\u06ba \u06c1\u0645 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u0686\u06be\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>VirtualMachine<\/code> \u0627\u0648\u0631 <code>ProviderConfig<\/code> \u0627\u0639\u062a\u0631\u0627\u0636 <code>VirtualMachine<\/code> \u0627\u0644\u06af \u0633\u06d2 \u0630\u06cc\u0644\u06cc \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a <code>Secret<\/code>\/<code>Service<\/code> \u0648\u06c1 \u0627\u0634\u06cc\u0627\u0621 \u062c\u0648 \u06c1\u0645 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: rbac.authorization.k8s.io\/v1\nkind: ClusterRole\nmetadata:\n  name: vmoperator-manager-role\nrules:\n  - apiGroups: ['compute.example.com']\n    resources: ['virtualmachines', 'providerconfigs']\n    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']\n  - apiGroups: ['compute.example.com']\n    resources: ['virtualmachines\/status'] # separate rule, it's a separate subresource\n    verbs: ['get', 'update', 'patch']\n  - apiGroups: ['']\n    resources: ['secrets', 'services']\n    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']\n---\napiVersion: rbac.authorization.k8s.io\/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: vmoperator-manager-rolebinding\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: vmoperator-manager-role\nsubjects:\n  - kind: ServiceAccount\n    name: vmoperator-controller-manager\n    namespace: vmoperator-system\n<\/code><\/pre>\n<p><strong>\u0645\u06cc\u0645\u0648:<\/strong> VVMoperator \u06a9\u0644\u0633\u0679\u0631 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0641\u0639\u0627\u0644 HTTP \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u0646\u0638\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u06a9\u0648\u0626\u06cc \u0646\u06cc\u0627 \u0646\u0645\u0648\u0646\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 Crossplane\u060c AWS \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0628\u0631\u0627\u0626\u06d2 Kubernetes\u060c Cluster API\u060c \u0627\u0648\u0631 cert-manager \u0633\u0628\u06be\u06cc \u0627\u0633\u06cc \u0637\u0631\u062d CRDs \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u06cc\u0631\u0648\u0646\u06cc \u06cc\u0627 \u063a\u06cc\u0631 Kubernetes \u0631\u06cc\u0627\u0633\u062a \u06a9\u0648 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u0627\u0633 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u0631\u0627\u0645 \u062f\u06c1 \u0645\u062d\u0633\u0648\u0633 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u06cc\u06c1 \u0627\u0646 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2.<\/p>\n<p><strong>\u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0646\u0648\u0679:<\/strong> \u06c1\u0645 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 VVMOperator \u06a9\u06d2 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u0648 \u062a\u0646\u06af \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 VMs \u06a9\u0627 \u0633\u0627\u0626\u0632 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u060c VMs \u06a9\u0648 \u0631\u0648\u06a9\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u060c \u0633\u0646\u06cc\u067e \u0634\u0627\u0679\u0633 \u0644\u06cc\u06ba\u060c \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062c\u0633\u0645\u0627\u0646\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u067e\u0648\u0631\u0679 \u06a9\u0631\u06cc\u06ba <code>ProviderConfig<\/code> \u06cc\u06c1 \u06cc\u06c1\u0627\u06ba \u062c\u0648 \u06a9\u0686\u06be \u06c1\u06d2 \u0627\u0633 \u06a9\u06cc \u0642\u062f\u0631\u062a\u06cc \u062a\u0648\u0633\u06cc\u0639 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062c\u0628 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0644\u0648\u067e \u0679\u06be\u0648\u0633 \u0645\u062d\u0633\u0648\u0633 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0627\u06cc\u06a9 \u0645\u0639\u0642\u0648\u0644 \u0627\u06af\u0644\u0627 \u0645\u0631\u062d\u0644\u06c1\u06d4<\/p>\n<h2 id=\"heading-part-4-production-amp-deployment\">\u062d\u0635\u06c1 4: \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0627\u0648\u0631 \u062a\u0642\u0633\u06cc\u0645<\/h2>\n<p>\u0627\u0628 \u062c\u0628 \u06a9\u06c1 VVMoperator \u06a9\u0627\u0645 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u0622\u0626\u06cc\u06d2 \u062f\u06cc\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0627\u0633\u06d2 \u06a9\u0633 \u0637\u0631\u062d \u067e\u06cc\u06a9\u062c \u0627\u0648\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u060c \u0627\u0648\u0631 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u06d2 \u0628\u06c1\u062a\u0631 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<h3 id=\"heading-packaging-amp-deployment\">\u067e\u06cc\u06a9\u06cc\u062c\u0646\u06af \u0627\u0648\u0631 \u062a\u0642\u0633\u06cc\u0645<\/h3>\n<p>\u0627\u0628 \u062a\u06a9 \u06a9\u06cc \u06c1\u0631 \u0686\u06cc\u0632 \u06c1\u0645\u0627\u0631\u06cc \u0645\u0634\u06cc\u0646\u0648\u06ba \u067e\u0631 \u0628\u0627\u0626\u0646\u0631\u06cc \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4 <code>go run<\/code> \u06a9\u0633\u06cc \u0628\u06be\u06cc \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 <code>kubectl<\/code> \u06a9\u0686\u06be \u0627\u06cc\u0633\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>Deployment<\/code> \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0627\u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u06a9\u062b\u06cc\u0631 \u0645\u0631\u062d\u0644\u06c1 \u0645\u0644\u062a\u0627 \u06c1\u06d2\u06d4 <code>Dockerfile<\/code>: \u0645\u0631\u062a\u0628 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0642\u062f\u0645 \u0627\u0648\u0631 \u062d\u0642\u06cc\u0642\u062a \u0645\u06cc\u06ba \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0628\u06c1\u062a \u0686\u06be\u0648\u0679\u06cc \u062f\u0648\u0633\u0631\u06cc \u062a\u0635\u0648\u06cc\u0631:<\/p>\n<pre><code class=\"language-dockerfile\">FROM golang:1.26 AS build\nWORKDIR \/src\nCOPY . .\nRUN CGO_ENABLED=0 go build -o \/vmoperator .\/cmd\/manager\n\nFROM gcr.io\/distroless\/static-debian12\nCOPY --from=build \/vmoperator \/vmoperator\nUSER 65532:65532 # nonroot, matches the security context on the Deployment below\nENTRYPOINT [\"\/vmoperator\"]\n<\/code><\/pre>\n<p>\u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba \u0645\u06a9\u0645\u0644 \u06af\u0648 \u0679\u0648\u0644 \u06a9\u0679 \u0627\u0648\u0631 \u062a\u0645\u0627\u0645 \u0633\u0648\u0631\u0633 \u0641\u0627\u0626\u0644\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u060c \u062c\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0633\u06cc \u06a9\u0648 \u0628\u06be\u06cc \u0628\u06be\u06cc\u062c\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062d\u062a\u0645\u06cc \u062a\u0635\u0648\u06cc\u0631 \u0635\u0631\u0641 \u0645\u0631\u062a\u0628 \u0634\u062f\u06c1 \u0628\u0627\u0626\u0646\u0631\u06cc \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2\u060c \u062c\u0633 \u0645\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0648\u06c1 \u0686\u06cc\u0632\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u06cc \u06a9\u0646\u0679\u06cc\u0646\u0631 \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u06a9\u0648 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0627\u0633 \u0633\u06cc\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0628\u06be\u06cc \u0642\u062f\u0645 \u062c\u0645\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u062e\u0648\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>runAsNonRoot<\/code> \u06cc\u06c1 \u0645\u0642\u0631\u0631 \u06c1\u06d2.<\/p>\n<pre><code class=\"language-bash\">docker build -t registry.example.com\/vmoperator:v0.1.0 .\ndocker push registry.example.com\/vmoperator:v0.1.0\n<\/code><\/pre>\n<p>\u0648\u06c1 \u062a\u0635\u0648\u06cc\u0631 \u06c1\u06d2\u06d4 <code>Deployment<\/code> \u0630\u06cc\u0644 \u0645\u06cc\u06ba \u0628\u06cc\u0627\u0646 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 <code>config\/manager\/<\/code> \u0645\u06cc\u06ba \u0627\u0635\u0644 \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u0627 \u062d\u0648\u0627\u0644\u06c1 \u062f\u06cc\u062a\u0627 \u06c1\u0648\u06ba\u06d4 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u0627\u0633\u06d2 \u06a9\u0633\u06cc \u0627\u06cc\u0633\u06cc \u062c\u06af\u06c1 \u067e\u0631 \u062f\u06be\u06a9\u06cc\u0644 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u06a9\u0644\u0633\u0679\u0631 \u0627\u0633\u06d2 \u06a9\u06be\u06cc\u0646\u0686 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0628\u0627\u0642\u06cc \u0645\u0627\u0646\u06cc \u0641\u06cc\u0633\u0679\u0633 (CRD\u060c RBAC\u060c \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u0627 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679) \u0622\u06af\u06d2 \u0628\u0691\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>Deployment<\/code>\u0627\u0648\u0631 <code>Deployment<\/code> \u0627\u0648\u0631 <code>Service<\/code> \u0641\u0631\u0636\u06cc \u0633\u067e\u0644\u0627\u0626\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4 \u0644\u06c1\u0630\u0627 \u0622\u067e \u0627\u0633\u06d2 \u0627\u067e\u0646\u06d2 \u06a9\u0645\u067e\u06cc\u0648\u0679\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u0636\u0645\u0646\u06cc \u0639\u0645\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u0686\u0644\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl apply -f config\/crd\/\nkubectl apply -f config\/rbac\/\nkubectl apply -f config\/manager\/\n<\/code><\/pre>\n<p>\u06a9\u0633\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 CRD \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u062f\u0648\u0633\u0631\u06cc \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba\u060c \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u06cc <code>Deployment<\/code> \u062c\u0628 \u0622\u067e \u0627\u0633\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u06cc\u06c1 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0631\u06cc\u0634 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2 (API \u0633\u0631\u0648\u0631 \u06a9\u0633\u06cc \u0627\u06cc\u0633\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0642\u0633\u0645 \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0627\u0633 \u0646\u06d2 \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0633\u0646\u0627 \u06c1\u0648 \u06af\u0627)\u06d4<\/p>\n<p>\u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0648\u06c1 \u06c1\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u06c1\u0627\u062a\u06be \u0633\u06d2 \u0644\u06a9\u06be\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06c1\u0645\u06cc\u06ba \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0645\u062d\u0633\u0648\u0633 \u06a9\u06cc\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0641\u06cc\u0644\u0688 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>VirtualMachineSpec<\/code> \u06cc\u06c1 \u0628\u06d2 \u0636\u0631\u0631 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0627\u0634\u06cc\u0627\u0621 \u067e\u0631 \u0633\u06cc\u0679 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06c1\u0645 \u0627\u0633 \u06a9\u0627 \u0646\u0627\u0645 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0646\u06c1 \u06c1\u06cc \u0627\u0633 \u06a9\u06cc \u0633\u0627\u062e\u062a \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0633\u0628 \u06a9\u0686\u06be \u0645\u062d\u0641\u0648\u0638 \u06c1\u06d2\u06d4 <code>VirtualMachine<\/code> \u067e\u0686\u06be\u0644\u06cc \u067e\u06cc\u0634\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632 \u06a9\u06cc\u0627 \u06af\u06cc\u0627\u06d4<\/p>\n<p>\u0633\u06cc \u0622\u0631 \u0688\u06cc <code>versions<\/code> \u0641\u06c1\u0631\u0633\u062a \u0628\u0627\u0644\u06a9\u0644 \u0627\u0633\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0646\u0627\u0626\u06cc \u06af\u0626\u06cc \u062a\u06be\u06cc\u06d4 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0631\u0698\u0646 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>served<\/code> \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u0646\u0634\u0627\u0646 \u0632\u062f \u06c1\u06d2\u06d4 <code>storage<\/code> \u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06a9\u0633 \u0634\u06a9\u0644 \u0648\u0627\u0644\u06cc \u0686\u06cc\u0632 \u06a9\u0648 \u0631\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062c\u0628 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0627\u0633\u0679\u0648\u0631 \u0634\u062f\u06c1 \u0648\u0631\u0698\u0646 \u06a9\u06d2 \u0639\u0644\u0627\u0648\u06c1 \u06a9\u0633\u06cc \u062f\u0648\u0633\u0631\u06d2 \u0648\u0631\u0698\u0646 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u06a9\u0646\u0648\u0631\u0698\u0646 \u0648\u06cc\u0628 \u06c1\u06a9 \u062f\u0648 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0628\u062f\u0644 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0641\u06cc \u0627\u0644\u062d\u0627\u0644 VVMOperator \u06a9\u0648 \u0627\u0633 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>v1<\/code> \u06cc\u06c1 \u0648\u0627\u062d\u062f \u0648\u0631\u0698\u0646 \u06c1\u06d2 \u062c\u0648 \u06a9\u0628\u06be\u06cc \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u0627\u0633\u06cc \u0644\u06cc\u06d2 <code>versions<\/code> \u0641\u06cc\u0644\u0688 \u06c1\u0645\u0627\u0631\u06d2 \u0644\u06a9\u06be\u06d2 \u06c1\u0648\u0626\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0648\u0627\u062d\u062f \u0642\u062f\u0631 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u06cc\u06a9 \u0641\u06c1\u0631\u0633\u062a \u062a\u06be\u06cc\u06d4<\/p>\n<p>\u0645\u0646\u062f\u0631\u062c\u06c1 \u0628\u0627\u0644\u0627 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0631\u0646\u0631 \u06a9\u06cc \u062c\u06af\u06c1 \u0646\u06c1\u06cc\u06ba \u0644\u06cc\u062a\u0627\u06d4 <code>kubectl apply<\/code> \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0627\u062a\u06be \u0633\u06d2\u06d4 \u0627\u06cc\u06a9 CI \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u062c\u0648 \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u06cc \u0634\u0628\u06cc\u06c1\u06c1 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0633\u06d2 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0636\u0645 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u0648 \u0628\u06cc\u0633 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u06cc\u06a9 \u0642\u062f\u0631\u062a\u06cc \u0627\u06af\u0644\u0627 \u0645\u0631\u062d\u0644\u06c1 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0639\u0627\u0645 \u0633\u06cc \u0622\u0626\u06cc\/\u0633\u06cc \u0688\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06af\u0631 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u062e\u0648\u062f \u06af\u0679 \u0645\u06cc\u06ba \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u0622\u067e\u0631\u06cc\u0679\u0631 \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-performance-amp-resilience\">\u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u0627\u0648\u0631 \u0644\u0686\u06a9<\/h3>\n<p>\u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0637\u0648\u0631 \u067e\u0631\u060c \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0627\u06cc\u06a9 \u0648\u0642\u062a \u0645\u06cc\u06ba \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0627\u06cc\u0688\u062c\u0633\u0679\u0645\u0646\u0679 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u0628 \u062a\u06a9 \u0679\u06be\u06cc\u06a9 \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u06c1\u0645 \u0635\u0631\u0641 \u0679\u06cc\u0633\u0679 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0633\u06cc\u06a9\u0691\u0648\u06ba \u0644\u0648\u06af \u0679\u06cc\u0633\u0679 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>VirtualMachine<\/code> \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06a9\u062b\u0631 \u0627\u067e\u0646\u06cc \u0628\u0627\u0631\u06cc \u06a9\u06d2 \u0627\u0646\u062a\u0638\u0627\u0631 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0628\u06cc\u0679\u06be\u06d2 \u06c1\u06cc\u06ba\u060c \u062d\u0627\u0644\u0627\u0646\u06a9\u06c1 \u0627\u06cc\u06a9 \u0628\u0644\u0627\u06a9 \u06a9\u0648 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0628\u06be\u06cc \u062f\u0648\u0633\u0631\u06d2 \u0628\u0644\u0627\u06a9\u0633 \u06a9\u0648 \u06c1\u0645 \u0622\u06c1\u0646\u06af \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u06d2 \u06af\u0627\u06d4<\/p>\n<p><code>MaxConcurrentReconciles<\/code>    \u0645\u06cc\u06ba \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u0627\u0679\u06be\u0627\u062a\u0627 \u06c1\u0648\u06ba:<\/p>\n<pre><code class=\"language-go\">func (r *VirtualMachineReconciler) SetupWithManager(mgr ctrl.Manager) error {\n\treturn ctrl.NewControllerManagedBy(mgr).\n\t\tFor(&computev1.VirtualMachine{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})).\n\t\tOwns(&corev1.Secret{}).\n\t\tOwns(&corev1.Service{}).\n\t\tWatches(&computev1.ProviderConfig{}, handler.EnqueueRequestsFromMapFunc(r.findVirtualMachinesForProviderConfig)).\n\t\tWithOptions(controller.Options{MaxConcurrentReconciles: 5}). \/\/ five VMs in flight instead of one\n\t\tComplete(r)\n}\n<\/code><\/pre>\n<p>\u06a9\u06cc\u0634\u0646\u06af \u0627\u0633 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u06d2 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0637\u0631\u0641 \u06a9\u06cc \u0645\u062f\u062f \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u067e\u0691\u06be\u0646\u0627 <code>vm<\/code> \u0633\u06d2 \u0648\u0627\u067e\u0633 \u0622\u06cc\u0627 <code>r.Get<\/code> \u06cc\u06c1 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u062a\u06cc\u0632 \u0627\u0648\u0631 \u0645\u0642\u0627\u0645\u06cc \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0645\u062e\u0628\u0631 \u0627\u0633\u06d2 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0645\u06cc\u06ba \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 <code>r.Provider.Get<\/code> \u06cc\u06c1 \u06c1\u0631 \u0628\u0627\u0631 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc HTTP \u0631\u0627\u0624\u0646\u0688 \u0679\u0631\u067e \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 \u06a9\u0648\u0626\u06cc \u06a9\u06cc\u0634 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u062a\u0648\u0627\u0632\u0646 \u0642\u0627\u0628\u0644 \u063a\u0648\u0631 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u062d\u0635\u06c1 2 \u06a9\u06cc \u0637\u0631\u062d \u06c1\u06cc \u06c1\u06d2\u06d4 \u0686\u0648\u0646\u06a9\u06c1 Kubernetes \u0646\u06d2 \u06c1\u0645\u0627\u0631\u06d2 \u0644\u06cc\u06d2 \u06a9\u06cc\u0634\u0646\u06af \u067e\u0631\u062a \u0628\u0646\u0627\u0626\u06cc \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0627\u0646 \u06a9\u0644\u0633\u0679\u0631 \u0631\u06cc\u0688\u0632 \u0633\u0633\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0644\u0633\u0679\u0631 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u0631\u06cc\u0688\u0632 \u06a9\u06cc \u0644\u0627\u06af\u062a \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u062a\u0627\u0631 \u06a9\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u0633\u0631\u06d2 \u067e\u0631 \u06c1\u06d2\u06d4 \u0622\u067e \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u06a9\u0644\u0627\u0626\u0646\u0679\u0633 \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 \u0642\u0644\u06cc\u0644 \u0645\u062f\u062a\u06cc \u06a9\u06cc\u0634 \u0634\u0627\u0645\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0642\u06cc\u0645\u062a \u067e\u0631 \u0622\u062a\u0627 \u06c1\u06d2\u06d4 <code>Running<\/code> VMs \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u0648 \u0627\u0628\u06be\u06cc \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u0686\u06a9\u06d2 \u06c1\u06cc\u06ba\u060c \u06a9\u06cc\u0634\u06d2 \u06a9\u06cc \u0645\u06cc\u0639\u0627\u062f \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u062a\u06a9 \u0631\u06cc\u0627\u0633\u062a \u06a9\u0648 \u062f\u06c1\u0631\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 \u06a9\u0648\u0626\u06cc \u06a9\u06cc\u0634 \u0646\u06c1 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0645\u06cc\u06ba \u06a9\u06cc\u0634\u06d2 \u0645\u06cc\u06ba \u062e\u0644\u0644 \u0688\u0627\u0644\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0686\u06cc\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0645\u0641\u0627\u06c1\u0645\u062a \u06a9\u0627 \u062f\u06be\u0645\u0627\u06a9\u06c1\u060c \u06c1\u0631 \u0644\u0641\u0638 <code>VirtualMachine<\/code> \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0627\u06cc\u06a9 \u0679\u0686 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0634\u0646 \u06a9\u06d2 HTTP \u06a9\u0627\u0644\u0648\u06ba \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06d2 \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646\u062a\u0627 \u06c1\u06d2\u06d4 \u0646\u0627\u06a9\u0627\u0645\u06cc \u067e\u0631\u060c \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u0648 \u0631\u06cc\u0679 \u0644\u0645\u06cc\u0679\u0631 \u062a\u06be\u0631\u0648\u0679\u0644\u0646\u06af \u0645\u06cc\u06ba \u0644\u067e\u06cc\u0679 \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u060c \u0642\u0637\u0639 \u0646\u0638\u0631 \u0627\u0633 \u06a9\u06d2 \u06a9\u06c1 \u0648\u06c1 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06cc\u06a9 \u0622\u0641\u06d4<\/p>\n<pre><code class=\"language-go\">type Client struct {\n\tbaseURL string\n\thttp    *http.Client\n\tlimiter *rate.Limiter \/\/ shared across every reconcile using this client\n}\n\nfunc (c *Client) Create(ctx context.Context, image string) (*VM, error) {\n\tif err := c.limiter.Wait(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\t\/\/ ... existing HTTP call\n}\n<\/code><\/pre>\n<p>\u0644\u06cc\u0688\u0631 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u062f\u0648\u0633\u0631\u0627 \u0646\u0635\u0641 \u06c1\u06d2 \u062c\u0648 \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0646\u0642\u0644 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0645 \u0646\u06d2 \u0627\u0633\u06d2 \u062d\u0635\u06c1 2 \u0645\u06cc\u06ba \u062a\u0635\u0648\u0631 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u0627\u060c \u0644\u06cc\u06a9\u0646 \u062d\u0642\u06cc\u0642\u062a \u0645\u06cc\u06ba \u06c1\u0645\u0627\u0631\u06d2 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u0645\u06cc\u06ba \u062f\u0648 \u0641\u06cc\u0644\u0688\u0632 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-go\">mgr, err := ctrl.NewManager(cfg, ctrl.Options{\n\tLeaderElection:   true,\n\tLeaderElectionID: \"vmoperator-leader\",\n})\n<\/code><\/pre>\n<p>\u0627\u0633 \u0633\u06cc\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c \u062a\u0645\u0627\u0645 \u0646\u0642\u0644\u06cc\u06ba \u0634\u0631\u0648\u0639 \u06a9\u06cc \u062c\u0627\u0626\u06cc\u06ba \u06af\u06cc\u060c \u0644\u06cc\u06a9\u0646 \u0635\u0631\u0641 \u0644\u06cc\u0632 \u067e\u0631 \u0631\u06a9\u06be\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0646\u0642\u0644\u06cc\u06ba \u0627\u0635\u0644 \u0645\u06cc\u06ba \u0635\u0644\u062d \u06a9\u06cc \u062c\u0627\u0626\u06cc\u06ba \u06af\u06cc\u06d4 \u0628\u0627\u0642\u06cc \u0627\u0633 \u0648\u0642\u062a \u0633\u0646\u0628\u06be\u0627\u0644\u0646\u06d2 \u06a9\u06d2 \u0644\u0626\u06d2 \u062a\u06cc\u0627\u0631 \u06c1\u06cc\u06ba \u062c\u0628 \u0648\u06c1 \u0648\u0642\u062a \u067e\u0631 \u0627\u067e \u0688\u06cc\u0679 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u0628\u06be\u06cc \u0627\u06cc\u06a9 \u062a\u0646\u0627\u0632\u0639\u06c1 \u06a9\u0648 \u0633\u0637\u062d \u067e\u0631 \u0644\u0627\u062a\u06cc \u06c1\u06d2 \u062c\u0633 \u06a9\u0648 \u062d\u0635\u06c1 3 \u0645\u06cc\u06ba \u0648\u0627\u0636\u062d \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>r.Provider.Create<\/code>\u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u06cc\u06a9 VM \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u06a9\u06cc ID \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u067e\u06be\u0631 \u0639\u0645\u0644 \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0631\u06cc\u0634 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>r.Status().Update<\/code> \u06a9\u0628\u06be\u06cc \u062f\u0648\u0691\u06cc\u06ba \u06af\u06d2\u06d4 <code>vm.Status.ID<\/code> \u06cc\u06c1 \u0627\u0628\u06be\u06cc \u0628\u06be\u06cc \u062e\u0627\u0644\u06cc \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0627\u06af\u0644\u06cc \u0645\u0641\u0627\u06c1\u0645\u062a \u0627\u0646 \u0627\u0634\u06cc\u0627\u0621 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u06d2 \u06af\u06cc \u062c\u0646 \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u0628\u06be\u06cc \u062a\u06a9 VM \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba: <code>Create<\/code> \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0628 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648 VMs \u06c1\u06cc\u06ba\u06d4 <code>VirtualMachine<\/code>.<\/p>\n<p>\u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba <code>MaxConcurrentReconciles<\/code> \u06cc\u0627 \u0644\u06cc\u0688\u0631 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0627\u0633 \u0633\u06d2 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba \u06c1\u06cc \u0627\u06cc\u06a9 \u062e\u0644\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0628\u06cc\u0631\u0648\u0646\u06cc \u06a9\u0627\u0644 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc \u062a\u062d\u0631\u06cc\u0631 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u06a9\u0686\u06be \u063a\u0644\u0637 \u06c1\u0648 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>\u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0628\u0646\u062f \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u0627\u06cc\u06a9 \u0622\u0626\u06cc\u0688\u06cc\u0645\u067e\u0648\u0679\u06cc\u0646\u0679 \u06a9\u0644\u06cc\u062f \u06a9\u0648 \u0642\u0628\u0648\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u0648 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0628\u0646\u0627\u0626\u06cc \u06af\u0626\u06cc \u062a\u06be\u06cc \u0627\u0648\u0631 \u067e\u06c1\u0644\u06cc \u06a9\u0644\u06cc\u062f \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u0645\u06cc\u06ba \u0645\u062d\u0641\u0648\u0638 \u06a9\u06cc \u06af\u0626\u06cc \u062a\u06be\u06cc\u06d4 <code>Create<\/code> \u0644\u06c1\u0630\u0627 \u0627\u06af\u0631 \u0622\u067e \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u067e\u06c1\u0686\u0627\u0646 \u0644\u06d2 \u06af\u0627 \u06a9\u06c1 \u06cc\u06c1 \u062f\u0648\u0633\u0631\u0627 VM \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u06c1\u0648\u0686\u06a9\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-security\">\u0633\u06cc\u06a9\u0648\u0631\u0679\u06cc<\/h3>\n<p>\u06a9\u06c1 <code>ClusterRole<\/code> \u062d\u0635\u06c1 3 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0636\u0631\u0648\u0631\u062a \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0633\u06cc\u0639 \u06af\u0646\u062c\u0627\u0626\u0634 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u0645\u0627\u0645 \u0641\u0639\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <code>secrets<\/code> \u0627\u0648\u0631 <code>services<\/code> \u067e\u0648\u0631\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba\u060c \u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u0635\u0631\u0641 \u0627\u067e\u0646\u06cc \u0645\u0644\u06a9\u06cc\u062a \u0648\u0627\u0644\u06cc \u0627\u0634\u06cc\u0627\u0621 \u06a9\u0648 \u0686\u06be\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0633\u062e\u062a \u0648\u0631\u0698\u0646 \u0627\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u067e\u0631 \u0627\u0633\u06a9\u0648\u067e \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>Role<\/code>\/<code>RoleBinding<\/code> \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 <code>ClusterRole<\/code>\/<code>ClusterRoleBinding<\/code> VVMOperator \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u06a9\u06d2 \u0686\u0644\u0646\u06d2 \u06a9\u06cc \u062a\u0648\u0642\u0639 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0645 \u0648\u06c1 \u0641\u0639\u0644 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646\u06c1\u06cc\u06ba \u06c1\u0645 \u06a9\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2\u06d4 \u06c1\u0645 \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba <code>list<\/code> \u06cc\u0627 <code>watch<\/code> \u0628\u06d2 \u062a\u0631\u062a\u06cc\u0628 <code>Secret<\/code>\u0635\u0631\u0641 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u06c1\u0645 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u06c1\u06d2 \u0627\u0648\u0631 \u062c\u0648 \u06c1\u0645 \u0646\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 RBAC \u0628\u06be\u06cc \u06c1\u06d2 \u062c\u0633 \u06a9\u0627 \u062d\u0648\u0627\u0644\u06c1 \u067e\u0686\u06be\u0644\u06d2 \u062d\u0635\u06d2 \u0645\u06cc\u06ba \u0644\u0627\u06af\u0648 \u06a9\u0631\u062f\u06c1 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633\u0646\u0627\u062f \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u062e\u0644\u0627 \u06c1\u06cc\u06ba\u06d4 <code>ProviderConfig<\/code> \u0645\u06cc\u0631\u06d2 \u067e\u0627\u0633 \u0641\u06cc \u0627\u0644\u062d\u0627\u0644 \u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u0645\u062a\u0646 \u06a9\u0627 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0635\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 API \u06a9\u0644\u06cc\u062f \u06a9\u06d2 \u0633\u0627\u062a\u06be API \u06a9\u0644\u06cc\u062f \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 CRD \u062a\u0635\u0631\u06cc\u062d \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0648\u0626\u06cc \u06a9\u0627\u0631\u0648\u0628\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u0628\u06cc\u0679\u06be\u0627 \u06c1\u06d2 \u062c\u0648 \u06a9\u0633\u06cc \u06a9\u0648 \u0628\u06be\u06cc \u0627\u0633 \u0686\u06cc\u0632 \u062a\u06a9 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06cc \u0631\u0633\u0627\u0626\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0646\u0638\u0631 \u0622\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u062a\u0639\u0644\u0642 \u06c1\u06d2 <code>Secret<\/code>\u0646\u0627\u0645 \u0633\u06d2 \u062d\u0648\u0627\u0644\u06c1 \u062f\u06cc\u0627 \u06af\u06cc\u0627\u060c \u0634\u0627\u0645\u0644 \u0646\u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-go\">type ProviderConfigSpec struct {\n\tEndpoint  string                      `json:\"endpoint\"`\n\tSecretRef corev1.LocalObjectReference `json:\"secretRef\"` \/\/ Secret holding the provider's API key\n}\n<\/code><\/pre>\n<p>\u062b\u0627\u0644\u062b \u0627\u0633\u06d2 \u062d\u0644 \u06a9\u0631\u06d2 \u06af\u0627\u06d4 <code>SecretRef<\/code> \u062c\u0633 \u0648\u0642\u062a \u0622\u067e \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06a9\u0644\u06cc\u062f \u06a9\u0644\u0627\u0626\u0646\u0679 \u0633\u06d2 \u067e\u0691\u06be\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 <code>Secret<\/code>\u06c1\u0645 \u0627\u0633\u06d2 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0627\u06cc\u0633\u06cc \u0686\u06cc\u0632 \u067e\u0631 \u0644\u0627\u06af \u06cc\u0627 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0646\u06c1\u06cc\u06ba \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0633 \u0645\u06cc\u06ba \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06cc \u0648\u0633\u06cc\u0639 \u0631\u0633\u0627\u0626\u06cc \u06c1\u0648\u060c \u0628\u0634\u0645\u0648\u0644 \u0688\u06cc\u0679\u0627\u06d4 <code>VirtualMachine<\/code>\u0627\u067e\u0646\u06cc \u062d\u0627\u0644\u062a.<\/p>\n<p>\u0622\u062e\u0631\u06cc \u062d\u0635\u06c1 \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u0627 \u0627\u067e\u0646\u0627 \u067e\u0648\u0688 \u06c1\u06d2\u06d4 \u063a\u06cc\u0631 \u062c\u0691 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0627\u06cc\u06a9 \u06a9\u0646\u0679\u06cc\u0646\u0631 \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u0627\u06cc\u06a9 \u0635\u0631\u0641 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u0648\u0679 \u0641\u0627\u0626\u0644 \u0633\u0633\u0679\u0645 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u0646\u06a9\u0633 \u06a9\u06cc \u063a\u06cc\u0631 \u0636\u0631\u0648\u0631\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u0648 \u06c1\u0679\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06af\u0631 \u0628\u0627\u0626\u0646\u0631\u06cc \u062e\u0648\u062f \u062e\u0631\u0627\u0628 \u06c1\u0648 \u062a\u0648 \u0645\u0645\u06a9\u0646\u06c1 \u0641\u0639\u0627\u0644\u06cc\u062a \u06a9\u0648 \u06a9\u0645 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u0645\u0627\u0645 \u06a9\u0627\u0645 \u06a9\u06d2 \u0628\u0648\u062c\u06be \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0639\u06cc\u0627\u0631\u06cc \u0645\u0634\u0642 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0646\u06d2 \u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u0645\u06cc\u06ba \u06a9\u06c1\u06cc\u06ba \u0628\u06be\u06cc \u0642\u0628\u0648\u0644\u06cc\u062a \u06a9\u0627 \u0648\u06cc\u0628 \u06c1\u06a9 \u0634\u0627\u0645\u0644 \u06a9\u06cc\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0648\u06c1 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0628\u06be\u06cc \u0648\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u0627\u06d4 \u06c1\u0645\u06cc\u06ba VVMOperator \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u062a\u06be\u06cc\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06c1\u0645 \u0627\u0633\u06d2 \u06a9\u0646\u0641\u06cc\u06af\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u067e\u0648\u0627\u0626\u0646\u0679\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0686\u06be\u0648\u0691 \u062f\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<h3 id=\"heading-observability\">\u0645\u0634\u0627\u06c1\u062f\u06c1<\/h3>\n<p>\u0645\u0646\u062a\u0638\u0645 \u06c1\u0645\u06cc\u06ba \u06a9\u0686\u06be \u0644\u06a9\u06be\u06d2 \u0628\u063a\u06cc\u0631 \u067e\u0631\u0648\u0645\u06cc\u062a\u06be\u06cc\u0633 \u06a9\u06d2 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u06a9\u0648 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06a9\u06cc \u06af\u06c1\u0631\u0627\u0626\u06cc\u060c \u0645\u0641\u0627\u06c1\u0645\u062a \u06a9\u06cc \u0645\u062f\u062a\u060c \u0627\u0648\u0631 \u0645\u0641\u0627\u06c1\u0645\u062a \u06a9\u06cc \u063a\u0644\u0637\u06cc \u06a9\u06cc \u06af\u0646\u062a\u06cc \u0641\u06cc \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06d2\u06d4<\/p>\n<p>\u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0622\u067e \u0645\u06cc\u0679\u0631\u06a9\u0633 \u06a9\u0648 \u0627\u0633\u06cc \u0637\u0631\u062d \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0633 \u0637\u0631\u062d \u0622\u067e Go \u0633\u0631\u0648\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-go\">var providerCallDuration = prometheus.NewHistogramVec(\n\tprometheus.HistogramOpts{\n\t\tName: \"vmoperator_provider_call_duration_seconds\",\n\t\tHelp: \"Duration of calls to the VM provider, by operation\",\n\t},\n\t[]string{\"operation\"},\n)\n\nfunc init() {\n\tmetrics.Registry.MustRegister(providerCallDuration) \/\/ shares the manager's existing \/metrics endpoint\n}\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0627\u0631\u062f \u06af\u0631\u062f\u060c \u06c1\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627\u0644 \u06a9\u0648 \u0679\u0627\u0626\u0645\u0631 \u0645\u06cc\u06ba \u0644\u067e\u06cc\u0679\u0646\u0627 \u0622\u067e \u06a9\u0648 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u0633\u06d2 \u0644\u06d2 \u06a9\u0631 \u0627\u0633 \u0633\u0648\u0627\u0644 \u06a9\u0648 \u06af\u0631\u0627\u0641 \u06a9\u0631\u0646\u06d2 \u062a\u06a9 \u0644\u06d2 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c &quot;\u06a9\u06cc\u0627 \u0645\u06cc\u0631\u0627 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0633\u0633\u062a \u06c1\u06d2\u061f&#8221;<\/p>\n<p>\u0627\u0633\u06cc \u062c\u0628\u0644\u062a \u0633\u06d2 \u0644\u0627\u06af\u0646\u06af \u06a9\u06d2 \u0641\u0648\u0627\u0626\u062f\u06d4 <code>log.FromContext(ctx)<\/code> \u0627\u0646\u062f\u0631 <code>Reconcile<\/code> \u0645\u06cc\u06ba \u0627\u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0627\u067e\u0646\u06d2 \u0633\u0627\u062a\u06be \u0644\u06d2 \u062c\u0627\u062a\u0627 \u06c1\u0648\u06ba\u06d4 <code>VirtualMachine<\/code>\u0627\u0633\u06d2 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0633\u06cc\u0679 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u06c1\u0631 \u0644\u0627\u0626\u0646 \u067e\u0631 \u0646\u0627\u0645 \u0627\u0648\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0646\u0638\u0631 \u0622\u0626\u06d2 \u06af\u06cc\u06d4 <code>SetupWithManager<\/code>. \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u0627 <code>vm.Status.ID<\/code> \u0627\u0633 \u0644\u0627\u06af\u0631 \u06a9\u06d2 \u0633\u06cc\u0679 \u0627\u067e \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0641\u0648\u0631\u0627\u064b \u0628\u0639\u062f \u0627\u0633 \u0633\u06d2 \u062c\u0691\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633 \u0645\u0641\u0627\u06c1\u0645\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0645\u0627\u0645 \u0628\u0639\u062f \u06a9\u06cc \u0644\u0627\u06af \u0644\u0627\u0626\u0646\u06cc\u06ba \u0628\u06be\u06cc VM \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0645\u0646\u0641\u0631\u062f \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631 \u062f\u06cc \u062c\u0627\u0626\u06cc\u06ba \u06af\u06cc\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0641\u06cc\u0644\u0688 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u0631\u0636\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0644\u0627\u06af\u0632 \u0627\u0648\u0631 \u0622\u067e\u0631\u06cc\u0679\u0631 \u0644\u0627\u06af\u0632 \u062c\u0645\u0639 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06c1\u06cc \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06d2 \u062f\u0648\u0646\u0648\u06ba \u0627\u0637\u0631\u0627\u0641 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-next-steps\">\u0627\u06af\u0644\u06d2 \u0627\u0642\u062f\u0627\u0645\u0627\u062a<\/h2>\n<p>\u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u0645\u06cc\u06ba\u060c \u0622\u067e \u0646\u06d2 \u0633\u06cc\u06a9\u06be\u0627 \u06a9\u06c1 Kubernetes \u0622\u067e\u0631\u06cc\u0679\u0631 \u06a9\u06cc\u0627 \u06c1\u06d2\u060c \u0627\u0633\u06d2 \u0634\u0631\u0648\u0639 \u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633\u06d2 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06cc\u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4 \u0622\u067e \u0646\u06d2 \u0641\u0627\u0626\u0646\u0644\u0627\u0626\u0632\u0631\u0632\u060c \u067e\u06cc\u0634\u06cc\u0646 \u06af\u0648\u0626\u06cc\u0627\u06ba\u060c \u0645\u0644\u06a9\u06cc\u062a\u06cc \u0648\u0633\u0627\u0626\u0644\u060c \u0627\u0648\u0631 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0628\u06be\u06cc \u0633\u06cc\u06a9\u06be\u0627\u06d4<\/p>\n<p>\u0627\u0633 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc VM \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 \u062a\u06a9 \u0645\u062d\u062f\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u06cc\u06a9\u0633\u0627\u06ba \u0646\u0638\u0631 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0633 \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0641\u0631\u0642 \u0646\u06c1\u06cc\u06ba \u067e\u0691\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1 \u06a9\u0633 \u0686\u06cc\u0632 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<p>\u0622\u067e \u0630\u06cc\u0644 \u06a9\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06d2 \u06a9\u0631 \u0628\u06be\u06cc \u0633\u06cc\u06a9\u06be\u0646\u0627 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Kubernetes \u0627\u06cc\u0633\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u0633\u06cc\u0679 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0628\u0634\u0645\u0648\u0644 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u060c \u062e\u062f\u0645\u0627\u062a \u0627\u0648\u0631 \u0646\u0648\u0688\u0633\u06d4 \u0622\u067e\u0631\u06cc\u0679\u0631\u0632 \u0627\u0633\u06cc \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0648\u0633\u0627\u0626\u0644 \u062a\u06a9 \u0628\u0691\u06be\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba Kubernetes \u06a9\u0648 \u0688\u06cc\u0641\u0627\u0644\u0679 \u0633\u06d2 \u0645\u0639\u0644\u0648\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0633 \u0633\u06d2 \u0648\u06c1 \u06a9\u0633\u0679\u0645 \u0633\u0633\u0679\u0645\u0632 (\u0627\u06a9\u062b\u0631 \u0628\u06cc\u0631\u0648\u0646\u06cc) \u06a9\u0648 \u0627\u0633\u06cc \u0627\u0639\u0644\u0627\u0646\u0627\u062a\u06cc [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":27436,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-27435","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/27435","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=27435"}],"version-history":[{"count":1,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/27435\/revisions"}],"predecessor-version":[{"id":27437,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/27435\/revisions\/27437"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media\/27436"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=27435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=27435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=27435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}