{"@attributes":{"version":"2.0"},"channel":{"title":"Cloud Native Cookbook","link":"https:\/\/cloudnative.lei6393.com\/","description":"Recent content on Cloud Native Cookbook","generator":"Hugo","language":"zh","copyright":"Copyright (c) 2024-2025 Cloud Native Cookbook","lastBuildDate":"Thu, 12 Feb 2026 09:28:11 +0800","item":[{"title":"API Server \u542f\u52a8\u6d41\u7a0b","link":"https:\/\/cloudnative.lei6393.com\/kubernetes\/03-apiserver\/01-startup\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cloudnative.lei6393.com\/kubernetes\/03-apiserver\/01-startup\/","description":"<p>\u672c\u6587\u6df1\u5165\u5206\u6790 kube-apiserver \u7684\u542f\u52a8\u6d41\u7a0b\uff0c\u5305\u62ec\u547d\u4ee4\u89e3\u6790\u3001\u914d\u7f6e\u6784\u5efa\u3001\u7ec4\u4ef6\u521d\u59cb\u5316\u548c\u670d\u52a1\u542f\u52a8\u7b49\u5173\u952e\u9636\u6bb5\u3002<\/p>\n<h2 id=\"1-\u5165\u53e3\u4e0e\u547d\u4ee4\u89e3\u6790\">1. \u5165\u53e3\u4e0e\u547d\u4ee4\u89e3\u6790<\/h2>\n<h3 id=\"11-main-\u5165\u53e3\">1.1 main \u5165\u53e3<\/h3>\n<p>API Server \u7684\u5165\u53e3\u4f4d\u4e8e <code>cmd\/kube-apiserver\/apiserver.go<\/code>\uff1a<\/p>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ cmd\/kube-apiserver\/apiserver.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">command<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewAPIServerCommand<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">code<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">cli<\/span><span class=\"p\">.<\/span><span class=\"nf\">Run<\/span><span class=\"p\">(<\/span><span class=\"nx\">command<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">os<\/span><span class=\"p\">.<\/span><span class=\"nf\">Exit<\/span><span class=\"p\">(<\/span><span class=\"nx\">code<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"12-cobra-\u547d\u4ee4\u6846\u67b6\">1.2 Cobra \u547d\u4ee4\u6846\u67b6<\/h3>\n<p>API Server \u4f7f\u7528 Cobra \u6846\u67b6\u5904\u7406\u547d\u4ee4\u884c\u53c2\u6570\uff1a<\/p>"},{"title":"API \u4e0e\u6570\u636e\u5b58\u50a8","link":"https:\/\/cloudnative.lei6393.com\/calico\/03-calico-control-plane\/01-api-and-datastore\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cloudnative.lei6393.com\/calico\/03-calico-control-plane\/01-api-and-datastore\/","description":"<h2 id=\"\u6982\u8ff0\">\u6982\u8ff0<\/h2>\n<p>Calico \u4f7f\u7528 Kubernetes \u98ce\u683c\u7684 API \u6765\u7ba1\u7406\u7f51\u7edc\u914d\u7f6e\u548c\u7b56\u7565\u3002\u672c\u7ae0\u4ecb\u7ecd Calico \u7684 API \u8d44\u6e90\u7c7b\u578b\u3001CRD \u5b9a\u4e49\u3001\u6570\u636e\u5b58\u50a8\u62bd\u8c61\u5c42\uff0c\u4ee5\u53ca libcalico-go \u5ba2\u6237\u7aef\u5e93\u7684\u4f7f\u7528\u3002<\/p>\n<h2 id=\"\u524d\u7f6e\u77e5\u8bc6\">\u524d\u7f6e\u77e5\u8bc6<\/h2>\n<ul>\n<li>Kubernetes API \u548c CRD \u57fa\u7840<\/li>\n<li>Go \u8bed\u8a00\u57fa\u7840<\/li>\n<li>etcd \u57fa\u7840\uff08\u53ef\u9009\uff09<\/li>\n<\/ul>\n<h2 id=\"calico-api-\u8d44\u6e90\u7c7b\u578b\">Calico API \u8d44\u6e90\u7c7b\u578b<\/h2>\n<h3 id=\"\u8d44\u6e90\u5206\u7c7b\">\u8d44\u6e90\u5206\u7c7b<\/h3>\n<div class=\"mermaid text-center\">graph TB\n subgraph resources[\"Calico API \u8d44\u6e90\"]\n subgraph network[\"\u7f51\u7edc\u8d44\u6e90\"]\n IPPOOL[\"IPPool<br\/>IP \u5730\u5740\u6c60\"]\n IPRESERV[\"IPReservation<br\/>IP \u9884\u7559\"]\n BGP_CONF[\"BGPConfiguration<br\/>BGP \u5168\u5c40\u914d\u7f6e\"]\n BGP_PEER[\"BGPPeer<br\/>BGP \u5bf9\u7b49\u4f53\"]\n end\n\n subgraph policy[\"\u7b56\u7565\u8d44\u6e90\"]\n NP[\"NetworkPolicy<br\/>\u547d\u540d\u7a7a\u95f4\u7b56\u7565\"]\n GNP[\"GlobalNetworkPolicy<br\/>\u5168\u5c40\u7b56\u7565\"]\n TIER[\"Tier<br\/>\u7b56\u7565\u5c42\"]\n PROFILE[\"Profile<br\/>\u7aef\u70b9\u914d\u7f6e\u6587\u4ef6\"]\n NSS[\"NetworkSet<br\/>IP \u96c6\u5408\"]\n GNSS[\"GlobalNetworkSet<br\/>\u5168\u5c40 IP \u96c6\u5408\"]\n end\n\n subgraph endpoint[\"\u7aef\u70b9\u8d44\u6e90\"]\n WEP[\"WorkloadEndpoint<br\/>\u5de5\u4f5c\u8d1f\u8f7d\u7aef\u70b9\"]\n HEP[\"HostEndpoint<br\/>\u4e3b\u673a\u7aef\u70b9\"]\n end\n\n subgraph node_res[\"\u8282\u70b9\u8d44\u6e90\"]\n NODE[\"Node<br\/>Calico \u8282\u70b9\"]\n FELIX_CONF[\"FelixConfiguration<br\/>Felix \u914d\u7f6e\"]\n end\n end\n<\/div>\n\n<h3 id=\"\u6838\u5fc3\u8d44\u6e90\u8be6\u89e3\">\u6838\u5fc3\u8d44\u6e90\u8be6\u89e3<\/h3>\n<table>\n <thead>\n <tr>\n <th>\u8d44\u6e90<\/th>\n <th>\u4f5c\u7528\u57df<\/th>\n <th>\u8bf4\u660e<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><strong>IPPool<\/strong><\/td>\n <td>Global<\/td>\n <td>\u5b9a\u4e49 Pod IP \u5730\u5740\u8303\u56f4<\/td>\n <\/tr>\n <tr>\n <td><strong>NetworkPolicy<\/strong><\/td>\n <td>Namespaced<\/td>\n <td>\u547d\u540d\u7a7a\u95f4\u7ea7\u7f51\u7edc\u7b56\u7565<\/td>\n <\/tr>\n <tr>\n <td><strong>GlobalNetworkPolicy<\/strong><\/td>\n <td>Global<\/td>\n <td>\u96c6\u7fa4\u7ea7\u7f51\u7edc\u7b56\u7565<\/td>\n <\/tr>\n <tr>\n <td><strong>WorkloadEndpoint<\/strong><\/td>\n <td>Namespaced<\/td>\n <td>Pod \u7f51\u7edc\u7aef\u70b9\u4fe1\u606f<\/td>\n <\/tr>\n <tr>\n <td><strong>HostEndpoint<\/strong><\/td>\n <td>Global<\/td>\n <td>\u4e3b\u673a\u7f51\u7edc\u7aef\u70b9<\/td>\n <\/tr>\n <tr>\n <td><strong>BGPPeer<\/strong><\/td>\n <td>Global<\/td>\n <td>BGP \u90bb\u5c45\u914d\u7f6e<\/td>\n <\/tr>\n <tr>\n <td><strong>BGPConfiguration<\/strong><\/td>\n <td>Global<\/td>\n <td>BGP \u5168\u5c40\u8bbe\u7f6e<\/td>\n <\/tr>\n <tr>\n <td><strong>FelixConfiguration<\/strong><\/td>\n <td>Global<\/td>\n <td>Felix \u914d\u7f6e<\/td>\n <\/tr>\n <tr>\n <td><strong>Node<\/strong><\/td>\n <td>Global<\/td>\n <td>Calico \u8282\u70b9\u4fe1\u606f<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h2 id=\"crd-\u5b9a\u4e49\">CRD \u5b9a\u4e49<\/h2>\n<h3 id=\"\u4ee3\u7801\u4f4d\u7f6e\">\u4ee3\u7801\u4f4d\u7f6e<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <pre tabindex=\"0\"><code>api\/\n\u251c\u2500\u2500 pkg\/\n\u2502 \u251c\u2500\u2500 apis\/\n\u2502 \u2502 \u2514\u2500\u2500 projectcalico\/\n\u2502 \u2502 \u2514\u2500\u2500 v3\/ # API \u7c7b\u578b\u5b9a\u4e49\n\u2502 \u2502 \u251c\u2500\u2500 bgpconfig.go\n\u2502 \u2502 \u251c\u2500\u2500 bgppeer.go\n\u2502 \u2502 \u251c\u2500\u2500 felixconfig.go\n\u2502 \u2502 \u251c\u2500\u2500 ippool.go\n\u2502 \u2502 \u251c\u2500\u2500 networkpolicy.go\n\u2502 \u2502 \u251c\u2500\u2500 globalnetworkpolicy.go\n\u2502 \u2502 \u251c\u2500\u2500 profile.go\n\u2502 \u2502 \u251c\u2500\u2500 workloadendpoint.go\n\u2502 \u2502 \u2514\u2500\u2500 ...\n\u2502 \u2514\u2500\u2500 lib\/\n\u2502 \u2514\u2500\u2500 numorstring\/ # \u7aef\u53e3\u8303\u56f4\u7b49\u7c7b\u578b\n\u2514\u2500\u2500 go.mod<\/code><\/pre>\n <\/figure>\n<\/div>\n<h3 id=\"ippool-\u793a\u4f8b\">IPPool \u793a\u4f8b<\/h3>\n<p><strong>\u6587\u4ef6<\/strong>: <code>api\/pkg\/apis\/projectcalico\/v3\/ippool.go<\/code><\/p>"},{"title":"BIRD \u4e0e confd","link":"https:\/\/cloudnative.lei6393.com\/calico\/06-bgp-networking\/01-bird-and-confd\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cloudnative.lei6393.com\/calico\/06-bgp-networking\/01-bird-and-confd\/","description":"<h2 id=\"\u6982\u8ff0\">\u6982\u8ff0<\/h2>\n<p>Calico \u4f7f\u7528 BIRD\uff08BIRD Internet Routing Daemon\uff09\u4f5c\u4e3a BGP \u8def\u7531\u5b88\u62a4\u8fdb\u7a0b\uff0c\u901a\u8fc7 confd \u52a8\u6001\u751f\u6210 BIRD \u914d\u7f6e\u3002\u672c\u6587\u6df1\u5165\u5206\u6790 BIRD \u7684\u914d\u7f6e\u7ed3\u6784\u3001confd \u7684\u6a21\u677f\u6e32\u67d3\u673a\u5236\u4ee5\u53ca\u914d\u7f6e\u70ed\u66f4\u65b0\u6d41\u7a0b\u3002<\/p>\n<h2 id=\"\u524d\u7f6e\u77e5\u8bc6\">\u524d\u7f6e\u77e5\u8bc6<\/h2>\n<ul>\n<li>BGP \u534f\u8bae\u57fa\u7840<\/li>\n<li>Calico \u67b6\u6784\u6982\u89c8<\/li>\n<li>Go template \u8bed\u6cd5<\/li>\n<\/ul>\n<h2 id=\"\u67b6\u6784\u603b\u89c8\">\u67b6\u6784\u603b\u89c8<\/h2>\n<div class=\"mermaid text-center\">flowchart TB\n subgraph datastore[\"\u6570\u636e\u5b58\u50a8\"]\n BGPCONFIG[\"BGPConfiguration\"]\n BGPPEER[\"BGPPeer\"]\n NODE[\"Node\"]\n end\n\n subgraph confd[\"confd\"]\n CLIENT[\"Calico Client<br\/>Watch \u8d44\u6e90\u53d8\u66f4\"]\n BGP_PROC[\"BGP Processor<br\/>\u5904\u7406 BGP \u914d\u7f6e\"]\n TEMPLATE[\"Template Processor<br\/>\u6e32\u67d3\u6a21\u677f\"]\n end\n\n subgraph output[\"\u8f93\u51fa\"]\n BIRD_CFG[\"bird.cfg<br\/>bird6.cfg\"]\n BIRD[\"BIRD Daemon\"]\n end\n\n BGPCONFIG --> CLIENT\n BGPPEER --> CLIENT\n NODE --> CLIENT\n\n CLIENT --> BGP_PROC\n BGP_PROC --> TEMPLATE\n TEMPLATE --> BIRD_CFG\n BIRD_CFG -->|\"SIGHUP\"| BIRD\n<\/div>\n\n<h2 id=\"bird-\u7b80\u4ecb\">BIRD \u7b80\u4ecb<\/h2>\n<h3 id=\"\u4ec0\u4e48\u662f-bird\">\u4ec0\u4e48\u662f BIRD<\/h3>\n<p>BIRD \u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u8def\u7531\u5b88\u62a4\u8fdb\u7a0b\uff0c\u652f\u6301\u591a\u79cd\u8def\u7531\u534f\u8bae\uff1a<\/p>"},{"title":"Calico \u7b56\u7565\u6a21\u578b","link":"https:\/\/cloudnative.lei6393.com\/calico\/05-policy-enforcement\/01-policy-model\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cloudnative.lei6393.com\/calico\/05-policy-enforcement\/01-policy-model\/","description":"<h2 id=\"\u6982\u8ff0\">\u6982\u8ff0<\/h2>\n<p>Calico \u63d0\u4f9b\u4e86\u5f3a\u5927\u800c\u7075\u6d3b\u7684\u7f51\u7edc\u7b56\u7565\u6a21\u578b\uff0c\u652f\u6301 Kubernetes \u539f\u751f NetworkPolicy \u4ee5\u53ca Calico \u6269\u5c55\u7684 NetworkPolicy \u548c GlobalNetworkPolicy\u3002\u672c\u6587\u6df1\u5165\u5206\u6790 Calico \u7b56\u7565\u7684\u6570\u636e\u6a21\u578b\u3001\u5c42\u7ea7\u7ed3\u6784\u3001\u89c4\u5219\u8bed\u4e49\u4ee5\u53ca\u4e0e Kubernetes NetworkPolicy \u7684\u5173\u7cfb\u3002<\/p>\n<h2 id=\"\u524d\u7f6e\u77e5\u8bc6\">\u524d\u7f6e\u77e5\u8bc6<\/h2>\n<ul>\n<li>Kubernetes NetworkPolicy \u57fa\u7840<\/li>\n<li>Calico \u67b6\u6784\u7ec4\u4ef6\uff08Felix\u3001kube-controllers\uff09<\/li>\n<li>\u6807\u7b7e\u9009\u62e9\u5668\u8bed\u6cd5<\/li>\n<\/ul>\n<h2 id=\"\u7b56\u7565\u7c7b\u578b\u603b\u89c8\">\u7b56\u7565\u7c7b\u578b\u603b\u89c8<\/h2>\n<h3 id=\"\u7b56\u7565\u5c42\u7ea7\u7ed3\u6784\">\u7b56\u7565\u5c42\u7ea7\u7ed3\u6784<\/h3>\n<div class=\"mermaid text-center\">graph TB\n subgraph tier1[\"Tier - \u7b56\u7565\u5206\u5c42\"]\n T1[\"kube-admin<br\/>Order: 1,000\"]\n T2[\"default<br\/>Order: 1,000,000\"]\n T3[\"kube-baseline<br\/>Order: 10,000,000\"]\n end\n\n subgraph policies[\"\u7b56\u7565\u7c7b\u578b\"]\n GNP[\"GlobalNetworkPolicy<br\/>\u96c6\u7fa4\u8303\u56f4\"]\n NP[\"NetworkPolicy<br\/>\u547d\u540d\u7a7a\u95f4\u8303\u56f4\"]\n KNP[\"K8s NetworkPolicy<br\/>\u8f6c\u6362\u4e3a Calico NP\"]\n PROF[\"Profile<br\/>\u57fa\u4e8e NS\/SA \u7684\u9ed8\u8ba4\u89c4\u5219\"]\n end\n\n T1 --> GNP\n T2 --> NP\n T2 --> KNP\n T3 --> PROF\n\n style tier1 fill:#e1f5fe\n style policies fill:#fff3e0\n<\/div>\n\n<h3 id=\"\u7b56\u7565\u8d44\u6e90\u5bf9\u6bd4\">\u7b56\u7565\u8d44\u6e90\u5bf9\u6bd4<\/h3>\n<table>\n <thead>\n <tr>\n <th>\u7279\u6027<\/th>\n <th>K8s NetworkPolicy<\/th>\n <th>Calico NetworkPolicy<\/th>\n <th>GlobalNetworkPolicy<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td>\u4f5c\u7528\u8303\u56f4<\/td>\n <td>Namespace<\/td>\n <td>Namespace<\/td>\n <td>\u96c6\u7fa4<\/td>\n <\/tr>\n <tr>\n <td>Tier \u652f\u6301<\/td>\n <td>\u56fa\u5b9a default<\/td>\n <td>\u53ef\u914d\u7f6e<\/td>\n <td>\u53ef\u914d\u7f6e<\/td>\n <\/tr>\n <tr>\n <td>Order \u63a7\u5236<\/td>\n <td>\u65e0<\/td>\n <td>\u652f\u6301<\/td>\n <td>\u652f\u6301<\/td>\n <\/tr>\n <tr>\n <td>DoNotTrack<\/td>\n <td>\u4e0d\u652f\u6301<\/td>\n <td>\u4e0d\u652f\u6301<\/td>\n <td>\u652f\u6301<\/td>\n <\/tr>\n <tr>\n <td>PreDNAT<\/td>\n <td>\u4e0d\u652f\u6301<\/td>\n <td>\u4e0d\u652f\u6301<\/td>\n <td>\u652f\u6301<\/td>\n <\/tr>\n <tr>\n <td>ApplyOnForward<\/td>\n <td>\u4e0d\u652f\u6301<\/td>\n <td>\u4e0d\u652f\u6301<\/td>\n <td>\u652f\u6301<\/td>\n <\/tr>\n <tr>\n <td>\u4e3b\u673a\u7aef\u70b9<\/td>\n <td>\u4e0d\u652f\u6301<\/td>\n <td>\u4e0d\u652f\u6301<\/td>\n <td>\u652f\u6301<\/td>\n <\/tr>\n <tr>\n <td>\u670d\u52a1\u8d26\u6237\u9009\u62e9\u5668<\/td>\n <td>\u4e0d\u652f\u6301<\/td>\n <td>\u652f\u6301<\/td>\n <td>\u652f\u6301<\/td>\n <\/tr>\n <tr>\n <td>HTTP \u89c4\u5219<\/td>\n <td>\u4e0d\u652f\u6301<\/td>\n <td>\u652f\u6301<\/td>\n <td>\u652f\u6301<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h2 id=\"\u6838\u5fc3\u6570\u636e\u7ed3\u6784\">\u6838\u5fc3\u6570\u636e\u7ed3\u6784<\/h2>\n<h3 id=\"rule-\u7ed3\u6784\">Rule \u7ed3\u6784<\/h3>\n<p>Rule \u662f\u7b56\u7565\u7684\u6838\u5fc3\u5355\u5143\uff0c\u5b9a\u4e49\u4e86\u5339\u914d\u6761\u4ef6\u548c\u52a8\u4f5c\uff1a<\/p>"},{"title":"client-go \u67b6\u6784\u6982\u89c8","link":"https:\/\/cloudnative.lei6393.com\/kubernetes\/12-client-go\/01-overview\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cloudnative.lei6393.com\/kubernetes\/12-client-go\/01-overview\/","description":"<h2 id=\"\u6982\u8ff0\">\u6982\u8ff0<\/h2>\n<p>client-go \u662f Kubernetes \u5b98\u65b9\u63d0\u4f9b\u7684 Go \u8bed\u8a00\u5ba2\u6237\u7aef\u5e93\uff0c\u7528\u4e8e\u4e0e Kubernetes API Server \u8fdb\u884c\u4ea4\u4e92\u3002\u5b83\u662f\u5f00\u53d1 Kubernetes \u63a7\u5236\u5668\u3001Operator \u548c\u5404\u79cd\u96c6\u6210\u5de5\u5177\u7684\u57fa\u7840\u3002\u672c\u7ae0\u4ecb\u7ecd client-go \u7684\u6574\u4f53\u67b6\u6784\u548c\u6838\u5fc3\u7ec4\u4ef6\u3002<\/p>\n<h2 id=\"\u6574\u4f53\u67b6\u6784\">\u6574\u4f53\u67b6\u6784<\/h2>\n<h3 id=\"\u7ec4\u4ef6\u7ed3\u6784\">\u7ec4\u4ef6\u7ed3\u6784<\/h3>\n<div class=\"mermaid text-center\">graph TB\n subgraph client_go[\"client-go\"]\n subgraph clients[\"\u5ba2\u6237\u7aef\u5c42\"]\n REST[\"RESTClient\"]\n Clientset[\"Clientset\"]\n Dynamic[\"DynamicClient\"]\n Discovery[\"DiscoveryClient\"]\n end\n\n subgraph informers[\"Informer \u5c42\"]\n SharedInformer[\"SharedInformerFactory\"]\n Informer[\"Informer\"]\n Lister[\"Lister\"]\n end\n\n subgraph tools[\"\u5de5\u5177\u5c42\"]\n Reflector[\"Reflector\"]\n DeltaFIFO[\"DeltaFIFO\"]\n Indexer[\"Indexer\"]\n WorkQueue[\"WorkQueue\"]\n end\n\n subgraph utilities[\"\u8f85\u52a9\u5de5\u5177\"]\n LeaderElection[\"Leader Election\"]\n Record[\"Event Recorder\"]\n Retry[\"Retry Utilities\"]\n end\n end\n\n subgraph apiserver[\"API Server\"]\n API[\"Kubernetes API\"]\n end\n\n REST --> API\n Clientset --> REST\n Dynamic --> REST\n Discovery --> REST\n SharedInformer --> Informer\n Informer --> Lister\n Informer --> Reflector\n Reflector --> DeltaFIFO\n DeltaFIFO --> Indexer\n<\/div>\n\n<h3 id=\"\u4ee3\u7801\u76ee\u5f55\u7ed3\u6784\">\u4ee3\u7801\u76ee\u5f55\u7ed3\u6784<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <pre tabindex=\"0\"><code>staging\/src\/k8s.io\/client-go\/\n\u251c\u2500\u2500 discovery\/ # \u8d44\u6e90\u53d1\u73b0\u5ba2\u6237\u7aef\n\u251c\u2500\u2500 dynamic\/ # \u52a8\u6001\u5ba2\u6237\u7aef\n\u251c\u2500\u2500 informers\/ # SharedInformerFactory\n\u251c\u2500\u2500 kubernetes\/ # \u7c7b\u578b\u5316 Clientset\n\u251c\u2500\u2500 listers\/ # Lister \u63a5\u53e3\n\u251c\u2500\u2500 plugin\/ # \u8ba4\u8bc1\u63d2\u4ef6\n\u251c\u2500\u2500 rest\/ # REST \u5ba2\u6237\u7aef\n\u251c\u2500\u2500 scale\/ # Scale \u5ba2\u6237\u7aef\n\u251c\u2500\u2500 tools\/\n\u2502 \u251c\u2500\u2500 cache\/ # Informer\u3001Reflector\u3001DeltaFIFO\n\u2502 \u251c\u2500\u2500 clientcmd\/ # kubeconfig \u5904\u7406\n\u2502 \u251c\u2500\u2500 leaderelection\/# Leader \u9009\u4e3e\n\u2502 \u251c\u2500\u2500 record\/ # \u4e8b\u4ef6\u8bb0\u5f55\n\u2502 \u2514\u2500\u2500 watch\/ # Watch \u5de5\u5177\n\u251c\u2500\u2500 transport\/ # HTTP \u4f20\u8f93\u5c42\n\u2514\u2500\u2500 util\/\n \u251c\u2500\u2500 retry\/ # \u91cd\u8bd5\u5de5\u5177\n \u2514\u2500\u2500 workqueue\/ # \u5de5\u4f5c\u961f\u5217<\/code><\/pre>\n <\/figure>\n<\/div>\n<h2 id=\"\u5ba2\u6237\u7aef\u7c7b\u578b\">\u5ba2\u6237\u7aef\u7c7b\u578b<\/h2>\n<h3 id=\"restclient\">RESTClient<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ RESTClient \u662f\u6700\u5e95\u5c42\u7684\u5ba2\u6237\u7aef<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u76f4\u63a5\u4e0e API Server \u8fdb\u884c HTTP \u4ea4\u4e92<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"s\">&#34;k8s.io\/client-go\/rest&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u521b\u5efa RESTClient<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">config<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">rest<\/span><span class=\"p\">.<\/span><span class=\"nf\">InClusterConfig<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8bbe\u7f6e API \u8def\u5f84<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">config<\/span><span class=\"p\">.<\/span><span class=\"nx\">APIPath<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;\/api&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">config<\/span><span class=\"p\">.<\/span><span class=\"nx\">GroupVersion<\/span> <span class=\"p\">=<\/span> <span class=\"o\">&amp;<\/span><span class=\"nx\">v1<\/span><span class=\"p\">.<\/span><span class=\"nx\">SchemeGroupVersion<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">config<\/span><span class=\"p\">.<\/span><span class=\"nx\">NegotiatedSerializer<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">scheme<\/span><span class=\"p\">.<\/span><span class=\"nx\">Codecs<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">restClient<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">rest<\/span><span class=\"p\">.<\/span><span class=\"nf\">RESTClientFor<\/span><span class=\"p\">(<\/span><span class=\"nx\">config<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u53d1\u9001\u8bf7\u6c42<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">result<\/span> <span class=\"o\">:=<\/span> <span class=\"o\">&amp;<\/span><span class=\"nx\">v1<\/span><span class=\"p\">.<\/span><span class=\"nx\">PodList<\/span><span class=\"p\">{}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">err<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">restClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">Get<\/span><span class=\"p\">().<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">Namespace<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;default&#34;<\/span><span class=\"p\">).<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">Resource<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;pods&#34;<\/span><span class=\"p\">).<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">Do<\/span><span class=\"p\">(<\/span><span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nf\">TODO<\/span><span class=\"p\">()).<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">Into<\/span><span class=\"p\">(<\/span><span class=\"nx\">result<\/span><span class=\"p\">)<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"clientset\">Clientset<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Clientset \u662f\u7c7b\u578b\u5316\u5ba2\u6237\u7aef<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u63d0\u4f9b\u6240\u6709\u5185\u7f6e\u8d44\u6e90\u7684\u7c7b\u578b\u5b89\u5168\u8bbf\u95ee<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"s\">&#34;k8s.io\/client-go\/kubernetes&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u521b\u5efa Clientset<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">clientset<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">kubernetes<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewForConfig<\/span><span class=\"p\">(<\/span><span class=\"nx\">config<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8bbf\u95ee\u6838\u5fc3 API<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">pods<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">clientset<\/span><span class=\"p\">.<\/span><span class=\"nf\">CoreV1<\/span><span class=\"p\">().<\/span><span class=\"nf\">Pods<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;default&#34;<\/span><span class=\"p\">).<\/span><span class=\"nf\">List<\/span><span class=\"p\">(<\/span><span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nf\">TODO<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">ListOptions<\/span><span class=\"p\">{})<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8bbf\u95ee apps API<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">deployments<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">clientset<\/span><span class=\"p\">.<\/span><span class=\"nf\">AppsV1<\/span><span class=\"p\">().<\/span><span class=\"nf\">Deployments<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;default&#34;<\/span><span class=\"p\">).<\/span><span class=\"nf\">List<\/span><span class=\"p\">(<\/span><span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nf\">TODO<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">ListOptions<\/span><span class=\"p\">{})<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8bbf\u95ee batch API<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">jobs<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">clientset<\/span><span class=\"p\">.<\/span><span class=\"nf\">BatchV1<\/span><span class=\"p\">().<\/span><span class=\"nf\">Jobs<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;default&#34;<\/span><span class=\"p\">).<\/span><span class=\"nf\">List<\/span><span class=\"p\">(<\/span><span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nf\">TODO<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">ListOptions<\/span><span class=\"p\">{})<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"dynamicclient\">DynamicClient<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ DynamicClient \u662f\u975e\u7c7b\u578b\u5316\u5ba2\u6237\u7aef<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u7528\u4e8e\u8bbf\u95ee\u4efb\u610f\u8d44\u6e90\uff08\u5305\u62ec CRD\uff09<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;k8s.io\/client-go\/dynamic&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;k8s.io\/apimachinery\/pkg\/runtime\/schema&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u521b\u5efa DynamicClient<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">dynamicClient<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">dynamic<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewForConfig<\/span><span class=\"p\">(<\/span><span class=\"nx\">config<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5b9a\u4e49 GVR<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">gvr<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">schema<\/span><span class=\"p\">.<\/span><span class=\"nx\">GroupVersionResource<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Group<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;apps&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Version<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;v1&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Resource<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;deployments&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u83b7\u53d6\u8d44\u6e90<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">unstructuredList<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">dynamicClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">Resource<\/span><span class=\"p\">(<\/span><span class=\"nx\">gvr<\/span><span class=\"p\">).<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">Namespace<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;default&#34;<\/span><span class=\"p\">).<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">List<\/span><span class=\"p\">(<\/span><span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nf\">TODO<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">ListOptions<\/span><span class=\"p\">{})<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"discoveryclient\">DiscoveryClient<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ DiscoveryClient \u7528\u4e8e\u53d1\u73b0 API \u8d44\u6e90<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"s\">&#34;k8s.io\/client-go\/discovery&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u521b\u5efa DiscoveryClient<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">discoveryClient<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">discovery<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewDiscoveryClientForConfig<\/span><span class=\"p\">(<\/span><span class=\"nx\">config<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u83b7\u53d6 API \u7ec4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">apiGroups<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">discoveryClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">ServerGroups<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u83b7\u53d6 API \u8d44\u6e90<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">resources<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">discoveryClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">ServerResources<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u83b7\u53d6\u670d\u52a1\u5668\u7248\u672c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">version<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">discoveryClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">ServerVersion<\/span><span class=\"p\">()<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"informer-\u673a\u5236\">Informer \u673a\u5236<\/h2>\n<h3 id=\"sharedinformerfactory\">SharedInformerFactory<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ SharedInformerFactory \u7ba1\u7406\u6240\u6709 Informer<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u786e\u4fdd\u6bcf\u79cd\u8d44\u6e90\u53ea\u6709\u4e00\u4e2a Informer<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;k8s.io\/client-go\/informers&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;time&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u521b\u5efa SharedInformerFactory<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">factory<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">informers<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewSharedInformerFactory<\/span><span class=\"p\">(<\/span><span class=\"nx\">clientset<\/span><span class=\"p\">,<\/span> <span class=\"mi\">30<\/span><span class=\"o\">*<\/span><span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u83b7\u53d6\u7279\u5b9a\u8d44\u6e90\u7684 Informer<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">podInformer<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">factory<\/span><span class=\"p\">.<\/span><span class=\"nf\">Core<\/span><span class=\"p\">().<\/span><span class=\"nf\">V1<\/span><span class=\"p\">().<\/span><span class=\"nf\">Pods<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">deploymentInformer<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">factory<\/span><span class=\"p\">.<\/span><span class=\"nf\">Apps<\/span><span class=\"p\">().<\/span><span class=\"nf\">V1<\/span><span class=\"p\">().<\/span><span class=\"nf\">Deployments<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u542f\u52a8\u6240\u6709 Informer<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">stopCh<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">make<\/span><span class=\"p\">(<\/span><span class=\"kd\">chan<\/span> <span class=\"kd\">struct<\/span><span class=\"p\">{})<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">factory<\/span><span class=\"p\">.<\/span><span class=\"nf\">Start<\/span><span class=\"p\">(<\/span><span class=\"nx\">stopCh<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u7b49\u5f85\u7f13\u5b58\u540c\u6b65<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">factory<\/span><span class=\"p\">.<\/span><span class=\"nf\">WaitForCacheSync<\/span><span class=\"p\">(<\/span><span class=\"nx\">stopCh<\/span><span class=\"p\">)<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"informer-\u7ec4\u4ef6\">Informer \u7ec4\u4ef6<\/h3>\n<div class=\"mermaid text-center\">graph TB\n subgraph informer[\"Informer \u5185\u90e8\u7ed3\u6784\"]\n Controller[\"Controller\"]\n Reflector[\"Reflector\"]\n DeltaFIFO[\"DeltaFIFO\"]\n Indexer[\"Indexer (Store)\"]\n Lister[\"Lister\"]\n Handler[\"EventHandler\"]\n end\n\n subgraph api[\"API Server\"]\n Watch[\"Watch API\"]\n end\n\n Watch -->|\"\u4e8b\u4ef6\u6d41\"| Reflector\n Reflector -->|\"Add\/Update\/Delete\"| DeltaFIFO\n DeltaFIFO -->|\"Pop\"| Controller\n Controller -->|\"\u66f4\u65b0\u7f13\u5b58\"| Indexer\n Controller -->|\"\u8c03\u7528\"| Handler\n Indexer -->|\"\u63d0\u4f9b\"| Lister\n<\/div>\n\n<h2 id=\"\u5de5\u5177\u7ec4\u4ef6\">\u5de5\u5177\u7ec4\u4ef6<\/h2>\n<h3 id=\"workqueue\">WorkQueue<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ WorkQueue \u7528\u4e8e\u63a7\u5236\u5668\u7684\u5de5\u4f5c\u961f\u5217<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"s\">&#34;k8s.io\/client-go\/util\/workqueue&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u57fa\u672c\u961f\u5217<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">queue<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">workqueue<\/span><span class=\"p\">.<\/span><span class=\"nf\">New<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5ef6\u8fdf\u961f\u5217<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">delayingQueue<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">workqueue<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewDelayingQueue<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u9650\u901f\u961f\u5217\uff08\u6700\u5e38\u7528\uff09<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">rateLimitingQueue<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">workqueue<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewRateLimitingQueue<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">workqueue<\/span><span class=\"p\">.<\/span><span class=\"nf\">DefaultControllerRateLimiter<\/span><span class=\"p\">(),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6dfb\u52a0\u5143\u7d20<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">queue<\/span><span class=\"p\">.<\/span><span class=\"nf\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;key&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5ef6\u8fdf\u6dfb\u52a0<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">delayingQueue<\/span><span class=\"p\">.<\/span><span class=\"nf\">AddAfter<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;key&#34;<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"o\">*<\/span><span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u83b7\u53d6\u5143\u7d20<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">shutdown<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">queue<\/span><span class=\"p\">.<\/span><span class=\"nf\">Get<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">shutdown<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">defer<\/span> <span class=\"nx\">queue<\/span><span class=\"p\">.<\/span><span class=\"nf\">Done<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5904\u7406\u5931\u8d25\uff0c\u91cd\u65b0\u5165\u961f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nf\">process<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">);<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">queue<\/span><span class=\"p\">.<\/span><span class=\"nf\">AddRateLimited<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"leader-election\">Leader Election<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Leader Election \u7528\u4e8e\u9ad8\u53ef\u7528\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;k8s.io\/client-go\/tools\/leaderelection&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;k8s.io\/client-go\/tools\/leaderelection\/resourcelock&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u521b\u5efa\u9501<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">lock<\/span> <span class=\"o\">:=<\/span> <span class=\"o\">&amp;<\/span><span class=\"nx\">resourcelock<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaseLock<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">LeaseMeta<\/span><span class=\"p\">:<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">ObjectMeta<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Name<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;my-controller-lock&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Namespace<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;default&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Client<\/span><span class=\"p\">:<\/span> <span class=\"nx\">clientset<\/span><span class=\"p\">.<\/span><span class=\"nf\">CoordinationV1<\/span><span class=\"p\">(),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">LockConfig<\/span><span class=\"p\">:<\/span> <span class=\"nx\">resourcelock<\/span><span class=\"p\">.<\/span><span class=\"nx\">ResourceLockConfig<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Identity<\/span><span class=\"p\">:<\/span> <span class=\"nx\">hostname<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u914d\u7f6e\u9009\u4e3e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">leaderelection<\/span><span class=\"p\">.<\/span><span class=\"nf\">RunOrDie<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"nx\">leaderelection<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaderElectionConfig<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Lock<\/span><span class=\"p\">:<\/span> <span class=\"nx\">lock<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">LeaseDuration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">15<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">RenewDeadline<\/span><span class=\"p\">:<\/span> <span class=\"mi\">10<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">RetryPeriod<\/span><span class=\"p\">:<\/span> <span class=\"mi\">2<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Callbacks<\/span><span class=\"p\">:<\/span> <span class=\"nx\">leaderelection<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaderCallbacks<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">OnStartedLeading<\/span><span class=\"p\">:<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span> <span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nx\">Context<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6210\u4e3a Leader\uff0c\u5f00\u59cb\u5de5\u4f5c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">run<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">OnStoppedLeading<\/span><span class=\"p\">:<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5931\u53bb Leader\uff0c\u505c\u6b62\u5de5\u4f5c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">log<\/span><span class=\"p\">.<\/span><span class=\"nf\">Fatal<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;lost leader election&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">OnNewLeader<\/span><span class=\"p\">:<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">identity<\/span> <span class=\"kt\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u65b0 Leader \u5f53\u9009<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">log<\/span><span class=\"p\">.<\/span><span class=\"nf\">Printf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;new leader: %s&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">identity<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">})<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"\u914d\u7f6e\u7ba1\u7406\">\u914d\u7f6e\u7ba1\u7406<\/h2>\n<h3 id=\"kubeconfig-\u52a0\u8f7d\">kubeconfig \u52a0\u8f7d<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4ece\u6587\u4ef6\u52a0\u8f7d\u914d\u7f6e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"s\">&#34;k8s.io\/client-go\/tools\/clientcmd&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4ece\u9ed8\u8ba4\u4f4d\u7f6e\u52a0\u8f7d<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">config<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">clientcmd<\/span><span class=\"p\">.<\/span><span class=\"nf\">BuildConfigFromFlags<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">clientcmd<\/span><span class=\"p\">.<\/span><span class=\"nx\">RecommendedHomeFile<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4ece\u6307\u5b9a\u8def\u5f84\u52a0\u8f7d<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">config<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">clientcmd<\/span><span class=\"p\">.<\/span><span class=\"nf\">BuildConfigFromFlags<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\/path\/to\/kubeconfig&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4ece\u96c6\u7fa4\u5185\u90e8\u52a0\u8f7d\uff08Pod \u5185\uff09<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">config<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">rest<\/span><span class=\"p\">.<\/span><span class=\"nf\">InClusterConfig<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u901a\u7528\u52a0\u8f7d\uff08\u4f18\u5148\u4f7f\u7528 kubeconfig\uff0c\u56de\u9000\u5230 in-cluster\uff09<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">config<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">clientcmd<\/span><span class=\"p\">.<\/span><span class=\"nf\">BuildConfigFromFlags<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">config<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">rest<\/span><span class=\"p\">.<\/span><span class=\"nf\">InClusterConfig<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"\u914d\u7f6e\u9009\u9879\">\u914d\u7f6e\u9009\u9879<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u914d\u7f6e REST \u5ba2\u6237\u7aef<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">config<\/span> <span class=\"o\">:=<\/span> <span class=\"o\">&amp;<\/span><span class=\"nx\">rest<\/span><span class=\"p\">.<\/span><span class=\"nx\">Config<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Host<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;https:\/\/api.example.com:6443&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">TLSClientConfig<\/span><span class=\"p\">:<\/span> <span class=\"nx\">rest<\/span><span class=\"p\">.<\/span><span class=\"nx\">TLSClientConfig<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">CAFile<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;\/path\/to\/ca.crt&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">CertFile<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;\/path\/to\/client.crt&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">KeyFile<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;\/path\/to\/client.key&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6216\u4f7f\u7528 Bearer Token<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">BearerToken<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;my-token&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8d85\u65f6\u8bbe\u7f6e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Timeout<\/span><span class=\"p\">:<\/span> <span class=\"mi\">30<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ QPS \u9650\u5236<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">QPS<\/span><span class=\"p\">:<\/span> <span class=\"mi\">50<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Burst<\/span><span class=\"p\">:<\/span> <span class=\"mi\">100<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5185\u5bb9\u7c7b\u578b<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ContentType<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;application\/json&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6216\u4f7f\u7528 Protobuf<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ContentType: &#34;application\/vnd.kubernetes.protobuf&#34;,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"\u7248\u672c\u517c\u5bb9\u6027\">\u7248\u672c\u517c\u5bb9\u6027<\/h2>\n<h3 id=\"\u7248\u672c\u5bf9\u5e94\u5173\u7cfb\">\u7248\u672c\u5bf9\u5e94\u5173\u7cfb<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <pre tabindex=\"0\"><code>client-go \u4e0e Kubernetes \u7248\u672c\u5bf9\u5e94:\n\nclient-go\u7248\u672c Kubernetes\u7248\u672c\nv0.28.x v1.28.x\nv0.27.x v1.27.x\nv0.26.x v1.26.x\n...\n\n\u517c\u5bb9\u6027\u89c4\u5219:\n- client-go v0.N \u4e0e Kubernetes v1.N \u517c\u5bb9\n- client-go \u53ef\u4ee5\u4e0e +\/- 2 \u4e2a\u6b21\u7248\u672c\u7684 API Server \u4ea4\u4e92\n- \u5efa\u8bae\u4f7f\u7528\u4e0e\u96c6\u7fa4\u7248\u672c\u5339\u914d\u7684 client-go<\/code><\/pre>\n <\/figure>\n<\/div>\n<h3 id=\"\u5bfc\u5165\u65b9\u5f0f\">\u5bfc\u5165\u65b9\u5f0f<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Go modules \u5bfc\u5165<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ go.mod<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">module<\/span> <span class=\"nx\">mycontroller<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">go<\/span> <span class=\"mf\">1.21<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nf\">require<\/span> <span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">k8s<\/span><span class=\"p\">.<\/span><span class=\"nx\">io<\/span><span class=\"o\">\/<\/span><span class=\"nx\">api<\/span> <span class=\"nx\">v0<\/span><span class=\"mf\">.28.0<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">k8s<\/span><span class=\"p\">.<\/span><span class=\"nx\">io<\/span><span class=\"o\">\/<\/span><span class=\"nx\">apimachinery<\/span> <span class=\"nx\">v0<\/span><span class=\"mf\">.28.0<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">k8s<\/span><span class=\"p\">.<\/span><span class=\"nx\">io<\/span><span class=\"o\">\/<\/span><span class=\"nx\">client<\/span><span class=\"o\">-<\/span><span class=\"k\">go<\/span> <span class=\"nx\">v0<\/span><span class=\"mf\">.28.0<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4ee3\u7801\u4e2d\u5bfc\u5165<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;k8s.io\/api\/core\/v1&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">metav1<\/span> <span class=\"s\">&#34;k8s.io\/apimachinery\/pkg\/apis\/meta\/v1&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;k8s.io\/client-go\/kubernetes&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"\u6700\u4f73\u5b9e\u8df5\">\u6700\u4f73\u5b9e\u8df5<\/h2>\n<h3 id=\"\u5ba2\u6237\u7aef\u9009\u62e9\">\u5ba2\u6237\u7aef\u9009\u62e9<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u9009\u62e9\u5408\u9002\u7684\u5ba2\u6237\u7aef<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 1. \u5185\u7f6e\u8d44\u6e90 \u2192 Clientset<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">clientset<\/span><span class=\"p\">.<\/span><span class=\"nf\">CoreV1<\/span><span class=\"p\">().<\/span><span class=\"nf\">Pods<\/span><span class=\"p\">(<\/span><span class=\"nx\">ns<\/span><span class=\"p\">).<\/span><span class=\"nf\">Get<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">opts<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 2. CRD \u8d44\u6e90 \u2192 DynamicClient<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">dynamicClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">Resource<\/span><span class=\"p\">(<\/span><span class=\"nx\">gvr<\/span><span class=\"p\">).<\/span><span class=\"nf\">Namespace<\/span><span class=\"p\">(<\/span><span class=\"nx\">ns<\/span><span class=\"p\">).<\/span><span class=\"nf\">Get<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">opts<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 3. \u8d44\u6e90\u53d1\u73b0 \u2192 DiscoveryClient<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">discoveryClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">ServerResources<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 4. \u5e95\u5c42\u63a7\u5236 \u2192 RESTClient<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">restClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">Get<\/span><span class=\"p\">().<\/span><span class=\"nf\">Resource<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;pods&#34;<\/span><span class=\"p\">).<\/span><span class=\"nf\">Do<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">).<\/span><span class=\"nf\">Into<\/span><span class=\"p\">(<\/span><span class=\"nx\">result<\/span><span class=\"p\">)<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"\u9519\u8bef\u5904\u7406\">\u9519\u8bef\u5904\u7406<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5904\u7406\u5e38\u89c1\u9519\u8bef<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"s\">&#34;k8s.io\/apimachinery\/pkg\/api\/errors&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">pod<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">clientset<\/span><span class=\"p\">.<\/span><span class=\"nf\">CoreV1<\/span><span class=\"p\">().<\/span><span class=\"nf\">Pods<\/span><span class=\"p\">(<\/span><span class=\"nx\">ns<\/span><span class=\"p\">).<\/span><span class=\"nf\">Get<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">GetOptions<\/span><span class=\"p\">{})<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">errors<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsNotFound<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8d44\u6e90\u4e0d\u5b58\u5728<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kc\">nil<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">errors<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsConflict<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u7248\u672c\u51b2\u7a81\uff0c\u9700\u8981\u91cd\u65b0\u83b7\u53d6\u5e76\u91cd\u8bd5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nf\">retry<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">errors<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsForbidden<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6743\u9650\u4e0d\u8db3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">err<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5176\u4ed6\u9519\u8bef<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">err<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"\u603b\u7ed3\">\u603b\u7ed3<\/h2>\n<p>client-go \u6838\u5fc3\u7ec4\u4ef6\uff1a<\/p>"},{"title":"CNI \u63d2\u4ef6\u5de5\u4f5c\u6d41","link":"https:\/\/cloudnative.lei6393.com\/calico\/04-calico-data-plane\/01-cni-plugin-workflow\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cloudnative.lei6393.com\/calico\/04-calico-data-plane\/01-cni-plugin-workflow\/","description":"<h2 id=\"\u6982\u8ff0\">\u6982\u8ff0<\/h2>\n<p>Calico CNI \u63d2\u4ef6\u662f Kubernetes \u4e0e Calico \u7f51\u7edc\u4e4b\u95f4\u7684\u6865\u6881\u3002\u5f53 kubelet \u521b\u5efa\u6216\u5220\u9664 Pod \u65f6\uff0c\u4f1a\u8c03\u7528 CNI \u63d2\u4ef6\u6765\u914d\u7f6e Pod \u7684\u7f51\u7edc\u3002\u672c\u7ae0\u6df1\u5165\u5206\u6790 Calico CNI \u63d2\u4ef6\u7684\u5b8c\u6574\u5de5\u4f5c\u6d41\u7a0b\uff0c\u5305\u62ec ADD\u3001DEL \u64cd\u4f5c\u7684\u8be6\u7ec6\u5b9e\u73b0\u3002<\/p>"},{"title":"containerd \u6574\u4f53\u67b6\u6784","link":"https:\/\/cloudnative.lei6393.com\/containerd\/02-architecture\/01-overall-architecture\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cloudnative.lei6393.com\/containerd\/02-architecture\/01-overall-architecture\/","description":"<p>\u672c\u7ae0\u6df1\u5165\u89e3\u6790 containerd \u7684\u6574\u4f53\u67b6\u6784\u8bbe\u8ba1\uff0c\u5e2e\u52a9\u4f60\u7406\u89e3\u5404\u7ec4\u4ef6\u4e4b\u95f4\u7684\u5173\u7cfb\u548c\u6570\u636e\u6d41\u5411\u3002<\/p>\n<h2 id=\"\u8bbe\u8ba1\u54f2\u5b66\">\u8bbe\u8ba1\u54f2\u5b66<\/h2>\n<p>containerd \u7684\u8bbe\u8ba1\u9075\u5faa\u4ee5\u4e0b\u6838\u5fc3\u539f\u5219\uff1a<\/p>\n<h3 id=\"\u7b80\u5355\u6027-simplicity\">\u7b80\u5355\u6027 (Simplicity)<\/h3>\n<ul>\n<li>\u4e13\u6ce8\u4e8e\u5bb9\u5668\u8fd0\u884c\u65f6\u6838\u5fc3\u529f\u80fd<\/li>\n<li>\u4e0d\u5305\u542b\u6784\u5efa\u3001\u7f16\u6392\u7b49\u9ad8\u7ea7\u529f\u80fd<\/li>\n<li>API \u8bbe\u8ba1\u7b80\u6d01\u660e\u4e86<\/li>\n<\/ul>\n<h3 id=\"\u5065\u58ee\u6027-robustness\">\u5065\u58ee\u6027 (Robustness)<\/h3>\n<ul>\n<li>\u5bb9\u5668\u8fdb\u7a0b\u4e0e containerd \u89e3\u8026<\/li>\n<li>containerd \u91cd\u542f\u4e0d\u5f71\u54cd\u8fd0\u884c\u4e2d\u7684\u5bb9\u5668<\/li>\n<li>\u6545\u969c\u9694\u79bb\u8bbe\u8ba1<\/li>\n<\/ul>\n<h3 id=\"\u53ef\u79fb\u690d\u6027-portability\">\u53ef\u79fb\u690d\u6027 (Portability)<\/h3>\n<ul>\n<li>\u652f\u6301\u591a\u79cd\u64cd\u4f5c\u7cfb\u7edf\uff08Linux, Windows, FreeBSD\uff09<\/li>\n<li>\u652f\u6301\u591a\u79cd CPU \u67b6\u6784<\/li>\n<li>\u53ef\u5d4c\u5165\u5230\u5404\u79cd\u7cfb\u7edf\u4e2d<\/li>\n<\/ul>\n<h3 id=\"\u53ef\u6269\u5c55\u6027-extensibility\">\u53ef\u6269\u5c55\u6027 (Extensibility)<\/h3>\n<ul>\n<li>\u63d2\u4ef6\u5316\u67b6\u6784<\/li>\n<li>\u53ef\u66ff\u6362\u7684\u7ec4\u4ef6\u5b9e\u73b0<\/li>\n<li>\u6e05\u6670\u7684\u6269\u5c55\u70b9<\/li>\n<\/ul>\n<h2 id=\"\u67b6\u6784\u6982\u89c8\">\u67b6\u6784\u6982\u89c8<\/h2>\n<div class=\"mermaid text-center\">flowchart TB\n subgraph clients[\"Client Layer\"]\n ctr[\"ctr\"]\n nerdctl[\"nerdctl\"]\n docker[\"Docker Engine\"]\n crictl[\"crictl\"]\n kubelet[\"kubelet\"]\n end\n\n subgraph api_layer[\"API Layer\"]\n grpc[\"gRPC Server<br\/>(TCP\/Unix Socket)\"]\n ttrpc[\"TTRPC Server<br\/>(Shim \u901a\u4fe1)\"]\n end\n\n subgraph services[\"Service Layer\"]\n containers_svc[\"Containers<br\/>Service\"]\n images_svc[\"Images<br\/>Service\"]\n tasks_svc[\"Tasks<br\/>Service\"]\n content_svc[\"Content<br\/>Service\"]\n snapshots_svc[\"Snapshots<br\/>Service\"]\n events_svc[\"Events<br\/>Service\"]\n leases_svc[\"Leases<br\/>Service\"]\n namespaces_svc[\"Namespaces<br\/>Service\"]\n end\n\n subgraph core[\"Core Layer\"]\n metadata[\"Metadata Store<br\/>(BoltDB)\"]\n content_store[\"Content Store\"]\n snapshotter[\"Snapshotter\"]\n runtime[\"Runtime Manager\"]\n events[\"Event System\"]\n end\n\n subgraph external[\"External\"]\n shim[\"containerd-shim\"]\n runc[\"runc\"]\n registry[\"Container Registry\"]\n end\n\n clients --> grpc\n grpc --> services\n services --> core\n tasks_svc --> ttrpc\n ttrpc --> shim\n shim --> runc\n content_store --> registry\n\n style api_layer fill:#e6f3ff\n style services fill:#fff2e6\n style core fill:#e6ffe6\n<\/div>\n\n<h2 id=\"\u6838\u5fc3\u7ec4\u4ef6\u8be6\u89e3\">\u6838\u5fc3\u7ec4\u4ef6\u8be6\u89e3<\/h2>\n<h3 id=\"1-api-layer---\u63a5\u53e3\u5c42\">1. API Layer - \u63a5\u53e3\u5c42<\/h3>\n<p>containerd \u901a\u8fc7 gRPC \u66b4\u9732 API\uff1a<\/p>"},{"title":"Content Store - \u5185\u5bb9\u5bfb\u5740\u5b58\u50a8\u539f\u7406","link":"https:\/\/cloudnative.lei6393.com\/containerd\/03-content-store\/01-content-addressable\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cloudnative.lei6393.com\/containerd\/03-content-store\/01-content-addressable\/","description":"<p>Content Store \u662f containerd \u7684\u6838\u5fc3\u7ec4\u4ef6\u4e4b\u4e00\uff0c\u5b83\u91c7\u7528\u5185\u5bb9\u5bfb\u5740\u5b58\u50a8\uff08Content-Addressable Storage, CAS\uff09\u65b9\u5f0f\u7ba1\u7406\u6240\u6709\u7684\u4e8c\u8fdb\u5236\u6570\u636e\uff08Blob\uff09\uff0c\u5305\u62ec\u955c\u50cf\u5c42\u3001\u914d\u7f6e\u6587\u4ef6\u7b49\u3002<\/p>\n<h2 id=\"\u5185\u5bb9\u5bfb\u5740\u5b58\u50a8\u539f\u7406\">\u5185\u5bb9\u5bfb\u5740\u5b58\u50a8\u539f\u7406<\/h2>\n<h3 id=\"\u4ec0\u4e48\u662f\u5185\u5bb9\u5bfb\u5740\">\u4ec0\u4e48\u662f\u5185\u5bb9\u5bfb\u5740<\/h3>\n<p>\u5185\u5bb9\u5bfb\u5740\u5b58\u50a8\u6839\u636e\u6570\u636e\u5185\u5bb9\u672c\u8eab\u6765\u6807\u8bc6\u548c\u68c0\u7d22\u6570\u636e\uff0c\u800c\u975e\u4f7f\u7528\u4f20\u7edf\u7684\u8def\u5f84\u6216\u6587\u4ef6\u540d\uff1a<\/p>\n<div class=\"mermaid text-center\">flowchart LR\n subgraph traditional[\"\u4f20\u7edf\u5b58\u50a8\"]\n path[\"\/images\/nginx\/layer1.tar\"]\n file1[\"\u6587\u4ef6\u5185\u5bb9\"]\n end\n\n subgraph cas[\"\u5185\u5bb9\u5bfb\u5740\u5b58\u50a8\"]\n digest[\"sha256:a3ed95ca...\"]\n file2[\"\u76f8\u540c\u5185\u5bb9\"]\n end\n\n path --> file1\n digest --> file2\n\n note[\"\u76f8\u540c\u5185\u5bb9\u53ea\u5b58\u50a8\u4e00\u4efd\"]\n<\/div>\n\n<h3 id=\"digest-\u683c\u5f0f\">Digest \u683c\u5f0f<\/h3>\n<p>containerd \u4f7f\u7528 OCI \u6807\u51c6\u7684 Digest \u683c\u5f0f\uff1a<\/p>"},{"title":"Controller Manager \u67b6\u6784\u6982\u89c8","link":"https:\/\/cloudnative.lei6393.com\/kubernetes\/05-controller\/01-architecture\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cloudnative.lei6393.com\/kubernetes\/05-controller\/01-architecture\/","description":"<p>\u672c\u6587\u8be6\u7ec6\u4ecb\u7ecd Kubernetes Controller Manager \u7684\u6574\u4f53\u67b6\u6784\uff0c\u5305\u62ec\u7ec4\u4ef6\u7ed3\u6784\u3001\u542f\u52a8\u6d41\u7a0b\u548c\u63a7\u5236\u5668\u5217\u8868\u3002<\/p>\n<h2 id=\"1-controller-manager-\u6982\u8ff0\">1. Controller Manager \u6982\u8ff0<\/h2>\n<h3 id=\"11-\u6838\u5fc3\u804c\u8d23\">1.1 \u6838\u5fc3\u804c\u8d23<\/h3>\n<p>Controller Manager \u662f Kubernetes \u63a7\u5236\u5e73\u9762\u7684\u6838\u5fc3\u7ec4\u4ef6\uff0c\u8d1f\u8d23\u8fd0\u884c\u6240\u6709\u5185\u7f6e\u63a7\u5236\u5668\uff1a<\/p>\n<div class=\"mermaid text-center\">graph TB\n subgraph control_plane[\"Control Plane\"]\n API[\"API Server\"]\n CM[\"Controller Manager\"]\n SCHED[\"Scheduler\"]\n end\n\n subgraph controllers[\"\u5185\u7f6e\u63a7\u5236\u5668\"]\n DC[\"Deployment\"]\n RSC[\"ReplicaSet\"]\n SC[\"StatefulSet\"]\n DSC[\"DaemonSet\"]\n JC[\"Job\"]\n GC[\"GC\"]\n NC[\"Namespace\"]\n SAC[\"ServiceAccount\"]\n end\n\n CM --> DC\n CM --> RSC\n CM --> SC\n CM --> DSC\n CM --> JC\n CM --> GC\n CM --> NC\n CM --> SAC\n\n DC --> API\n RSC --> API\n SC --> API\n<\/div>\n\n<h3 id=\"12-\u8bbe\u8ba1\u539f\u5219\">1.2 \u8bbe\u8ba1\u539f\u5219<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <pre tabindex=\"0\"><code>\u63a7\u5236\u5668\u8bbe\u8ba1\u539f\u5219:\n\u251c\u2500\u2500 \u58f0\u660e\u5f0f\n\u2502 \u2514\u2500\u2500 \u7528\u6237\u58f0\u660e\u671f\u671b\u72b6\u6001\uff0c\u63a7\u5236\u5668\u8d1f\u8d23\u8fbe\u6210\n\u251c\u2500\u2500 \u5e42\u7b49\u6027\n\u2502 \u2514\u2500\u2500 \u591a\u6b21\u6267\u884c\u7ed3\u679c\u4e00\u81f4\n\u251c\u2500\u2500 \u677e\u8026\u5408\n\u2502 \u2514\u2500\u2500 \u63a7\u5236\u5668\u4e4b\u95f4\u76f8\u4e92\u72ec\u7acb\n\u251c\u2500\u2500 \u6700\u7ec8\u4e00\u81f4\n\u2502 \u2514\u2500\u2500 \u7cfb\u7edf\u6700\u7ec8\u4f1a\u6536\u655b\u5230\u671f\u671b\u72b6\u6001\n\u2514\u2500\u2500 Level-Triggered\n \u2514\u2500\u2500 \u57fa\u4e8e\u72b6\u6001\u800c\u975e\u4e8b\u4ef6\u9a71\u52a8<\/code><\/pre>\n <\/figure>\n<\/div>\n<h3 id=\"13-kube-controller-manager-vs-cloud-controller-manager\">1.3 kube-controller-manager vs cloud-controller-manager<\/h3>\n<table>\n <thead>\n <tr>\n <th>\u7ec4\u4ef6<\/th>\n <th>\u804c\u8d23<\/th>\n <th>\u63a7\u5236\u5668<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td>kube-controller-manager<\/td>\n <td>\u6838\u5fc3\u8d44\u6e90\u63a7\u5236<\/td>\n <td>Deployment, ReplicaSet, Job \u7b49<\/td>\n <\/tr>\n <tr>\n <td>cloud-controller-manager<\/td>\n <td>\u4e91\u5e73\u53f0\u96c6\u6210<\/td>\n <td>Node, Route, Service (LB)<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h2 id=\"2-\u6574\u4f53\u67b6\u6784\">2. \u6574\u4f53\u67b6\u6784<\/h2>\n<h3 id=\"21-\u7ec4\u4ef6\u67b6\u6784\">2.1 \u7ec4\u4ef6\u67b6\u6784<\/h3>\n<div class=\"mermaid text-center\">graph TB\n subgraph kcm[\"kube-controller-manager\"]\n subgraph infra[\"\u57fa\u7840\u8bbe\u65bd\"]\n LC[\"LeaderElection\"]\n SIF[\"SharedInformerFactory\"]\n CLIENT[\"Clientset\"]\n end\n\n subgraph controller_ctx[\"Controller Context\"]\n CM_CTX[\"ControllerContext\"]\n INF_START[\"InformerStarted\"]\n end\n\n subgraph controllers[\"Controllers\"]\n C1[\"Deployment\"]\n C2[\"ReplicaSet\"]\n C3[\"StatefulSet\"]\n C4[\"DaemonSet\"]\n C5[\"Job\"]\n C6[\"...\"]\n end\n end\n\n LC --> CM_CTX\n CLIENT --> SIF\n SIF --> CM_CTX\n CM_CTX --> C1\n CM_CTX --> C2\n CM_CTX --> C3\n CM_CTX --> C4\n CM_CTX --> C5\n<\/div>\n\n<h3 id=\"22-\u6838\u5fc3\u6570\u636e\u7ed3\u6784\">2.2 \u6838\u5fc3\u6570\u636e\u7ed3\u6784<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ ControllerContext \u5305\u542b\u63a7\u5236\u5668\u8fd0\u884c\u6240\u9700\u7684\u6240\u6709\u4e0a\u4e0b\u6587<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ cmd\/kube-controller-manager\/app\/controllermanager.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type<\/span> <span class=\"nx\">ControllerContext<\/span> <span class=\"kd\">struct<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5ba2\u6237\u7aef\u914d\u7f6e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ClientBuilder<\/span> <span class=\"nx\">clientbuilder<\/span><span class=\"p\">.<\/span><span class=\"nx\">ControllerClientBuilder<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Informer \u5de5\u5382<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">InformerFactory<\/span> <span class=\"nx\">informers<\/span><span class=\"p\">.<\/span><span class=\"nx\">SharedInformerFactory<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5bf9\u8c61\u5143\u6570\u636e Informer<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ObjectOrMetadataInformerFactory<\/span> <span class=\"nx\">controller<\/span><span class=\"p\">.<\/span><span class=\"nx\">InformerFactory<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u7ec4\u4ef6\u914d\u7f6e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ComponentConfig<\/span> <span class=\"nx\">kubectrlmgrconfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">KubeControllerManagerConfiguration<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u4e8b\u4ef6\u8bb0\u5f55\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">EventRecorder<\/span> <span class=\"nx\">record<\/span><span class=\"p\">.<\/span><span class=\"nx\">EventRecorder<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u4e91\u63d0\u4f9b\u5546<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Cloud<\/span> <span class=\"nx\">cloudprovider<\/span><span class=\"p\">.<\/span><span class=\"nx\">Interface<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u505c\u6b62\u901a\u9053<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Stop<\/span> <span class=\"o\">&lt;-<\/span><span class=\"kd\">chan<\/span> <span class=\"kd\">struct<\/span><span class=\"p\">{}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Informer \u542f\u52a8\u72b6\u6001<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">InformersStarted<\/span> <span class=\"kd\">chan<\/span> <span class=\"kd\">struct<\/span><span class=\"p\">{}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u9700\u8981\u7684\u96c6\u7fa4\u89d2\u8272<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">AvailableResources<\/span> <span class=\"kd\">map<\/span><span class=\"p\">[<\/span><span class=\"nx\">schema<\/span><span class=\"p\">.<\/span><span class=\"nx\">GroupVersionResource<\/span><span class=\"p\">]<\/span><span class=\"kt\">bool<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u63a7\u5236\u5668\u521d\u59cb\u5316\u51fd\u6570\u7c7b\u578b<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type<\/span> <span class=\"nx\">InitFunc<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span> <span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nx\">Context<\/span><span class=\"p\">,<\/span> <span class=\"nx\">controllerCtx<\/span> <span class=\"nx\">ControllerContext<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"nx\">controller<\/span><span class=\"p\">.<\/span><span class=\"nx\">Interface<\/span><span class=\"p\">,<\/span> <span class=\"kt\">bool<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"3-\u542f\u52a8\u6d41\u7a0b\">3. \u542f\u52a8\u6d41\u7a0b<\/h2>\n<h3 id=\"31-\u542f\u52a8\u6d41\u7a0b\u56fe\">3.1 \u542f\u52a8\u6d41\u7a0b\u56fe<\/h3>\n<div class=\"mermaid text-center\">sequenceDiagram\n participant Main\n participant Options\n participant Server\n participant LeaderElection\n participant Controllers\n\n Main->>Options: NewKubeControllerManagerOptions\n Options->>Options: \u89e3\u6790\u547d\u4ee4\u884c\u53c2\u6570\n Main->>Server: NewControllerManagerCommand\n Server->>Server: \u6784\u5efa Config\n Server->>LeaderElection: \u542f\u52a8\u9009\u4e3e\n LeaderElection->>LeaderElection: \u83b7\u53d6\u9501\n LeaderElection->>Controllers: Run\n Controllers->>Controllers: \u521d\u59cb\u5316 SharedInformerFactory\n Controllers->>Controllers: \u542f\u52a8\u5404\u63a7\u5236\u5668\n Controllers->>Controllers: \u7b49\u5f85\u7f13\u5b58\u540c\u6b65\n Controllers->>Controllers: \u8fd0\u884c\n<\/div>\n\n<h3 id=\"32-\u5165\u53e3\u51fd\u6570\">3.2 \u5165\u53e3\u51fd\u6570<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ main \u5165\u53e3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ cmd\/kube-controller-manager\/controller-manager.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">command<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewControllerManagerCommand<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">code<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">cli<\/span><span class=\"p\">.<\/span><span class=\"nf\">Run<\/span><span class=\"p\">(<\/span><span class=\"nx\">command<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">os<\/span><span class=\"p\">.<\/span><span class=\"nf\">Exit<\/span><span class=\"p\">(<\/span><span class=\"nx\">code<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ NewControllerManagerCommand \u521b\u5efa\u547d\u4ee4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ cmd\/kube-controller-manager\/app\/controllermanager.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">NewControllerManagerCommand<\/span><span class=\"p\">()<\/span> <span class=\"o\">*<\/span><span class=\"nx\">cobra<\/span><span class=\"p\">.<\/span><span class=\"nx\">Command<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">s<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">options<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewKubeControllerManagerOptions<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">klog<\/span><span class=\"p\">.<\/span><span class=\"nf\">Fatalf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;unable to initialize command options: %v&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">cmd<\/span> <span class=\"o\">:=<\/span> <span class=\"o\">&amp;<\/span><span class=\"nx\">cobra<\/span><span class=\"p\">.<\/span><span class=\"nx\">Command<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Use<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;kube-controller-manager&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">RunE<\/span><span class=\"p\">:<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">cmd<\/span> <span class=\"o\">*<\/span><span class=\"nx\">cobra<\/span><span class=\"p\">.<\/span><span class=\"nx\">Command<\/span><span class=\"p\">,<\/span> <span class=\"nx\">args<\/span> <span class=\"p\">[]<\/span><span class=\"kt\">string<\/span><span class=\"p\">)<\/span> <span class=\"kt\">error<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5b8c\u6210\u914d\u7f6e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">c<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">s<\/span><span class=\"p\">.<\/span><span class=\"nf\">Config<\/span><span class=\"p\">(<\/span><span class=\"nf\">KnownControllers<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">ControllersDisabledByDefault<\/span><span class=\"p\">.<\/span><span class=\"nf\">List<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">err<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8fd0\u884c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nf\">Run<\/span><span class=\"p\">(<\/span><span class=\"nx\">c<\/span><span class=\"p\">.<\/span><span class=\"nf\">Complete<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">wait<\/span><span class=\"p\">.<\/span><span class=\"nx\">NeverStop<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">cmd<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"33-run-\u51fd\u6570\">3.3 Run \u51fd\u6570<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Run \u542f\u52a8 Controller Manager<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ cmd\/kube-controller-manager\/app\/controllermanager.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">Run<\/span><span class=\"p\">(<\/span><span class=\"nx\">c<\/span> <span class=\"o\">*<\/span><span class=\"nx\">config<\/span><span class=\"p\">.<\/span><span class=\"nx\">CompletedConfig<\/span><span class=\"p\">,<\/span> <span class=\"nx\">stopCh<\/span> <span class=\"o\">&lt;-<\/span><span class=\"kd\">chan<\/span> <span class=\"kd\">struct<\/span><span class=\"p\">{})<\/span> <span class=\"kt\">error<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ 1. \u521b\u5efa\u63a7\u5236\u5668\u4e0a\u4e0b\u6587<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllerContext<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nf\">CreateControllerContext<\/span><span class=\"p\">(<\/span><span class=\"nx\">c<\/span><span class=\"p\">,<\/span> <span class=\"nx\">rootClientBuilder<\/span><span class=\"p\">,<\/span> <span class=\"nx\">clientBuilder<\/span><span class=\"p\">,<\/span> <span class=\"nx\">stopCh<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">err<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ 2. \u8bbe\u7f6e\u5065\u5eb7\u68c0\u67e5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">var<\/span> <span class=\"nx\">checks<\/span> <span class=\"p\">[]<\/span><span class=\"nx\">healthz<\/span><span class=\"p\">.<\/span><span class=\"nx\">HealthChecker<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">var<\/span> <span class=\"nx\">electionChecker<\/span> <span class=\"o\">*<\/span><span class=\"nx\">leaderelection<\/span><span class=\"p\">.<\/span><span class=\"nx\">HealthzAdaptor<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ 3. Leader Election<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">c<\/span><span class=\"p\">.<\/span><span class=\"nx\">ComponentConfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">Generic<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaderElection<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaderElect<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">electionChecker<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">leaderelection<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewLeaderHealthzAdaptor<\/span><span class=\"p\">(<\/span><span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">20<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">checks<\/span> <span class=\"p\">=<\/span> <span class=\"nb\">append<\/span><span class=\"p\">(<\/span><span class=\"nx\">checks<\/span><span class=\"p\">,<\/span> <span class=\"nx\">electionChecker<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">go<\/span> <span class=\"nx\">leaderelection<\/span><span class=\"p\">.<\/span><span class=\"nf\">RunOrDie<\/span><span class=\"p\">(<\/span><span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nf\">TODO<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">leaderelection<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaderElectionConfig<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Lock<\/span><span class=\"p\">:<\/span> <span class=\"nx\">lock<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">LeaseDuration<\/span><span class=\"p\">:<\/span> <span class=\"nx\">c<\/span><span class=\"p\">.<\/span><span class=\"nx\">ComponentConfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">Generic<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaderElection<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaseDuration<\/span><span class=\"p\">.<\/span><span class=\"nx\">Duration<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">RenewDeadline<\/span><span class=\"p\">:<\/span> <span class=\"nx\">c<\/span><span class=\"p\">.<\/span><span class=\"nx\">ComponentConfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">Generic<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaderElection<\/span><span class=\"p\">.<\/span><span class=\"nx\">RenewDeadline<\/span><span class=\"p\">.<\/span><span class=\"nx\">Duration<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">RetryPeriod<\/span><span class=\"p\">:<\/span> <span class=\"nx\">c<\/span><span class=\"p\">.<\/span><span class=\"nx\">ComponentConfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">Generic<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaderElection<\/span><span class=\"p\">.<\/span><span class=\"nx\">RetryPeriod<\/span><span class=\"p\">.<\/span><span class=\"nx\">Duration<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">Callbacks<\/span><span class=\"p\">:<\/span> <span class=\"nx\">leaderelection<\/span><span class=\"p\">.<\/span><span class=\"nx\">LeaderCallbacks<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">OnStartedLeading<\/span><span class=\"p\">:<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span> <span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nx\">Context<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u83b7\u5f97 Leader\uff0c\u542f\u52a8\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">run<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"nx\">controllerContext<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">OnStoppedLeading<\/span><span class=\"p\">:<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">klog<\/span><span class=\"p\">.<\/span><span class=\"nf\">Fatalf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;leaderelection lost&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">})<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u4e0d\u4f7f\u7528\u9009\u4e3e\uff0c\u76f4\u63a5\u542f\u52a8<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">run<\/span><span class=\"p\">(<\/span><span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nf\">TODO<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">controllerContext<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"o\">&lt;-<\/span><span class=\"nx\">stopCh<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kc\">nil<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"34-\u542f\u52a8\u63a7\u5236\u5668\">3.4 \u542f\u52a8\u63a7\u5236\u5668<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ StartControllers \u542f\u52a8\u6240\u6709\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ cmd\/kube-controller-manager\/app\/controllermanager.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">StartControllers<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span> <span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nx\">Context<\/span><span class=\"p\">,<\/span> <span class=\"nx\">controllerCtx<\/span> <span class=\"nx\">ControllerContext<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span> <span class=\"kd\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"nx\">InitFunc<\/span><span class=\"p\">,<\/span> <span class=\"nx\">unsecuredMux<\/span> <span class=\"o\">*<\/span><span class=\"nx\">mux<\/span><span class=\"p\">.<\/span><span class=\"nx\">PathRecorderMux<\/span><span class=\"p\">)<\/span> <span class=\"kt\">error<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u542f\u52a8\u6240\u6709\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">for<\/span> <span class=\"nx\">controllerName<\/span><span class=\"p\">,<\/span> <span class=\"nx\">initFn<\/span> <span class=\"o\">:=<\/span> <span class=\"k\">range<\/span> <span class=\"nx\">controllers<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">!<\/span><span class=\"nx\">controllerCtx<\/span><span class=\"p\">.<\/span><span class=\"nf\">IsControllerEnabled<\/span><span class=\"p\">(<\/span><span class=\"nx\">controllerName<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">klog<\/span><span class=\"p\">.<\/span><span class=\"nf\">Warningf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;%q is disabled&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">controllerName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">continue<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nf\">Sleep<\/span><span class=\"p\">(<\/span><span class=\"nx\">wait<\/span><span class=\"p\">.<\/span><span class=\"nf\">Jitter<\/span><span class=\"p\">(<\/span><span class=\"nx\">controllerCtx<\/span><span class=\"p\">.<\/span><span class=\"nx\">ComponentConfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">Generic<\/span><span class=\"p\">.<\/span><span class=\"nx\">ControllerStartInterval<\/span><span class=\"p\">.<\/span><span class=\"nx\">Duration<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ControllerStartJitter<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">klog<\/span><span class=\"p\">.<\/span><span class=\"nf\">V<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">).<\/span><span class=\"nf\">Infof<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Starting %q&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">controllerName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ctrl<\/span><span class=\"p\">,<\/span> <span class=\"nx\">started<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nf\">initFn<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"nx\">controllerCtx<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">klog<\/span><span class=\"p\">.<\/span><span class=\"nf\">Errorf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Error starting %q: %v&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">controllerName<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">err<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">!<\/span><span class=\"nx\">started<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">klog<\/span><span class=\"p\">.<\/span><span class=\"nf\">Warningf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Skipping %q&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">controllerName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">continue<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">check<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">controllerhealthz<\/span><span class=\"p\">.<\/span><span class=\"nf\">NamedPingChecker<\/span><span class=\"p\">(<\/span><span class=\"nx\">controllerName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">ctrl<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">healthCheckable<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ok<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">ctrl<\/span><span class=\"p\">.(<\/span><span class=\"nx\">controller<\/span><span class=\"p\">.<\/span><span class=\"nx\">Healthz<\/span><span class=\"p\">);<\/span> <span class=\"nx\">ok<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">check<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">controllerhealthz<\/span><span class=\"p\">.<\/span><span class=\"nf\">NamedHealthChecker<\/span><span class=\"p\">(<\/span><span class=\"nx\">controllerName<\/span><span class=\"p\">,<\/span> <span class=\"nx\">healthCheckable<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">klog<\/span><span class=\"p\">.<\/span><span class=\"nf\">Infof<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Started %q&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">controllerName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kc\">nil<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"4-\u63a7\u5236\u5668\u521d\u59cb\u5316\">4. \u63a7\u5236\u5668\u521d\u59cb\u5316<\/h2>\n<h3 id=\"41-\u63a7\u5236\u5668\u6ce8\u518c\">4.1 \u63a7\u5236\u5668\u6ce8\u518c<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u63a7\u5236\u5668\u6ce8\u518c\u8868<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ cmd\/kube-controller-manager\/app\/controllermanager.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">NewControllerInitializers<\/span><span class=\"p\">(<\/span><span class=\"nx\">loopMode<\/span> <span class=\"nx\">ControllerLoopMode<\/span><span class=\"p\">)<\/span> <span class=\"kd\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"nx\">InitFunc<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span> <span class=\"o\">:=<\/span> <span class=\"kd\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"nx\">InitFunc<\/span><span class=\"p\">{}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5de5\u4f5c\u8d1f\u8f7d\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;deployment&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startDeploymentController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;replicaset&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startReplicaSetController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;statefulset&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startStatefulSetController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;daemonset&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startDaemonSetController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;job&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startJobController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;cronjob&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startCronJobController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Pod \u76f8\u5173\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;replicationcontroller&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startReplicationController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;podgc&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startPodGCController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u670d\u52a1\u76f8\u5173\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;endpoint&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startEndpointController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;endpointslice&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startEndpointSliceController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;endpointslicemirroring&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startEndpointSliceMirroringController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8282\u70b9\u76f8\u5173\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;nodelifecycle&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startNodeLifecycleController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;nodeipam&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startNodeIpamController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;ttl&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startTTLController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5b58\u50a8\u76f8\u5173\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;persistentvolume-binder&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startPersistentVolumeBinderController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;attachdetach&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startAttachDetachController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;persistentvolume-expander&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startVolumeExpandController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;pvc-protection&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startPVCProtectionController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;pv-protection&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startPVProtectionController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u547d\u540d\u7a7a\u95f4\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;namespace&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startNamespaceController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ServiceAccount \u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;serviceaccount&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startServiceAccountController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;serviceaccount-token&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startServiceAccountTokenController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8d44\u6e90\u914d\u989d\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;resourcequota&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startResourceQuotaController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5783\u573e\u56de\u6536\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;garbagecollector&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startGarbageCollectorController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ TTL \u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;ttl-after-finished&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startTTLAfterFinishedController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8bc1\u4e66\u63a7\u5236\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;csrapproving&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startCSRApprovingController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;csrcleaner&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startCSRCleanerController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllers<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;csrsigning&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">startCSRSigningController<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5176\u4ed6\u63a7\u5236\u5668...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">controllers<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"42-\u63a7\u5236\u5668\u521d\u59cb\u5316\u793a\u4f8b\">4.2 \u63a7\u5236\u5668\u521d\u59cb\u5316\u793a\u4f8b<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Deployment \u63a7\u5236\u5668\u521d\u59cb\u5316<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ cmd\/kube-controller-manager\/app\/apps.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">startDeploymentController<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span> <span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nx\">Context<\/span><span class=\"p\">,<\/span> <span class=\"nx\">controllerContext<\/span> <span class=\"nx\">ControllerContext<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"nx\">controller<\/span><span class=\"p\">.<\/span><span class=\"nx\">Interface<\/span><span class=\"p\">,<\/span> <span class=\"kt\">bool<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">dc<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">deployment<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewDeploymentController<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllerContext<\/span><span class=\"p\">.<\/span><span class=\"nx\">InformerFactory<\/span><span class=\"p\">.<\/span><span class=\"nf\">Apps<\/span><span class=\"p\">().<\/span><span class=\"nf\">V1<\/span><span class=\"p\">().<\/span><span class=\"nf\">Deployments<\/span><span class=\"p\">(),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllerContext<\/span><span class=\"p\">.<\/span><span class=\"nx\">InformerFactory<\/span><span class=\"p\">.<\/span><span class=\"nf\">Apps<\/span><span class=\"p\">().<\/span><span class=\"nf\">V1<\/span><span class=\"p\">().<\/span><span class=\"nf\">ReplicaSets<\/span><span class=\"p\">(),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllerContext<\/span><span class=\"p\">.<\/span><span class=\"nx\">InformerFactory<\/span><span class=\"p\">.<\/span><span class=\"nf\">Core<\/span><span class=\"p\">().<\/span><span class=\"nf\">V1<\/span><span class=\"p\">().<\/span><span class=\"nf\">Pods<\/span><span class=\"p\">(),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">controllerContext<\/span><span class=\"p\">.<\/span><span class=\"nx\">ClientBuilder<\/span><span class=\"p\">.<\/span><span class=\"nf\">ClientOrDie<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;deployment-controller&#34;<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kc\">nil<\/span><span class=\"p\">,<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Errorf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;error creating Deployment controller: %v&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">go<\/span> <span class=\"nx\">dc<\/span><span class=\"p\">.<\/span><span class=\"nf\">Run<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"nx\">controllerContext<\/span><span class=\"p\">.<\/span><span class=\"nx\">ComponentConfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">DeploymentController<\/span><span class=\"p\">.<\/span><span class=\"nx\">ConcurrentDeploymentSyncs<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kc\">nil<\/span><span class=\"p\">,<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"kc\">nil<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"5-sharedinformerfactory\">5. SharedInformerFactory<\/h2>\n<h3 id=\"51-informer-\u5de5\u5382\u7ed3\u6784\">5.1 Informer \u5de5\u5382\u7ed3\u6784<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ SharedInformerFactory \u521b\u5efa<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ cmd\/kube-controller-manager\/app\/controllermanager.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">CreateControllerContext<\/span><span class=\"p\">(<\/span><span class=\"nx\">c<\/span> <span class=\"o\">*<\/span><span class=\"nx\">config<\/span><span class=\"p\">.<\/span><span class=\"nx\">CompletedConfig<\/span><span class=\"p\">,<\/span> <span class=\"o\">...<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"nx\">ControllerContext<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u521b\u5efa SharedInformerFactory<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">sharedInformers<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">informers<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewSharedInformerFactory<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">versionedClient<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">ResyncPeriod<\/span><span class=\"p\">(<\/span><span class=\"nx\">c<\/span><span class=\"p\">)(),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u521b\u5efa Metadata Informer (\u7528\u4e8e GC)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">metadataInformers<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">metadatainformers<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewSharedInformerFactory<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">metadataClient<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nf\">ResyncPeriod<\/span><span class=\"p\">(<\/span><span class=\"nx\">c<\/span><span class=\"p\">)(),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">ControllerContext<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">InformerFactory<\/span><span class=\"p\">:<\/span> <span class=\"nx\">sharedInformers<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ObjectOrMetadataInformerFactory<\/span><span class=\"p\">:<\/span> <span class=\"nx\">controller<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewInformerFactory<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">sharedInformers<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">metadataInformers<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"o\">...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">},<\/span> <span class=\"kc\">nil<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"52-informer-\u542f\u52a8\">5.2 Informer \u542f\u52a8<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u542f\u52a8 Informers<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ cmd\/kube-controller-manager\/app\/controllermanager.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span> <span class=\"nx\">ControllerContext<\/span><span class=\"p\">)<\/span> <span class=\"nf\">StartInformers<\/span><span class=\"p\">(<\/span><span class=\"nx\">stopCh<\/span> <span class=\"o\">&lt;-<\/span><span class=\"kd\">chan<\/span> <span class=\"kd\">struct<\/span><span class=\"p\">{})<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">InformerFactory<\/span><span class=\"p\">.<\/span><span class=\"nf\">Start<\/span><span class=\"p\">(<\/span><span class=\"nx\">stopCh<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">ObjectOrMetadataInformerFactory<\/span><span class=\"p\">.<\/span><span class=\"nf\">Start<\/span><span class=\"p\">(<\/span><span class=\"nx\">stopCh<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u7b49\u5f85\u7f13\u5b58\u540c\u6b65<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span> <span class=\"nx\">ControllerContext<\/span><span class=\"p\">)<\/span> <span class=\"nf\">WaitForInformersSync<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">InformerFactory<\/span><span class=\"p\">.<\/span><span class=\"nf\">WaitForCacheSync<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">Stop<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"6-leader-election\">6. Leader Election<\/h2>\n<h3 id=\"61-\u9009\u4e3e\u673a\u5236\">6.1 \u9009\u4e3e\u673a\u5236<\/h3>\n<div class=\"mermaid text-center\">graph TB\n subgraph leader_election[\"Leader Election\"]\n LOCK[\"Lease Lock<br\/>(kube-system\/kube-controller-manager)\"]\n CM1[\"Controller Manager 1<br\/>Leader\"]\n CM2[\"Controller Manager 2<br\/>Standby\"]\n CM3[\"Controller Manager 3<br\/>Standby\"]\n end\n\n CM1 -->|\"\u6301\u6709\u9501\"| LOCK\n CM2 -.->|\"\u5c1d\u8bd5\u83b7\u53d6\"| LOCK\n CM3 -.->|\"\u5c1d\u8bd5\u83b7\u53d6\"| LOCK\n<\/div>\n\n<h3 id=\"62-\u9009\u4e3e\u914d\u7f6e\">6.2 \u9009\u4e3e\u914d\u7f6e<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Leader Election \u914d\u7f6e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ staging\/src\/k8s.io\/component-base\/config\/types.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type<\/span> <span class=\"nx\">LeaderElectionConfiguration<\/span> <span class=\"kd\">struct<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u662f\u5426\u542f\u7528\u9009\u4e3e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">LeaderElect<\/span> <span class=\"kt\">bool<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u9501\u7684\u6301\u7eed\u65f6\u95f4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">LeaseDuration<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">Duration<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u7eed\u7ea6\u622a\u6b62\u65f6\u95f4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">RenewDeadline<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">Duration<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u91cd\u8bd5\u95f4\u9694<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">RetryPeriod<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">Duration<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8d44\u6e90\u9501\u7c7b\u578b<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ResourceLock<\/span> <span class=\"kt\">string<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8d44\u6e90\u540d\u79f0<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ResourceName<\/span> <span class=\"kt\">string<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8d44\u6e90\u547d\u540d\u7a7a\u95f4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ResourceNamespace<\/span> <span class=\"kt\">string<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u9ed8\u8ba4\u503c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">var<\/span> <span class=\"nx\">defaultLeaderElectionConfiguration<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">LeaderElectionConfiguration<\/span><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">LeaderElect<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">LeaseDuration<\/span><span class=\"p\">:<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">Duration<\/span><span class=\"p\">{<\/span><span class=\"nx\">Duration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">15<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span><span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">RenewDeadline<\/span><span class=\"p\">:<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">Duration<\/span><span class=\"p\">{<\/span><span class=\"nx\">Duration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">10<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span><span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">RetryPeriod<\/span><span class=\"p\">:<\/span> <span class=\"nx\">metav1<\/span><span class=\"p\">.<\/span><span class=\"nx\">Duration<\/span><span class=\"p\">{<\/span><span class=\"nx\">Duration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">2<\/span> <span class=\"o\">*<\/span> <span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span><span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ResourceLock<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;leases&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ResourceName<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;kube-controller-manager&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ResourceNamespace<\/span><span class=\"p\">:<\/span> <span class=\"s\">&#34;kube-system&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"63-\u9009\u4e3e\u5b9e\u73b0\">6.3 \u9009\u4e3e\u5b9e\u73b0<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8fd0\u884c\u9009\u4e3e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ staging\/src\/k8s.io\/client-go\/tools\/leaderelection\/leaderelection.go<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">RunOrDie<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span> <span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nx\">Context<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lec<\/span> <span class=\"nx\">LeaderElectionConfig<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">le<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nf\">NewLeaderElector<\/span><span class=\"p\">(<\/span><span class=\"nx\">lec<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">le<\/span><span class=\"p\">.<\/span><span class=\"nf\">Run<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"p\">(<\/span><span class=\"nx\">le<\/span> <span class=\"o\">*<\/span><span class=\"nx\">LeaderElector<\/span><span class=\"p\">)<\/span> <span class=\"nf\">Run<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span> <span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nx\">Context<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">le<\/span><span class=\"p\">.<\/span><span class=\"nx\">config<\/span><span class=\"p\">.<\/span><span class=\"nx\">Callbacks<\/span><span class=\"p\">.<\/span><span class=\"nf\">OnStoppedLeading<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5c1d\u8bd5\u83b7\u53d6\u9501<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">!<\/span><span class=\"nx\">le<\/span><span class=\"p\">.<\/span><span class=\"nf\">acquire<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u83b7\u53d6\u9501\u6210\u529f\uff0c\u542f\u52a8\u56de\u8c03<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"nx\">cancel<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">context<\/span><span class=\"p\">.<\/span><span class=\"nf\">WithCancel<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">defer<\/span> <span class=\"nf\">cancel<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">go<\/span> <span class=\"nx\">le<\/span><span class=\"p\">.<\/span><span class=\"nx\">config<\/span><span class=\"p\">.<\/span><span class=\"nx\">Callbacks<\/span><span class=\"p\">.<\/span><span class=\"nf\">OnStartedLeading<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u7eed\u7ea6\u5faa\u73af<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">le<\/span><span class=\"p\">.<\/span><span class=\"nf\">renew<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"7-\u63a7\u5236\u5668\u5217\u8868\">7. \u63a7\u5236\u5668\u5217\u8868<\/h2>\n<h3 id=\"71-\u5de5\u4f5c\u8d1f\u8f7d\u63a7\u5236\u5668\">7.1 \u5de5\u4f5c\u8d1f\u8f7d\u63a7\u5236\u5668<\/h3>\n<table>\n <thead>\n <tr>\n <th>\u63a7\u5236\u5668<\/th>\n <th>\u804c\u8d23<\/th>\n <th>\u5173\u8054\u8d44\u6e90<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td>deployment<\/td>\n <td>Deployment \u7ba1\u7406<\/td>\n <td>Deployment, ReplicaSet<\/td>\n <\/tr>\n <tr>\n <td>replicaset<\/td>\n <td>ReplicaSet \u7ba1\u7406<\/td>\n <td>ReplicaSet, Pod<\/td>\n <\/tr>\n <tr>\n <td>statefulset<\/td>\n <td>StatefulSet \u7ba1\u7406<\/td>\n <td>StatefulSet, Pod, PVC<\/td>\n <\/tr>\n <tr>\n <td>daemonset<\/td>\n <td>DaemonSet \u7ba1\u7406<\/td>\n <td>DaemonSet, Pod<\/td>\n <\/tr>\n <tr>\n <td>job<\/td>\n <td>Job \u7ba1\u7406<\/td>\n <td>Job, Pod<\/td>\n <\/tr>\n <tr>\n <td>cronjob<\/td>\n <td>CronJob \u7ba1\u7406<\/td>\n <td>CronJob, Job<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h3 id=\"72-\u670d\u52a1\u53d1\u73b0\u63a7\u5236\u5668\">7.2 \u670d\u52a1\u53d1\u73b0\u63a7\u5236\u5668<\/h3>\n<table>\n <thead>\n <tr>\n <th>\u63a7\u5236\u5668<\/th>\n <th>\u804c\u8d23<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td>endpoint<\/td>\n <td>\u7ef4\u62a4 Endpoints<\/td>\n <\/tr>\n <tr>\n <td>endpointslice<\/td>\n <td>\u7ef4\u62a4 EndpointSlice<\/td>\n <\/tr>\n <tr>\n <td>endpointslicemirroring<\/td>\n <td>Endpoints \u5230 EndpointSlice \u955c\u50cf<\/td>\n <\/tr>\n <tr>\n <td>service<\/td>\n <td>Service \u5904\u7406<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h3 id=\"73-\u8282\u70b9\u63a7\u5236\u5668\">7.3 \u8282\u70b9\u63a7\u5236\u5668<\/h3>\n<table>\n <thead>\n <tr>\n <th>\u63a7\u5236\u5668<\/th>\n <th>\u804c\u8d23<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td>nodelifecycle<\/td>\n <td>\u8282\u70b9\u751f\u547d\u5468\u671f\u7ba1\u7406<\/td>\n <\/tr>\n <tr>\n <td>nodeipam<\/td>\n <td>\u8282\u70b9 CIDR \u5206\u914d<\/td>\n <\/tr>\n <tr>\n <td>taintmanager<\/td>\n <td>\u6c61\u70b9\u7ba1\u7406<\/td>\n <\/tr>\n <tr>\n <td>ttl<\/td>\n <td>TTL \u7ba1\u7406<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h3 id=\"74-\u5b58\u50a8\u63a7\u5236\u5668\">7.4 \u5b58\u50a8\u63a7\u5236\u5668<\/h3>\n<table>\n <thead>\n <tr>\n <th>\u63a7\u5236\u5668<\/th>\n <th>\u804c\u8d23<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td>persistentvolume-binder<\/td>\n <td>PV\/PVC \u7ed1\u5b9a<\/td>\n <\/tr>\n <tr>\n <td>attachdetach<\/td>\n <td>\u5377 Attach\/Detach<\/td>\n <\/tr>\n <tr>\n <td>persistentvolume-expander<\/td>\n <td>\u5377\u6269\u5c55<\/td>\n <\/tr>\n <tr>\n <td>pvc-protection<\/td>\n <td>PVC \u4fdd\u62a4<\/td>\n <\/tr>\n <tr>\n <td>pv-protection<\/td>\n <td>PV \u4fdd\u62a4<\/td>\n <\/tr>\n <tr>\n <td>ephemeral-volume<\/td>\n <td>\u4e34\u65f6\u5377<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h3 id=\"75-\u5176\u4ed6\u63a7\u5236\u5668\">7.5 \u5176\u4ed6\u63a7\u5236\u5668<\/h3>\n<table>\n <thead>\n <tr>\n <th>\u63a7\u5236\u5668<\/th>\n <th>\u804c\u8d23<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td>namespace<\/td>\n <td>\u547d\u540d\u7a7a\u95f4\u751f\u547d\u5468\u671f<\/td>\n <\/tr>\n <tr>\n <td>serviceaccount<\/td>\n <td>ServiceAccount \u7ba1\u7406<\/td>\n <\/tr>\n <tr>\n <td>garbagecollector<\/td>\n <td>\u5783\u573e\u56de\u6536<\/td>\n <\/tr>\n <tr>\n <td>resourcequota<\/td>\n <td>\u8d44\u6e90\u914d\u989d<\/td>\n <\/tr>\n <tr>\n <td>horizontalpodautoscaling<\/td>\n <td>HPA<\/td>\n <\/tr>\n <tr>\n <td>disruption<\/td>\n <td>PDB \u7ba1\u7406<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h2 id=\"8-\u914d\u7f6e\u53c2\u6570\">8. \u914d\u7f6e\u53c2\u6570<\/h2>\n<h3 id=\"81-\u901a\u7528\u914d\u7f6e\">8.1 \u901a\u7528\u914d\u7f6e<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-yaml\" data-lang=\"yaml\"><span class=\"line\"><span class=\"cl\"><span class=\"c\"># Controller Manager \u914d\u7f6e\u793a\u4f8b<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">apiVersion<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">kubecontroller.config.k8s.io\/v1alpha1<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">kind<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">KubeControllerManagerConfiguration<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">generic<\/span><span class=\"p\">:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c\"># \u5e76\u53d1\u540c\u6b65\u6570<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">controllers<\/span><span class=\"p\">:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span>- <span class=\"s2\">&#34;*&#34;<\/span><span class=\"w\"> <\/span><span class=\"c\"># \u542f\u7528\u6240\u6709\u63a7\u5236\u5668<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c\"># \u6216\u7981\u7528\u7279\u5b9a\u63a7\u5236\u5668<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c\"># controllers:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c\"># - &#34;*&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c\"># - &#34;-bootstrapsigner&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"c\"># Leader Election<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">leaderElection<\/span><span class=\"p\">:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">leaderElect<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">leaseDuration<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">15s<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">renewDeadline<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">10s<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">retryPeriod<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">2s<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">resourceLock<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">leases<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">resourceName<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">kube-controller-manager<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">resourceNamespace<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">kube-system<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h3 id=\"82-\u63a7\u5236\u5668\u7279\u5b9a\u914d\u7f6e\">8.2 \u63a7\u5236\u5668\u7279\u5b9a\u914d\u7f6e<\/h3>\n\n\n\n<div class=\"expressive-code\">\n <figure class=\"frame not-content\">\n <figcaption class=\"header\">\n <span class=\"title\"><\/span>\n <\/figcaption>\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-yaml\" data-lang=\"yaml\"><span class=\"line\"><span class=\"cl\"><span class=\"c\"># \u5404\u63a7\u5236\u5668\u914d\u7f6e<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">deploymentController<\/span><span class=\"p\">:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">concurrentDeploymentSyncs<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"m\">5<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">replicaSetController<\/span><span class=\"p\">:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">concurrentRSSyncs<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"m\">5<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">endpointController<\/span><span class=\"p\">:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">concurrentEndpointSyncs<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"m\">5<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">serviceAccountController<\/span><span class=\"p\">:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">concurrentSATokenSyncs<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"m\">5<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">serviceAccountKeyFile<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">\/etc\/kubernetes\/pki\/sa.key<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">garbageCollectorController<\/span><span class=\"p\">:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">concurrentGCSyncs<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"m\">20<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">enableGarbageCollector<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">nodeLifecycleController<\/span><span class=\"p\">:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">podEvictionTimeout<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">5m0s<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">nodeMonitorGracePeriod<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">40s<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nt\">nodeStartupGracePeriod<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"l\">1m0s<\/span><\/span><\/span><\/code><\/pre><\/div>\n <\/figure>\n<\/div>\n<h2 id=\"\u5c0f\u7ed3\">\u5c0f\u7ed3<\/h2>\n<p>\u672c\u6587\u4ecb\u7ecd\u4e86 Controller Manager \u7684\u6574\u4f53\u67b6\u6784\uff1a<\/p>"},{"title":"Controller Manager \u4e0e Controller \u6846\u67b6\u6df1\u5ea6\u89e3\u6790","link":"https:\/\/cloudnative.lei6393.com\/volcano\/05-controllers-analysis\/01-controller-framework\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cloudnative.lei6393.com\/volcano\/05-controllers-analysis\/01-controller-framework\/","description":"<h2 id=\"1-\u6982\u8ff0\">1. \u6982\u8ff0<\/h2>\n<p>Volcano Controller Manager \u662f Volcano \u7cfb\u7edf\u7684\u6838\u5fc3\u7ec4\u4ef6\u4e4b\u4e00\uff0c\u8d1f\u8d23\u7ba1\u7406\u6240\u6709\u81ea\u5b9a\u4e49\u8d44\u6e90 (CRD) \u7684\u751f\u547d\u5468\u671f\u3002\u5b83\u91c7\u7528\u7ecf\u5178\u7684 Kubernetes Controller \u6a21\u5f0f\uff0c\u901a\u8fc7 <strong>Informer \u76d1\u542c + Work Queue \u5904\u7406 + \u72b6\u6001\u673a\u9a71\u52a8<\/strong> \u7684\u65b9\u5f0f\uff0c\u5b9e\u73b0\u4e86\u5bf9 Job\u3001Queue\u3001PodGroup\u3001JobFlow \u7b49\u8d44\u6e90\u7684\u81ea\u52a8\u5316\u7ba1\u7406\u3002<\/p>"}]}}