{
    "componentChunkName": "component---src-templates-issues-tsx",
    "path": "/issues/293",
    "result": {"data":{"issuesJson":{"id":"3a80d7c9-4481-57f8-b01e-eb2caa7c05fa","title":"weibaohui/kom: 一个用于 Kubernetes 操作的工具，SDK级的kubectl、client-go的使用封装。并且支持作为管理k8s 的 MCP server。","number":293,"bodyHTML":"<div align=\"center\" dir=\"auto\">\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\"><img src=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\" width=\"100%\" height=\"3\" data-animated-image=\"\" data-canonical-src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\" style=\"max-width: 100%; height: auto; max-height: 3px;\"></a><br><br></p>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th align=\"right\">Repos</th>\n<th align=\"left\"><a href=\"https://github.com/weibaohui/kom\">weibaohui/kom</a></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"right\"><strong>Views</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/22a316423aae23454e59e6113c04bf686c46702d699512868513de423aeb6f40/68747470733a2f2f76696577732e77686174696c656172656e65642e746f6461792f76696577732f6769746875622f77656962616f6875692f6b6f6d2e737667\" alt=\"views\" data-canonical-src=\"https://views.whatilearened.today/views/github/weibaohui/kom.svg\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>Stars</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/eb880470eee7d5d0522121a06ea83b2dc92b62dbaa228c454f613985da0261f9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f77656962616f6875692f6b6f6d3f636f6c6f723d663266303864266c6f676f3d556e64657274616c65266c6f676f436f6c6f723d656234363330\" alt=\"stars\" data-canonical-src=\"https://img.shields.io/github/stars/weibaohui/kom?color=f2f08d&amp;logo=Undertale&amp;logoColor=eb4630\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>Forks</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/6fe949dc24a3c40b3a667c14b4d2de7a09a8fd0225e4c33d2922e7ba96f84b3c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f77656962616f6875692f6b6f6d3f636f6c6f723d626138366562266c6f676f3d48616e647368616b65266c6f676f436f6c6f723d656136616136\" alt=\"forks\" data-canonical-src=\"https://img.shields.io/github/forks/weibaohui/kom?color=ba86eb&amp;logo=Handshake&amp;logoColor=ea6aa6\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>License</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/c9fa39395ac54c9c4a36733db1e70b21fbba7c4327e5bffdbe4a875401773f85/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f77656962616f6875692f6b6f6d3f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e53556845556741414144414141414177434159414141425841766d48414141414358424957584d41414173544141414c457745416d70775941414144336b6c45515652346e4f335953557a5555426748384a726f57567255474a66456d3773584e63534446784d544c327069347348456778654e526f77586770455742445552522532424e414e4f4b4f4b36366f6f4b4a4742586545475263574163455646475152484677516d483525324630774861655748493944554455354c356b6e6568644f62377a66652532423139636e434a47495243516945596c514237594a4979474c38616f73756c565a36695246516a69474b6b7564576735614c6c704f70704e586e665071773555304459524a6d56786a4367464633424c755a476d416f5655694b4541726d583744375553677351706f72674761336748664b34483663754262435644334771683141352532424c6745253242467749656e514d306a6f446f66714c6f48564e7742796d384370546e416d327a51713073676478624964515a556c416b7150415a3664676a303541446f59526f6f66792532466f5869726f376b3551586a4c6f70677a4b69514e6c4c4461716f4967754577426a7a7150355066446a45394479495879493633464d547751464d43567271774e61763451666f52673538514625324266724d485172454b3844546f434d714e4179574e4866786d54526f4c4f726d5352566747744466714345715a4f4851727a6f34706243557341333431365169364551394b476a6345465267484f724f4b6e5536574162396247455459656b4b7843766a546167394534706a653534446b3551503862624d4859762532464333756541654a6b50304f4778422532424a70426e4172595238455951516e6f4e31414e4661426e5050356c385372736559514c303641646b30464a5938484f5761424d6c6541486a683068506f73497a6c6f3876304125324633345a694f6548726130714b52504d5653493774762532423932747725324676687855654252713456454c674d376642714b354770526d6f514c584e7075625475367a6f4e52706754386e5051627138347764253246494375767978694b4871694e41664933774d367549684271476b4c696977414f734b44714f68743749747239567938536a52424557667941627225324668523142667056514664484a42253246423268683778376a36517077435665655951326b72554235436c636a3641326d3067576a25324244306d4c34397a573563517943484c4e37726a6c6d6d6174457958582532464372547a412532466f51785a6b576c39474a5443566f25324279546a3837253242346769504b6376307149486f344156344430565a727251493334706e70524d36357875652532467a417265453425324654253246536f676c664542794d7369517441546c4c3352414a355948725378365a44665337307337754d486842705225324659423573305057366f455270316236253246667252684b3353444c35546965364f515548516c5133735644752532427a50636b397657453973747225324236496a533967486d5750616861444a25324277434b364e494242587348423948796b587378774470686c436d416476706c6162554a4e6e5a504239342532464e7436784f6538587a4562503257684d335741673147756236744825324233513150673337365239713475716c6e6f36676448476a444f5139306562303141484d3672596975554a314f713472344656756a35765239427a4d3957674e764f7977446869495951467667626366774166774d764863615067425041253246447948476a50624e394138616d6562636477416444354e6633373574787165774e5552656f797677424958594c645170576c6877465771745061435044334173467541535636717171496c62304a766b564331464c39576b4c55556c55574b337a585a4c46432532423125324642726f46746f364f7358497545594a5034447a7a5732594656316f4a614141414141456c46546b5375516d4343\" alt=\"license\" data-canonical-src=\"https://img.shields.io/github/license/weibaohui/kom?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD3klEQVR4nO3YSUzUUBgH8JroWVrUGJfEm7sXNcSDFxMTL2pi4sHEgxeNRowXgpEWBDURR%2BNANOKOK66ooKJGBXeEGRcWAcEVFGQRHFwQmH5%2F0wHaeWHI9DUDU5L5knehdOb7zfe%2B19cnCJGIRCQiEYlQB7YJIyGL8aosulVZ6iRFQjiGKkudWg5aLlpOppNXnfPqw5U0DYRJmVxjCgFF3BLuZGmAoVUiKEArmX7D7USgsQporgGa3gHfK4H6cuBbCVD3Gqh1A5%2BLgE%2BFwIenQM0joDofqLoHVNwBym8CpTnAm2zQq0sgdxbIdQZUlAkqPAZ6dgj05ADoYRoofy%2FoXiro7k5QXjLopgzKiQNlLDaqoIguEwBjzqP5PfDjE9DyIXyI63FMTwQFMCVrqwNav4QfoRg58QF%2BfrMHQrEK8DToCMqNAyWNHfxmTRoLOrmSRVgGtDfqCEqZOHQrzo4pbCUsA3416Qi6EQ9KGjcEFRgHOrOKnU6WAb9bGETYekKxCvjTag9E4pje54Dk5QP8bbMHYv%2FC3ueAeJkP0OGxB%2BJpBnArYR8EYQQnoN1ANFaBnPP5l8SrseYQL06Adk0FJY8HOWaBMleAHjh0hPosIzlo8v0A%2F34ZiOeHra0qKRPMVSI7tv%2B92tw%2FvhxUeBRq4VELgM7fBqK5GpRmoQLXNpubTu6zoNRpgT8nPQbq84wd%2FICuvyxiKHqiNAfI3wM6uIhBqGkLiiwAOsKDqOht7Itr9Vy8SjRBEWfyAbr%2FhR1BfpVQFdHJB%2FB2hh7x7j6QpwCVeeYQ2krUB5Clcj6A2m0gWj%2BD0mL49zW5cQyCHLN7rjlmmatEyXX%2FCrTzA%2FoQxZkWl9GJTCVo%2ByTj87%2B4giPKcv0qIHo4AV4D0VZrrQI34pnpRM65xue%2FzAreE4%2FT%2FSoglfEByMsiQtATlL3RAJ5YHrSx6ZDfS70s7uMHhBpR%2FYB5s0PW6oERp1b6%2FfrRhK3SDL5Tie6OQUHQlQ3sVDu%2BzPck9vWE9str%2B6IjS9gHmWPahaDJ%2BwCK6NIBBXsHB9HykXsxwDphlCmAdvplabUJNnZPB94%2FNt6xOe8XzEbP2WhM3WAg1Gub6tH%2B3Q1Pg376R9q4uqlno6gdHGjDOQ90eb01AHM6rYiuUJ1Oq4r4FVuj5vR9BzM9WgNvOywDhiIYQFvgbcfwAfwMvHcaPgBPA%2FDyHGjPbN9A8amebcdwAdD5Nf375txqewNUReoyvwBIXYLdQpWlhwFWqtPaCPD3AsFuASV6qqqIlb0JvkVC1FL9WkLUUlUWK3zXZLFC%2B1%2FBroFto6OsXIuEYJP4DzzW2YFV1oJaAAAAAElFTkSuQmCC\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>UpdatedAt</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/993d01b1527fbe1875c905507f83437bc08ad815c6cb773b19181ca1f2074320/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f77656962616f6875692f6b6f6d3f646973706c61795f74696d657374616d703d636f6d6d6974746572266c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d557064617465644174\" alt=\"last-commit\" data-canonical-src=\"https://img.shields.io/github/last-commit/weibaohui/kom?display_timestamp=committer&amp;logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nLVX7U9aVxwm26dlX%2Fdhbx%2B2%2FQnbkvUbrdUAQgJJIfUDNWDTTmOv1FQUFaPJ4kusrV01Jt1sNpctS2u3botZtmxd9tJSFSoqKqIF5bYDFLCovClefstzJ8wXRLDZLznkcO4557n3d3%2FneZ4rEOQZt1WqF%2B8XFr4%2BfOLEe2joY0zwf8ToyZPvjEgkLY%2Bk0mmrXO6dKinxzGk0fjT0x%2BRyr0UqncYczM1rc4tQ%2BIrp2LGXdo4NC4VvWqTS72wqlc%2Br13ORri6KdXdnbOHLlwlzJpRKn6W4%2BK6poOCNnIAfHj%2F%2BwahIZB4vKnqZf0qJpNIql%2Fv8TU0cNl5rbyc3w0QnTp3y2LTaJ7M1NaxDr2fRn1SpPG6Gia21tfE34TcaOay1iMUVOQFbFYqIWSo1W8TiAVanC0evXOEB7Wp14HFb22zE5fqLOC5ERLQWidNaNI4uEcc9i7hcJldHh2NWrQ5gDdbOlpaumIuLb2atAQDPnz0b8NbWcmxVVRJ3HmxpScwwzOJmKDRGe8LlCZDLG9g7TInV1Ql7dbXbV1e3gT0WKirCFomkPyvwXFlZGJOjV6%2BSt64uudDZOU5EUcox%2FMEQDVvt6MbcN27Y3Ayzhv3spaUrB6Z9qrJSO19ezj8p2pLBkJy%2BcCHJxWI5gW5tcfRRz1dU19GfGkou9PZO4smR9jGFwpex4Dy3bvnmKypotbU13VidjqYZhrj49rvMEt%2F%2FYqLz9d00NjW%2Fczgyo9O51zs6aNlo5FDtu0DZgQFhlGXJ0dBADoNhd6uvp6Whoayg7N9LVGH8mD4b%2FHnftUQoNG4vLQ0gixMqlW%2B4qOjtNHDg3r1f6YiRSGxRy7UvqLb9U4qkqnxPONva5lDpHr1%2ByyKRNKWBZy5edMUHB2m5ry%2B%2BEQw%2Bzgf4zo9%2F0ocN3WRzLBw4J%2BJyPWCrqmIgGYtUOsWD4oxZFQoPUjGpVHqI4%2FafkQPC6fZQeeM1%2BvLuIQnjuBWQDDCscrmHP9eoNPAtBqfOnXuaK%2Bh6JEbGrs%2BpvvMmxeIbh863abVPeYySEo9FJHpNMFJY%2BP5cWZkfg7O1tSwYCeSQLTY3E8Q09%2FBVPJUlxQjshT1BscCY02r9UDUBfvCHB66pcfPA3lyAe3ngr3%2F47XDgaJzsly7xwA6NZtlUUPCuAHqaSjUIP%2Bsue8BRWAC%2FNfQ7JZPZ59s0Gj7VtpISz4hQ%2BCpfXGMKhZcvLpUKxfWM8ohvf7p%2FODjHBfcVF8Isk82g1FHykcVFE%2BUZAAX47aE%2FMl4PO50Pnuh0%2Fx4nmcyWPsdwDhBx6CmkLV%2FgFDjYKxOJOFtb0wQyIhL9RyCwK3AOfIGp1YFEBhnMJcLRWEbKdKQoU6ncTZkIEDicAy%2F81dVuEM5RwPfey4xOx0Ik%2FI2NnFki%2BWafOoFIYFcgYZCyxd7eCUjbc4AmF65ft%2FkMhk3o%2B5hc7sMJyqjJEGvYFaQFIr7Y0wPw8BFAY%2B6%2Bvmk3w6zzRuDMmZVRsfh8RtA0uETSD7uCBT6DYQN6iveU0fpkYLjE6qrVrtOxeNKU9THLZJ9kBU2JBsBhV5AivB%2FoKaQNKgPCBwDYaIfZC4adThOqF4WENViLJwVoXobfLBKVw67AOaTsLc65TaVK21vQ4La99eKcYg5vbxsbObzTQ9N7UKDgUO1wDjiDIIBshh5ztg39nQMLSZBH4OzBOUDEQXm206d3fcLgswbXQA4PhcK3nhswU1Bz8wvQ09RHG%2FoYy3ejfwBNmtoYqLA0XgAAAABJRU5ErkJggg%3D%3D&amp;label=UpdatedAt\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>CreatedAt</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/5ed1e08a51d0382729df9f14a518ded9b2ba64d3999e15136f2263da113bbccb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f637265617465642d61742f77656962616f6875692f6b6f6d3f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d437265617465644174\" alt=\"create-at\" data-canonical-src=\"https://img.shields.io/github/created-at/weibaohui/kom?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nLVX7U9aVxwm26dlX%2Fdhbx%2B2%2FQnbkvUbrdUAQgJJIfUDNWDTTmOv1FQUFaPJ4kusrV01Jt1sNpctS2u3botZtmxd9tJSFSoqKqIF5bYDFLCovClefstzJ8wXRLDZLznkcO4557n3d3%2FneZ4rEOQZt1WqF%2B8XFr4%2BfOLEe2joY0zwf8ToyZPvjEgkLY%2Bk0mmrXO6dKinxzGk0fjT0x%2BRyr0UqncYczM1rc4tQ%2BIrp2LGXdo4NC4VvWqTS72wqlc%2Br13ORri6KdXdnbOHLlwlzJpRKn6W4%2BK6poOCNnIAfHj%2F%2BwahIZB4vKnqZf0qJpNIql%2Fv8TU0cNl5rbyc3w0QnTp3y2LTaJ7M1NaxDr2fRn1SpPG6Gia21tfE34TcaOay1iMUVOQFbFYqIWSo1W8TiAVanC0evXOEB7Wp14HFb22zE5fqLOC5ERLQWidNaNI4uEcc9i7hcJldHh2NWrQ5gDdbOlpaumIuLb2atAQDPnz0b8NbWcmxVVRJ3HmxpScwwzOJmKDRGe8LlCZDLG9g7TInV1Ql7dbXbV1e3gT0WKirCFomkPyvwXFlZGJOjV6%2BSt64uudDZOU5EUcox%2FMEQDVvt6MbcN27Y3Ayzhv3spaUrB6Z9qrJSO19ezj8p2pLBkJy%2BcCHJxWI5gW5tcfRRz1dU19GfGkou9PZO4smR9jGFwpex4Dy3bvnmKypotbU13VidjqYZhrj49rvMEt%2F%2FYqLz9d00NjW%2Fczgyo9O51zs6aNlo5FDtu0DZgQFhlGXJ0dBADoNhd6uvp6Whoayg7N9LVGH8mD4b%2FHnftUQoNG4vLQ0gixMqlW%2B4qOjtNHDg3r1f6YiRSGxRy7UvqLb9U4qkqnxPONva5lDpHr1%2ByyKRNKWBZy5edMUHB2m5ry%2B%2BEQw%2Bzgf4zo9%2F0ocN3WRzLBw4J%2BJyPWCrqmIgGYtUOsWD4oxZFQoPUjGpVHqI4%2FafkQPC6fZQeeM1%2BvLuIQnjuBWQDDCscrmHP9eoNPAtBqfOnXuaK%2Bh6JEbGrs%2BpvvMmxeIbh863abVPeYySEo9FJHpNMFJY%2BP5cWZkfg7O1tSwYCeSQLTY3E8Q09%2FBVPJUlxQjshT1BscCY02r9UDUBfvCHB66pcfPA3lyAe3ngr3%2F47XDgaJzsly7xwA6NZtlUUPCuAHqaSjUIP%2Bsue8BRWAC%2FNfQ7JZPZ59s0Gj7VtpISz4hQ%2BCpfXGMKhZcvLpUKxfWM8ohvf7p%2FODjHBfcVF8Isk82g1FHykcVFE%2BUZAAX47aE%2FMl4PO50Pnuh0%2Fx4nmcyWPsdwDhBx6CmkLV%2FgFDjYKxOJOFtb0wQyIhL9RyCwK3AOfIGp1YFEBhnMJcLRWEbKdKQoU6ncTZkIEDicAy%2F81dVuEM5RwPfey4xOx0Ik%2FI2NnFki%2BWafOoFIYFcgYZCyxd7eCUjbc4AmF65ft%2FkMhk3o%2B5hc7sMJyqjJEGvYFaQFIr7Y0wPw8BFAY%2B6%2Bvmk3w6zzRuDMmZVRsfh8RtA0uETSD7uCBT6DYQN6iveU0fpkYLjE6qrVrtOxeNKU9THLZJ9kBU2JBsBhV5AivB%2FoKaQNKgPCBwDYaIfZC4adThOqF4WENViLJwVoXobfLBKVw67AOaTsLc65TaVK21vQ4La99eKcYg5vbxsbObzTQ9N7UKDgUO1wDjiDIIBshh5ztg39nQMLSZBH4OzBOUDEQXm206d3fcLgswbXQA4PhcK3nhswU1Bz8wvQ09RHG%2FoYy3ejfwBNmtoYqLA0XgAAAABJRU5ErkJggg%3D%3D&amp;label=CreatedAt\" style=\"max-width: 100%;\"></a></td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<a href=\"https://github.com/opsre/awesome-ops\">\n</a><p dir=\"auto\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/b964a36ea4078c39f603d46a29436371c7541a2f26e0228d7b21b9d9805b43d3/68747470733a2f2f736f6369616c6966792e6769742e63692f6f707372652f617765736f6d652d6f70732f696d6167653f6465736372697074696f6e3d3126666f6e743d42697474657226666f726b733d31266973737565733d31266c616e67756167653d31266c6f676f3d6874747073253341253246253246617661746172732e67697468756275736572636f6e74656e742e636f6d25324675253246313838353638303230266e616d653d31266f776e65723d31267061747465726e3d436972637569742b426f6172642670756c6c733d31267374617267617a6572733d31267468656d653d4c69676874\" alt=\"\" data-canonical-src=\"https://socialify.git.ci/opsre/awesome-ops/image?description=1&amp;font=Bitter&amp;forks=1&amp;issues=1&amp;language=1&amp;logo=https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F188568020&amp;name=1&amp;owner=1&amp;pattern=Circuit+Board&amp;pulls=1&amp;stargazers=1&amp;theme=Light\" style=\"max-width: 100%;\"></a></p>\n<a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\"><img src=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\" width=\"100%\" height=\"3\" data-animated-image=\"\" data-canonical-src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\" style=\"max-width: 100%; height: auto; max-height: 3px;\"></a>\n</div>\n<h1 dir=\"auto\">Kom - Kubernetes Operations Manager</h1>\n<p dir=\"auto\"><a href=\"README_en.md\">English</a> | <a href=\"README.md\">中文</a><br>\n<a href=\"https://github.com/weibaohui/kom/blob/master/LICENSE\"><img src=\"https://camo.githubusercontent.com/9d4dc30e2f4f1a2bb3a3ca529b93aa419a73209749db41f4f531ee4735cf16b3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265\" alt=\"kom\" data-canonical-src=\"https://img.shields.io/badge/License-MIT-blue?style=flat-square\" style=\"max-width: 100%;\"></a></p>\n<h2 dir=\"auto\">简介</h2>\n<p dir=\"auto\"><code class=\"notranslate\">kom</code> 是一个用于 Kubernetes 操作的工具，相当于SDK级的kubectl、client-go的使用封装。<br>\n它提供了一系列功能来管理 Kubernetes 资源，包括创建、更新、删除和获取资源。这个项目支持多种 Kubernetes 资源类型的操作，并能够处理自定义资源定义（CRD）。<br>\n通过使用 <code class=\"notranslate\">kom</code>，你可以轻松地进行资源的增删改查和日志获取以及操作POD内文件等动作，甚至可以使用SQL语句来查询、管理k8s资源。</p>\n<h2 dir=\"auto\"><strong>特点</strong></h2>\n<ol dir=\"auto\">\n<li>简单易用：kom 提供了丰富的功能，包括创建、更新、删除、获取、列表等，包括对内置资源以及CRD资源的操作。</li>\n<li>多集群支持：通过RegisterCluster，你可以轻松地管理多个 Kubernetes 集群。</li>\n<li>MCP支持：支持多集群的MCP管理,同时支持stdio、sse两种模式，内置48种工具，支持SSE模式，支持私有化部署，多人共享。支持超过百种组合操作。</li>\n<li>支持跨命名空间：通过kom.Namespace(\"default\",\"kube-system\").List(&amp;items) 跨命名空间查询资源。</li>\n<li>链式调用：kom 提供了链式调用，使得操作资源更加简单和直观。</li>\n<li>支持自定义资源定义（CRD）：kom 支持自定义资源定义（CRD），你可以轻松地定义和操作自定义资源。</li>\n<li>支持回调机制，轻松拓展业务逻辑，而不必跟k8s操作强耦合。</li>\n<li>支持POD内文件操作，轻松上传、下载、删除文件。</li>\n<li>支持高频操作封装，如deployment的restart重启、scale扩缩容、启停等20余项操作功能。</li>\n<li>支持SQL查询k8s资源。select * from pod where metadata.namespace='kube-system' or metadata.namespace='default' order by  metadata.creationTimestamp desc</li>\n<li>支持查询缓存，在高频、批量查询场景下，可设置缓存过期时间，提升查询性能。列表过滤条件不受缓存影响。</li>\n</ol>\n<h2 dir=\"auto\">示例程序</h2>\n<p dir=\"auto\"><strong>k8m</strong> 是一个轻量级的 Kubernetes 管理工具，它基于kom、amis实现，单文件，支持多平台架构。</p>\n<ol dir=\"auto\">\n<li><strong>下载</strong>：从 <a href=\"https://github.com/weibaohui/k8m\">https://github.com/weibaohui/k8m</a> 下载最新版本。</li>\n<li><strong>运行</strong>：使用 <code class=\"notranslate\">./k8m</code> 命令启动,访问<a href=\"http://127.0.0.1:3618\" rel=\"nofollow\">http://127.0.0.1:3618</a>。</li>\n</ol>\n<h2 dir=\"auto\">安装</h2>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"import (\n    &quot;github.com/weibaohui/kom&quot;\n    &quot;github.com/weibaohui/kom/callbacks&quot;\n)\nfunc main() {\n    // 注册回调，务必先注册\n    callbacks.RegisterInit()\n    // 注册集群\n\tdefaultKubeConfig := os.Getenv(&quot;KUBECONFIG&quot;)\n\tif defaultKubeConfig == &quot;&quot; {\n\t\tdefaultKubeConfig = filepath.Join(homedir.HomeDir(), &quot;.kube&quot;, &quot;config&quot;)\n\t}\n\t_, _ = kom.Clusters().RegisterInCluster()\n\t_, _ = kom.Clusters().RegisterByPathWithID(defaultKubeConfig, &quot;default&quot;)\n\tkom.Clusters().Show()\n\t// 其他逻辑\n}\"><pre class=\"notranslate\">import (\n    <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>github.com/weibaohui/kom<span class=\"pl-pds\">\"</span></span>\n    <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>github.com/weibaohui/kom/callbacks<span class=\"pl-pds\">\"</span></span>\n)\nfunc <span class=\"pl-en\">main</span>() {\n    // 注册回调，务必先注册\n    <span class=\"pl-en\">callbacks.RegisterInit</span>()\n    // 注册集群\n\tdefaultKubeConfig := os.Getenv(<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>KUBECONFIG<span class=\"pl-pds\">\"</span></span>)\n\t<span class=\"pl-k\">if</span> defaultKubeConfig == <span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-pds\">\"</span></span> {\n\t\tdefaultKubeConfig = <span class=\"pl-en\">filepath.Join(homedir.HomeDir</span>(), <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>.kube<span class=\"pl-pds\">\"</span></span>, <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>config<span class=\"pl-pds\">\"</span></span>)\n\t}\n\t_, _ = <span class=\"pl-en\">kom.Clusters().RegisterInCluster</span>()\n\t_, _ = <span class=\"pl-en\">kom.Clusters</span>().RegisterByPathWithID(defaultKubeConfig, <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>default<span class=\"pl-pds\">\"</span></span>)\n\t<span class=\"pl-en\">kom.Clusters().Show</span>()\n\t// 其他逻辑\n}</pre></div>\n<h2 dir=\"auto\">使用示例</h2>\n<h3 dir=\"auto\">0. 多集群 k8s MCP 支持</h3>\n<p dir=\"auto\">同时支持stdio、sse两种模式<br>\n支持多个tools 支持。包括对任意资源的查询列表删除描述操作，以及POD日志读取操作。</p>\n<h4 dir=\"auto\">1.集成到代码中</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 一行代码启动MCP Server\nmcp.RunMCPServer(&quot;kom mcp server&quot;, &quot;0.0.1&quot;, 9096)\n\n\n\"><pre class=\"notranslate\"><span class=\"pl-c\">// 一行代码启动MCP Server</span>\n<span class=\"pl-s1\">mcp</span>.<span class=\"pl-c1\">RunMCPServer</span>(<span class=\"pl-s\">\"kom mcp server\"</span>, <span class=\"pl-s\">\"0.0.1\"</span>, <span class=\"pl-c1\">9096</span>)\n\n</pre></div>\n<h4 dir=\"auto\">2. 编译</h4>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# 源码启动\ngo build main.go \n//编译为kom\"><pre class=\"notranslate\"><span class=\"pl-c\"><span class=\"pl-c\">#</span> 源码启动</span>\ngo build main.go \n//编译为kom</pre></div>\n<h4 dir=\"auto\">3. 启动</h4>\n<p dir=\"auto\">启动后支持两种模式，一种为stdio，一种sse。<br>\n管理k8s默认使用KUBECONFIG env环境变量。</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# 设置KUBECONFIG环境变量\nexport KUBECONFIG = /Users/xxx/.kube/config\"><pre class=\"notranslate\"><span class=\"pl-c\"><span class=\"pl-c\">#</span> 设置KUBECONFIG环境变量</span>\n<span class=\"pl-k\">export</span> KUBECONFIG = /Users/xxx/.kube/config</pre></div>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# 运行\n./kom \n# MCP Server 访问地址\nhttp://IP:9096/sse\"><pre class=\"notranslate\"><span class=\"pl-c\"><span class=\"pl-c\">#</span> 运行</span>\n./kom \n<span class=\"pl-c\"><span class=\"pl-c\">#</span> MCP Server 访问地址</span>\nhttp://IP:9096/sse</pre></div>\n<p dir=\"auto\">此时，编译得到的二进制文件，可当做stdio 模式使用。<br>\n<a href=\"http://IP:9096/sse\" rel=\"nofollow\">http://IP:9096/sse</a> 模式，可以当做sse 模式使用。</p>\n<h4 dir=\"auto\">4. 集成到MCP工具中</h4>\n<p dir=\"auto\">支持stdio\\sse 两种方式集成。<br>\n适合MCP工具集成，如Cursor、Claude Desktop(仅支持stdio模式)、Windsurf等，此外也可以使用这些软件的UI操作界面进行添加。</p>\n<div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;mcpServers&quot;: {\n    &quot;kom&quot;: {\n      &quot;type&quot;: &quot;sse&quot;,\n      &quot;url&quot;: &quot;http://IP:9096/sse&quot;\n    }\n  }\n}\"><pre class=\"notranslate\">{\n  <span class=\"pl-ent\">\"mcpServers\"</span>: {\n    <span class=\"pl-ent\">\"kom\"</span>: {\n      <span class=\"pl-ent\">\"type\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>sse<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"url\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>http://IP:9096/sse<span class=\"pl-pds\">\"</span></span>\n    }\n  }\n}</pre></div>\n<div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n    &quot;mcpServers&quot;: {\n        &quot;k8m&quot;: {\n            &quot;command&quot;: &quot;path/to/kom&quot;,\n            &quot;args&quot;: []\n        }\n    }\n}\"><pre class=\"notranslate\">{\n    <span class=\"pl-ent\">\"mcpServers\"</span>: {\n        <span class=\"pl-ent\">\"k8m\"</span>: {\n            <span class=\"pl-ent\">\"command\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>path/to/kom<span class=\"pl-pds\">\"</span></span>,\n            <span class=\"pl-ent\">\"args\"</span>: []\n        }\n    }\n}</pre></div>\n<h4 dir=\"auto\">MCP工具列表（49种）</h4>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th>类别</th>\n<th>方法</th>\n<th>描述</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>集群管理（1）</strong></td>\n<td><code class=\"notranslate\">list_clusters</code></td>\n<td>列出所有已注册的Kubernetes集群</td>\n</tr>\n<tr>\n<td><strong>部署管理（12）</strong></td>\n<td><code class=\"notranslate\">scale_deployment</code></td>\n<td>扩缩容Deployment</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">restart_deployment</code></td>\n<td>重启Deployment</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">stop_deployment</code></td>\n<td>停止Deployment</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">restore_deployment</code></td>\n<td>恢复Deployment</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">update_tag_deployment</code></td>\n<td>更新Deployment镜像标签</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">rollout_history_deployment</code></td>\n<td>查询Deployment升级历史</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">rollout_undo_deployment</code></td>\n<td>回滚Deployment</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">rollout_pause_deployment</code></td>\n<td>暂停Deployment升级</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">rollout_resume_deployment</code></td>\n<td>恢复Deployment升级</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">rollout_status_deployment</code></td>\n<td>查询Deployment升级状态</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">hpa_list_deployment</code></td>\n<td>查询Deployment的HPA列表</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">list_deployment_pods</code></td>\n<td>获取Deployment管理的Pod列表</td>\n</tr>\n<tr>\n<td><strong>动态资源管理(含CRD，8)</strong></td>\n<td><code class=\"notranslate\">get_k8s_resource</code></td>\n<td>获取k8s资源</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">describe_k8s_resource</code></td>\n<td>描述k8s资源</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">delete_k8s_resource</code></td>\n<td>删除k8s资源</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">list_k8s_resource</code></td>\n<td>列表形式获取k8s资源</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">list_k8s_event</code></td>\n<td>列表形式获取k8s事件</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">patch_k8s_resource</code></td>\n<td>更新k8s资源，以JSON Patch方式更新</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">label_k8s_resource</code></td>\n<td>为k8s资源添加或删除标签</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">annotate_k8s_resource</code></td>\n<td>为k8s资源添加或删除注解</td>\n</tr>\n<tr>\n<td><strong>节点管理（8）</strong></td>\n<td><code class=\"notranslate\">taint_node</code></td>\n<td>为节点添加污点</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">untaint_node</code></td>\n<td>为节点移除污点</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">cordon_node</code></td>\n<td>为节点设置Cordon</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">uncordon_node</code></td>\n<td>为节点取消Cordon</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">drain_node</code></td>\n<td>为节点执行Drain</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_node_resource_usage</code></td>\n<td>查询节点的资源使用情况</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_node_ip_usage</code></td>\n<td>查询节点上Pod IP资源使用情况</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_node_pod_count</code></td>\n<td>查询节点上的Pod数量</td>\n</tr>\n<tr>\n<td><strong>Pod 管理（14）</strong></td>\n<td><code class=\"notranslate\">list_pod_files</code></td>\n<td>列出Pod文件</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">list_all_pod_files</code></td>\n<td>列出Pod所有文件</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">delete_pod_file</code></td>\n<td>删除Pod文件</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">upload_file_to_pod</code></td>\n<td>上传文件到Pod内，支持传递文本内容，存储为Pod内文件</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_pod_logs</code></td>\n<td>获取Pod日志</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">run_command_in_pod</code></td>\n<td>在Pod中执行命令</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_pod_linked_service</code></td>\n<td>获取Pod关联的Service</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_pod_linked_ingress</code></td>\n<td>获取Pod关联的Ingress</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_pod_linked_endpoints</code></td>\n<td>获取Pod关联的Endpoints</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_pod_linked_pvc</code></td>\n<td>获取Pod关联的PVC</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_pod_linked_pv</code></td>\n<td>获取Pod关联的PV</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_pod_linked_env</code></td>\n<td>通过在pod内运行env命令获取Pod运行时环境变量</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_pod_linked_env_from_yaml</code></td>\n<td>通过Pod yaml定义获取Pod运行时环境变量</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_pod_resource_usage</code></td>\n<td>获取Pod的资源使用情况，包括CPU和内存的请求值、限制值、可分配值和使用比例</td>\n</tr>\n<tr>\n<td><strong>YAML管理（2）</strong></td>\n<td><code class=\"notranslate\">apply_yaml</code></td>\n<td>应用YAML资源</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">delete_yaml</code></td>\n<td>删除YAML资源</td>\n</tr>\n<tr>\n<td><strong>存储管理（3）</strong></td>\n<td><code class=\"notranslate\">set_default_storageclass</code></td>\n<td>设置默认StorageClass</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_storageclass_pvc_count</code></td>\n<td>获取StorageClass下的PVC数量</td>\n</tr>\n<tr>\n<td></td>\n<td><code class=\"notranslate\">get_storageclass_pv_count</code></td>\n<td>获取StorageClass下的PV数量</td>\n</tr>\n<tr>\n<td><strong>Ingress管理（1）</strong></td>\n<td><code class=\"notranslate\">set_default_ingressclass</code></td>\n<td>设置默认IngressClass</td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<h4 dir=\"auto\">启动命令</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"mcp.RunMCPServer(&quot;kom mcp server&quot;, &quot;0.0.1&quot;, 3619)\"><pre class=\"notranslate\"><span class=\"pl-s1\">mcp</span>.<span class=\"pl-c1\">RunMCPServer</span>(<span class=\"pl-s\">\"kom mcp server\"</span>, <span class=\"pl-s\">\"0.0.1\"</span>, <span class=\"pl-c1\">3619</span>)</pre></div>\n<h4 dir=\"auto\">AI工具集成</h4>\n<h5 dir=\"auto\">Claude Desktop</h5>\n<ol dir=\"auto\">\n<li>打开Claude Desktop设置面板</li>\n<li>在API配置区域添加MCP Server地址</li>\n<li>启用SSE事件监听功能</li>\n<li>验证连接状态</li>\n</ol>\n<div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;mcpServers&quot;: {\n    &quot;k8m&quot;: {\n      &quot;command&quot;: &quot;path/to/kom&quot;,\n      &quot;args&quot;: []\n    }\n  }\n}\"><pre class=\"notranslate\">{\n  <span class=\"pl-ent\">\"mcpServers\"</span>: {\n    <span class=\"pl-ent\">\"k8m\"</span>: {\n      <span class=\"pl-ent\">\"command\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>path/to/kom<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"args\"</span>: []\n    }\n  }\n}</pre></div>\n<h5 dir=\"auto\">Cursor</h5>\n<ol dir=\"auto\">\n<li>进入Cursor设置界面</li>\n<li>找到扩展服务配置选项</li>\n<li>支持sse、stdio两种方式。sse 方式填写<a href=\"http://localhost:9096/sse,stdio%E6%96%B9%E5%BC%8F%E5%A1%AB%E5%86%99kom%E7%9A%84%E6%96%87%E4%BB%B6%E4%BD%8D%E7%BD%AE%E3%80%82\" rel=\"nofollow\">http://localhost:9096/sse,stdio方式填写kom的文件位置。</a></li>\n</ol>\n<h5 dir=\"auto\">Windsurf</h5>\n<ol dir=\"auto\">\n<li>访问配置中心</li>\n<li>设置API服务器地址</li>\n<li>支持sse、stdio两种方式。sse 方式填写<a href=\"http://localhost:9096/sse,stdio%E6%96%B9%E5%BC%8F%E5%A1%AB%E5%86%99kom%E7%9A%84%E6%96%87%E4%BB%B6%E4%BD%8D%E7%BD%AE%E3%80%82\" rel=\"nofollow\">http://localhost:9096/sse,stdio方式填写kom的文件位置。</a></li>\n</ol>\n<h4 dir=\"auto\">cherry studio</h4>\n<ol dir=\"auto\">\n<li>点击左下角设置</li>\n<li>点击MCP 服务器</li>\n<li>点击添加服务器</li>\n<li>支持sse、stdio两种方式。sse 方式填写<a href=\"http://localhost:9096/sse,stdio%E6%96%B9%E5%BC%8F%E5%A1%AB%E5%86%99kom%E7%9A%84%E6%96%87%E4%BB%B6%E4%BD%8D%E7%BD%AE%E3%80%82\" rel=\"nofollow\">http://localhost:9096/sse,stdio方式填写kom的文件位置。</a></li>\n</ol>\n<h3 dir=\"auto\">1. 多集群管理</h3>\n<h4 dir=\"auto\">注册多集群</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 注册InCluster集群，名称为InCluster\nkom.Clusters().RegisterInCluster()\n// 注册两个带名称的集群,分别名为orb和docker-desktop\nkom.Clusters().RegisterByPathWithID(&quot;/Users/kom/.kube/orb&quot;, &quot;orb&quot;)\nkom.Clusters().RegisterByPathWithID(&quot;/Users/kom/.kube/config&quot;, &quot;docker-desktop&quot;)\n// 注册一个名为default的集群，那么kom.DefaultCluster()则会返回该集群。\nkom.Clusters().RegisterByPathWithID(&quot;/Users/kom/.kube/config&quot;, &quot;default&quot;)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 注册InCluster集群，名称为InCluster</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">Clusters</span>().<span class=\"pl-c1\">RegisterInCluster</span>()\n<span class=\"pl-c\">// 注册两个带名称的集群,分别名为orb和docker-desktop</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">Clusters</span>().<span class=\"pl-c1\">RegisterByPathWithID</span>(<span class=\"pl-s\">\"/Users/kom/.kube/orb\"</span>, <span class=\"pl-s\">\"orb\"</span>)\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">Clusters</span>().<span class=\"pl-c1\">RegisterByPathWithID</span>(<span class=\"pl-s\">\"/Users/kom/.kube/config\"</span>, <span class=\"pl-s\">\"docker-desktop\"</span>)\n<span class=\"pl-c\">// 注册一个名为default的集群，那么kom.DefaultCluster()则会返回该集群。</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">Clusters</span>().<span class=\"pl-c1\">RegisterByPathWithID</span>(<span class=\"pl-s\">\"/Users/kom/.kube/config\"</span>, <span class=\"pl-s\">\"default\"</span>)</pre></div>\n<h4 dir=\"auto\">显示已注册集群</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"kom.Clusters().Show()\"><pre class=\"notranslate\"><span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">Clusters</span>().<span class=\"pl-c1\">Show</span>()</pre></div>\n<h4 dir=\"auto\">选择默认集群</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 使用默认集群,查询集群内kube-system命名空间下的pod\n// 首先尝试返回 ID 为 &quot;InCluster&quot; 的实例，如果不存在，\n// 则尝试返回 ID 为 &quot;default&quot; 的实例。\n// 如果上述两个名称的实例都不存在，则返回 clusters 列表中的任意一个实例。\nvar pods []corev1.Pod\nerr = kom.DefaultCluster().Resource(&amp;corev1.Pod{}).Namespace(&quot;kube-system&quot;).List(&amp;pods).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 使用默认集群,查询集群内kube-system命名空间下的pod</span>\n<span class=\"pl-c\">// 首先尝试返回 ID 为 \"InCluster\" 的实例，如果不存在，</span>\n<span class=\"pl-c\">// 则尝试返回 ID 为 \"default\" 的实例。</span>\n<span class=\"pl-c\">// 如果上述两个名称的实例都不存在，则返回 clusters 列表中的任意一个实例。</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">pods</span> []corev1.<span class=\"pl-smi\">Pod</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>corev1.<span class=\"pl-smi\">Pod</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"kube-system\"</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">pods</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">选择指定集群</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 选择orb集群,查询集群内kube-system命名空间下的pod\nvar pods []corev1.Pod\nerr = kom.Cluster(&quot;orb&quot;).Resource(&amp;corev1.Pod{}).Namespace(&quot;kube-system&quot;).List(&amp;pods).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 选择orb集群,查询集群内kube-system命名空间下的pod</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">pods</span> []corev1.<span class=\"pl-smi\">Pod</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">Cluster</span>(<span class=\"pl-s\">\"orb\"</span>).<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>corev1.<span class=\"pl-smi\">Pod</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"kube-system\"</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">pods</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h3 dir=\"auto\">2. 内置资源对象的增删改查以及Watch示例</h3>\n<p dir=\"auto\">定义一个 Deployment 对象，并通过 kom 进行资源操作。</p>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var item v1.Deployment\nvar items []v1.Deployment\"><pre class=\"notranslate\"><span class=\"pl-k\">var</span> <span class=\"pl-s1\">item</span> v1.<span class=\"pl-smi\">Deployment</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">items</span> []v1.<span class=\"pl-smi\">Deployment</span></pre></div>\n<h4 dir=\"auto\">创建某个资源</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"item = v1.Deployment{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      &quot;nginx&quot;,\n\t\t\tNamespace: &quot;default&quot;,\n\t\t},\n\t\tSpec: v1.DeploymentSpec{\n\t\t\tTemplate: corev1.PodTemplateSpec{\n\t\t\t\tSpec: corev1.PodSpec{\n\t\t\t\t\tContainers: []corev1.Container{\n\t\t\t\t\t\t{Name: &quot;test&quot;, Image: &quot;nginx:1.14.2&quot;},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\nerr := kom.DefaultCluster().Resource(&amp;item).Create(&amp;item).Error\"><pre class=\"notranslate\"><span class=\"pl-s1\">item</span> <span class=\"pl-c1\">=</span> v1.<span class=\"pl-smi\">Deployment</span>{\n\t\t<span class=\"pl-s1\">ObjectMeta</span>: metav1.<span class=\"pl-smi\">ObjectMeta</span>{\n\t\t\t<span class=\"pl-s1\">Name</span>:      <span class=\"pl-s\">\"nginx\"</span>,\n\t\t\t<span class=\"pl-s1\">Namespace</span>: <span class=\"pl-s\">\"default\"</span>,\n\t\t},\n\t\t<span class=\"pl-s1\">Spec</span>: v1.<span class=\"pl-smi\">DeploymentSpec</span>{\n\t\t\t<span class=\"pl-s1\">Template</span>: corev1.<span class=\"pl-smi\">PodTemplateSpec</span>{\n\t\t\t\t<span class=\"pl-s1\">Spec</span>: corev1.<span class=\"pl-smi\">PodSpec</span>{\n\t\t\t\t\t<span class=\"pl-s1\">Containers</span>: []corev1.<span class=\"pl-smi\">Container</span>{\n\t\t\t\t\t\t{<span class=\"pl-s1\">Name</span>: <span class=\"pl-s\">\"test\"</span>, <span class=\"pl-s1\">Image</span>: <span class=\"pl-s\">\"nginx:1.14.2\"</span>},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Create</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">Get查询某个资源</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 查询 default 命名空间下名为 nginx 的 Deployment\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Get(&amp;item).Error\n// 查询 default 命名空间下名为 nginx 的 Deployment，并使用缓存 5 秒\n// 5秒内，不会再次查询，批量操作、高频操作下，建议启用缓存\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).WithCache(5 * time.Second).Get(&amp;item).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 查询 default 命名空间下名为 nginx 的 Deployment</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Get</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-c\">// 查询 default 命名空间下名为 nginx 的 Deployment，并使用缓存 5 秒</span>\n<span class=\"pl-c\">// 5秒内，不会再次查询，批量操作、高频操作下，建议启用缓存</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">WithCache</span>(<span class=\"pl-c1\">5</span> <span class=\"pl-c1\">*</span> <span class=\"pl-s1\">time</span>.<span class=\"pl-c1\">Second</span>).<span class=\"pl-c1\">Get</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">List查询资源列表</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 查询 default 命名空间下的 Deployment 列表\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;).List(&amp;items).Error\n// 查询 default、kube-system 命名空间下的 Deployment 列表\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;,&quot;kube-system&quot;).List(&amp;items).Error\n// 查询 所有 命名空间下的 Deployment 列表\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;*&quot;).List(&amp;items).Error\nerr := kom.DefaultCluster().Resource(&amp;item).AllNamespace().List(&amp;items).Error\n// 设置5秒缓存，对列表生效\nerr := kom.DefaultCluster().Resource(&amp;item).WithCache(5 * time.Second).List(&amp;nodeList).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 查询 default 命名空间下的 Deployment 列表</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">items</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-c\">// 查询 default、kube-system 命名空间下的 Deployment 列表</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>,<span class=\"pl-s\">\"kube-system\"</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">items</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-c\">// 查询 所有 命名空间下的 Deployment 列表</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"*\"</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">items</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">AllNamespace</span>().<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">items</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-c\">// 设置5秒缓存，对列表生效</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">WithCache</span>(<span class=\"pl-c1\">5</span> <span class=\"pl-c1\">*</span> <span class=\"pl-s1\">time</span>.<span class=\"pl-c1\">Second</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">nodeList</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">通过Label查询资源列表</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 查询 default 命名空间下 标签为 app:nginx 的 Deployment 列表\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;).WithLabelSelector(&quot;app=nginx&quot;).List(&amp;items).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 查询 default 命名空间下 标签为 app:nginx 的 Deployment 列表</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">WithLabelSelector</span>(<span class=\"pl-s\">\"app=nginx\"</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">items</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">通过多个Label查询资源列表</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 查询 default 命名空间下 标签为 app:nginx m:n 的 Deployment 列表\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;).WithLabelSelector(&quot;app=nginx&quot;).WithLabelSelector(&quot;m=n&quot;).List(&amp;items).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 查询 default 命名空间下 标签为 app:nginx m:n 的 Deployment 列表</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">WithLabelSelector</span>(<span class=\"pl-s\">\"app=nginx\"</span>).<span class=\"pl-c1\">WithLabelSelector</span>(<span class=\"pl-s\">\"m=n\"</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">items</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">通过Field查询资源列表</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 查询 default 命名空间下 标签为 metadata.name=test-deploy 的 Deployment 列表\n// filedSelector 一般支持原生的字段定义。如metadata.name,metadata.namespace,metadata.labels,metadata.annotations,metadata.creationTimestamp,spec.nodeName,spec.serviceAccountName,spec.schedulerName,status.phase,status.hostIP,status.podIP,status.qosClass,spec.containers.name等字段\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;).WithFieldSelector(&quot;metadata.name=test-deploy&quot;).List(&amp;items).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 查询 default 命名空间下 标签为 metadata.name=test-deploy 的 Deployment 列表</span>\n<span class=\"pl-c\">// filedSelector 一般支持原生的字段定义。如metadata.name,metadata.namespace,metadata.labels,metadata.annotations,metadata.creationTimestamp,spec.nodeName,spec.serviceAccountName,spec.schedulerName,status.phase,status.hostIP,status.podIP,status.qosClass,spec.containers.name等字段</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">WithFieldSelector</span>(<span class=\"pl-s\">\"metadata.name=test-deploy\"</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">items</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">分页查询资源</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var list []corev1.Pod\nvar total int64\nsql := &quot;select * from pod where metadata.namespace=? or metadata.namespace=?     order by  metadata.creationTimestamp desc &quot;\nerr := kom.DefaultCluster().Sql(sql, &quot;kube-system&quot;, &quot;default&quot;).\n\t\tFillTotalCount(&amp;total).\n\t\tLimit(5).\n\t\tOffset(10).\n\t\tList(&amp;list).Error\nfmt.Printf(&quot;total %d\\n&quot;, total)  //返回总数 480\nfmt.Printf(&quot;Count %d\\n&quot;, len(list)) //返回条目数=limit=5\"><pre class=\"notranslate\"><span class=\"pl-k\">var</span> <span class=\"pl-s1\">list</span> []corev1.<span class=\"pl-smi\">Pod</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">total</span> <span class=\"pl-smi\">int64</span>\n<span class=\"pl-s1\">sql</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">\"select * from pod where metadata.namespace=? or metadata.namespace=?     order by  metadata.creationTimestamp desc \"</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Sql</span>(<span class=\"pl-s1\">sql</span>, <span class=\"pl-s\">\"kube-system\"</span>, <span class=\"pl-s\">\"default\"</span>).\n\t\t<span class=\"pl-c1\">FillTotalCount</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">total</span>).\n\t\t<span class=\"pl-c1\">Limit</span>(<span class=\"pl-c1\">5</span>).\n\t\t<span class=\"pl-c1\">Offset</span>(<span class=\"pl-c1\">10</span>).\n\t\t<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">list</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"total %d<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">total</span>)  <span class=\"pl-c\">//返回总数 480</span>\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Count %d<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">len</span>(<span class=\"pl-s1\">list</span>)) <span class=\"pl-c\">//返回条目数=limit=5</span></pre></div>\n<h4 dir=\"auto\">更新资源内容</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 更新名为nginx 的 Deployment，增加一个注解\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Get(&amp;item).Error\nif item.Spec.Template.Annotations == nil {\n\titem.Spec.Template.Annotations = map[string]string{}\n}\nitem.Spec.Template.Annotations[&quot;kom.kubernetes.io/restartedAt&quot;] = time.Now().Format(time.RFC3339)\nerr = kom.DefaultCluster().Resource(&amp;item).Update(&amp;item).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 更新名为nginx 的 Deployment，增加一个注解</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Get</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-k\">if</span> <span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">Spec</span>.<span class=\"pl-c1\">Template</span>.<span class=\"pl-c1\">Annotations</span> <span class=\"pl-c1\">==</span> <span class=\"pl-c1\">nil</span> {\n\t<span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">Spec</span>.<span class=\"pl-c1\">Template</span>.<span class=\"pl-c1\">Annotations</span> <span class=\"pl-c1\">=</span> <span class=\"pl-k\">map</span>[<span class=\"pl-smi\">string</span>]<span class=\"pl-smi\">string</span>{}\n}\n<span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">Spec</span>.<span class=\"pl-c1\">Template</span>.<span class=\"pl-c1\">Annotations</span>[<span class=\"pl-s\">\"kom.kubernetes.io/restartedAt\"</span>] <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">time</span>.<span class=\"pl-c1\">Now</span>().<span class=\"pl-c1\">Format</span>(<span class=\"pl-s1\">time</span>.<span class=\"pl-c1\">RFC3339</span>)\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Update</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">PATCH 更新资源</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 使用 Patch 更新资源,为名为 nginx 的 Deployment 增加一个标签，并设置副本数为5\npatchData := `{\n    &quot;spec&quot;: {\n        &quot;replicas&quot;: 5\n    },\n    &quot;metadata&quot;: {\n        &quot;labels&quot;: {\n            &quot;new-label&quot;: &quot;new-value&quot;\n        }\n    }\n}`\nerr := kom.DefaultCluster().Resource(&amp;item).Patch(&amp;item, types.StrategicMergePatchType, patchData).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 使用 Patch 更新资源,为名为 nginx 的 Deployment 增加一个标签，并设置副本数为5</span>\n<span class=\"pl-s1\">patchData</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">`{</span>\n<span class=\"pl-s\">    \"spec\": {</span>\n<span class=\"pl-s\">        \"replicas\": 5</span>\n<span class=\"pl-s\">    },</span>\n<span class=\"pl-s\">    \"metadata\": {</span>\n<span class=\"pl-s\">        \"labels\": {</span>\n<span class=\"pl-s\">            \"new-label\": \"new-value\"</span>\n<span class=\"pl-s\">        }</span>\n<span class=\"pl-s\">    }</span>\n<span class=\"pl-s\">}`</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Patch</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>, <span class=\"pl-s1\">types</span>.<span class=\"pl-c1\">StrategicMergePatchType</span>, <span class=\"pl-s1\">patchData</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">删除资源</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 删除名为 nginx 的 Deployment\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Delete().Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 删除名为 nginx 的 Deployment</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Delete</span>().<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">强制删除资源</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 删除名为 nginx 的 Deployment\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).ForceDelete().Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 删除名为 nginx 的 Deployment</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">ForceDelete</span>().<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">通用类型资源的获取（适用于k8s内置类型以及CRD）</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 指定GVK获取资源\nvar list []corev1.Event\nerr := kom.DefaultCluster().GVK(&quot;events.k8s.io&quot;, &quot;v1&quot;, &quot;Event&quot;).Namespace(&quot;default&quot;).List(&amp;list).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 指定GVK获取资源</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">list</span> []corev1.<span class=\"pl-smi\">Event</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">GVK</span>(<span class=\"pl-s\">\"events.k8s.io\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"Event\"</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">list</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">Watch资源变更</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// watch default 命名空间下 Pod资源 的变更\nvar watcher watch.Interface\nvar pod corev1.Pod\nerr := kom.DefaultCluster().Resource(&amp;pod).Namespace(&quot;default&quot;).Watch(&amp;watcher).Error\nif err != nil {\n\tfmt.Printf(&quot;Create Watcher Error %v&quot;, err)\n\treturn err\n}\ngo func() {\n\tdefer watcher.Stop()\n\n\tfor event := range watcher.ResultChan() {\n\t\terr := kom.DefaultCluster().Tools().ConvertRuntimeObjectToTypedObject(event.Object, &amp;pod)\n\t\tif err != nil {\n\t\t\tfmt.Printf(&quot;无法将对象转换为 *v1.Pod 类型: %v&quot;, err)\n\t\t\treturn\n\t\t}\n\t\t// 处理事件\n\t\tswitch event.Type {\n\t\tcase watch.Added:\n\t\t\tfmt.Printf(&quot;Added Pod [ %s/%s ]\\n&quot;, pod.Namespace, pod.Name)\n\t\tcase watch.Modified:\n\t\t\tfmt.Printf(&quot;Modified Pod [ %s/%s ]\\n&quot;, pod.Namespace, pod.Name)\n\t\tcase watch.Deleted:\n\t\t\tfmt.Printf(&quot;Deleted Pod [ %s/%s ]\\n&quot;, pod.Namespace, pod.Name)\n\t\t}\n\t}\n}()\"><pre class=\"notranslate\"><span class=\"pl-c\">// watch default 命名空间下 Pod资源 的变更</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">watcher</span> watch.<span class=\"pl-smi\">Interface</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">pod</span> corev1.<span class=\"pl-smi\">Pod</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">pod</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Watch</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">watcher</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-k\">if</span> <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">!=</span> <span class=\"pl-c1\">nil</span> {\n\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Create Watcher Error %v\"</span>, <span class=\"pl-s1\">err</span>)\n\t<span class=\"pl-k\">return</span> <span class=\"pl-s1\">err</span>\n}\n<span class=\"pl-k\">go</span> <span class=\"pl-k\">func</span>() {\n\t<span class=\"pl-k\">defer</span> <span class=\"pl-s1\">watcher</span>.<span class=\"pl-c1\">Stop</span>()\n\n\t<span class=\"pl-k\">for</span> <span class=\"pl-s1\">event</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">watcher</span>.<span class=\"pl-c1\">ResultChan</span>() {\n\t\t<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Tools</span>().<span class=\"pl-c1\">ConvertRuntimeObjectToTypedObject</span>(<span class=\"pl-s1\">event</span>.<span class=\"pl-c1\">Object</span>, <span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">pod</span>)\n\t\t<span class=\"pl-k\">if</span> <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">!=</span> <span class=\"pl-c1\">nil</span> {\n\t\t\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"无法将对象转换为 *v1.Pod 类型: %v\"</span>, <span class=\"pl-s1\">err</span>)\n\t\t\t<span class=\"pl-k\">return</span>\n\t\t}\n\t\t<span class=\"pl-c\">// 处理事件</span>\n\t\t<span class=\"pl-k\">switch</span> <span class=\"pl-s1\">event</span>.<span class=\"pl-c1\">Type</span> {\n\t\t<span class=\"pl-k\">case</span> <span class=\"pl-s1\">watch</span>.<span class=\"pl-c1\">Added</span>:\n\t\t\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Added Pod [ %s/%s ]<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">pod</span>.<span class=\"pl-c1\">Namespace</span>, <span class=\"pl-s1\">pod</span>.<span class=\"pl-c1\">Name</span>)\n\t\t<span class=\"pl-k\">case</span> <span class=\"pl-s1\">watch</span>.<span class=\"pl-c1\">Modified</span>:\n\t\t\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Modified Pod [ %s/%s ]<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">pod</span>.<span class=\"pl-c1\">Namespace</span>, <span class=\"pl-s1\">pod</span>.<span class=\"pl-c1\">Name</span>)\n\t\t<span class=\"pl-k\">case</span> <span class=\"pl-s1\">watch</span>.<span class=\"pl-c1\">Deleted</span>:\n\t\t\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Deleted Pod [ %s/%s ]<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">pod</span>.<span class=\"pl-c1\">Namespace</span>, <span class=\"pl-s1\">pod</span>.<span class=\"pl-c1\">Name</span>)\n\t\t}\n\t}\n}()</pre></div>\n<h4 dir=\"auto\">Describe查询某个资源</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Describe default 命名空间下名为 nginx 的 Deployment\nvar describeResult []byte\nerr := kom.DefaultCluster().Resource(&amp;item).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Describe(&amp;item).Error\nfmt.Printf(&quot;describeResult: %s&quot;, describeResult)\"><pre class=\"notranslate\"><span class=\"pl-c\">// Describe default 命名空间下名为 nginx 的 Deployment</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">describeResult</span> []<span class=\"pl-smi\">byte</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Describe</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"describeResult: %s\"</span>, <span class=\"pl-s1\">describeResult</span>)</pre></div>\n<h3 dir=\"auto\">3. YAML 创建、更新、删除</h3>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"yaml := `apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: example-config\n  namespace: default\ndata:\n  key: value\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: example-deployment\n  namespace: default\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: example\n  template:\n    metadata:\n      labels:\n        app: example\n    spec:\n      containers:\n        - name: example-container\n          image: nginx\n`\n// 第一次执行Apply为创建，返回每一条资源的执行结果 \nresults := kom.DefaultCluster().Applier().Apply(yaml)\n// 第二次执行Apply为更新，返回每一条资源的执行结果\nresults = kom.DefaultCluster().Applier().Apply(yaml)\n// 删除，返回每一条资源的执行结果\nresults = kom.DefaultCluster().Applier().Delete(yaml)\"><pre class=\"notranslate\"><span class=\"pl-s1\">yaml</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">`apiVersion: v1</span>\n<span class=\"pl-s\">kind: ConfigMap</span>\n<span class=\"pl-s\">metadata:</span>\n<span class=\"pl-s\">  name: example-config</span>\n<span class=\"pl-s\">  namespace: default</span>\n<span class=\"pl-s\">data:</span>\n<span class=\"pl-s\">  key: value</span>\n<span class=\"pl-s\">---</span>\n<span class=\"pl-s\">apiVersion: apps/v1</span>\n<span class=\"pl-s\">kind: Deployment</span>\n<span class=\"pl-s\">metadata:</span>\n<span class=\"pl-s\">  name: example-deployment</span>\n<span class=\"pl-s\">  namespace: default</span>\n<span class=\"pl-s\">spec:</span>\n<span class=\"pl-s\">  replicas: 1</span>\n<span class=\"pl-s\">  selector:</span>\n<span class=\"pl-s\">    matchLabels:</span>\n<span class=\"pl-s\">      app: example</span>\n<span class=\"pl-s\">  template:</span>\n<span class=\"pl-s\">    metadata:</span>\n<span class=\"pl-s\">      labels:</span>\n<span class=\"pl-s\">        app: example</span>\n<span class=\"pl-s\">    spec:</span>\n<span class=\"pl-s\">      containers:</span>\n<span class=\"pl-s\">        - name: example-container</span>\n<span class=\"pl-s\">          image: nginx</span>\n<span class=\"pl-s\">`</span>\n<span class=\"pl-c\">// 第一次执行Apply为创建，返回每一条资源的执行结果 </span>\n<span class=\"pl-s1\">results</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Applier</span>().<span class=\"pl-c1\">Apply</span>(<span class=\"pl-s1\">yaml</span>)\n<span class=\"pl-c\">// 第二次执行Apply为更新，返回每一条资源的执行结果</span>\n<span class=\"pl-s1\">results</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Applier</span>().<span class=\"pl-c1\">Apply</span>(<span class=\"pl-s1\">yaml</span>)\n<span class=\"pl-c\">// 删除，返回每一条资源的执行结果</span>\n<span class=\"pl-s1\">results</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Applier</span>().<span class=\"pl-c1\">Delete</span>(<span class=\"pl-s1\">yaml</span>)</pre></div>\n<h3 dir=\"auto\">4. Pod 操作</h3>\n<h4 dir=\"auto\">获取日志</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 获取Pod日志\nvar stream io.ReadCloser\nerr := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;random-char-pod&quot;).Ctl().Pod().ContainerName(&quot;container&quot;).GetLogs(&amp;stream, &amp;corev1.PodLogOptions{}).Error\nreader := bufio.NewReader(stream)\nline, _ := reader.ReadString('\\n')\nfmt.Println(line)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 获取Pod日志</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">stream</span> io.<span class=\"pl-smi\">ReadCloser</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"random-char-pod\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"container\"</span>).<span class=\"pl-c1\">GetLogs</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">stream</span>, <span class=\"pl-c1\">&amp;</span>corev1.<span class=\"pl-smi\">PodLogOptions</span>{}).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-s1\">reader</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">bufio</span>.<span class=\"pl-c1\">NewReader</span>(<span class=\"pl-s1\">stream</span>)\n<span class=\"pl-s1\">line</span>, <span class=\"pl-s1\">_</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">reader</span>.<span class=\"pl-c1\">ReadString</span>(<span class=\"pl-s\">'\\n'</span>)\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Println</span>(<span class=\"pl-s1\">line</span>)</pre></div>\n<h4 dir=\"auto\">执行命令</h4>\n<p dir=\"auto\">在Pod内执行命令，需要指定容器名称，并且会触发Exec()类型的callbacks。</p>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 在Pod内执行ps -ef命令\nvar execResult string\nerr := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;random-char-pod&quot;).Ctl().Pod().ContainerName(&quot;container&quot;).Command(&quot;ps&quot;, &quot;-ef&quot;).ExecuteCommand(&amp;execResult).Error\nfmt.Printf(&quot;execResult: %s&quot;, execResult)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 在Pod内执行ps -ef命令</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">execResult</span> <span class=\"pl-smi\">string</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"random-char-pod\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"container\"</span>).<span class=\"pl-c1\">Command</span>(<span class=\"pl-s\">\"ps\"</span>, <span class=\"pl-s\">\"-ef\"</span>).<span class=\"pl-c1\">ExecuteCommand</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">execResult</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"execResult: %s\"</span>, <span class=\"pl-s1\">execResult</span>)</pre></div>\n<h4 dir=\"auto\">端口转发</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err := kom.DefaultCluster().Resource(&amp;v1.Pod{}).\n\t\tNamespace(&quot;default&quot;).\n\t\tName(&quot;nginx-deployment-f576985cc-7czqr&quot;).\n    Ctl().Pod().\n\t\tContainerName(&quot;nginx&quot;).\n\t\tPortForward(&quot;20088&quot;, &quot;80&quot;, stopCh).Error\n// 监听0.0.0.0上的20088端口，转发到Pod的80端口\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>v1.<span class=\"pl-smi\">Pod</span>{}).\n\t\t<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).\n\t\t<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx-deployment-f576985cc-7czqr\"</span>).\n    <span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().\n\t\t<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"nginx\"</span>).\n\t\t<span class=\"pl-c1\">PortForward</span>(<span class=\"pl-s\">\"20088\"</span>, <span class=\"pl-s\">\"80\"</span>, <span class=\"pl-s1\">stopCh</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-c\">// 监听0.0.0.0上的20088端口，转发到Pod的80端口</span></pre></div>\n<h4 dir=\"auto\">流式执行命令</h4>\n<p dir=\"auto\">在Pod内执行命令，并且会触发StreamExec()类型的callbacks。适合执行ping 等命令</p>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cb := func(data []byte) error {\n\t\tfmt.Printf(&quot;Data %s\\n&quot;, string(data))\n\t\treturn nil\n\t}\nerr := kom.DefaultCluster().Namespace(&quot;kube-system&quot;).Name(&quot;traefik-d7c9c5778-p9nf4&quot;).Ctl().Pod().ContainerName(&quot;traefik&quot;).Command(&quot;ping&quot;, &quot;127.0.0.1&quot;).StreamExecute(cb, cb).Error\n//输出：\n//Data PING 127.0.0.1 (127.0.0.1): 56 data bytes\n//Data 64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.023 ms\n//Data 64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.011 ms\n//Data 64 bytes from 127.0.0.1: seq=2 ttl=42 time=0.012 ms\n//Data 64 bytes from 127.0.0.1: seq=3 ttl=42 time=0.016 ms\"><pre class=\"notranslate\"><span class=\"pl-s1\">cb</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">func</span>(<span class=\"pl-s1\">data</span> []<span class=\"pl-smi\">byte</span>) <span class=\"pl-smi\">error</span> {\n\t\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Data %s<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">string</span>(<span class=\"pl-s1\">data</span>))\n\t\t<span class=\"pl-k\">return</span> <span class=\"pl-c1\">nil</span>\n\t}\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"kube-system\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"traefik-d7c9c5778-p9nf4\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"traefik\"</span>).<span class=\"pl-c1\">Command</span>(<span class=\"pl-s\">\"ping\"</span>, <span class=\"pl-s\">\"127.0.0.1\"</span>).<span class=\"pl-c1\">StreamExecute</span>(<span class=\"pl-s1\">cb</span>, <span class=\"pl-s1\">cb</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-c\">//输出：</span>\n<span class=\"pl-c\">//Data PING 127.0.0.1 (127.0.0.1): 56 data bytes</span>\n<span class=\"pl-c\">//Data 64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.023 ms</span>\n<span class=\"pl-c\">//Data 64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.011 ms</span>\n<span class=\"pl-c\">//Data 64 bytes from 127.0.0.1: seq=2 ttl=42 time=0.012 ms</span>\n<span class=\"pl-c\">//Data 64 bytes from 127.0.0.1: seq=3 ttl=42 time=0.016 ms</span></pre></div>\n<h4 dir=\"auto\">文件列表</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 获取Pod内/etc文件夹列表\nkom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().ContainerName(&quot;nginx&quot;).ListFiles(&quot;/etc&quot;)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 获取Pod内/etc文件夹列表</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">ListFiles</span>(<span class=\"pl-s\">\"/etc\"</span>)</pre></div>\n<h4 dir=\"auto\">所有文件列表，包括隐藏文件</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 获取Pod内/etc文件夹列表\nkom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().ContainerName(&quot;nginx&quot;).ListAllFiles(&quot;/etc&quot;)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 获取Pod内/etc文件夹列表</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">ListAllFiles</span>(<span class=\"pl-s\">\"/etc\"</span>)</pre></div>\n<h4 dir=\"auto\">文件下载</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 下载Pod内/etc/hosts文件\nkom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().ContainerName(&quot;nginx&quot;).DownloadFile(&quot;/etc/hosts&quot;)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 下载Pod内/etc/hosts文件</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">DownloadFile</span>(<span class=\"pl-s\">\"/etc/hosts\"</span>)</pre></div>\n<h4 dir=\"auto\">文件下载(Tar压缩)</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 下载Pod内/etc/hosts文件，以tar方式进行打包后，获取，下载\nkom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().ContainerName(&quot;nginx&quot;).DownloadTarFile(&quot;/etc/hosts&quot;)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 下载Pod内/etc/hosts文件，以tar方式进行打包后，获取，下载</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">DownloadTarFile</span>(<span class=\"pl-s\">\"/etc/hosts\"</span>)</pre></div>\n<h4 dir=\"auto\">文件上传</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 上传文件内容到Pod内/etc/demo.txt文件\nkom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().ContainerName(&quot;nginx&quot;).SaveFile(&quot;/etc/demo.txt&quot;, &quot;txt-context&quot;)\n// os.File 类型文件直接上传到Pod内/etc/目录下\nfile, _ := os.Open(tempFilePath)\nkom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().ContainerName(&quot;nginx&quot;).UploadFile(&quot;/etc/&quot;, file)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 上传文件内容到Pod内/etc/demo.txt文件</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">SaveFile</span>(<span class=\"pl-s\">\"/etc/demo.txt\"</span>, <span class=\"pl-s\">\"txt-context\"</span>)\n<span class=\"pl-c\">// os.File 类型文件直接上传到Pod内/etc/目录下</span>\n<span class=\"pl-s1\">file</span>, <span class=\"pl-s1\">_</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">os</span>.<span class=\"pl-c1\">Open</span>(<span class=\"pl-s1\">tempFilePath</span>)\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">UploadFile</span>(<span class=\"pl-s\">\"/etc/\"</span>, <span class=\"pl-s1\">file</span>)</pre></div>\n<h4 dir=\"auto\">文件删除</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 删除Pod内/etc/xyz文件\nkom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().ContainerName(&quot;nginx&quot;).DeleteFile(&quot;/etc/xyz&quot;)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 删除Pod内/etc/xyz文件</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ContainerName</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">DeleteFile</span>(<span class=\"pl-s\">\"/etc/xyz\"</span>)</pre></div>\n<h4 dir=\"auto\">获取关联资源-Service</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 获取Pod关联的Service\nsvcs, err := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().LinkedService()\nfor _, svc := range svcs {\n\tfmt.Printf(&quot;service name %v\\n&quot;, svc.Name)\n}\"><pre class=\"notranslate\"><span class=\"pl-c\">// 获取Pod关联的Service</span>\n<span class=\"pl-s1\">svcs</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">LinkedService</span>()\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">svc</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">svcs</span> {\n\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"service name %v<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">svc</span>.<span class=\"pl-c1\">Name</span>)\n}</pre></div>\n<h4 dir=\"auto\">获取关联资源-Ingress</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 获取Pod关联的Ingress\ningresses, err := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().LinkedIngress()\nfor _, ingress := range ingresses {\n\tfmt.Printf(&quot;ingress name %v\\n&quot;, ingress.Name)\n}\"><pre class=\"notranslate\"><span class=\"pl-c\">// 获取Pod关联的Ingress</span>\n<span class=\"pl-s1\">ingresses</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">LinkedIngress</span>()\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">ingress</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">ingresses</span> {\n\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"ingress name %v<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">ingress</span>.<span class=\"pl-c1\">Name</span>)\n}</pre></div>\n<h4 dir=\"auto\">获取关联资源-PVC</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 获取Pod关联的PVC\npvcs, err := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().LinkedPVC()\nfor _, pvc := range pvcs {\n\tfmt.Printf(&quot;pvc name %v\\n&quot;, pvc.Name)\n}\"><pre class=\"notranslate\"><span class=\"pl-c\">// 获取Pod关联的PVC</span>\n<span class=\"pl-s1\">pvcs</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">LinkedPVC</span>()\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">pvc</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">pvcs</span> {\n\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"pvc name %v<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">pvc</span>.<span class=\"pl-c1\">Name</span>)\n}</pre></div>\n<h4 dir=\"auto\">获取关联资源-PV</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 获取Pod关联的PVC\npvs, err := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().LinkedPV()\nfor _, pv := range pvs {\n\tfmt.Printf(&quot;pv name %v\\n&quot;, pv.Name)\n}\"><pre class=\"notranslate\"><span class=\"pl-c\">// 获取Pod关联的PVC</span>\n<span class=\"pl-s1\">pvs</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">LinkedPV</span>()\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">pv</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">pvs</span> {\n\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"pv name %v<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">pv</span>.<span class=\"pl-c1\">Name</span>)\n}</pre></div>\n<h4 dir=\"auto\">获取关联资源-Endpoints</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 获取Pod关联的Endpoints\nendpoints, err := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().LinkedEndpoints()\nfor _, endpoint := range endpoints {\n\tfmt.Printf(&quot;endpoint name %v\\n&quot;, endpoint.Name)\n}\"><pre class=\"notranslate\"><span class=\"pl-c\">// 获取Pod关联的Endpoints</span>\n<span class=\"pl-s1\">endpoints</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">LinkedEndpoints</span>()\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">endpoint</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">endpoints</span> {\n\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"endpoint name %v<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">endpoint</span>.<span class=\"pl-c1\">Name</span>)\n}</pre></div>\n<h4 dir=\"auto\">获取关联资源-运行时Env</h4>\n<p dir=\"auto\">从Pod内执行env命令获得ENV配置信息</p>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"envs, err := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().LinkedEnv()\nfor _, env := range envs {\n\t\tfmt.Printf(&quot;env %s %s=%s\\n&quot;, env.ContainerName, env.EnvName, env.EnvValue)\n\t}\"><pre class=\"notranslate\"><span class=\"pl-s1\">envs</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">LinkedEnv</span>()\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">env</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">envs</span> {\n\t\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"env %s %s=%s<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">env</span>.<span class=\"pl-c1\">ContainerName</span>, <span class=\"pl-s1\">env</span>.<span class=\"pl-c1\">EnvName</span>, <span class=\"pl-s1\">env</span>.<span class=\"pl-c1\">EnvValue</span>)\n\t}</pre></div>\n<h4 dir=\"auto\">获取关联资源-定义Env</h4>\n<p dir=\"auto\">从pod定义上提取ENV配置信息</p>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"envs, err := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().LinkedEnvFromPod()\nfor _, env := range envs {\n\t\tfmt.Printf(&quot;env %s %s=%s\\n&quot;, env.ContainerName, env.EnvName, env.EnvValue)\n\t}\"><pre class=\"notranslate\"><span class=\"pl-s1\">envs</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">LinkedEnvFromPod</span>()\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">env</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">envs</span> {\n\t\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"env %s %s=%s<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">env</span>.<span class=\"pl-c1\">ContainerName</span>, <span class=\"pl-s1\">env</span>.<span class=\"pl-c1\">EnvName</span>, <span class=\"pl-s1\">env</span>.<span class=\"pl-c1\">EnvValue</span>)\n\t}</pre></div>\n<h4 dir=\"auto\">获取关联资源-节点</h4>\n<p dir=\"auto\">根据Pod 定义中声明的NodeSelector、NodeAffinity、污点容忍度、NodeName等配置信息，返回可用节点列表。暂未考虑Pod亲和性、CPU内存等运行时调度因素。</p>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nodes, err := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Pod().LinkedNode()\nfor _, node := range nodes {\n    fmt.Printf(&quot;reason:%s\\t node name %s\\n&quot;, node.Reason, node.Name)\n}\"><pre class=\"notranslate\"><span class=\"pl-s1\">nodes</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">LinkedNode</span>()\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">node</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">nodes</span> {\n    <span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"reason:%s<span class=\"pl-cce\">\\t</span> node name %s<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">node</span>.<span class=\"pl-c1\">Reason</span>, <span class=\"pl-s1\">node</span>.<span class=\"pl-c1\">Name</span>)\n}</pre></div>\n<h3 dir=\"auto\">5. 自定义资源定义（CRD）增删改查及Watch操作</h3>\n<p dir=\"auto\">在没有CR定义的情况下，如何进行增删改查操作。操作方式同k8s内置资源。<br>\n将对象定义为unstructured.Unstructured，并且需要指定Group、Version、Kind。<br>\n因此可以通过kom.DefaultCluster().GVK(group, version, kind)来替代kom.DefaultCluster().Resource(interface{})<br>\n为方便记忆及使用，kom提供了kom.DefaultCluster().CRD(group, version, kind)来简化操作。<br>\n下面给出操作CRD的示例：<br>\n首先定义一个通用的处理对象，用来接收CRD的返回结果。</p>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var item unstructured.Unstructured\"><pre class=\"notranslate\"><span class=\"pl-k\">var</span> <span class=\"pl-s1\">item</span> unstructured.<span class=\"pl-smi\">Unstructured</span></pre></div>\n<h4 dir=\"auto\">创建CRD</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"yaml := `apiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: crontabs.stable.example.com\nspec:\n  group: stable.example.com\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            spec:\n              type: object\n              properties:\n                cronSpec:\n                  type: string\n                image:\n                  type: string\n                replicas:\n                  type: integer\n  scope: Namespaced\n  names:\n    plural: crontabs\n    singular: crontab\n    kind: CronTab\n    shortNames:\n    - ct`\nresult := kom.DefaultCluster().Applier().Apply(yaml)\"><pre class=\"notranslate\"><span class=\"pl-s1\">yaml</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">`apiVersion: apiextensions.k8s.io/v1</span>\n<span class=\"pl-s\">kind: CustomResourceDefinition</span>\n<span class=\"pl-s\">metadata:</span>\n<span class=\"pl-s\">  name: crontabs.stable.example.com</span>\n<span class=\"pl-s\">spec:</span>\n<span class=\"pl-s\">  group: stable.example.com</span>\n<span class=\"pl-s\">  versions:</span>\n<span class=\"pl-s\">    - name: v1</span>\n<span class=\"pl-s\">      served: true</span>\n<span class=\"pl-s\">      storage: true</span>\n<span class=\"pl-s\">      schema:</span>\n<span class=\"pl-s\">        openAPIV3Schema:</span>\n<span class=\"pl-s\">          type: object</span>\n<span class=\"pl-s\">          properties:</span>\n<span class=\"pl-s\">            spec:</span>\n<span class=\"pl-s\">              type: object</span>\n<span class=\"pl-s\">              properties:</span>\n<span class=\"pl-s\">                cronSpec:</span>\n<span class=\"pl-s\">                  type: string</span>\n<span class=\"pl-s\">                image:</span>\n<span class=\"pl-s\">                  type: string</span>\n<span class=\"pl-s\">                replicas:</span>\n<span class=\"pl-s\">                  type: integer</span>\n<span class=\"pl-s\">  scope: Namespaced</span>\n<span class=\"pl-s\">  names:</span>\n<span class=\"pl-s\">    plural: crontabs</span>\n<span class=\"pl-s\">    singular: crontab</span>\n<span class=\"pl-s\">    kind: CronTab</span>\n<span class=\"pl-s\">    shortNames:</span>\n<span class=\"pl-s\">    - ct`</span>\n<span class=\"pl-s1\">result</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Applier</span>().<span class=\"pl-c1\">Apply</span>(<span class=\"pl-s1\">yaml</span>)</pre></div>\n<h4 dir=\"auto\">创建CRD的CR对象</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"item = unstructured.Unstructured{\n\t\tObject: map[string]interface{}{\n\t\t\t&quot;apiVersion&quot;: &quot;stable.example.com/v1&quot;,\n\t\t\t&quot;kind&quot;:       &quot;CronTab&quot;,\n\t\t\t&quot;metadata&quot;: map[string]interface{}{\n\t\t\t\t&quot;name&quot;:      &quot;test-crontab&quot;,\n\t\t\t\t&quot;namespace&quot;: &quot;default&quot;,\n\t\t\t},\n\t\t\t&quot;spec&quot;: map[string]interface{}{\n\t\t\t\t&quot;cronSpec&quot;: &quot;* * * * */8&quot;,\n\t\t\t\t&quot;image&quot;:    &quot;test-crontab-image&quot;,\n\t\t\t},\n\t\t},\n\t}\nerr := kom.DefaultCluster().CRD(&quot;stable.example.com&quot;, &quot;v1&quot;, &quot;CronTab&quot;).Namespace(item.GetNamespace()).Name(item.GetName()).Create(&amp;item).Error\"><pre class=\"notranslate\"><span class=\"pl-s1\">item</span> <span class=\"pl-c1\">=</span> unstructured.<span class=\"pl-smi\">Unstructured</span>{\n\t\t<span class=\"pl-s1\">Object</span>: <span class=\"pl-k\">map</span>[<span class=\"pl-smi\">string</span>]<span class=\"pl-k\">interface</span>{}{\n\t\t\t<span class=\"pl-s\">\"apiVersion\"</span>: <span class=\"pl-s\">\"stable.example.com/v1\"</span>,\n\t\t\t<span class=\"pl-s\">\"kind\"</span>:       <span class=\"pl-s\">\"CronTab\"</span>,\n\t\t\t<span class=\"pl-s\">\"metadata\"</span>: <span class=\"pl-k\">map</span>[<span class=\"pl-smi\">string</span>]<span class=\"pl-k\">interface</span>{}{\n\t\t\t\t<span class=\"pl-s\">\"name\"</span>:      <span class=\"pl-s\">\"test-crontab\"</span>,\n\t\t\t\t<span class=\"pl-s\">\"namespace\"</span>: <span class=\"pl-s\">\"default\"</span>,\n\t\t\t},\n\t\t\t<span class=\"pl-s\">\"spec\"</span>: <span class=\"pl-k\">map</span>[<span class=\"pl-smi\">string</span>]<span class=\"pl-k\">interface</span>{}{\n\t\t\t\t<span class=\"pl-s\">\"cronSpec\"</span>: <span class=\"pl-s\">\"* * * * */8\"</span>,\n\t\t\t\t<span class=\"pl-s\">\"image\"</span>:    <span class=\"pl-s\">\"test-crontab-image\"</span>,\n\t\t\t},\n\t\t},\n\t}\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">CRD</span>(<span class=\"pl-s\">\"stable.example.com\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"CronTab\"</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetNamespace</span>()).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetName</span>()).<span class=\"pl-c1\">Create</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">Get获取单个CR对象</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err := kom.DefaultCluster().CRD(&quot;stable.example.com&quot;, &quot;v1&quot;, &quot;CronTab&quot;).Name(item.GetName()).Namespace(item.GetNamespace()).Get(&amp;item).Error\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">CRD</span>(<span class=\"pl-s\">\"stable.example.com\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"CronTab\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetName</span>()).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetNamespace</span>()).<span class=\"pl-c1\">Get</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">List获取CR对象的列表</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var crontabList []unstructured.Unstructured\n// 查询default命名空间下的CronTab\nerr := kom.DefaultCluster().CRD(&quot;stable.example.com&quot;, &quot;v1&quot;, &quot;CronTab&quot;).Namespace(crontab.GetNamespace()).List(&amp;crontabList).Error\n// 查询所有命名空间下的CronTab\nerr := kom.DefaultCluster().CRD(&quot;stable.example.com&quot;, &quot;v1&quot;, &quot;CronTab&quot;).AllNamespace().List(&amp;crontabList).Error\nerr := kom.DefaultCluster().CRD(&quot;stable.example.com&quot;, &quot;v1&quot;, &quot;CronTab&quot;).Namespace(&quot;*&quot;).List(&amp;crontabList).Error\"><pre class=\"notranslate\"><span class=\"pl-k\">var</span> <span class=\"pl-s1\">crontabList</span> []unstructured.<span class=\"pl-smi\">Unstructured</span>\n<span class=\"pl-c\">// 查询default命名空间下的CronTab</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">CRD</span>(<span class=\"pl-s\">\"stable.example.com\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"CronTab\"</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s1\">crontab</span>.<span class=\"pl-c1\">GetNamespace</span>()).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">crontabList</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-c\">// 查询所有命名空间下的CronTab</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">CRD</span>(<span class=\"pl-s\">\"stable.example.com\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"CronTab\"</span>).<span class=\"pl-c1\">AllNamespace</span>().<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">crontabList</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">CRD</span>(<span class=\"pl-s\">\"stable.example.com\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"CronTab\"</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"*\"</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">crontabList</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">更新CR对象</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"patchData := `{\n    &quot;spec&quot;: {\n        &quot;image&quot;: &quot;patch-image&quot;\n    },\n    &quot;metadata&quot;: {\n        &quot;labels&quot;: {\n            &quot;new-label&quot;: &quot;new-value&quot;\n        }\n    }\n}`\nerr := kom.DefaultCluster().CRD(&quot;stable.example.com&quot;, &quot;v1&quot;, &quot;CronTab&quot;).Name(crontab.GetName()).Namespace(crontab.GetNamespace()).Patch(&amp;crontab, types.StrategicMergePatchType, patchData).Error\"><pre class=\"notranslate\"><span class=\"pl-s1\">patchData</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">`{</span>\n<span class=\"pl-s\">    \"spec\": {</span>\n<span class=\"pl-s\">        \"image\": \"patch-image\"</span>\n<span class=\"pl-s\">    },</span>\n<span class=\"pl-s\">    \"metadata\": {</span>\n<span class=\"pl-s\">        \"labels\": {</span>\n<span class=\"pl-s\">            \"new-label\": \"new-value\"</span>\n<span class=\"pl-s\">        }</span>\n<span class=\"pl-s\">    }</span>\n<span class=\"pl-s\">}`</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">CRD</span>(<span class=\"pl-s\">\"stable.example.com\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"CronTab\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">crontab</span>.<span class=\"pl-c1\">GetName</span>()).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s1\">crontab</span>.<span class=\"pl-c1\">GetNamespace</span>()).<span class=\"pl-c1\">Patch</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">crontab</span>, <span class=\"pl-s1\">types</span>.<span class=\"pl-c1\">StrategicMergePatchType</span>, <span class=\"pl-s1\">patchData</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">删除CR对象</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err := kom.DefaultCluster().CRD(&quot;stable.example.com&quot;, &quot;v1&quot;, &quot;CronTab&quot;).Name(crontab.GetName()).Namespace(crontab.GetNamespace()).Delete().Error\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">CRD</span>(<span class=\"pl-s\">\"stable.example.com\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"CronTab\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">crontab</span>.<span class=\"pl-c1\">GetName</span>()).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s1\">crontab</span>.<span class=\"pl-c1\">GetNamespace</span>()).<span class=\"pl-c1\">Delete</span>().<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">强制删除CR对象</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err := kom.DefaultCluster().CRD(&quot;stable.example.com&quot;, &quot;v1&quot;, &quot;CronTab&quot;).Name(crontab.GetName()).Namespace(crontab.GetNamespace()).ForceDelete().Error\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">CRD</span>(<span class=\"pl-s\">\"stable.example.com\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"CronTab\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">crontab</span>.<span class=\"pl-c1\">GetName</span>()).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s1\">crontab</span>.<span class=\"pl-c1\">GetNamespace</span>()).<span class=\"pl-c1\">ForceDelete</span>().<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">Watch CR对象</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var watcher watch.Interface\n\nerr := kom.DefaultCluster().CRD(&quot;stable.example.com&quot;, &quot;v1&quot;, &quot;CronTab&quot;).Namespace(&quot;default&quot;).Watch(&amp;watcher).Error\nif err != nil {\n    fmt.Printf(&quot;Create Watcher Error %v&quot;, err)\n}\ngo func() {\n    defer watcher.Stop()\n    \n    for event := range watcher.ResultChan() {\n    var item *unstructured.Unstructured\n    \n    item, err := kom.DefaultCluster().Tools().ConvertRuntimeObjectToUnstructuredObject(event.Object)\n    if err != nil {\n        fmt.Printf(&quot;无法将对象转换为 Unstructured 类型: %v&quot;, err)\n        return\n    }\n    // 处理事件\n    switch event.Type {\n        case watch.Added:\n            fmt.Printf(&quot;Added Unstructured [ %s/%s ]\\n&quot;, item.GetNamespace(), item.GetName())\n        case watch.Modified:\n            fmt.Printf(&quot;Modified Unstructured [ %s/%s ]\\n&quot;, item.GetNamespace(), item.GetName())\n        case watch.Deleted:\n            fmt.Printf(&quot;Deleted Unstructured [ %s/%s ]\\n&quot;, item.GetNamespace(), item.GetName())\n        }\n    }\n}()\"><pre class=\"notranslate\"><span class=\"pl-k\">var</span> <span class=\"pl-s1\">watcher</span> watch.<span class=\"pl-smi\">Interface</span>\n\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">CRD</span>(<span class=\"pl-s\">\"stable.example.com\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"CronTab\"</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Watch</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">watcher</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-k\">if</span> <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">!=</span> <span class=\"pl-c1\">nil</span> {\n    <span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Create Watcher Error %v\"</span>, <span class=\"pl-s1\">err</span>)\n}\n<span class=\"pl-k\">go</span> <span class=\"pl-k\">func</span>() {\n    <span class=\"pl-k\">defer</span> <span class=\"pl-s1\">watcher</span>.<span class=\"pl-c1\">Stop</span>()\n    \n    <span class=\"pl-k\">for</span> <span class=\"pl-s1\">event</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">watcher</span>.<span class=\"pl-c1\">ResultChan</span>() {\n    <span class=\"pl-k\">var</span> <span class=\"pl-s1\">item</span> <span class=\"pl-c1\">*</span>unstructured.<span class=\"pl-smi\">Unstructured</span>\n    \n    <span class=\"pl-s1\">item</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Tools</span>().<span class=\"pl-c1\">ConvertRuntimeObjectToUnstructuredObject</span>(<span class=\"pl-s1\">event</span>.<span class=\"pl-c1\">Object</span>)\n    <span class=\"pl-k\">if</span> <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">!=</span> <span class=\"pl-c1\">nil</span> {\n        <span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"无法将对象转换为 Unstructured 类型: %v\"</span>, <span class=\"pl-s1\">err</span>)\n        <span class=\"pl-k\">return</span>\n    }\n    <span class=\"pl-c\">// 处理事件</span>\n    <span class=\"pl-k\">switch</span> <span class=\"pl-s1\">event</span>.<span class=\"pl-c1\">Type</span> {\n        <span class=\"pl-k\">case</span> <span class=\"pl-s1\">watch</span>.<span class=\"pl-c1\">Added</span>:\n            <span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Added Unstructured [ %s/%s ]<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetNamespace</span>(), <span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetName</span>())\n        <span class=\"pl-k\">case</span> <span class=\"pl-s1\">watch</span>.<span class=\"pl-c1\">Modified</span>:\n            <span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Modified Unstructured [ %s/%s ]<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetNamespace</span>(), <span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetName</span>())\n        <span class=\"pl-k\">case</span> <span class=\"pl-s1\">watch</span>.<span class=\"pl-c1\">Deleted</span>:\n            <span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Deleted Unstructured [ %s/%s ]<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetNamespace</span>(), <span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetName</span>())\n        }\n    }\n}()</pre></div>\n<h4 dir=\"auto\">Describe查询某个CRD资源</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Describe default 命名空间下名为 nginx 的 Deployment\nvar describeResult []byte\nerr := kom.DefaultCluster()..CRD(&quot;stable.example.com&quot;, &quot;v1&quot;, &quot;CronTab&quot;).Namespace(&quot;default&quot;).Name(item.GetName()).Describe(&amp;item).Error\nfmt.Printf(&quot;describeResult: %s&quot;, describeResult)\"><pre class=\"notranslate\"><span class=\"pl-c\">// Describe default 命名空间下名为 nginx 的 Deployment</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">describeResult</span> []<span class=\"pl-smi\">byte</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>()..<span class=\"pl-c1\">CRD</span>(<span class=\"pl-s\">\"stable.example.com\"</span>, <span class=\"pl-s\">\"v1\"</span>, <span class=\"pl-s\">\"CronTab\"</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">GetName</span>()).<span class=\"pl-c1\">Describe</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">item</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"describeResult: %s\"</span>, <span class=\"pl-s1\">describeResult</span>)</pre></div>\n<h3 dir=\"auto\">6. 集群参数信息</h3>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 集群文档\nkom.DefaultCluster().Status().Docs()\n// 集群资源信息\nkom.DefaultCluster().Status().APIResources()\n// 集群已注册CRD列表\nkom.DefaultCluster().Status().CRDList()\n// 集群版本信息\nkom.DefaultCluster().Status().ServerVersion()\"><pre class=\"notranslate\"><span class=\"pl-c\">// 集群文档</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Status</span>().<span class=\"pl-c1\">Docs</span>()\n<span class=\"pl-c\">// 集群资源信息</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Status</span>().<span class=\"pl-c1\">APIResources</span>()\n<span class=\"pl-c\">// 集群已注册CRD列表</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Status</span>().<span class=\"pl-c1\">CRDList</span>()\n<span class=\"pl-c\">// 集群版本信息</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Status</span>().<span class=\"pl-c1\">ServerVersion</span>()</pre></div>\n<h3 dir=\"auto\">7. callback机制</h3>\n<ul dir=\"auto\">\n<li>内置了callback机制，可以自定义回调函数，当执行完某项操作后，会调用对应的回调函数。</li>\n<li>如果回调函数返回true，则继续执行后续操作，否则终止后续操作。</li>\n<li>当前支持的callback有：get,list,create,update,patch,delete,exec,stream-exec,logs,watch.</li>\n<li>内置的callback名称有：\"kom:get\",\"kom:list\",\"kom:create\",\"kom:update\",\"kom:patch\",\"kom:watch\",\"kom:delete\",\"kom:pod:exec\",\"kom:pod:stream:exec\",\"kom:pod:logs\",\"kom:pod:port:forward\"</li>\n<li>支持回调函数排序，默认按注册顺序执行，可以通过kom.DefaultCluster().Callback().After(\"kom:get\")或者.Before(\"kom:get\")设置顺序。</li>\n<li>支持删除回调函数，通过kom.DefaultCluster().Callback().Delete(\"kom:get\")</li>\n<li>支持替换回调函数，通过kom.DefaultCluster().Callback().Replace(\"kom:get\",cb)</li>\n</ul>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 为Get获取资源注册回调函数\nkom.DefaultCluster().Callback().Get().Register(&quot;get&quot;, cb)\n// 为List获取资源注册回调函数\nkom.DefaultCluster().Callback().List().Register(&quot;list&quot;, cb)\n// 为Create创建资源注册回调函数\nkom.DefaultCluster().Callback().Create().Register(&quot;create&quot;, cb)\n// 为Update更新资源注册回调函数\nkom.DefaultCluster().Callback().Update().Register(&quot;update&quot;, cb)\n// 为Patch更新资源注册回调函数\nkom.DefaultCluster().Callback().Patch().Register(&quot;patch&quot;, cb)\n// 为Delete删除资源注册回调函数\nkom.DefaultCluster().Callback().Delete().Register(&quot;delete&quot;, cb)\n// 为Watch资源注册回调函数\nkom.DefaultCluster().Callback().Watch().Register(&quot;watch&quot;,cb)\n// 为Exec Pod内执行命令注册回调函数\nkom.DefaultCluster().Callback().Exec().Register(&quot;exec&quot;, cb)\n// 为Logs获取日志注册回调函数\nkom.DefaultCluster().Callback().Logs().Register(&quot;logs&quot;, cb)\n// 删除回调函数\nkom.DefaultCluster().Callback().Get().Delete(&quot;get&quot;)\n// 替换回调函数\nkom.DefaultCluster().Callback().Get().Replace(&quot;get&quot;, cb)\n// 指定回调函数执行顺序，在内置的回调函数执行完之后再执行\nkom.DefaultCluster().Callback().After(&quot;kom:get&quot;).Register(&quot;get&quot;, cb)\n// 指定回调函数执行顺序，在内置的回调函数执行之前先执行\n// 案例1.在Create创建资源前，进行权限检查，没有权限则返回error，后续创建动作将不再执行\n// 案例2.在List获取资源列表后，进行特定的资源筛选，从列表(Statement.Dest)中删除不符合要求的资源，然后返回给用户\nkom.DefaultCluster().Callback().Before(&quot;kom:create&quot;).Register(&quot;create&quot;, cb)\n\n// 自定义回调函数\nfunc cb(k *kom.Kubectl) error {\n    stmt := k.Statement\n    gvr := stmt.GVR\n    ns := stmt.Namespace\n    name := stmt.Name\n    // 打印信息\n    fmt.Printf(&quot;Get %s/%s(%s)\\n&quot;, ns, name, gvr)\n    fmt.Printf(&quot;Command %s/%s(%s %s)\\n&quot;, ns, name, stmt.Command, stmt.Args)\n    return nil\n\t// return fmt.Errorf(&quot;error&quot;) 返回error将阻止后续cb的执行\n}\"><pre class=\"notranslate\"><span class=\"pl-c\">// 为Get获取资源注册回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Get</span>().<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"get\"</span>, <span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 为List获取资源注册回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">List</span>().<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"list\"</span>, <span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 为Create创建资源注册回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Create</span>().<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"create\"</span>, <span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 为Update更新资源注册回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Update</span>().<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"update\"</span>, <span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 为Patch更新资源注册回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Patch</span>().<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"patch\"</span>, <span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 为Delete删除资源注册回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Delete</span>().<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"delete\"</span>, <span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 为Watch资源注册回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Watch</span>().<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"watch\"</span>,<span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 为Exec Pod内执行命令注册回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Exec</span>().<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"exec\"</span>, <span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 为Logs获取日志注册回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Logs</span>().<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"logs\"</span>, <span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 删除回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Get</span>().<span class=\"pl-c1\">Delete</span>(<span class=\"pl-s\">\"get\"</span>)\n<span class=\"pl-c\">// 替换回调函数</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Get</span>().<span class=\"pl-c1\">Replace</span>(<span class=\"pl-s\">\"get\"</span>, <span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 指定回调函数执行顺序，在内置的回调函数执行完之后再执行</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">After</span>(<span class=\"pl-s\">\"kom:get\"</span>).<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"get\"</span>, <span class=\"pl-s1\">cb</span>)\n<span class=\"pl-c\">// 指定回调函数执行顺序，在内置的回调函数执行之前先执行</span>\n<span class=\"pl-c\">// 案例1.在Create创建资源前，进行权限检查，没有权限则返回error，后续创建动作将不再执行</span>\n<span class=\"pl-c\">// 案例2.在List获取资源列表后，进行特定的资源筛选，从列表(Statement.Dest)中删除不符合要求的资源，然后返回给用户</span>\n<span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Callback</span>().<span class=\"pl-c1\">Before</span>(<span class=\"pl-s\">\"kom:create\"</span>).<span class=\"pl-c1\">Register</span>(<span class=\"pl-s\">\"create\"</span>, <span class=\"pl-s1\">cb</span>)\n\n<span class=\"pl-c\">// 自定义回调函数</span>\n<span class=\"pl-k\">func</span> <span class=\"pl-s1\">cb</span>(<span class=\"pl-s1\">k</span> <span class=\"pl-c1\">*</span>kom.<span class=\"pl-smi\">Kubectl</span>) <span class=\"pl-smi\">error</span> {\n    <span class=\"pl-s1\">stmt</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">k</span>.<span class=\"pl-c1\">Statement</span>\n    <span class=\"pl-s1\">gvr</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">stmt</span>.<span class=\"pl-c1\">GVR</span>\n    <span class=\"pl-s1\">ns</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">stmt</span>.<span class=\"pl-c1\">Namespace</span>\n    <span class=\"pl-s1\">name</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">stmt</span>.<span class=\"pl-c1\">Name</span>\n    <span class=\"pl-c\">// 打印信息</span>\n    <span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Get %s/%s(%s)<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">ns</span>, <span class=\"pl-s1\">name</span>, <span class=\"pl-s1\">gvr</span>)\n    <span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Command %s/%s(%s %s)<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">ns</span>, <span class=\"pl-s1\">name</span>, <span class=\"pl-s1\">stmt</span>.<span class=\"pl-c1\">Command</span>, <span class=\"pl-s1\">stmt</span>.<span class=\"pl-c1\">Args</span>)\n    <span class=\"pl-k\">return</span> <span class=\"pl-c1\">nil</span>\n\t<span class=\"pl-c\">// return fmt.Errorf(\"error\") 返回error将阻止后续cb的执行</span>\n}</pre></div>\n<h3 dir=\"auto\">8. SQL查询k8s资源</h3>\n<ul dir=\"auto\">\n<li>通过SQL()方法查询k8s资源，简单高效。</li>\n<li>Table 名称支持集群内注册的所有资源的全称及简写，包括CRD资源。只要是注册到集群上了，就可以查。</li>\n<li>典型的Table 名称有：pod,deployment,service,ingress,pvc,pv,node,namespace,secret,configmap,serviceaccount,role,rolebinding,clusterrole,clusterrolebinding,crd,cr,hpa,daemonset,statefulset,job,cronjob,limitrange,horizontalpodautoscaler,poddisruptionbudget,networkpolicy,endpoints,ingressclass,mutatingwebhookconfiguration,validatingwebhookconfiguration,customresourcedefinition,storageclass,persistentvolumeclaim,persistentvolume,horizontalpodautoscaler,podsecurity。统统都可以查。</li>\n<li>查询字段目前仅支持*。也就是select *</li>\n<li>查询条件目前支持 =，!=,&gt;=,&lt;=,&lt;&gt;,like,in,not in,and,or,between</li>\n<li>排序字段目前支持对单一字段进行排序。默认按创建时间倒序排列</li>\n<li></li>\n</ul>\n<h4 dir=\"auto\">查询k8s内置资源</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"    sql := &quot;select * from deploy where metadata.namespace='kube-system' or metadata.namespace='default' order by  metadata.creationTimestamp asc   &quot;\n\n\tvar list []v1.Deployment\n\terr := kom.DefaultCluster().Sql(sql).List(&amp;list).Error\n\tfor _, d := range list {\n\t\tfmt.Printf(&quot;List Items foreach %s,%s at %s \\n&quot;, d.GetNamespace(), d.GetName(), d.GetCreationTimestamp())\n\t}\"><pre class=\"notranslate\">    <span class=\"pl-s1\">sql</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">\"select * from deploy where metadata.namespace='kube-system' or metadata.namespace='default' order by  metadata.creationTimestamp asc   \"</span>\n\n\t<span class=\"pl-k\">var</span> <span class=\"pl-s1\">list</span> []v1.<span class=\"pl-smi\">Deployment</span>\n\t<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Sql</span>(<span class=\"pl-s1\">sql</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">list</span>).<span class=\"pl-c1\">Error</span>\n\t<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">d</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">list</span> {\n\t\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"List Items foreach %s,%s at %s <span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">d</span>.<span class=\"pl-c1\">GetNamespace</span>(), <span class=\"pl-s1\">d</span>.<span class=\"pl-c1\">GetName</span>(), <span class=\"pl-s1\">d</span>.<span class=\"pl-c1\">GetCreationTimestamp</span>())\n\t}</pre></div>\n<h4 dir=\"auto\">查询CRD资源</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"    // vm 为kubevirt 的CRD\n    sql := &quot;select * from vm where (metadata.namespace='kube-system' or metadata.namespace='default' )  &quot;\n\tvar list []unstructured.Unstructured\n\terr := kom.DefaultCluster().Sql(sql).List(&amp;list).Error\n\tfor _, d := range list {\n\t\tfmt.Printf(&quot;List Items foreach %s,%s\\n&quot;, d.GetNamespace(), d.GetName())\n\t}\"><pre class=\"notranslate\">    <span class=\"pl-c\">// vm 为kubevirt 的CRD</span>\n    <span class=\"pl-s1\">sql</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">\"select * from vm where (metadata.namespace='kube-system' or metadata.namespace='default' )  \"</span>\n\t<span class=\"pl-k\">var</span> <span class=\"pl-s1\">list</span> []unstructured.<span class=\"pl-smi\">Unstructured</span>\n\t<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Sql</span>(<span class=\"pl-s1\">sql</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">list</span>).<span class=\"pl-c1\">Error</span>\n\t<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">d</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">list</span> {\n\t\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"List Items foreach %s,%s<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">d</span>.<span class=\"pl-c1\">GetNamespace</span>(), <span class=\"pl-s1\">d</span>.<span class=\"pl-c1\">GetName</span>())\n\t}</pre></div>\n<h4 dir=\"auto\">链式调研查询SQL</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 查询pod 列表\nerr := kom.DefaultCluster().From(&quot;pod&quot;).\n\t\tWhere(&quot;metadata.namespace = ?  or metadata.namespace= ? &quot;, &quot;kube-system&quot;, &quot;default&quot;).\n\t\tOrder(&quot;metadata.creationTimestamp desc&quot;).\n\t\tList(&amp;list).Error\"><pre class=\"notranslate\"><span class=\"pl-c\">// 查询pod 列表</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">From</span>(<span class=\"pl-s\">\"pod\"</span>).\n\t\t<span class=\"pl-c1\">Where</span>(<span class=\"pl-s\">\"metadata.namespace = ?  or metadata.namespace= ? \"</span>, <span class=\"pl-s\">\"kube-system\"</span>, <span class=\"pl-s\">\"default\"</span>).\n\t\t<span class=\"pl-c1\">Order</span>(<span class=\"pl-s\">\"metadata.creationTimestamp desc\"</span>).\n\t\t<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">list</span>).<span class=\"pl-c1\">Error</span></pre></div>\n<h4 dir=\"auto\">k8s资源嵌套列表属性支持</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// spec.containers为列表，其下的ports也为列表，我们查询ports的name\nsql := &quot;select * from pod where spec.containers.ports.name like '%k8m%'  &quot;\nvar list []v1.Pod\nerr := kom.DefaultCluster().Sql(sql).List(&amp;list).Error\nfor _, d := range list {\n\tt.Logf(&quot;List Items foreach %s,%s\\n&quot;, d.GetNamespace(), d.GetName())\n}\"><pre class=\"notranslate\"><span class=\"pl-c\">// spec.containers为列表，其下的ports也为列表，我们查询ports的name</span>\n<span class=\"pl-s1\">sql</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">\"select * from pod where spec.containers.ports.name like '%k8m%'  \"</span>\n<span class=\"pl-k\">var</span> <span class=\"pl-s1\">list</span> []v1.<span class=\"pl-smi\">Pod</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Sql</span>(<span class=\"pl-s1\">sql</span>).<span class=\"pl-c1\">List</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-s1\">list</span>).<span class=\"pl-c1\">Error</span>\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">d</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">list</span> {\n\t<span class=\"pl-s1\">t</span>.<span class=\"pl-c1\">Logf</span>(<span class=\"pl-s\">\"List Items foreach %s,%s<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">d</span>.<span class=\"pl-c1\">GetNamespace</span>(), <span class=\"pl-s1\">d</span>.<span class=\"pl-c1\">GetName</span>())\n}</pre></div>\n<h3 dir=\"auto\">9. 其他操作</h3>\n<h4 dir=\"auto\">Deployment重启</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err = kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Rollout().Restart()\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Rollout</span>().<span class=\"pl-c1\">Restart</span>()</pre></div>\n<h4 dir=\"auto\">Deployment扩缩容</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 将名称为nginx的deployment的副本数设置为3\nerr = kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Scaler().Scale(3)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 将名称为nginx的deployment的副本数设置为3</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Scaler</span>().<span class=\"pl-c1\">Scale</span>(<span class=\"pl-c1\">3</span>)</pre></div>\n<h4 dir=\"auto\">Deployment 停止</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 将名称为nginx的deployment的副本数设置为0\n// 当前运行副本数量记录到注解中\nerr = kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Scaler().Stop()\"><pre class=\"notranslate\"><span class=\"pl-c\">// 将名称为nginx的deployment的副本数设置为0</span>\n<span class=\"pl-c\">// 当前运行副本数量记录到注解中</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Scaler</span>().<span class=\"pl-c1\">Stop</span>()</pre></div>\n<h4 dir=\"auto\">Deployment 恢复</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 将名称为nginx的deployment的副本数从注解中恢复，如果没有注解，默认恢复到1\nerr = kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Scaler().Restore()\"><pre class=\"notranslate\"><span class=\"pl-c\">// 将名称为nginx的deployment的副本数从注解中恢复，如果没有注解，默认恢复到1</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Scaler</span>().<span class=\"pl-c1\">Restore</span>()</pre></div>\n<h4 dir=\"auto\">Deployment更新Tag</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 将名称为nginx的deployment的中的容器镜像tag升级为alpine\nerr = kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Deployment().ReplaceImageTag(&quot;main&quot;,&quot;20241124&quot;)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 将名称为nginx的deployment的中的容器镜像tag升级为alpine</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Deployment</span>().<span class=\"pl-c1\">ReplaceImageTag</span>(<span class=\"pl-s\">\"main\"</span>,<span class=\"pl-s\">\"20241124\"</span>)</pre></div>\n<h4 dir=\"auto\">Deployment Rollout History</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 查询名称为nginx的deployment的升级历史\nresult, err := kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Rollout().History()\"><pre class=\"notranslate\"><span class=\"pl-c\">// 查询名称为nginx的deployment的升级历史</span>\n<span class=\"pl-s1\">result</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Rollout</span>().<span class=\"pl-c1\">History</span>()</pre></div>\n<h4 dir=\"auto\">Deployment Rollout Undo</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 将名称为nginx的deployment进行回滚\nresult, err := kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Rollout().Undo()\n// 将名称为nginx的deployment进行回滚到指定版本(history 查询)\nresult, err := kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Rollout().Undo(&quot;6&quot;)\"><pre class=\"notranslate\"><span class=\"pl-c\">// 将名称为nginx的deployment进行回滚</span>\n<span class=\"pl-s1\">result</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Rollout</span>().<span class=\"pl-c1\">Undo</span>()\n<span class=\"pl-c\">// 将名称为nginx的deployment进行回滚到指定版本(history 查询)</span>\n<span class=\"pl-s1\">result</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Rollout</span>().<span class=\"pl-c1\">Undo</span>(<span class=\"pl-s\">\"6\"</span>)</pre></div>\n<h4 dir=\"auto\">Deployment Rollout Pause</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 暂停升级过程\nerr := kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Rollout().Pause()\"><pre class=\"notranslate\"><span class=\"pl-c\">// 暂停升级过程</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Rollout</span>().<span class=\"pl-c1\">Pause</span>()</pre></div>\n<h4 dir=\"auto\">Deployment Rollout Resume</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 恢复升级过程\nerr := kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Rollout().Resume()\"><pre class=\"notranslate\"><span class=\"pl-c\">// 恢复升级过程</span>\n<span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Rollout</span>().<span class=\"pl-c1\">Resume</span>()</pre></div>\n<h4 dir=\"auto\">Deployment Rollout Status</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 将名称为nginx的deployment的中的容器镜像tag升级为alpine\nresult, err := kom.DefaultCluster().Resource(&amp;Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx&quot;).Ctl().Rollout().Status()\"><pre class=\"notranslate\"><span class=\"pl-c\">// 将名称为nginx的deployment的中的容器镜像tag升级为alpine</span>\n<span class=\"pl-s1\">result</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Rollout</span>().<span class=\"pl-c1\">Status</span>()</pre></div>\n<h4 dir=\"auto\">Deployment HPA</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// 显示deployment的hpa \nlist, err := kom.DefaultCluster().Resource(&amp;v1.Deployment{}).Namespace(&quot;default&quot;).Name(&quot;nginx-web&quot;).Ctl().Deployment().HPAList()\nfor _, item := range list {\n    t.Logf(&quot;HPA %s\\n&quot;, item.Name)\n}\"><pre class=\"notranslate\"><span class=\"pl-c\">// 显示deployment的hpa </span>\n<span class=\"pl-s1\">list</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>v1.<span class=\"pl-smi\">Deployment</span>{}).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx-web\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Deployment</span>().<span class=\"pl-c1\">HPAList</span>()\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">item</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">list</span> {\n    <span class=\"pl-s1\">t</span>.<span class=\"pl-c1\">Logf</span>(<span class=\"pl-s\">\"HPA %s<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">item</span>.<span class=\"pl-c1\">Name</span>)\n}</pre></div>\n<h4 dir=\"auto\">节点打污点</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err = kom.DefaultCluster().Resource(&amp;Node{}).Name(&quot;kind-control-plane&quot;).Ctl().Node().Taint(&quot;dedicated=special-user:NoSchedule&quot;)\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"kind-control-plane\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">Taint</span>(<span class=\"pl-s\">\"dedicated=special-user:NoSchedule\"</span>)</pre></div>\n<h4 dir=\"auto\">节点去除污点</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err = kom.DefaultCluster().Resource(&amp;Node{}).Name(&quot;kind-control-plane&quot;).Ctl().Node().UnTaint(&quot;dedicated=special-user:NoSchedule&quot;)\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"kind-control-plane\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">UnTaint</span>(<span class=\"pl-s\">\"dedicated=special-user:NoSchedule\"</span>)</pre></div>\n<h4 dir=\"auto\">节点Cordon</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err = kom.DefaultCluster().Resource(&amp;Node{}).Name(&quot;kind-control-plane&quot;).Ctl().Node().Cordon()\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"kind-control-plane\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">Cordon</span>()</pre></div>\n<h4 dir=\"auto\">节点UnCordon</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err = kom.DefaultCluster().Resource(&amp;Node{}).Name(&quot;kind-control-plane&quot;).Ctl().Node().UnCordon()\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"kind-control-plane\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">UnCordon</span>()</pre></div>\n<h4 dir=\"auto\">节点Drain</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err = kom.DefaultCluster().Resource(&amp;Node{}).Name(&quot;kind-control-plane&quot;).Ctl().Node().Drain()\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"kind-control-plane\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">Drain</span>()</pre></div>\n<h4 dir=\"auto\">查询节点IP资源情况</h4>\n<p dir=\"auto\">支持设置缓存时间，避免频繁查询k8s API</p>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nodeName := &quot;lima-rancher-desktop&quot;\ntotal, used, available := kom.DefaultCluster().Resource(&amp;corev1.Node{}).WithCache(5 * time.Second).Name(nodeName).Ctl().Node().IPUsage()\nfmt.Printf(&quot;Total %d, Used %d, Available %d\\n&quot;, total, used, available)\n//Total 256, Used 6, Available 250\"><pre class=\"notranslate\"><span class=\"pl-s1\">nodeName</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">\"lima-rancher-desktop\"</span>\n<span class=\"pl-s1\">total</span>, <span class=\"pl-s1\">used</span>, <span class=\"pl-s1\">available</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>corev1.<span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">WithCache</span>(<span class=\"pl-c1\">5</span> <span class=\"pl-c1\">*</span> <span class=\"pl-s1\">time</span>.<span class=\"pl-c1\">Second</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">nodeName</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">IPUsage</span>()\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Total %d, Used %d, Available %d<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">total</span>, <span class=\"pl-s1\">used</span>, <span class=\"pl-s1\">available</span>)\n<span class=\"pl-c\">//Total 256, Used 6, Available 250</span></pre></div>\n<h4 dir=\"auto\">节点IP资源使用情况统计</h4>\n<p dir=\"auto\">支持设置缓存时间，避免频繁查询k8s API</p>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nodeName := &quot;lima-rancher-desktop&quot;\ntotal, used, available := kom.DefaultCluster().Resource(&amp;corev1.Node{}).WithCache(5 * time.Second).Name(nodeName).Ctl().Node().PodCount()\nfmt.Printf(&quot;Total %d, Used %d, Available %d\\n&quot;, total, used, available)\n//Total 110, Used 9, Available 101\"><pre class=\"notranslate\"><span class=\"pl-s1\">nodeName</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">\"lima-rancher-desktop\"</span>\n<span class=\"pl-s1\">total</span>, <span class=\"pl-s1\">used</span>, <span class=\"pl-s1\">available</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>corev1.<span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">WithCache</span>(<span class=\"pl-c1\">5</span> <span class=\"pl-c1\">*</span> <span class=\"pl-s1\">time</span>.<span class=\"pl-c1\">Second</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">nodeName</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">PodCount</span>()\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Total %d, Used %d, Available %d<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">total</span>, <span class=\"pl-s1\">used</span>, <span class=\"pl-s1\">available</span>)\n<span class=\"pl-c\">//Total 110, Used 9, Available 101</span></pre></div>\n<h4 dir=\"auto\">节点资源用量情况统计</h4>\n<p dir=\"auto\">支持设置缓存时间，避免频繁查询k8s API</p>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nodeName := &quot;lima-rancher-desktop&quot;\nusage := kom.DefaultCluster().Resource(&amp;corev1.Node{}).WithCache(5 * time.Second).Name(nodeName).Ctl().Node().ResourceUsage()\nfmt.Printf(&quot;Node Usage %s\\n&quot;, utils.ToJSON(usage))\"><pre class=\"notranslate\"><span class=\"pl-s1\">nodeName</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">\"lima-rancher-desktop\"</span>\n<span class=\"pl-s1\">usage</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>corev1.<span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">WithCache</span>(<span class=\"pl-c1\">5</span> <span class=\"pl-c1\">*</span> <span class=\"pl-s1\">time</span>.<span class=\"pl-c1\">Second</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">nodeName</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">ResourceUsage</span>()\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Node Usage %s<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">utils</span>.<span class=\"pl-c1\">ToJSON</span>(<span class=\"pl-s1\">usage</span>))</pre></div>\n<p dir=\"auto\">包括当前的请求值、限制值、可分配值、使用比例</p>\n<div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;requests&quot;: {\n    &quot;cpu&quot;: &quot;200m&quot;,\n    &quot;memory&quot;: &quot;140Mi&quot;\n  },\n  &quot;limits&quot;: {\n    &quot;memory&quot;: &quot;170Mi&quot;\n  },\n  &quot;allocatable&quot;: {\n    &quot;cpu&quot;: &quot;4&quot;,\n    &quot;ephemeral-storage&quot;: &quot;99833802265&quot;,\n    &quot;hugepages-1Gi&quot;: &quot;0&quot;,\n    &quot;hugepages-2Mi&quot;: &quot;0&quot;,\n    &quot;hugepages-32Mi&quot;: &quot;0&quot;,\n    &quot;hugepages-64Ki&quot;: &quot;0&quot;,\n    &quot;memory&quot;: &quot;8127096Ki&quot;,\n    &quot;pods&quot;: &quot;110&quot;\n  },\n  &quot;usageFractions&quot;: {\n    &quot;cpu&quot;: {\n      &quot;requestFraction&quot;: 5,\n      &quot;limitFraction&quot;: 0\n    },\n    &quot;ephemeral-storage&quot;: {\n      &quot;requestFraction&quot;: 0,\n      &quot;limitFraction&quot;: 0\n    },\n    &quot;memory&quot;: {\n      &quot;requestFraction&quot;: 1.76397571777176,\n      &quot;limitFraction&quot;: 2.1419705144371375\n    }\n  }\n}\"><pre class=\"notranslate\">{\n  <span class=\"pl-ent\">\"requests\"</span>: {\n    <span class=\"pl-ent\">\"cpu\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>200m<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"memory\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>140Mi<span class=\"pl-pds\">\"</span></span>\n  },\n  <span class=\"pl-ent\">\"limits\"</span>: {\n    <span class=\"pl-ent\">\"memory\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>170Mi<span class=\"pl-pds\">\"</span></span>\n  },\n  <span class=\"pl-ent\">\"allocatable\"</span>: {\n    <span class=\"pl-ent\">\"cpu\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>4<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"ephemeral-storage\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>99833802265<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"hugepages-1Gi\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"hugepages-2Mi\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"hugepages-32Mi\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"hugepages-64Ki\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"memory\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>8127096Ki<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"pods\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>110<span class=\"pl-pds\">\"</span></span>\n  },\n  <span class=\"pl-ent\">\"usageFractions\"</span>: {\n    <span class=\"pl-ent\">\"cpu\"</span>: {\n      <span class=\"pl-ent\">\"requestFraction\"</span>: <span class=\"pl-c1\">5</span>,\n      <span class=\"pl-ent\">\"limitFraction\"</span>: <span class=\"pl-c1\">0</span>\n    },\n    <span class=\"pl-ent\">\"ephemeral-storage\"</span>: {\n      <span class=\"pl-ent\">\"requestFraction\"</span>: <span class=\"pl-c1\">0</span>,\n      <span class=\"pl-ent\">\"limitFraction\"</span>: <span class=\"pl-c1\">0</span>\n    },\n    <span class=\"pl-ent\">\"memory\"</span>: {\n      <span class=\"pl-ent\">\"requestFraction\"</span>: <span class=\"pl-c1\">1.76397571777176</span>,\n      <span class=\"pl-ent\">\"limitFraction\"</span>: <span class=\"pl-c1\">2.1419705144371375</span>\n    }\n  }\n}</pre></div>\n<h4 dir=\"auto\">给资源增加标签</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err = kom.DefaultCluster().Resource(&amp;Node{}).Name(&quot;kind-control-plane&quot;).Ctl().Label(&quot;name=zhangsan&quot;)\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"kind-control-plane\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Label</span>(<span class=\"pl-s\">\"name=zhangsan\"</span>)</pre></div>\n<h4 dir=\"auto\">给资源删除标签</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err = kom.DefaultCluster().Resource(&amp;Node{}).Name(&quot;kind-control-plane&quot;).Ctl().Label(&quot;name-&quot;)\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"kind-control-plane\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Label</span>(<span class=\"pl-s\">\"name-\"</span>)</pre></div>\n<h4 dir=\"auto\">给资源增加注解</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err = kom.DefaultCluster().Resource(&amp;Node{}).Name(&quot;kind-control-plane&quot;).Ctl().Annotate(&quot;name=zhangsan&quot;)\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"kind-control-plane\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Annotate</span>(<span class=\"pl-s\">\"name=zhangsan\"</span>)</pre></div>\n<h4 dir=\"auto\">给资源删除注解</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err = kom.DefaultCluster().Resource(&amp;Node{}).Name(&quot;kind-control-plane&quot;).Ctl().Annotate(&quot;name-&quot;)\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span><span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"kind-control-plane\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Annotate</span>(<span class=\"pl-s\">\"name-\"</span>)</pre></div>\n<h4 dir=\"auto\">创建NodeSell</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"ns, pod, container, err  := kom.DefaultCluster().Resource(&amp;v1.Node{}).Name(&quot;kind-control-plane&quot;).Ctl().Node().CreateNodeShell()\nfmt.Printf(&quot;Node Shell ns=%s podName=%s containerName=%s&quot;, ns, pod, container)\"><pre class=\"notranslate\"><span class=\"pl-s1\">ns</span>, <span class=\"pl-s1\">pod</span>, <span class=\"pl-s1\">container</span>, <span class=\"pl-s1\">err</span>  <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>v1.<span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"kind-control-plane\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">CreateNodeShell</span>()\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Node Shell ns=%s podName=%s containerName=%s\"</span>, <span class=\"pl-s1\">ns</span>, <span class=\"pl-s1\">pod</span>, <span class=\"pl-s1\">container</span>)</pre></div>\n<h4 dir=\"auto\">创建kubectl Shell</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"ns, pod, container, err := kom.DefaultCluster().Resource(&amp;v1.Node{}).Name(name).Ctl().Node().CreateKubectlShell(kubeconfig)\nfmt.Printf(&quot;Kubectl Shell ns=%s podName=%s containerName=%s&quot;, ns, pod, container)\n\"><pre class=\"notranslate\"><span class=\"pl-s1\">ns</span>, <span class=\"pl-s1\">pod</span>, <span class=\"pl-s1\">container</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>v1.<span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">name</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">CreateKubectlShell</span>(<span class=\"pl-s1\">kubeconfig</span>)\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Kubectl Shell ns=%s podName=%s containerName=%s\"</span>, <span class=\"pl-s1\">ns</span>, <span class=\"pl-s1\">pod</span>, <span class=\"pl-s1\">container</span>)</pre></div>\n<h4 dir=\"auto\">统计StorageClass下的PVC数量</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"count, err := kom.DefaultCluster().Resource(&amp;v1.StorageClass{}).Name(&quot;hostpath&quot;).Ctl().StorageClass().PVCCount()\nfmt.Printf(&quot;pvc count %d\\n&quot;, count)\"><pre class=\"notranslate\"><span class=\"pl-s1\">count</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>v1.<span class=\"pl-smi\">StorageClass</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"hostpath\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">StorageClass</span>().<span class=\"pl-c1\">PVCCount</span>()\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"pvc count %d<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">count</span>)</pre></div>\n<h4 dir=\"auto\">统计StorageClass下的PV数量</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"count, err := kom.DefaultCluster().Resource(&amp;v1.StorageClass{}).Name(&quot;hostpath&quot;).Ctl().StorageClass().PVCount()\nfmt.Printf(&quot;pv count %d\\n&quot;, count)\"><pre class=\"notranslate\"><span class=\"pl-s1\">count</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>v1.<span class=\"pl-smi\">StorageClass</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"hostpath\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">StorageClass</span>().<span class=\"pl-c1\">PVCount</span>()\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"pv count %d<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">count</span>)</pre></div>\n<h4 dir=\"auto\">设置StorageClass为默认</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err := kom.DefaultCluster().Resource(&amp;v1.StorageClass{}).Name(&quot;hostpath&quot;).Ctl().StorageClass().SetDefault()\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>v1.<span class=\"pl-smi\">StorageClass</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"hostpath\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">StorageClass</span>().<span class=\"pl-c1\">SetDefault</span>()</pre></div>\n<h4 dir=\"auto\">设置IngressClass为默认</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"err := kom.DefaultCluster().Resource(&amp;v1.IngressClass{}).Name(&quot;nginx&quot;).Ctl().IngressClass().SetDefault()\"><pre class=\"notranslate\"><span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>v1.<span class=\"pl-smi\">IngressClass</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"nginx\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">IngressClass</span>().<span class=\"pl-c1\">SetDefault</span>()</pre></div>\n<h4 dir=\"auto\">统计Deployment/StatefulSet/DaemonSet下的Pod列表</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"list, err := kom.DefaultCluster().Namespace(&quot;default&quot;).Name(&quot;managed-pods&quot;).Ctl().Deployment().ManagedPods()\nfor _, pod := range list {\n\tfmt.Printf(&quot;ManagedPod: %v&quot;, pod.Name)\n}\"><pre class=\"notranslate\"><span class=\"pl-s1\">list</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s\">\"default\"</span>).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s\">\"managed-pods\"</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Deployment</span>().<span class=\"pl-c1\">ManagedPods</span>()\n<span class=\"pl-k\">for</span> <span class=\"pl-s1\">_</span>, <span class=\"pl-s1\">pod</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-k\">range</span> <span class=\"pl-s1\">list</span> {\n\t<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"ManagedPod: %v\"</span>, <span class=\"pl-s1\">pod</span>.<span class=\"pl-c1\">Name</span>)\n}</pre></div>\n<h4 dir=\"auto\">获取所有节点的标签集合</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// labels 类型为map[string]string\nlabels, err := kom.DefaultCluster().Resource(&amp;v1.Node{}).Ctl().Node().AllNodeLabels()\nfmt.Printf(&quot;%s&quot;, utils.ToJSON(labels))\"><pre class=\"notranslate\"><span class=\"pl-c\">// labels 类型为map[string]string</span>\n<span class=\"pl-s1\">labels</span>, <span class=\"pl-s1\">err</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>v1.<span class=\"pl-smi\">Node</span>{}).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Node</span>().<span class=\"pl-c1\">AllNodeLabels</span>()\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"%s\"</span>, <span class=\"pl-s1\">utils</span>.<span class=\"pl-c1\">ToJSON</span>(<span class=\"pl-s1\">labels</span>))</pre></div>\n<div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n          &quot;beta.kubernetes.io/arch&quot;: &quot;arm64&quot;,\n          &quot;beta.kubernetes.io/os&quot;: &quot;linux&quot;,\n          &quot;kubernetes.io/arch&quot;: &quot;arm64&quot;,\n          &quot;kubernetes.io/hostname&quot;: &quot;kind-control-plane&quot;,\n          &quot;kubernetes.io/os&quot;: &quot;linux&quot;,\n          &quot;kubernetes.io/role&quot;: &quot;agent&quot;,\n          &quot;node-role.kubernetes.io/agent&quot;: &quot;&quot;,\n          &quot;node-role.kubernetes.io/control-plane&quot;: &quot;&quot;,\n          &quot;type&quot;: &quot;kwok&quot;,\n          &quot;uat&quot;: &quot;test&quot;,\n          &quot;x&quot;: &quot;x&quot;\n}\"><pre class=\"notranslate\">{\n          <span class=\"pl-ent\">\"beta.kubernetes.io/arch\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>arm64<span class=\"pl-pds\">\"</span></span>,\n          <span class=\"pl-ent\">\"beta.kubernetes.io/os\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>linux<span class=\"pl-pds\">\"</span></span>,\n          <span class=\"pl-ent\">\"kubernetes.io/arch\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>arm64<span class=\"pl-pds\">\"</span></span>,\n          <span class=\"pl-ent\">\"kubernetes.io/hostname\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>kind-control-plane<span class=\"pl-pds\">\"</span></span>,\n          <span class=\"pl-ent\">\"kubernetes.io/os\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>linux<span class=\"pl-pds\">\"</span></span>,\n          <span class=\"pl-ent\">\"kubernetes.io/role\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>agent<span class=\"pl-pds\">\"</span></span>,\n          <span class=\"pl-ent\">\"node-role.kubernetes.io/agent\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-pds\">\"</span></span>,\n          <span class=\"pl-ent\">\"node-role.kubernetes.io/control-plane\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-pds\">\"</span></span>,\n          <span class=\"pl-ent\">\"type\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>kwok<span class=\"pl-pds\">\"</span></span>,\n          <span class=\"pl-ent\">\"uat\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>test<span class=\"pl-pds\">\"</span></span>,\n          <span class=\"pl-ent\">\"x\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>x<span class=\"pl-pds\">\"</span></span>\n}</pre></div>\n<h4 dir=\"auto\">查看Pod资源占用率</h4>\n<div class=\"highlight highlight-source-go notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"podName := &quot;coredns-ccb96694c-jprpf&quot;\nns := &quot;kube-system&quot;\nusage := kom.DefaultCluster().Resource(&amp;corev1.Pod{}).Name(podName).Namespace(ns).Ctl().Pod().ResourceUsage()\nfmt.Printf(&quot;Pod Usage %s\\n&quot;, utils.ToJSON(usage))\"><pre class=\"notranslate\"><span class=\"pl-s1\">podName</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">\"coredns-ccb96694c-jprpf\"</span>\n<span class=\"pl-s1\">ns</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s\">\"kube-system\"</span>\n<span class=\"pl-s1\">usage</span> <span class=\"pl-c1\">:=</span> <span class=\"pl-s1\">kom</span>.<span class=\"pl-c1\">DefaultCluster</span>().<span class=\"pl-c1\">Resource</span>(<span class=\"pl-c1\">&amp;</span>corev1.<span class=\"pl-smi\">Pod</span>{}).<span class=\"pl-c1\">Name</span>(<span class=\"pl-s1\">podName</span>).<span class=\"pl-c1\">Namespace</span>(<span class=\"pl-s1\">ns</span>).<span class=\"pl-c1\">Ctl</span>().<span class=\"pl-c1\">Pod</span>().<span class=\"pl-c1\">ResourceUsage</span>()\n<span class=\"pl-s1\">fmt</span>.<span class=\"pl-c1\">Printf</span>(<span class=\"pl-s\">\"Pod Usage %s<span class=\"pl-cce\">\\n</span>\"</span>, <span class=\"pl-s1\">utils</span>.<span class=\"pl-c1\">ToJSON</span>(<span class=\"pl-s1\">usage</span>))</pre></div>\n<p dir=\"auto\">包括当前的请求值、限制值、可分配值、使用比例</p>\n<div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;requests&quot;: {\n    &quot;cpu&quot;: &quot;100m&quot;,\n    &quot;memory&quot;: &quot;70Mi&quot;\n  },\n  &quot;limits&quot;: {\n    &quot;memory&quot;: &quot;170Mi&quot;\n  },\n  &quot;allocatable&quot;: {\n    &quot;cpu&quot;: &quot;4&quot;,\n    &quot;ephemeral-storage&quot;: &quot;99833802265&quot;,\n    &quot;hugepages-1Gi&quot;: &quot;0&quot;,\n    &quot;hugepages-2Mi&quot;: &quot;0&quot;,\n    &quot;hugepages-32Mi&quot;: &quot;0&quot;,\n    &quot;hugepages-64Ki&quot;: &quot;0&quot;,\n    &quot;memory&quot;: &quot;8127096Ki&quot;,\n    &quot;pods&quot;: &quot;110&quot;\n  },\n  &quot;usageFractions&quot;: {\n    &quot;cpu&quot;: {\n      &quot;requestFraction&quot;: 2.5,\n      &quot;limitFraction&quot;: 0\n    },\n    &quot;memory&quot;: {\n      &quot;requestFraction&quot;: 0.88198785888588,\n      &quot;limitFraction&quot;: 2.1419705144371375\n    }\n  }\n}\"><pre class=\"notranslate\">{\n  <span class=\"pl-ent\">\"requests\"</span>: {\n    <span class=\"pl-ent\">\"cpu\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>100m<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"memory\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>70Mi<span class=\"pl-pds\">\"</span></span>\n  },\n  <span class=\"pl-ent\">\"limits\"</span>: {\n    <span class=\"pl-ent\">\"memory\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>170Mi<span class=\"pl-pds\">\"</span></span>\n  },\n  <span class=\"pl-ent\">\"allocatable\"</span>: {\n    <span class=\"pl-ent\">\"cpu\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>4<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"ephemeral-storage\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>99833802265<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"hugepages-1Gi\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"hugepages-2Mi\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"hugepages-32Mi\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"hugepages-64Ki\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>0<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"memory\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>8127096Ki<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"pods\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>110<span class=\"pl-pds\">\"</span></span>\n  },\n  <span class=\"pl-ent\">\"usageFractions\"</span>: {\n    <span class=\"pl-ent\">\"cpu\"</span>: {\n      <span class=\"pl-ent\">\"requestFraction\"</span>: <span class=\"pl-c1\">2.5</span>,\n      <span class=\"pl-ent\">\"limitFraction\"</span>: <span class=\"pl-c1\">0</span>\n    },\n    <span class=\"pl-ent\">\"memory\"</span>: {\n      <span class=\"pl-ent\">\"requestFraction\"</span>: <span class=\"pl-c1\">0.88198785888588</span>,\n      <span class=\"pl-ent\">\"limitFraction\"</span>: <span class=\"pl-c1\">2.1419705144371375</span>\n    }\n  }\n}</pre></div>\n<h2 dir=\"auto\">k8s版本兼容性测试</h2>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th>k8s版本</th>\n<th>测试结果</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>V1.31.3</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>V1.31.2</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>V1.31.1</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>V1.31.0</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>V1.30.7</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>V1.30.6</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.30.5</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.30.4</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.30.3</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.30.2</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.30.1</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.30.0</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.11</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.10</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.9</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.8</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.7</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.6</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.5</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.4</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.3</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.2</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.1</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.29.0</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>V1.28.14</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.13</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.12</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.11</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.10</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.9</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.8</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.7</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.6</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.28.5</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.4</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.3</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.2</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.28.1</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.15</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.14</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.27.13</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.12</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.11</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.27.10</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.9</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.8</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.7</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.6</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.5</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.4</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.3</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.2</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.27.1</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.14</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.13</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.12</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.26.11</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.26.10</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.9</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.8</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.7</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.6</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.5</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.4</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.3</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.2</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.1</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.26.0</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.15</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.25.14</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.13</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.12</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.11</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.10</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.9</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.8</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.7</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>v1.25.6</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.5</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.4</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.3</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.2</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.25.0</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.16</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.15</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.14</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.13</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.12</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.24.11</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.24.10</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.9</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.8</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.7</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>V1.24.6</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.4</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.3</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.24.2</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.24.1</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.16</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.15</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.14</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.13</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.12</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.10</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.9</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.8</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.7</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>V1.23.6</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.5</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.4</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.3</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.23.2</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.23.1</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.22.16</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.22.15</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.22.13</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.22.12</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.22.11</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.22.10</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.22.9</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.22.8</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.22.7</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.22.6</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>v1.22.5</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.22.4</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.22.3</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>V1.22.2</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>V1.21.13</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.12</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.11</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.10</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.9</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.8</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.7</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.6</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.5</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.4</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.3</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.2</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.1</td>\n<td>未测</td>\n</tr>\n<tr>\n<td>V1.21.0</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<h2 dir=\"auto\">联系我</h2>\n<p dir=\"auto\">微信（大罗马的太阳） 搜索ID：daluomadetaiyang,备注kom。</p>","updatedAt":"2025-05-21T16:06:21Z","upvoteCount":null,"author":{"login":"eryajf","avatarUrl":"https://avatars.githubusercontent.com/u/33259379?u=e4a4090a38ac2473aaed4ef9945233636776c6c3&v=4","url":"https://github.com/eryajf"},"category":null,"labels":{"edges":[{"node":{"name":"更多","color":"25B472"}},{"node":{"name":"K8S-Tools","color":"2d411a"}},{"node":{"name":"weibaohui","color":"2e8bb3"}}]},"comments":{"edges":[]}}},"pageContext":{"number":293,"previous":{"title":"kubernetes/kompose: 将 Docker Compose 转换为 Kubernetes","number":292},"next":{"title":"tbillington/kondo: 清理项目中的依赖关系和构建制品。","number":294}}},
    "staticQueryHashes": ["151096407","2861350382"]}