{
    "componentChunkName": "component---src-templates-issues-tsx",
    "path": "/issues/551",
    "result": {"data":{"issuesJson":{"id":"7c0420fa-ddf5-59bb-b98b-b3411e1a17f8","title":"telepresenceio/telepresence: 面向远程 Kubernetes 或 OpenShift 集群的本地开发工具","number":551,"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/telepresenceio/telepresence\">telepresenceio/telepresence</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/d927f1b86c51313a7bb7a0890ce676387ec3912ca3a8e50fea97a61adfbf708e/68747470733a2f2f76696577732e77686174696c656172656e65642e746f6461792f76696577732f6769746875622f74656c6570726573656e6365696f2f74656c6570726573656e63652e737667\" alt=\"views\" data-canonical-src=\"https://views.whatilearened.today/views/github/telepresenceio/telepresence.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/df827288d110422bda714f017553621ac88f7cdd4cebed2a3ee7baca1012be40/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f74656c6570726573656e6365696f2f74656c6570726573656e63653f636f6c6f723d663266303864266c6f676f3d556e64657274616c65266c6f676f436f6c6f723d656234363330\" alt=\"stars\" data-canonical-src=\"https://img.shields.io/github/stars/telepresenceio/telepresence?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/2617e5aec8a1222a8716597413d089274fbbdba7a298821a6982327621eeb7d7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f74656c6570726573656e6365696f2f74656c6570726573656e63653f636f6c6f723d626138366562266c6f676f3d48616e647368616b65266c6f676f436f6c6f723d656136616136\" alt=\"forks\" data-canonical-src=\"https://img.shields.io/github/forks/telepresenceio/telepresence?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/0c93ca71e73bb599dbfbd81eb5bbb82f63a427dc55ced5d8a7de2d4025f1f1c5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c2d4e4f4e452d626c75653f6c6f676f3d756e6c6963656e7365\" alt=\"license\" data-canonical-src=\"https://img.shields.io/badge/L-NONE-blue?logo=unlicense\" 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/c367eed879d7806adb50f430dd8972aadb4879147d06682052ad302c0799d200/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f74656c6570726573656e6365696f2f74656c6570726573656e63653f646973706c61795f74696d657374616d703d636f6d6d6974746572266c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d557064617465644174\" alt=\"last-commit\" data-canonical-src=\"https://img.shields.io/github/last-commit/telepresenceio/telepresence?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/2928258f9399309e29cb72a16d5b9352c23d2dab24fb70d7828deeb780971b64/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f637265617465642d61742f74656c6570726573656e6365696f2f74656c6570726573656e63653f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d437265617465644174\" alt=\"create-at\" data-canonical-src=\"https://img.shields.io/github/created-at/telepresenceio/telepresence?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\">Telepresence: fast, efficient local development for Kubernetes microservices</h1>\n<p dir=\"auto\"><a href=\"https://raw.githubusercontent.com/telepresenceio/telepresence.io/master/src/assets/images/telepresence-edgy.svg\" rel=\"nofollow\"><img src=\"https://raw.githubusercontent.com/telepresenceio/telepresence.io/master/src/assets/images/telepresence-edgy.svg\" width=\"80\" style=\"max-width: 100%;\"></a></p>\n<p dir=\"auto\"><a href=\"https://artifacthub.io/packages/search?repo=telepresence-oss\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/3fac0017365de7c603d28aca009291f09790badfd1b6754454b1f13506114246/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f61727469666163746875622e696f2f62616467652f7265706f7369746f72792f74656c6570726573656e63652d6f7373\" alt=\"Artifact Hub\" data-canonical-src=\"https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/telepresence-oss\" style=\"max-width: 100%;\"></a> <a href=\"https://gurubase.io/g/telepresence\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/0b3b36d86733e0d30bc4ebab2731bd16c4553ede5160e4b45e3418a14fac8291/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f47757275626173652d41736b25323054656c6570726573656e6365253230477572752d303036424646\" alt=\"Gurubase\" data-canonical-src=\"https://img.shields.io/badge/Gurubase-Ask%20Telepresence%20Guru-006BFF\" style=\"max-width: 100%;\"></a></p>\n<p dir=\"auto\">Telepresence gives developers infinite scale development environments for Kubernetes.</p>\n<h2 dir=\"auto\">Key benefits</h2>\n<p dir=\"auto\"><strong>With Telepresence:</strong></p>\n<ul dir=\"auto\">\n<li>You run your services locally, using your favorite IDE and other tools</li>\n<li>Your workstation is connected to the cluster and can access to its services</li>\n</ul>\n<p dir=\"auto\"><strong>This gives developers:</strong></p>\n<ul dir=\"auto\">\n<li>A fast local dev loop, with no waiting for a container build / push / deploy</li>\n<li>Ability to use their favorite local tools (IDE, debugger, etc.)</li>\n<li>Ability to run large-scale applications that can't run locally</li>\n</ul>\n<h2 dir=\"auto\">Quick Start</h2>\n<p dir=\"auto\">A few quick ways to start using Telepresence:</p>\n<ul dir=\"auto\">\n<li><strong>Telepresence Quick Start:</strong> <a href=\"https://telepresence.io/docs/quick-start\" rel=\"nofollow\">Quick Start</a></li>\n<li><strong>Install Telepresence:</strong> <a href=\"https://telepresence.io/docs/install/client\" rel=\"nofollow\">Install</a></li>\n<li><strong>Contributor's Guide:</strong> <a href=\"https://github.com/telepresenceio/telepresence/blob/release/v2/CONTRIBUTING.md\">Guide</a></li>\n<li><strong>Meetings:</strong> Check out our community <a href=\"https://github.com/telepresenceio/telepresence/blob/release/v2/MEETING_SCHEDULE.md\">meeting schedule</a> for opportunities to interact with Telepresence developers</li>\n</ul>\n<h2 dir=\"auto\">Walkthrough</h2>\n<h3 dir=\"auto\">Install something in the cluster that Telepresence can engage with:</h3>\n<p dir=\"auto\">Start with an empty cluster:</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ kubectl create deploy hello --image=k8s.gcr.io/echoserver:1.9\ndeployment.apps/hello created\n$ kubectl expose deploy hello --port 80 --target-port 8080\nservice/hello exposed\n$ kubectl get ns,svc,deploy,po\nNAME                        STATUS   AGE\nnamespace/default           Active   4d19h\nnamespace/kube-node-lease   Active   4d19h\nnamespace/kube-public       Active   4d19h\nnamespace/kube-system       Active   4d19h\n\nNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE\nservice/hello        ClusterIP   10.98.148.129   &lt;none&gt;        80/TCP    112s\nservice/kubernetes   ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP   4d19h\n\nNAME                    READY   UP-TO-DATE   AVAILABLE   AGE\ndeployment.apps/hello   1/1     1            1           2m47s\n\nNAME                        READY   STATUS    RESTARTS   AGE\npod/hello-87f7f548f-djc8v   1/1     Running   0          1m47s\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">kubectl create deploy hello --image=k8s.gcr.io/echoserver:1.9</span>\n<span class=\"pl-c1\">deployment.apps/hello created</span>\n$ <span class=\"pl-s1\">kubectl expose deploy hello --port 80 --target-port 8080</span>\n<span class=\"pl-c1\">service/hello exposed</span>\n$ <span class=\"pl-s1\">kubectl get ns,svc,deploy,po</span>\n<span class=\"pl-c1\">NAME                        STATUS   AGE</span>\n<span class=\"pl-c1\">namespace/default           Active   4d19h</span>\n<span class=\"pl-c1\">namespace/kube-node-lease   Active   4d19h</span>\n<span class=\"pl-c1\">namespace/kube-public       Active   4d19h</span>\n<span class=\"pl-c1\">namespace/kube-system       Active   4d19h</span>\n\n<span class=\"pl-c1\">NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE</span>\n<span class=\"pl-c1\">service/hello        ClusterIP   10.98.148.129   &lt;none&gt;        80/TCP    112s</span>\n<span class=\"pl-c1\">service/kubernetes   ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP   4d19h</span>\n\n<span class=\"pl-c1\">NAME                    READY   UP-TO-DATE   AVAILABLE   AGE</span>\n<span class=\"pl-c1\">deployment.apps/hello   1/1     1            1           2m47s</span>\n\n<span class=\"pl-c1\">NAME                        READY   STATUS    RESTARTS   AGE</span>\n<span class=\"pl-c1\">pod/hello-87f7f548f-djc8v   1/1     Running   0          1m47s</span></pre></div>\n<p dir=\"auto\">Check telepresence version</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ telepresence version\nOSS Client : v2.23.0\nRoot Daemon: not running\nUser Daemon: not running\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">telepresence version</span>\n<span class=\"pl-c1\">OSS Client : v2.23.0</span>\n<span class=\"pl-c1\">Root Daemon: not running</span>\n<span class=\"pl-c1\">User Daemon: not running</span></pre></div>\n<h3 dir=\"auto\">Setup Traffic Manager in the cluster</h3>\n<p dir=\"auto\">Install Traffic Manager in your cluster. By default, it will reside in the <code class=\"notranslate\">ambassador</code> namespace:</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ telepresence helm install\n\nTraffic Manager installed successfully\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">telepresence helm install</span>\n\n<span class=\"pl-c1\">Traffic Manager installed successfully</span></pre></div>\n<h3 dir=\"auto\">Establish a connection to  the cluster (outbound traffic)</h3>\n<p dir=\"auto\">Let telepresence connect:</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ telepresence connect\n ✔ Connected to context rancher-desktop, namespace default (https://127.0.0.1:6443)       2.4s \"><pre class=\"notranslate\">$ <span class=\"pl-s1\">telepresence connect</span>\n<span class=\"pl-c1\"> ✔ Connected to context rancher-desktop, namespace default (https://127.0.0.1:6443)       2.4s </span></pre></div>\n<p dir=\"auto\">A session is now active and outbound connections will be routed to the cluster. I.e. your laptop is logically \"inside\"<br>\na namespace in the cluster.</p>\n<p dir=\"auto\">Since telepresence connected to the default namespace, all services in that namespace can now be reached directly<br>\nby their name. You can of course also use namespaced names, e.g. <code class=\"notranslate\">curl hello.default</code>.</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ curl hello\n\nHostname: hello-87f7f548f-djc8v\n\nPod Information:\n\t-no pod information available-\n\nServer values:\n\tserver_version=nginx: 1.13.3 - lua: 10008\n\nRequest Information:\n\tclient_address=10.1.5.190\n\tmethod=GET\n\treal path=/\n\tquery=\n\trequest_version=1.1\n\trequest_scheme=http\n\trequest_uri=http://hello:8080/\n\nRequest Headers:\n\taccept=*/*\n\thost=hello\n\tuser-agent=curl/8.9.1\n\nRequest Body:\n\t-no body in request-\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">curl hello</span>\n\n<span class=\"pl-c1\">Hostname: hello-87f7f548f-djc8v</span>\n\n<span class=\"pl-c1\">Pod Information:</span>\n<span class=\"pl-c1\">\t-no pod information available-</span>\n\n<span class=\"pl-c1\">Server values:</span>\n<span class=\"pl-c1\">\tserver_version=nginx: 1.13.3 - lua: 10008</span>\n\n<span class=\"pl-c1\">Request Information:</span>\n<span class=\"pl-c1\">\tclient_address=10.1.5.190</span>\n<span class=\"pl-c1\">\tmethod=GET</span>\n<span class=\"pl-c1\">\treal path=/</span>\n<span class=\"pl-c1\">\tquery=</span>\n<span class=\"pl-c1\">\trequest_version=1.1</span>\n<span class=\"pl-c1\">\trequest_scheme=http</span>\n<span class=\"pl-c1\">\trequest_uri=http://hello:8080/</span>\n\n<span class=\"pl-c1\">Request Headers:</span>\n<span class=\"pl-c1\">\taccept=*/*</span>\n<span class=\"pl-c1\">\thost=hello</span>\n<span class=\"pl-c1\">\tuser-agent=curl/8.9.1</span>\n\n<span class=\"pl-c1\">Request Body:</span>\n<span class=\"pl-c1\">\t-no body in request-</span></pre></div>\n<h3 dir=\"auto\">Intercept the service. I.e. redirect traffic to it to our laptop (inbound traffic)</h3>\n<p dir=\"auto\">Add an intercept for the hello deployment on port 9000. Here, we also start a service listening on that port:</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ telepresence intercept hello --port 9000 -- python3 -m http.server 9000\n ✔ Intercepted                                                                              2.1s \nUsing Deployment hello\n   Intercept name    : hello\n   State             : ACTIVE\n   Workload kind     : Deployment\n   Intercepting      : 10.1.5.196 -&gt; 127.0.0.1\n       8080 -&gt; 9000 TCP\n   Volume Mount Point: /tmp/telfs-629530207\nServing HTTP on 0.0.0.0 port 9000 (http://0.0.0.0:9000/) ...\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">telepresence intercept hello --port 9000 -- python3 -m http.server 9000</span>\n<span class=\"pl-c1\"> ✔ Intercepted                                                                              2.1s </span>\n<span class=\"pl-c1\">Using Deployment hello</span>\n<span class=\"pl-c1\">   Intercept name    : hello</span>\n<span class=\"pl-c1\">   State             : ACTIVE</span>\n<span class=\"pl-c1\">   Workload kind     : Deployment</span>\n<span class=\"pl-c1\">   Intercepting      : 10.1.5.196 -&gt; 127.0.0.1</span>\n<span class=\"pl-c1\">       8080 -&gt; 9000 TCP</span>\n<span class=\"pl-c1\">   Volume Mount Point: /tmp/telfs-629530207</span>\n<span class=\"pl-c1\">Serving HTTP on 0.0.0.0 port 9000 (http://0.0.0.0:9000/) ...</span></pre></div>\n<p dir=\"auto\">The <code class=\"notranslate\">python -m httpserver</code> is now started on port 9000 and will run until terminated by <code class=\"notranslate\">&lt;ctrl&gt;-C</code>. Access it from a browser using <code class=\"notranslate\">http://hello/</code> or use curl from another terminal. With curl, it presents a html listing from the directory where the server was started. Something like:</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ curl hello\n&lt;!DOCTYPE HTML&gt;\n&lt;html lang=&quot;en&quot;&gt;\n&lt;head&gt;\n&lt;meta charset=&quot;utf-8&quot;&gt;\n&lt;title&gt;Directory listing for /&lt;/title&gt;\n&lt;/head&gt;\n&lt;body&gt;\n&lt;h1&gt;Directory listing for /&lt;/h1&gt;\n&lt;hr&gt;\n&lt;ul&gt;\n&lt;li&gt;&lt;a href=&quot;file1.txt&quot;&gt;file1.txt&lt;/a&gt;&lt;/li&gt;\n&lt;li&gt;&lt;a href=&quot;file2.txt&quot;&gt;file2.txt&lt;/a&gt;&lt;/li&gt;\n&lt;/ul&gt;\n&lt;hr&gt;\n&lt;/body&gt;\n&lt;/html&gt;\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">curl hello</span>\n<span class=\"pl-c1\">&lt;!DOCTYPE HTML&gt;</span>\n<span class=\"pl-c1\">&lt;html lang=\"en\"&gt;</span>\n<span class=\"pl-c1\">&lt;head&gt;</span>\n<span class=\"pl-c1\">&lt;meta charset=\"utf-8\"&gt;</span>\n<span class=\"pl-c1\">&lt;title&gt;Directory listing for /&lt;/title&gt;</span>\n<span class=\"pl-c1\">&lt;/head&gt;</span>\n<span class=\"pl-c1\">&lt;body&gt;</span>\n<span class=\"pl-c1\">&lt;h1&gt;Directory listing for /&lt;/h1&gt;</span>\n<span class=\"pl-c1\">&lt;hr&gt;</span>\n<span class=\"pl-c1\">&lt;ul&gt;</span>\n<span class=\"pl-c1\">&lt;li&gt;&lt;a href=\"file1.txt\"&gt;file1.txt&lt;/a&gt;&lt;/li&gt;</span>\n<span class=\"pl-c1\">&lt;li&gt;&lt;a href=\"file2.txt\"&gt;file2.txt&lt;/a&gt;&lt;/li&gt;</span>\n<span class=\"pl-c1\">&lt;/ul&gt;</span>\n<span class=\"pl-c1\">&lt;hr&gt;</span>\n<span class=\"pl-c1\">&lt;/body&gt;</span>\n<span class=\"pl-c1\">&lt;/html&gt;</span></pre></div>\n<p dir=\"auto\">Observe that the python service reports that it's being accessed:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"127.0.0.1 - - [03/Apr/2025 09:44:57] &quot;GET / HTTP/1.1&quot; 200 -\"><pre class=\"notranslate\"><code class=\"notranslate\">127.0.0.1 - - [03/Apr/2025 09:44:57] \"GET / HTTP/1.1\" 200 -\n</code></pre></div>\n<h3 dir=\"auto\">Clean-up and close daemon processes</h3>\n<p dir=\"auto\">End the service with <code class=\"notranslate\">&lt;ctrl&gt;-C</code> and then try <code class=\"notranslate\">curl hello</code> or <code class=\"notranslate\">http://hello</code> again. The intercept is gone, and the echo service responds as normal.</p>\n<p dir=\"auto\">Now end the session too. Your desktop no longer has access to the cluster internals.</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ telepresence quit\n ✔ Disconnected                                                                           0.1s \n$ curl hello\ncurl: (6) Could not resolve host: hello\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">telepresence quit</span>\n<span class=\"pl-c1\"> ✔ Disconnected                                                                           0.1s </span>\n$ <span class=\"pl-s1\">curl hello</span>\n<span class=\"pl-c1\">curl: (6) Could not resolve host: hello</span></pre></div>\n<p dir=\"auto\">The telepresence daemons are still running in the background, which is harmless. You'll need to stop them before you<br>\nupgrade telepresence. That's done by passing the option <code class=\"notranslate\">-s</code> (stop all local telepresence daemons) to the<br>\nquit command.</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ telepresence quit -s\n ✔ Quit                                                                                   0.3s \"><pre class=\"notranslate\">$ <span class=\"pl-s1\">telepresence quit -s</span>\n<span class=\"pl-c1\"> ✔ Quit                                                                                   0.3s </span></pre></div>\n<h3 dir=\"auto\">What got installed in the cluster?</h3>\n<p dir=\"auto\">Telepresence installs the Traffic Manager in your cluster if it is not already present. This deployment remains unless you uninstall it.</p>\n<p dir=\"auto\">Telepresence injects the Traffic Agent as an additional container into the pods of the workload you intercept, and  will optionally install<br>\nan init-container to route traffic through the agent (the init-container is only injected when the service is headless or uses a numerical<br>\n<code class=\"notranslate\">targetPort</code>). The modifications persist unless you uninstall them.</p>\n<p dir=\"auto\">At first glance, we can see that the deployment is installed ...</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ kubectl get svc,deploy,pod\nNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE\nservice/hello        ClusterIP   10.102.244.61   &lt;none&gt;        80/TCP    10m\nservice/kubernetes   ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP   4d20h\n\nNAME                    READY   UP-TO-DATE   AVAILABLE   AGE\ndeployment.apps/hello   1/1     1            1           11m\n\nNAME                        READY   STATUS    RESTARTS   AGE\npod/hello-87f7f548f-mdg8d   2/2     Running   0          6m36s\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">kubectl get svc,deploy,pod</span>\n<span class=\"pl-c1\">NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE</span>\n<span class=\"pl-c1\">service/hello        ClusterIP   10.102.244.61   &lt;none&gt;        80/TCP    10m</span>\n<span class=\"pl-c1\">service/kubernetes   ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP   4d20h</span>\n\n<span class=\"pl-c1\">NAME                    READY   UP-TO-DATE   AVAILABLE   AGE</span>\n<span class=\"pl-c1\">deployment.apps/hello   1/1     1            1           11m</span>\n\n<span class=\"pl-c1\">NAME                        READY   STATUS    RESTARTS   AGE</span>\n<span class=\"pl-c1\">pod/hello-87f7f548f-mdg8d   2/2     Running   0          6m36s</span></pre></div>\n<p dir=\"auto\">... and that the traffic-manager is installed in the \"ambassador\" namespace.</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ kubectl -n ambassador get svc,deploy,pod\nNAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE\nservice/agent-injector    ClusterIP   10.107.17.143   &lt;none&gt;        443/TCP    31m\nservice/traffic-manager   ClusterIP   None            &lt;none&gt;        8081/TCP   31m\n\nNAME                              READY   UP-TO-DATE   AVAILABLE   AGE\ndeployment.apps/traffic-manager   1/1     1            1           31m\n\nNAME                                   READY   STATUS    RESTARTS   AGE\npod/traffic-manager-7cc6668576-hmlzz   1/1     Running   0          31m\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">kubectl -n ambassador get svc,deploy,pod</span>\n<span class=\"pl-c1\">NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE</span>\n<span class=\"pl-c1\">service/agent-injector    ClusterIP   10.107.17.143   &lt;none&gt;        443/TCP    31m</span>\n<span class=\"pl-c1\">service/traffic-manager   ClusterIP   None            &lt;none&gt;        8081/TCP   31m</span>\n\n<span class=\"pl-c1\">NAME                              READY   UP-TO-DATE   AVAILABLE   AGE</span>\n<span class=\"pl-c1\">deployment.apps/traffic-manager   1/1     1            1           31m</span>\n\n<span class=\"pl-c1\">NAME                                   READY   STATUS    RESTARTS   AGE</span>\n<span class=\"pl-c1\">pod/traffic-manager-7cc6668576-hmlzz   1/1     Running   0          31m</span></pre></div>\n<p dir=\"auto\">The traffic-agent is installed too, in the hello pod. Here together with an init-container, because the service is using a numerical<br>\n<code class=\"notranslate\">targetPort</code>.</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ kubectl describe pod hello-774455b6f5-6x6vs\nName:             hello-87f7f548f-mdg8d\nNamespace:        default\nPriority:         0\nService Account:  default\nNode:             lima-rancher-desktop/192.168.65.3\nStart Time:       Thu, 03 Apr 2025 09:43:37 +0200\nLabels:           app=hello\n                  pod-template-hash=87f7f548f\n                  telepresence.io/workloadEnabled=true\n                  telepresence.io/workloadKind=Deployment\n                  telepresence.io/workloadName=hello\nAnnotations:      telepresence.io/agent-config:\n                    {&quot;agentName&quot;:&quot;hello&quot;,&quot;namespace&quot;:&quot;default&quot;,&quot;logLevel&quot;:&quot;debug&quot;,&quot;workloadName&quot;:&quot;hello&quot;,&quot;workloadKind&quot;:&quot;Deployment&quot;,&quot;managerHost&quot;:&quot;traffic-ma...\n                  telepresence.io/inject-traffic-agent: enabled\nStatus:           Running\nIP:               10.1.5.196\nIPs:\n  IP:           10.1.5.196\nControlled By:  ReplicaSet/hello-87f7f548f\nInit Containers:\n  tel-agent-init:\n    Container ID:  docker://f3203943fb97414bee8c3ad4b11237895a8165df7aa39a8f88741b4093e491be\n    Image:         local/tel2:2.23.0-alpha.0\n    Image ID:      docker-pullable://tel2@sha256:0f81a553bb223f4cfe97973d585586439451e120eb2ed8e35d0fe9266b22fd6d\n    Port:          &lt;none&gt;\n    Host Port:     &lt;none&gt;\n    Args:\n      agent-init\n    State:          Terminated\n      Reason:       Completed\n      Exit Code:    0\n      Started:      Thu, 03 Apr 2025 09:43:38 +0200\n      Finished:     Thu, 03 Apr 2025 09:43:38 +0200\n    Ready:          True\n    Restart Count:  0\n    Environment:\n      LOG_LEVEL:     debug\n      AGENT_CONFIG:   (v1:metadata.annotations['telepresence.io/agent-config'])\n      POD_IP:         (v1:status.podIP)\n    Mounts:\n      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zgfs5 (ro)\nContainers:\n  echoserver:\n    Container ID:   docker://2ccc7a81bfe7d1f666af7b17c6415631af2f1bfdb6cb147a0ef7a345f528ac49\n    Image:          registry.k8s.io/echoserver:1.9\n    Image ID:       docker-pullable://registry.k8s.io/echoserver@sha256:10f4dbc8eeeb8806d9b3a261b2473b77ca357b290a15d91ce5a0ca5e6164b535\n    Port:           &lt;none&gt;\n    Host Port:      &lt;none&gt;\n    State:          Running\n      Started:      Thu, 03 Apr 2025 09:43:39 +0200\n    Ready:          True\n    Restart Count:  0\n    Environment:    &lt;none&gt;\n    Mounts:\n      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zgfs5 (ro)\n  traffic-agent:\n    Container ID:  docker://b4f2279e58aacdf3426c80381c29f7cc214729a7d44a40acd1a566d778d84cfa\n    Image:         local/tel2:2.23.0-alpha.0\n    Image ID:      docker-pullable://tel2@sha256:0f81a553bb223f4cfe97973d585586439451e120eb2ed8e35d0fe9266b22fd6d\n    Port:          9900/TCP\n    Host Port:     0/TCP\n    Args:\n      agent\n    State:          Running\n      Started:      Thu, 03 Apr 2025 09:43:39 +0200\n    Ready:          True\n    Restart Count:  0\n    Readiness:      exec [/bin/stat /tmp/agent/ready] delay=0s timeout=1s period=10s #success=1 #failure=3\n    Environment:\n      AGENT_CONFIG:         (v1:metadata.annotations['telepresence.io/agent-config'])\n      _TEL_AGENT_POD_IP:    (v1:status.podIP)\n      _TEL_AGENT_POD_UID:   (v1:metadata.uid)\n      _TEL_AGENT_NAME:     hello-87f7f548f-mdg8d (v1:metadata.name)\n    Mounts:\n      /tel_app_exports from export-volume (rw)\n      /tel_app_mounts/echoserver/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zgfs5 (ro)\n      /tmp from tel-agent-tmp (rw)\n      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zgfs5 (ro)\nConditions:\n  Type                        Status\n  PodReadyToStartContainers   True \n  Initialized                 True \n  Ready                       True \n  ContainersReady             True \n  PodScheduled                True \nVolumes:\n  kube-api-access-zgfs5:\n    Type:                    Projected (a volume that contains injected data from multiple sources)\n    TokenExpirationSeconds:  3607\n    ConfigMapName:           kube-root-ca.crt\n    ConfigMapOptional:       &lt;nil&gt;\n    DownwardAPI:             true\n  export-volume:\n    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)\n    Medium:     \n    SizeLimit:  &lt;unset&gt;\n  tel-agent-tmp:\n    Type:        EmptyDir (a temporary directory that shares a pod's lifetime)\n    Medium:      \n    SizeLimit:   &lt;unset&gt;\nQoS Class:       BestEffort\nNode-Selectors:  &lt;none&gt;\nTolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s\n                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s\nEvents:\n  Type    Reason     Age    From               Message\n  ----    ------     ----   ----               -------\n  Normal  Scheduled  8m     default-scheduler  Successfully assigned default/hello-87f7f548f-mdg8d to lima-rancher-desktop\n  Normal  Pulled     7m59s  kubelet            Container image &quot;local/tel2:2.23.0-alpha.0&quot; already present on machine\n  Normal  Created    7m59s  kubelet            Created container: tel-agent-init\n  Normal  Started    7m59s  kubelet            Started container tel-agent-init\n  Normal  Pulled     7m58s  kubelet            Container image &quot;registry.k8s.io/echoserver:1.9&quot; already present on machine\n  Normal  Created    7m58s  kubelet            Created container: echoserver\n  Normal  Started    7m58s  kubelet            Started container echoserver\n  Normal  Pulled     7m58s  kubelet            Container image &quot;local/tel2:2.23.0-alpha.0&quot; already present on machine\n  Normal  Created    7m58s  kubelet            Created container: traffic-agent\n  Normal  Started    7m58s  kubelet            Started container traffic-agent\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">kubectl describe pod hello-774455b6f5-6x6vs</span>\n<span class=\"pl-c1\">Name:             hello-87f7f548f-mdg8d</span>\n<span class=\"pl-c1\">Namespace:        default</span>\n<span class=\"pl-c1\">Priority:         0</span>\n<span class=\"pl-c1\">Service Account:  default</span>\n<span class=\"pl-c1\">Node:             lima-rancher-desktop/192.168.65.3</span>\n<span class=\"pl-c1\">Start Time:       Thu, 03 Apr 2025 09:43:37 +0200</span>\n<span class=\"pl-c1\">Labels:           app=hello</span>\n<span class=\"pl-c1\">                  pod-template-hash=87f7f548f</span>\n<span class=\"pl-c1\">                  telepresence.io/workloadEnabled=true</span>\n<span class=\"pl-c1\">                  telepresence.io/workloadKind=Deployment</span>\n<span class=\"pl-c1\">                  telepresence.io/workloadName=hello</span>\n<span class=\"pl-c1\">Annotations:      telepresence.io/agent-config:</span>\n<span class=\"pl-c1\">                    {\"agentName\":\"hello\",\"namespace\":\"default\",\"logLevel\":\"debug\",\"workloadName\":\"hello\",\"workloadKind\":\"Deployment\",\"managerHost\":\"traffic-ma...</span>\n<span class=\"pl-c1\">                  telepresence.io/inject-traffic-agent: enabled</span>\n<span class=\"pl-c1\">Status:           Running</span>\n<span class=\"pl-c1\">IP:               10.1.5.196</span>\n<span class=\"pl-c1\">IPs:</span>\n<span class=\"pl-c1\">  IP:           10.1.5.196</span>\n<span class=\"pl-c1\">Controlled By:  ReplicaSet/hello-87f7f548f</span>\n<span class=\"pl-c1\">Init Containers:</span>\n<span class=\"pl-c1\">  tel-agent-init:</span>\n<span class=\"pl-c1\">    Container ID:  docker://f3203943fb97414bee8c3ad4b11237895a8165df7aa39a8f88741b4093e491be</span>\n<span class=\"pl-c1\">    Image:         local/tel2:2.23.0-alpha.0</span>\n<span class=\"pl-c1\">    Image ID:      docker-pullable://tel2@sha256:0f81a553bb223f4cfe97973d585586439451e120eb2ed8e35d0fe9266b22fd6d</span>\n<span class=\"pl-c1\">    Port:          &lt;none&gt;</span>\n<span class=\"pl-c1\">    Host Port:     &lt;none&gt;</span>\n<span class=\"pl-c1\">    Args:</span>\n<span class=\"pl-c1\">      agent-init</span>\n<span class=\"pl-c1\">    State:          Terminated</span>\n<span class=\"pl-c1\">      Reason:       Completed</span>\n<span class=\"pl-c1\">      Exit Code:    0</span>\n<span class=\"pl-c1\">      Started:      Thu, 03 Apr 2025 09:43:38 +0200</span>\n<span class=\"pl-c1\">      Finished:     Thu, 03 Apr 2025 09:43:38 +0200</span>\n<span class=\"pl-c1\">    Ready:          True</span>\n<span class=\"pl-c1\">    Restart Count:  0</span>\n<span class=\"pl-c1\">    Environment:</span>\n<span class=\"pl-c1\">      LOG_LEVEL:     debug</span>\n<span class=\"pl-c1\">      AGENT_CONFIG:   (v1:metadata.annotations['telepresence.io/agent-config'])</span>\n<span class=\"pl-c1\">      POD_IP:         (v1:status.podIP)</span>\n<span class=\"pl-c1\">    Mounts:</span>\n<span class=\"pl-c1\">      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zgfs5 (ro)</span>\n<span class=\"pl-c1\">Containers:</span>\n<span class=\"pl-c1\">  echoserver:</span>\n<span class=\"pl-c1\">    Container ID:   docker://2ccc7a81bfe7d1f666af7b17c6415631af2f1bfdb6cb147a0ef7a345f528ac49</span>\n<span class=\"pl-c1\">    Image:          registry.k8s.io/echoserver:1.9</span>\n<span class=\"pl-c1\">    Image ID:       docker-pullable://registry.k8s.io/echoserver@sha256:10f4dbc8eeeb8806d9b3a261b2473b77ca357b290a15d91ce5a0ca5e6164b535</span>\n<span class=\"pl-c1\">    Port:           &lt;none&gt;</span>\n<span class=\"pl-c1\">    Host Port:      &lt;none&gt;</span>\n<span class=\"pl-c1\">    State:          Running</span>\n<span class=\"pl-c1\">      Started:      Thu, 03 Apr 2025 09:43:39 +0200</span>\n<span class=\"pl-c1\">    Ready:          True</span>\n<span class=\"pl-c1\">    Restart Count:  0</span>\n<span class=\"pl-c1\">    Environment:    &lt;none&gt;</span>\n<span class=\"pl-c1\">    Mounts:</span>\n<span class=\"pl-c1\">      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zgfs5 (ro)</span>\n<span class=\"pl-c1\">  traffic-agent:</span>\n<span class=\"pl-c1\">    Container ID:  docker://b4f2279e58aacdf3426c80381c29f7cc214729a7d44a40acd1a566d778d84cfa</span>\n<span class=\"pl-c1\">    Image:         local/tel2:2.23.0-alpha.0</span>\n<span class=\"pl-c1\">    Image ID:      docker-pullable://tel2@sha256:0f81a553bb223f4cfe97973d585586439451e120eb2ed8e35d0fe9266b22fd6d</span>\n<span class=\"pl-c1\">    Port:          9900/TCP</span>\n<span class=\"pl-c1\">    Host Port:     0/TCP</span>\n<span class=\"pl-c1\">    Args:</span>\n<span class=\"pl-c1\">      agent</span>\n<span class=\"pl-c1\">    State:          Running</span>\n<span class=\"pl-c1\">      Started:      Thu, 03 Apr 2025 09:43:39 +0200</span>\n<span class=\"pl-c1\">    Ready:          True</span>\n<span class=\"pl-c1\">    Restart Count:  0</span>\n<span class=\"pl-c1\">    Readiness:      exec [/bin/stat /tmp/agent/ready] delay=0s timeout=1s period=10s #success=1 #failure=3</span>\n<span class=\"pl-c1\">    Environment:</span>\n<span class=\"pl-c1\">      AGENT_CONFIG:         (v1:metadata.annotations['telepresence.io/agent-config'])</span>\n<span class=\"pl-c1\">      _TEL_AGENT_POD_IP:    (v1:status.podIP)</span>\n<span class=\"pl-c1\">      _TEL_AGENT_POD_UID:   (v1:metadata.uid)</span>\n<span class=\"pl-c1\">      _TEL_AGENT_NAME:     hello-87f7f548f-mdg8d (v1:metadata.name)</span>\n<span class=\"pl-c1\">    Mounts:</span>\n<span class=\"pl-c1\">      /tel_app_exports from export-volume (rw)</span>\n<span class=\"pl-c1\">      /tel_app_mounts/echoserver/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zgfs5 (ro)</span>\n<span class=\"pl-c1\">      /tmp from tel-agent-tmp (rw)</span>\n<span class=\"pl-c1\">      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zgfs5 (ro)</span>\n<span class=\"pl-c1\">Conditions:</span>\n<span class=\"pl-c1\">  Type                        Status</span>\n<span class=\"pl-c1\">  PodReadyToStartContainers   True </span>\n<span class=\"pl-c1\">  Initialized                 True </span>\n<span class=\"pl-c1\">  Ready                       True </span>\n<span class=\"pl-c1\">  ContainersReady             True </span>\n<span class=\"pl-c1\">  PodScheduled                True </span>\n<span class=\"pl-c1\">Volumes:</span>\n<span class=\"pl-c1\">  kube-api-access-zgfs5:</span>\n<span class=\"pl-c1\">    Type:                    Projected (a volume that contains injected data from multiple sources)</span>\n<span class=\"pl-c1\">    TokenExpirationSeconds:  3607</span>\n<span class=\"pl-c1\">    ConfigMapName:           kube-root-ca.crt</span>\n<span class=\"pl-c1\">    ConfigMapOptional:       &lt;nil&gt;</span>\n<span class=\"pl-c1\">    DownwardAPI:             true</span>\n<span class=\"pl-c1\">  export-volume:</span>\n<span class=\"pl-c1\">    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)</span>\n<span class=\"pl-c1\">    Medium:     </span>\n<span class=\"pl-c1\">    SizeLimit:  &lt;unset&gt;</span>\n<span class=\"pl-c1\">  tel-agent-tmp:</span>\n<span class=\"pl-c1\">    Type:        EmptyDir (a temporary directory that shares a pod's lifetime)</span>\n<span class=\"pl-c1\">    Medium:      </span>\n<span class=\"pl-c1\">    SizeLimit:   &lt;unset&gt;</span>\n<span class=\"pl-c1\">QoS Class:       BestEffort</span>\n<span class=\"pl-c1\">Node-Selectors:  &lt;none&gt;</span>\n<span class=\"pl-c1\">Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s</span>\n<span class=\"pl-c1\">                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s</span>\n<span class=\"pl-c1\">Events:</span>\n<span class=\"pl-c1\">  Type    Reason     Age    From               Message</span>\n<span class=\"pl-c1\">  ----    ------     ----   ----               -------</span>\n<span class=\"pl-c1\">  Normal  Scheduled  8m     default-scheduler  Successfully assigned default/hello-87f7f548f-mdg8d to lima-rancher-desktop</span>\n<span class=\"pl-c1\">  Normal  Pulled     7m59s  kubelet            Container image \"local/tel2:2.23.0-alpha.0\" already present on machine</span>\n<span class=\"pl-c1\">  Normal  Created    7m59s  kubelet            Created container: tel-agent-init</span>\n<span class=\"pl-c1\">  Normal  Started    7m59s  kubelet            Started container tel-agent-init</span>\n<span class=\"pl-c1\">  Normal  Pulled     7m58s  kubelet            Container image \"registry.k8s.io/echoserver:1.9\" already present on machine</span>\n<span class=\"pl-c1\">  Normal  Created    7m58s  kubelet            Created container: echoserver</span>\n<span class=\"pl-c1\">  Normal  Started    7m58s  kubelet            Started container echoserver</span>\n<span class=\"pl-c1\">  Normal  Pulled     7m58s  kubelet            Container image \"local/tel2:2.23.0-alpha.0\" already present on machine</span>\n<span class=\"pl-c1\">  Normal  Created    7m58s  kubelet            Created container: traffic-agent</span>\n<span class=\"pl-c1\">  Normal  Started    7m58s  kubelet            Started container traffic-agent</span></pre></div>\n<h3 dir=\"auto\">Uninstalling</h3>\n<p dir=\"auto\">You can uninstall the traffic-agent from specific deployments or from all deployments. Or you can choose to uninstall everything in which<br>\ncase the traffic-manager and all traffic-agents will be uninstalled.</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ telepresence helm uninstall\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">telepresence helm uninstall</span></pre></div>\n<p dir=\"auto\">will remove everything that was automatically installed by telepresence from the cluster.</p>\n<div class=\"highlight highlight-text-shell-session notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ telepresence uninstall hello\"><pre class=\"notranslate\">$ <span class=\"pl-s1\">telepresence uninstall hello</span></pre></div>\n<p dir=\"auto\">will remove the traffic-agent and the configmap entry.</p>\n<h3 dir=\"auto\">Troubleshooting</h3>\n<p dir=\"auto\">The telepresence background processes <code class=\"notranslate\">daemon</code> and <code class=\"notranslate\">connector</code> both produces log files that can be very helpful when problems are<br>\nencountered. The files are named <code class=\"notranslate\">daemon.log</code> and <code class=\"notranslate\">connector.log</code>. The location of the logs differ depending on what platform that is used:</p>\n<ul dir=\"auto\">\n<li>macOS <code class=\"notranslate\">~/Library/Logs/telepresence</code></li>\n<li>Linux <code class=\"notranslate\">~/.cache/telepresence/logs</code></li>\n<li>Windows <code class=\"notranslate\">\"%USERPROFILE%\\AppData\\Local\\logs\"</code></li>\n</ul>\n<h2 dir=\"auto\">How it works</h2>\n<p dir=\"auto\">When Telepresence 2 connects to a Kubernetes cluster, it:</p>\n<ol dir=\"auto\">\n<li>Ensures Traffic Manager is installed in the cluster.</li>\n<li>Looks for the relevant subnets in the kubernetes cluster.</li>\n<li>Creates a Virtual Network Interface (VIF).</li>\n<li>Assigns the cluster's subnets to the VIF.</li>\n<li>Binds itself to VIF and starts routing traffic to the traffic-manager, or a traffic-agent if one is present.</li>\n<li>Starts listening for, and serving DNS requests, by passing a selected portion to the traffic-manager or traffic-agent.</li>\n</ol>\n<p dir=\"auto\">When a locally running application makes a network request to a service in the cluster, Telepresence will resolve the name to an address within the cluster.<br>\nThe operating system then sees that the TUN device has an address in the same subnet as the address of the outgoing packets and sends them to <code class=\"notranslate\">tel0</code>.<br>\nTelepresence is on the other side of <code class=\"notranslate\">tel0</code> and picks up the packets, injecting them into the cluster through a gRPC connection with Traffic Manager.</p>\n<h2 dir=\"auto\">Troubleshooting</h2>\n<p dir=\"auto\">Visit the troubleshooting section in the Telepresence documentation for more advice:<br>\n<a href=\"https://telepresence.io/docs/troubleshooting/\" rel=\"nofollow\">Troubleshooting</a></p>\n<p dir=\"auto\">Or discuss with the community in the <a href=\"https://communityinviter.com/apps/cloud-native/cncf\" rel=\"nofollow\">CNCF Slack</a> in the <a href=\"https://cloud-native.slack.com/archives/C06B36KJ85P\" rel=\"nofollow\">#telepresence-oss</a> channel.</p>","updatedAt":"2025-05-22T01:50:14Z","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":"telepresenceio","color":"0d02a4"}}]},"comments":{"edges":[]}}},"pageContext":{"number":551,"previous":{"title":"influxdata/telegraf: 用于收集、处理、聚合和写入指标、日志和其他任意数据的代理，提供超过 300 个插件的综合套件，涵盖系统监控、云服务和消息传递等广泛功能","number":550},"next":{"title":"grafana/tempo:  Grafana Tempo 是一个高容量、最小依赖的分布式跟踪后端。","number":552}}},
    "staticQueryHashes": ["151096407","2861350382"]}