{"id":109,"date":"2026-02-11T15:40:26","date_gmt":"2026-02-11T07:40:26","guid":{"rendered":"https:\/\/win7er.com\/?p=109"},"modified":"2026-02-11T15:43:24","modified_gmt":"2026-02-11T07:43:24","slug":"kubespray%e9%83%a8%e7%bd%b2k8s%e9%9b%86%e7%be%a4","status":"publish","type":"post","link":"https:\/\/win7er.com\/?p=109","title":{"rendered":"kubespray\u90e8\u7f72k8s\u96c6\u7fa4"},"content":{"rendered":"<h3 class=\"wp-block-heading\">1. \u670d\u52a1\u5668\u8bf4\u660e<\/h3>\n<h4 class=\"wp-block-heading\">1.1 \u8282\u70b9\u8981\u6c42<\/h4>\n<p>\u8282\u70b9\u6570 &gt;= 3\u53f0\nCPU &gt;= 2c\n\u5185\u5b58 &gt;= 2GB\n\u5b89\u5168\u7ec4\uff1a\u5173\u95ed\uff08\u5141\u8bb8\u8282\u70b9\u4e4b\u95f4\u4efb\u610f\u7aef\u53e3\u8bbf\u95ee\uff0c\u4ee5\u53caipip\u96a7\u9053\u534f\u8bae\u901a\u8baf\uff09<\/p>\n<h4 class=\"wp-block-heading\">1.2 \u73af\u5883\u8bf4\u660e<\/h4>\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\">\n<thead>\n<tr>\n<th style=\"text-align: center\">\u6211\u4eec\u4f7f\u7528\u4e09\u53f0CentOS7.6\u7684\u865a\u62df\u673a\uff0c\u5177\u4f53\u4fe1\u606f\u5982\u4e0b\uff1a<\/th>\n<th style=\"text-align: center\">\u7cfb\u7edf\u7c7b\u578b<\/th>\n<th style=\"text-align: center\">IP\u5730\u5740<\/th>\n<th style=\"text-align: center\">\u8282\u70b9\u89d2\u8272<\/th>\n<th style=\"text-align: center\">CPU<\/th>\n<th style=\"text-align: center\">Memory<\/th>\n<th>Hostname<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: center\">centos-7.6<\/td>\n<td style=\"text-align: center\">10.211.55.14<\/td>\n<td style=\"text-align: center\">master<\/td>\n<td style=\"text-align: center\">&gt;=2<\/td>\n<td style=\"text-align: center\">&gt;=2G<\/td>\n<td style=\"text-align: center\">node-1<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\">centos-7.6<\/td>\n<td style=\"text-align: center\">10.211.55.15<\/td>\n<td style=\"text-align: center\">master<\/td>\n<td style=\"text-align: center\">&gt;=2<\/td>\n<td style=\"text-align: center\">&gt;=2G<\/td>\n<td style=\"text-align: center\">node-2<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\">centos-7.6<\/td>\n<td style=\"text-align: center\">10.211.55.16<\/td>\n<td style=\"text-align: center\">worker<\/td>\n<td style=\"text-align: center\">&gt;=2<\/td>\n<td style=\"text-align: center\">&gt;=2G<\/td>\n<td style=\"text-align: center\">node-3<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n<h4 class=\"wp-block-heading\">1.3 \u79d1\u5b66\u4e0a\u7f51<\/h4>\n<blockquote>\n<p>\u6ce8\u610f\uff1a\u5b89\u88c5\u8fc7\u7a0b\u9700\u8981\u8bbf\u95ee\u5f88\u591agoogle\u3001github\u3001docker.io\u3001k8s.io\u7b49\u5916\u7f51\u5730\u5740\n\u73af\u5883\u4e2d\u53ea\u8981\u6709\u4e00\u53f0\u4f5c\u4e3a\u4ee3\u7406\u53ef\u8bbf\u95ee\u5916\u7f51\u5373\u53ef<\/p>\n<\/blockquote>\n<p>\u670d\u52a1\u5668\u9700\u8981\u80fd\u591f\u6709\u8bbf\u95ee\u5916\u7f51\u7684\u80fd\u529b\uff0c\u82e5\u4f7f\u7528\u66ff\u4ee3\u6e90\u4f1a\u6709\u5f88\u591a\u9700\u8981\u4fee\u6539\u7684\u5730\u65b9\uff0c\u5f88\u5bb9\u6613\u9057\u6f0f\u5bfc\u81f4\u5b89\u88c5\u5931\u8d25\uff0c\u5efa\u8bae\u642d\u5efaproxy\u6216\u8005\u90e8\u7f72\u5728\u80fd\u8bbf\u95ee\u5916\u7f51\u7684\u73af\u5883\u4e2d<\/p>\n<h5 class=\"wp-block-heading\">1.3.1 \u8d2d\u4e70ss\u670d\u52a1<\/h5>\n<p><a href=\"https:\/\/portal.shadowsocks.au\/login\">https:\/\/portal.shadowsocks.au\/login<\/a><\/p>\n<h5 class=\"wp-block-heading\">1.3.2 \u642d\u5efatrojan+privoxy\u5b9e\u73b0\u79d1\u5b66\u4e0a\u7f51<\/h5>\n<p>\u5177\u4f53\u64cd\u4f5c\u8bf7\u770b\u6587\u6863\n<a href=\"https:\/\/app.yinxiang.com\/shard\/s72\/nl\/17034191\/278072f9-1b29-4531-9afb-4186340e2f2e\/\">Linux trojan proxy<\/a><\/p>\n<blockquote>\n<p>\u6ce8\u610f\uff1a\u7531\u4e8e\u90e8\u5206\u4ee3\u7406\u6a21\u5f0f\u95ee\u9898\uff0c\u5bfc\u81f4\u5f00\u542f\u4e86\u4ee3\u7406\u540e\u5728yum\u5b89\u88c5\u65f6\u4f1a\u62a5503\uff0c\u6240\u4ee5\u9700\u8981\u5bf9privoxy\u7684forward\u505a\u4e00\u4e9b\u7b56\u7565\u4fee\u6539<\/p>\n<\/blockquote>\n<p>\u5c06\u5168\u8f6c\u53d1\u7b56\u7565\n<code>forward-socks5t \/ 127.0.0.1:1080 .<\/code>\n\u66ff\u6362\u4e3a<\/p>\n<pre><code>forward-socks5t .google.com 127.0.0.1:1080 .\nforward-socks5t .googleapis.com 127.0.0.1:1080 .\nforward-socks5t .githubusercontent.com 127.0.0.1:1080 .\nforward-socks5t .github.com 127.0.0.1:1080 .\nforward-socks5t .docker.io 127.0.0.1:1080 .\nforward-socks5t .k8s.io 127.0.0.1:1080 .\nforward-socks5t .pkg.dev 127.0.0.1:1080 .<\/code><\/pre>\n<p>\u53ea\u5bf9\u8fd9\u4e9b\u5730\u5740\u505a\u5916\u90e8\u8f6c\u53d1<\/p>\n<p>\u7f16\u8f91\u6240\u6709\u8282\u70b9\u7684\/root\/.bash_profile\uff0c\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u8bbe\u7f6e\u547d\u4ee4\u884c\u4ee3\u7406<\/p>\n<pre><code>export https_proxy=http:\/\/10.211.55.14:8118\nexport http_proxy=http:\/\/10.211.55.14:8118\nexport all_proxy=http:\/\/10.211.55.14:8118<\/code><\/pre>\n<blockquote>\n<p>\u6ce8\u610f\uff1a10.211.55.14\u4e3a\u90e8\u7f72\u4e86trojan+privoxy\u53ef\u79d1\u5b66\u4e0a\u7f51\u7684\u4ee3\u7406\u670d\u52a1\u5668<\/p>\n<\/blockquote>\n<p>\u52a0\u8f7d\u914d\u7f6e<\/p>\n<pre><code>source \/root\/.bash_profile<\/code><\/pre>\n<h3 class=\"wp-block-heading\">2. \u7cfb\u7edf\u8bbe\u7f6e\uff08\u6240\u6709\u8282\u70b9\uff09<\/h3>\n<blockquote>\n<p>\u6ce8\u610f\uff1a\u6240\u6709\u64cd\u4f5c\u4f7f\u7528root\u7528\u6237\u6267\u884c<\/p>\n<h4 class=\"wp-block-heading\">2.1 \u4e3b\u673a\u540d<\/h4>\n<p>\u4e3b\u673a\u540d\u5fc5\u987b\u5408\u6cd5\uff0c\u5e76\u4e14\u6bcf\u4e2a\u8282\u70b9\u90fd\u4e0d\u4e00\u6837\uff08\u5efa\u8bae\u547d\u540d\u89c4\u8303\uff1a\u6570\u5b57+\u5b57\u6bcd+\u4e2d\u5212\u7ebf\u7ec4\u5408\uff0c\u4e0d\u8981\u5305\u542b\u5176\u4ed6\u7279\u6b8a\u5b57\u7b26\uff09\u3002<\/p>\n<\/blockquote>\n<p><strong><em># \u67e5\u770b\u4e3b\u673a\u540d<\/em><\/strong><\/p>\n<blockquote>\n<p>$ hostname<\/p>\n<\/blockquote>\n<p><strong><em># \u4fee\u6539\u4e3b\u673a\u540d<\/em><\/strong><\/p>\n<blockquote>\n<p>$ hostnamectl set-hostname <\/p>\n\n#### 2.2 \u5173\u95ed\u9632\u706b\u5899\u3001selinux\u3001swap\uff0c\u91cd\u7f6eiptables\n<\/blockquote>\n<p><strong><em># \u5173\u95edselinux<\/em><\/strong><\/p>\n<blockquote>\n<p>$ setenforce 0\n$ sed -i &#8216;\/SELINUX\/s\/enforcing\/disabled\/&#8217; \/etc\/selinux\/config<\/p>\n<\/blockquote>\n<p><strong><em># \u5173\u95ed\u9632\u706b\u5899<\/em><\/strong><\/p>\n<blockquote>\n<p>$ systemctl stop firewalld &amp;&amp; systemctl disable firewalld<\/p>\n<\/blockquote>\n<p><strong><em># \u8bbe\u7f6eiptables\u89c4\u5219<\/em><\/strong><\/p>\n<blockquote>\n<p>$ iptables -F &amp;&amp; iptables -X &amp;&amp; iptables -F -t nat &amp;&amp; iptables -X -t nat &amp;&amp; iptables -P FORWARD ACCEPT<\/p>\n<\/blockquote>\n<p><strong><em># \u5173\u95edswap<\/em><\/strong><\/p>\n<blockquote>\n<p>$ swapoff -a &amp;&amp; free \u2013h<\/p>\n<\/blockquote>\n<p><strong><em># \u5173\u95eddnsmasq(\u5426\u5219\u53ef\u80fd\u5bfc\u81f4\u5bb9\u5668\u65e0\u6cd5\u89e3\u6790\u57df\u540d)<\/em><\/strong><\/p>\n<blockquote>\n<p>$ service dnsmasq stop &amp;&amp; systemctl disable dnsmasq<\/p>\n<\/blockquote>\n<h4 class=\"wp-block-heading\">2.3 k8s\u53c2\u6570\u8bbe\u7f6e<\/h4>\n<p><strong><em># \u5236\u4f5c\u914d\u7f6e\u6587\u4ef6<\/em><\/strong><\/p>\n<blockquote>\n<p>$ cat &gt; \/etc\/sysctl.d\/kubernetes.conf &lt;&lt;EOF\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_nonlocal_bind = 1\nnet.ipv4.ip_forward = 1\nvm.swappiness = 0\nvm.overcommit_memory = 1\nEOF<\/p>\n<\/blockquote>\n<p><strong><em># \u751f\u6548\u6587\u4ef6<\/em><\/strong><\/p>\n<blockquote>\n<p>$ sysctl -p \/etc\/sysctl.d\/kubernetes.conf<\/p>\n<\/blockquote>\n<h4 class=\"wp-block-heading\">2.4 etcdV3 API\u73af\u5883\u53d8\u91cf\u8bbe\u7f6e<\/h4>\n<blockquote>\n<p>\u6ce8\u610f\uff1a\u4f7f\u7528etcd V3\u7248\u672c\u8c03\u7528API\u65f6\u9700\u8981\u8bbe\u7f6e<\/p>\n<\/blockquote>\n<p><strong><em># \u7f16\u8f91\/etc\/profile<\/em><\/strong><\/p>\n<blockquote>\n<p>$ vi \/etc\/profile<\/p>\n<\/blockquote>\n<p><strong><em># \u5728\u6587\u4ef6\u5c3e\u90e8\u6dfb\u52a0\u5982\u4e0b\u547d\u4ee4<\/em><\/strong><\/p>\n<blockquote>\n<p>export ETCDCTL_API=3<\/p>\n<\/blockquote>\n<p><strong><em># \u52a0\u8f7d\u914d\u7f6e<\/em><\/strong><\/p>\n<blockquote>\n<p>$ source \/etc\/profile<\/p>\n<\/blockquote>\n<h4 class=\"wp-block-heading\">2.5 \u79fb\u9664docker\u76f8\u5173\u8f6f\u4ef6\u5305\uff08\u53ef\u9009\uff09<\/h4>\n<blockquote>\n<p>$ yum remove -y docker*\n$ rm -f \/etc\/docker\/daemon.json<\/p>\n<\/blockquote>\n<h3 class=\"wp-block-heading\">3. \u4f7f\u7528kubespray\u90e8\u7f72\u96c6\u7fa4<\/h3>\n<p>\u8fd9\u90e8\u5206\u53ea\u9700\u8981\u5728\u4e00\u4e2a <strong>\u64cd\u4f5c<\/strong> \u8282\u70b9\u6267\u884c\uff0c\u53ef\u4ee5\u662f\u96c6\u7fa4\u4e2d\u7684\u4e00\u4e2a\u8282\u70b9\uff0c\u4e5f\u53ef\u4ee5\u662f\u96c6\u7fa4\u4e4b\u5916\u7684\u8282\u70b9\u3002\u751a\u81f3\u53ef\u4ee5\u662f\u4f60\u81ea\u5df1\u7684\u7b14\u8bb0\u672c\u7535\u8111\u3002\u6211\u4eec\u8fd9\u91cc\u4f7f\u7528\u66f4\u666e\u904d\u7684\u96c6\u7fa4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2alinux\u8282\u70b9\u3002<\/p>\n<h4 class=\"wp-block-heading\">3.1 \u914d\u7f6e\u514d\u5bc6<\/h4>\n<p><strong><em># 1. \u751f\u6210keygen\uff08\u6267\u884cssh-keygen\uff0c\u4e00\u8def\u56de\u8f66\u4e0b\u53bb\uff09<\/em><\/strong><\/p>\n<blockquote>\n<p>$ ssh-keygen<\/p>\n<\/blockquote>\n<p><strong><em># 2. \u67e5\u770b\u5e76\u590d\u5236\u751f\u6210\u7684pubkey<\/em><\/strong><\/p>\n<blockquote>\n<p>$ cat \/root\/.ssh\/id_rsa.pub<\/p>\n<\/blockquote>\n<p><strong><em># 3. \u5206\u522b\u767b\u9646\u5230\u6bcf\u4e2a\u8282\u70b9\u4e0a\uff0c\u5c06pubkey\u5199\u5165\/root\/.ssh\/authorized_keys<\/em><\/strong><\/p>\n<blockquote>\n<p>$ mkdir -p \/root\/.ssh\n$ echo &#8220;&#8221; &gt;&gt; \/root\/.ssh\/authorized_keys<\/p>\n<\/blockquote>\n<p>\u8bbe\u7f6e\u5b8c\u6210\u540e\u5728 <strong>\u64cd\u4f5c<\/strong> \u8282\u70b9\u5bf9\u6bcf\u4e2a\u8282\u70b9\u4f7f\u7528ssh\u6d4b\u8bd5\u767b\u5f55\uff0c\u4e0d\u7528\u8f93\u5165\u5bc6\u7801\u5373\u914d\u7f6e\u5b8c\u6210<\/p>\n<h4 class=\"wp-block-heading\">3.2 \u4f9d\u8d56\u8f6f\u4ef6\u4e0b\u8f7d\u3001\u5b89\u88c5<\/h4>\n<p>\u6839\u636e\u9700\u8981\u90e8\u7f72\u7684k8s\u7248\u672c\u53ef\u4e0b\u8f7d\u5bf9\u5e94\u7684kubespray\u7248\u672c\uff0c\u5efa\u8bae\u4e0b\u8f7d\u6700\u65b0\u7248\uff0c\u672c\u4f8b\u4f7f\u7528\u76ee\u524d\u6700\u65b0\u76842.21.0\u7248\u672c\uff0c\u8be5\u7248\u672c\u652f\u6301\u6700\u65b0\u7684python3.11\uff0c\u540e\u7eed\u6211\u4eec\u4e5f\u5c06\u91c7\u7528\u8fd9\u4e2a\u7248\u672c\u7684python\u8fdb\u884c\u90e8\u7f72<\/p>\n<h5 class=\"wp-block-heading\">3.2.1 kubespray2.21.0\u5bf9\u5e94\u7684Component versions<\/h5>\n<ul>\n<li>Core\n<ul>\n<li>kubernetes v1.25.6<\/li>\n<li>etcd v3.5.6<\/li>\n<li>docker v20.10 (cri_dockerd: v0.3.0)<\/li>\n<li>containerd v1.6.15<\/li>\n<li>cri-o v1.24<\/li>\n<\/ul><\/li>\n<li>Network Plugin\n<ul>\n<li>cni-plugins v1.2.0<\/li>\n<li>calico v3.24.5<\/li>\n<li>cilium v1.12.1<\/li>\n<li>flannel v0.20.2<\/li>\n<li>kube-ovn v1.10.7<\/li>\n<li>kube-router v1.5.1<\/li>\n<li>multus v3.8<\/li>\n<li>weave v2.8.1<\/li>\n<li>kube-vip v0.5.5<\/li>\n<\/ul><\/li>\n<li>Application\n<ul>\n<li>cert-manager v1.11.0<\/li>\n<li>coredns v1.9.3<\/li>\n<li>ingress-nginx v1.5.1<\/li>\n<li>krew v0.4.3<\/li>\n<li>argocd v2.5.7<\/li>\n<li>helm v3.10.3<\/li>\n<li>metallb v0.12.1<\/li>\n<li>registry v2.8.1<\/li>\n<\/ul><\/li>\n<li>Storage Plugin\n<ul>\n<li>cephfs-provisioner v2.1.0-k8s1.11<\/li>\n<li>rbd-provisioner v2.1.1-k8s1.11<\/li>\n<li>aws-ebs-csi-plugin v0.5.0<\/li>\n<li>azure-csi-plugin v1.10.0<\/li>\n<li>cinder-csi-plugin v1.22.0<\/li>\n<li>gcp-pd-csi-plugin v1.4.0<\/li>\n<li>local-path-provisioner v0.0.22<\/li>\n<li>local-volume-provisioner v2.5.0<\/li>\n<\/ul><\/li>\n<\/ul>\n<h5 class=\"wp-block-heading\">3.2.2 CentOS 7 \u5b89\u88c5python3.11<\/h5>\n<p>\u5b89\u88c5\u8fc7\u7a0b\u6bd4\u8f83\u7e41\u7410\uff0c\u4e0d\u5728\u8fd9\u91cc\u8fc7\u591a\u8d58\u8ff0\uff0c\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0b\u6587\u7ae0<\/p>\n<blockquote>\n<p><a href=\"https:\/\/code84.com\/834009.html\">CentOS 7 \u5b89\u88c5python3.11<\/a><\/p>\n<p>\u6ce8\u610f\uff1apip\u6267\u884c\u662f\u9700\u8981ssl\u652f\u6301\u7684\uff0c\u800cpython3.11\u9700\u8981openssl11\uff0c\u5982\u679c\u7cfb\u7edf\u9ed8\u8ba4\u7684openssl\u7248\u672c\u672a\u66f4\u65b0\uff0c\u4f1a\u5bfc\u81f4\u7f16\u8bd1\u540e\u7684python\u6ca1\u6709ssl\u6a21\u5757<\/p>\n<\/blockquote>\n<h5 class=\"wp-block-heading\">3.2.3 kubespray\u4e0b\u8f7d<\/h5>\n<p><a href=\"https:\/\/github.com\/kubernetes-sigs\/kubespray\">kubespray github<\/a><\/p>\n<p><strong><em># \u4e0b\u8f7d\u90e8\u7f72\u5305<\/em><\/strong><\/p>\n<blockquote>\n<p>wget <a href=\"https:\/\/github.com\/kubernetes-sigs\/kubespray\/archive\/refs\/tags\/v2.21.0.tar.gz\">https:\/\/github.com\/kubernetes-sigs\/kubespray\/archive\/refs\/tags\/v2.21.0.tar.gz<\/a><\/p>\n<\/blockquote>\n<p><strong><em># \u89e3\u538b\u90e8\u7f72\u5305<\/em><\/strong><\/p>\n<blockquote>\n<p>tar -xvf v2.21.0.tar.gz &amp;&amp; cd kubespray-2.21.0<\/p>\n<\/blockquote>\n<p><strong><em># \u5b89\u88c5requirements<\/em><\/strong><\/p>\n<blockquote>\n<p>cat requirements.txt\npip3 install -r requirements.txt<\/p>\n<\/blockquote>\n<p><strong><em># \u5982\u679cinstall\u9047\u5230\u95ee\u9898\u53ef\u4ee5\u5c1d\u8bd5\u5347\u7ea7pip\uff0c\u53ef\u80fd\u4f1a\u9047\u5230ruamel\u5305\u65e0\u6cd5\u5b89\u88c5<\/em><\/strong><\/p>\n<blockquote>\n<p>pip3 install &#8211;upgrade pip<\/p>\n<p>\u6ce8\u610f\uff1a\u5fc5\u987b\u786e\u4fdd\u6240\u6709\u4f9d\u8d56\u5305\u6b63\u786e\u5b89\u88c5\uff0c\u4e0d\u7136\u90e8\u7f72\u8fc7\u7a0b\u4f1a\u6709\u83ab\u540d\u5176\u5999\u95ee\u9898\u5bfc\u81f4\u5931\u8d25<\/p>\n<\/blockquote>\n<h4 class=\"wp-block-heading\">3.3 \u751f\u6210\u914d\u7f6e<\/h4>\n<p>\u9879\u76ee\u4e2d\u6709\u4e00\u4e2a\u76ee\u5f55\u662f\u96c6\u7fa4\u7684\u57fa\u7840\u914d\u7f6e\uff0c\u793a\u4f8b\u914d\u7f6e\u5728\u76ee\u5f55inventory\/sample\u4e2d\uff0c\u6211\u4eec\u590d\u5236\u4e00\u4efd\u51fa\u6765\u4f5c\u4e3a\u81ea\u5df1\u96c6\u7fa4\u7684\u914d\u7f6e<\/p>\n<blockquote>\n<p>cp -rpf inventory\/sample inventory\/mycluster<\/p>\n<\/blockquote>\n<p>\u7531\u4e8ekubespray\u7ed9\u6211\u4eec\u51c6\u5907\u4e86py\u811a\u672c\uff0c\u53ef\u4ee5\u76f4\u63a5\u6839\u636e\u73af\u5883\u53d8\u91cf\u81ea\u52a8\u751f\u6210\u914d\u7f6e\u6587\u4ef6\uff0c\u6240\u4ee5\u6211\u4eec\u73b0\u5728\u53ea\u9700\u8981\u8bbe\u5b9a\u597d\u73af\u5883\u53d8\u91cf\u5c31\u53ef\u4ee5\u5566<\/p>\n<p><strong><em># \u4f7f\u7528\u771f\u5b9e\u7684hostname\uff08\u5426\u5219\u4f1a\u81ea\u52a8\u628a\u4f60\u7684hostname\u6539\u6210node1\/node2&#8230;\u8fd9\u79cd\u54e6\uff09<\/em><\/strong><\/p>\n<blockquote>\n<p>$ export USE_REAL_HOSTNAME=true<\/p>\n<\/blockquote>\n<p><strong><em># \u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\u4f4d\u7f6e<\/em><\/strong><\/p>\n<blockquote>\n<p>$ export CONFIG_FILE=inventory\/mycluster\/hosts.yaml<\/p>\n<\/blockquote>\n<p><strong><em># \u5b9a\u4e49ip\u5217\u8868\uff08\u4f60\u7684\u670d\u52a1\u5668\u5185\u7f51ip\u5730\u5740\u5217\u8868\uff0c3\u53f0\u53ca\u4ee5\u4e0a\uff0c\u524d\u4e24\u53f0\u9ed8\u8ba4\u4e3amaster\u8282\u70b9\uff09<\/em><\/strong><\/p>\n<blockquote>\n<p>$ declare -a IPS=(10.211.55.14 10.211.55.15 10.211.55.16)<\/p>\n<\/blockquote>\n<p><strong><em># \u751f\u6210\u914d\u7f6e\u6587\u4ef6<\/em><\/strong><\/p>\n<blockquote>\n<p>$ python3 contrib\/inventory_builder\/inventory.py ${IPS[@]}<\/p>\n<\/blockquote>\n<h4 class=\"wp-block-heading\">3.4 \u4e2a\u6027\u5316\u914d\u7f6e<\/h4>\n<p>\u914d\u7f6e\u6587\u4ef6\u90fd\u751f\u6210\u597d\u4e86\uff0c\u867d\u7136\u53ef\u4ee5\u76f4\u63a5\u7528\uff0c\u4f46\u5e76\u4e0d\u80fd\u5b8c\u5168\u6ee1\u8db3\u5927\u5bb6\u7684\u4e2a\u6027\u5316\u9700\u6c42\uff0c\u6bd4\u5982\u7528docker\u8fd8\u662fcontainerd\uff1fdocker\u7684\u5de5\u4f5c\u76ee\u5f55\u662f\u5426\u7528\u9ed8\u8ba4\u7684\/var\/lib\/docker\uff1f\u7b49\u7b49\u3002\u5f53\u7136\u9ed8\u8ba4\u7684\u60c5\u51b5kubespray\u8fd8\u4f1a\u5230google\u7684\u5b98\u65b9\u4ed3\u5e93\u4e0b\u8f7d\u955c\u50cf\u3001\u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u8fd9\u4e2a\u5c31\u9700\u8981\u4f60\u7684\u670d\u52a1\u5668\u53ef\u4ee5\u4e0a\u5916\u9762\u7684\u7f51\uff0c\u60f3\u4e0a\u5916\u7f51\u4e5f\u9700\u8981\u4fee\u6539\u4e00\u4e9b\u914d\u7f6e\u3002<\/p>\n<h5 class=\"wp-block-heading\">3.4.1 \u8282\u70b9\u7ec4\u7ec7\u914d\u7f6e\uff08\u8fd9\u91cc\u53ef\u4ee5\u8c03\u6574\u6bcf\u4e2a\u8282\u70b9\u7684\u89d2\u8272\uff09<\/h5>\n<pre><code class=\"lang-bash language-bash bash\">[root@node-1 kubespray-2.21.0]# cat inventory\/mycluster\/hosts.yaml \nall:\n  hosts:\n    node-1:\n      ansible_host: 10.211.55.14\n      ip: 10.211.55.14\n      access_ip: 10.211.55.14\n    node-2:\n      ansible_host: 10.211.55.15\n      ip: 10.211.55.15\n      access_ip: 10.211.55.15\n    node-3:\n      ansible_host: 10.211.55.16\n      ip: 10.211.55.16\n      access_ip: 10.211.55.16\n  children:\n    kube_control_plane: ## master\u8282\u70b9\u7684\u4e3b\u673a\n      hosts:\n        node-1:\n        node-2:\n    kube_node:  ## worker\u8282\u70b9\u7684\u4e3b\u673a\n      hosts:\n        node-1:\n        node-2:\n        node-3:\n    etcd:\n      hosts:\n        node-1:\n        node-2:\n        node-3:\n    k8s_cluster:\n      children:\n        kube_control_plane:\n        kube_node:\n    calico_rr:\n      hosts: {}<\/code><\/pre>\n<h5 class=\"wp-block-heading\">3.4.2 k8s\u96c6\u7fa4\u914d\u7f6e\uff08\u5305\u62ec\u8bbe\u7f6e\u5bb9\u5668\u8fd0\u884c\u65f6\u3001svc\u7f51\u6bb5\u3001pod\u7f51\u6bb5\u7b49\uff09<\/h5>\n<blockquote>\n<p>cat inventory\/mycluster\/group_vars\/k8s_cluster\/k8s-cluster.yml <\/p>\n<\/blockquote>\n<p>\u6839\u636e\u9700\u8981\u4fee\u6539\u76f8\u5173\u914d\u7f6e\uff0c\u4e3b\u8981\u914d\u7f6e\u53c2\u8003<\/p>\n<blockquote>\n<p>## Change this to use another Kubernetes version, e.g. a current beta release\nkube_version: v1.25.6<\/p>\n<\/blockquote>\n<p>\u7f51\u7edc\u63d2\u4ef6\uff0c\u9ed8\u8ba4\u4e3acalico\uff0c\u53ef\u6839\u636e\u5b9e\u9645\u9700\u8981\u914d\u7f6e<\/p>\n<blockquote>\n<p># Choose network plugin (cilium, calico, kube-ovn, weave or flannel. Use cni for generic cni plugin)\n# Can also be set to &#8216;cloud&#8217;, which lets the cloud provider setup appropriate routing\nkube_network_plugin: calico <\/p>\n<\/blockquote>\n<p>service\u6240\u5728\u7f51\u6bb5\uff0c\u9ed8\u8ba4\u4e3a10.233.0.0\/18\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u9700\u8981\u8bbe\u7f6e<\/p>\n<blockquote>\n<p># Kubernetes internal network for services, unused block of space.\nkube_service_addresses: 10.100.0.0\/16<\/p>\n<\/blockquote>\n<p>pod\u6240\u5728\u7f51\u6bb5\uff0c\u9ed8\u8ba4\u4e3a10.233.64.0\/18\uff0c\u53ef\u6839\u636e\u5b9e\u9645\u9700\u8981\u8bbe\u7f6e<\/p>\n<blockquote>\n<p># internal network. When used, it will assign IP\n# addresses from this range to individual pods.\n# This network must be unused in your network infrastructure!\nkube_pods_subnet: 10.200.0.0\/16<\/p>\n<\/blockquote>\n<p>\u5bb9\u5668\u8fd0\u884c\u65f6\uff0c\u4ee5\u524d\u9ed8\u8ba4\u4e3adocker\uff0c\u73b0\u5728\u9ed8\u8ba4\u503c\u4e3acontainerd<\/p>\n<blockquote>\n<p>## Container runtime\n## docker for docker, crio for cri-o and containerd for containerd.\n## Default: containerd\ncontainer_manager: containerd<\/p>\n<\/blockquote>\n<h5 class=\"wp-block-heading\">3.4.3 containerd\u914d\u7f6e\uff08\u672c\u6587\u4f7f\u7528containerd\u4f5c\u4e3ai\u5bb9\u5668\u5f15\u64ce\uff09<\/h5>\n<blockquote>\n<p>cat inventory\/mycluster\/group_vars\/all\/containerd.yml <\/p>\n<\/blockquote>\n<pre><code class=\"lang-bash language-bash bash\">---\n# Please see roles\/container-engine\/containerd\/defaults\/main.yml for more configuration options\n\n# containerd_storage_dir: &quot;\/var\/lib\/containerd&quot;\n# containerd_state_dir: &quot;\/run\/containerd&quot;\ncontainerd_oom_score: -999 ##\u9ed8\u8ba4\u4e3a0\uff0c \u9700\u8981\u8bbe\u7f6e\u4e3a-999\u9632\u6b62\u88ab\u6740\n\n# containerd_default_runtime: &quot;runc&quot;\n# containerd_snapshotter: &quot;native&quot;\n\n# containerd_runc_runtime:\n#   name: runc\n#   type: &quot;io.containerd.runc.v2&quot;\n#   engine: &quot;&quot;\n#   root: &quot;&quot;\n\n# containerd_additional_runtimes:\n# Example for Kata Containers as additional runtime:\n#   - name: kata\n#     type: &quot;io.containerd.kata.v2&quot;\n#     engine: &quot;&quot;\n#     root: &quot;&quot;\n\n# containerd_grpc_max_recv_message_size: 16777216\n# containerd_grpc_max_send_message_size: 16777216\n\n# containerd_debug_level: &quot;info&quot;\n\n# containerd_metrics_address: &quot;&quot;\n\n# containerd_metrics_grpc_histogram: false\n\n## An obvious use case is allowing insecure-registry access to self hosted registries.\n## Can be ipaddress and domain_name.\n## example define mirror.registry.io or 172.19.16.11:5000\n## set &quot;name&quot;: &quot;url&quot;. insecure url must be started http:\/\/\n## Port number is also needed if the default HTTPS port is not used.\n# containerd_insecure_registries:\n#   &quot;localhost&quot;: &quot;http:\/\/127.0.0.1&quot;\n#   &quot;172.19.16.11:5000&quot;: &quot;http:\/\/172.19.16.11:5000&quot;\n\n# containerd_registries:\n#   &quot;docker.io&quot;: &quot;https:\/\/registry-1.docker.io&quot;\n\n# containerd_max_container_log_line_size: -1\n\n# containerd_registry_auth:\n#   - registry: 10.0.0.2:5000\n#     username: user\n#     password: pass<\/code><\/pre>\n<h5 class=\"wp-block-heading\">3.4.4 \u914d\u7f6eetcd\u90e8\u7f72\u7c7b\u578b\uff08\u65b0\u7248\u672c\u9ed8\u8ba4\u662fhost\uff0c\u5bb9\u5668\u5f15\u64ce\u662fdocker\u7684\u9700\u8981\u4fee\u6539\u4e3adocker\uff09<\/h5>\n<blockquote>\n<p>cat inventory\/mycluster\/group_vars\/all\/etcd.yml <\/p>\n<\/blockquote>\n<pre><code class=\"lang-bash language-bash bash\">---\n## Directory where etcd data stored\netcd_data_dir: \/var\/lib\/etcd\n\n## Container runtime\n## docker for docker, crio for cri-o and containerd for containerd.\n## Additionally you can set this to kubeadm if you want to install etcd using kubeadm\n## Kubeadm etcd deployment is experimental and only available for new deployments\n## If this is not set, container manager will be inherited from the Kubespray defaults\n## and not from k8s_cluster\/k8s-cluster.yml, which might not be what you want.\n## Also this makes possible to use different container manager for etcd nodes.\n# container_manager: containerd\n\n## Settings for etcd deployment type\n# Set this to docker if you are using container_manager: docker\netcd_deployment_type: host<\/code><\/pre>\n<h5 class=\"wp-block-heading\">3.4.5 \u9644\u52a0\u7ec4\u4ef6\uff08ingress\u3001dashboard\u7b49\uff09<\/h5>\n<blockquote>\n<p>cat inventory\/mycluster\/group_vars\/k8s_cluster\/addons.yml <\/p>\n<\/blockquote>\n<pre><code class=\"lang-bash language-bash bash\">---\n# Kubernetes dashboard\n# RBAC required. see docs\/getting-started.md for access details.\ndashboard_enabled: true ##\u9ed8\u8ba4\u4e3afalse\uff0c\u5982\u9700\u8981\u5b89\u88c5\u8bbe\u7f6e\u4e3atrue\n\n# Helm deployment\nhelm_enabled: false\n\n# Registry deployment\nregistry_enabled: false\n# registry_namespace: kube-system\n# registry_storage_class: &quot;&quot;\n# registry_disk_size: &quot;10Gi&quot;\n\n# Metrics Server deployment\nmetrics_server_enabled: false\n# metrics_server_container_port: 4443\n# metrics_server_kubelet_insecure_tls: true\n# metrics_server_metric_resolution: 15s\n# metrics_server_kubelet_preferred_address_types: &quot;InternalIP,ExternalIP,Hostname&quot;\n# metrics_server_host_network: false\n# metrics_server_replicas: 1\n\n# Rancher Local Path Provisioner\nlocal_path_provisioner_enabled: false\n# local_path_provisioner_namespace: &quot;local-path-storage&quot;\n# local_path_provisioner_storage_class: &quot;local-path&quot;\n# local_path_provisioner_reclaim_policy: Delete\n# local_path_provisioner_claim_root: \/opt\/local-path-provisioner\/\n# local_path_provisioner_debug: false\n# local_path_provisioner_image_repo: &quot;rancher\/local-path-provisioner&quot;\n# local_path_provisioner_image_tag: &quot;v0.0.22&quot;\n# local_path_provisioner_helper_image_repo: &quot;busybox&quot;\n# local_path_provisioner_helper_image_tag: &quot;latest&quot;\n\n# Local volume provisioner deployment\nlocal_volume_provisioner_enabled: false\n# local_volume_provisioner_namespace: kube-system\n# local_volume_provisioner_nodelabels:\n#   - kubernetes.io\/hostname\n#   - topology.kubernetes.io\/region\n#   - topology.kubernetes.io\/zone\n# local_volume_provisioner_storage_classes:\n#   local-storage:\n#     host_dir: \/mnt\/disks\n#     mount_dir: \/mnt\/disks\n#     volume_mode: Filesystem\n#     fs_type: ext4\n#   fast-disks:\n#     host_dir: \/mnt\/fast-disks\n#     mount_dir: \/mnt\/fast-disks\n#     block_cleaner_command:\n#       - &quot;\/scripts\/shred.sh&quot;\n#       - &quot;2&quot;\n#     volume_mode: Filesystem\n#     fs_type: ext4\n# local_volume_provisioner_tolerations:\n#   - effect: NoSchedule\n#     operator: Exists\n\n# CSI Volume Snapshot Controller deployment, set this to true if your CSI is able to manage snapshots\n# currently, setting cinder_csi_enabled=true would automatically enable the snapshot controller\n# Longhorn is an extenal CSI that would also require setting this to true but it is not included in kubespray\n# csi_snapshot_controller_enabled: false\n# csi snapshot namespace\n# snapshot_controller_namespace: kube-system\n\n# CephFS provisioner deployment\ncephfs_provisioner_enabled: false\n# cephfs_provisioner_namespace: &quot;cephfs-provisioner&quot;\n# cephfs_provisioner_cluster: ceph\n# cephfs_provisioner_monitors: &quot;172.24.0.1:6789,172.24.0.2:6789,172.24.0.3:6789&quot;\n# cephfs_provisioner_admin_id: admin\n# cephfs_provisioner_secret: secret\n# cephfs_provisioner_storage_class: cephfs\n# cephfs_provisioner_reclaim_policy: Delete\n# cephfs_provisioner_claim_root: \/volumes\n# cephfs_provisioner_deterministic_names: true\n\n# RBD provisioner deployment\nrbd_provisioner_enabled: false\n# rbd_provisioner_namespace: rbd-provisioner\n# rbd_provisioner_replicas: 2\n# rbd_provisioner_monitors: &quot;172.24.0.1:6789,172.24.0.2:6789,172.24.0.3:6789&quot;\n# rbd_provisioner_pool: kube\n# rbd_provisioner_admin_id: admin\n# rbd_provisioner_secret_name: ceph-secret-admin\n# rbd_provisioner_secret: ceph-key-admin\n# rbd_provisioner_user_id: kube\n# rbd_provisioner_user_secret_name: ceph-secret-user\n# rbd_provisioner_user_secret: ceph-key-user\n# rbd_provisioner_user_secret_namespace: rbd-provisioner\n# rbd_provisioner_fs_type: ext4\n# rbd_provisioner_image_format: &quot;2&quot;\n# rbd_provisioner_image_features: layering\n# rbd_provisioner_storage_class: rbd\n# rbd_provisioner_reclaim_policy: Delete\n\n# Nginx ingress controller deployment\ningress_nginx_enabled: true ##\u9ed8\u8ba4\u4e3afalse\uff0c\u5982\u9700\u8981\u5b89\u88c5\u8bbe\u7f6e\u4e3atrue\n# ingress_nginx_host_network: false\ningress_publish_status_address: &quot;&quot;\n# ingress_nginx_nodeselector:\n#   kubernetes.io\/os: &quot;linux&quot;\n# ingress_nginx_tolerations:\n#   - key: &quot;node-role.kubernetes.io\/master&quot;\n#     operator: &quot;Equal&quot;\n#     value: &quot;&quot;\n#     effect: &quot;NoSchedule&quot;\n#   - key: &quot;node-role.kubernetes.io\/control-plane&quot;\n#     operator: &quot;Equal&quot;\n#     value: &quot;&quot;\n#     effect: &quot;NoSchedule&quot;\n# ingress_nginx_namespace: &quot;ingress-nginx&quot;\n# ingress_nginx_insecure_port: 80\n# ingress_nginx_secure_port: 443\n# ingress_nginx_configmap:\n#   map-hash-bucket-size: &quot;128&quot;\n#   ssl-protocols: &quot;TLSv1.2 TLSv1.3&quot;\n# ingress_nginx_configmap_tcp_services:\n#   9000: &quot;default\/example-go:8080&quot;\n# ingress_nginx_configmap_udp_services:\n#   53: &quot;kube-system\/coredns:53&quot;\n# ingress_nginx_extra_args:\n#   - --default-ssl-certificate=default\/foo-tls\n# ingress_nginx_termination_grace_period_seconds: 300\n# ingress_nginx_class: nginx\n\n# ALB ingress controller deployment\ningress_alb_enabled: false\n# alb_ingress_aws_region: &quot;us-east-1&quot;\n# alb_ingress_restrict_scheme: &quot;false&quot;\n# Enables logging on all outbound requests sent to the AWS API.\n# If logging is desired, set to true.\n# alb_ingress_aws_debug: &quot;false&quot;\n\n# Cert manager deployment\ncert_manager_enabled: false\n# cert_manager_namespace: &quot;cert-manager&quot;\n# cert_manager_tolerations:\n#   - key: node-role.kubernetes.io\/master\n#     effect: NoSchedule\n#   - key: node-role.kubernetes.io\/control-plane\n#     effect: NoSchedule\n# cert_manager_affinity:\n#  nodeAffinity:\n#    preferredDuringSchedulingIgnoredDuringExecution:\n#    - weight: 100\n#      preference:\n#        matchExpressions:\n#        - key: node-role.kubernetes.io\/control-plane\n#          operator: In\n#          values:\n#          - &quot;&quot;\n# cert_manager_nodeselector:\n#   kubernetes.io\/os: &quot;linux&quot;\n\n# cert_manager_trusted_internal_ca: |\n#   -----BEGIN CERTIFICATE-----\n#   [REPLACE with your CA certificate]\n#   -----END CERTIFICATE-----\n# cert_manager_leader_election_namespace: kube-system\n\n# MetalLB deployment\nmetallb_enabled: false\nmetallb_speaker_enabled: &quot;{{ metallb_enabled }}&quot;\n# metallb_ip_range:\n#   - &quot;10.5.0.50-10.5.0.99&quot;\n# metallb_pool_name: &quot;loadbalanced&quot;\n# metallb_auto_assign: true\n# metallb_avoid_buggy_ips: false\n# metallb_speaker_nodeselector:\n#   kubernetes.io\/os: &quot;linux&quot;\n# metallb_controller_nodeselector:\n#   kubernetes.io\/os: &quot;linux&quot;\n# metallb_speaker_tolerations:\n#   - key: &quot;node-role.kubernetes.io\/master&quot;\n#     operator: &quot;Equal&quot;\n#     value: &quot;&quot;\n#     effect: &quot;NoSchedule&quot;\n#   - key: &quot;node-role.kubernetes.io\/control-plane&quot;\n#     operator: &quot;Equal&quot;\n#     value: &quot;&quot;\n#     effect: &quot;NoSchedule&quot;\n# metallb_controller_tolerations:\n#   - key: &quot;node-role.kubernetes.io\/master&quot;\n#     operator: &quot;Equal&quot;\n#     value: &quot;&quot;\n#     effect: &quot;NoSchedule&quot;\n#   - key: &quot;node-role.kubernetes.io\/control-plane&quot;\n#     operator: &quot;Equal&quot;\n#     value: &quot;&quot;\n#     effect: &quot;NoSchedule&quot;\n# metallb_version: v0.12.1\n# metallb_protocol: &quot;layer2&quot;\n# metallb_port: &quot;7472&quot;\n# metallb_memberlist_port: &quot;7946&quot;\n# metallb_additional_address_pools:\n#   kube_service_pool:\n#     ip_range:\n#       - &quot;10.5.1.50-10.5.1.99&quot;\n#     protocol: &quot;layer2&quot;\n#     auto_assign: false\n#     avoid_buggy_ips: false\n# metallb_protocol: &quot;bgp&quot;\n# metallb_peers:\n#   - peer_address: 192.0.2.1\n#     peer_asn: 64512\n#     my_asn: 4200000000\n#   - peer_address: 192.0.2.2\n#     peer_asn: 64513\n#     my_asn: 4200000000\n\nargocd_enabled: false\n# argocd_version: v2.5.7\n# argocd_namespace: argocd\n# Default password:\n#   - https:\/\/argo-cd.readthedocs.io\/en\/stable\/getting_started\/#4-login-using-the-cli\n#   ---\n#   The initial password is autogenerated to be the pod name of the Argo CD API server. This can be retrieved with the command:\n#   kubectl get pods -n argocd -l app.kubernetes.io\/name=argocd-server -o name | cut -d&#039;\/&#039; -f 2\n#   ---\n# Use the following var to set admin password\n# argocd_admin_password: &quot;password&quot;\n\n# The plugin manager for kubectl\nkrew_enabled: false\nkrew_root_dir: &quot;\/usr\/local\/krew&quot;<\/code><\/pre>\n<h5 class=\"wp-block-heading\">3.4.6 \u5168\u5c40\u914d\u7f6e\uff08\u53ef\u4ee5\u5728\u8fd9\u914d\u7f6ehttp(s)\u4ee3\u7406\u5b9e\u73b0\u5916\u7f51\u8bbf\u95ee\uff09<\/h5>\n<blockquote>\n<p>cat inventory\/mycluster\/group_vars\/all\/all.yml <\/p>\n<\/blockquote>\n<pre><code class=\"lang-bash language-bash bash\">---\n## Directory where the binaries will be installed\nbin_dir: \/usr\/local\/bin\n\n## The access_ip variable is used to define how other nodes should access\n## the node.  This is used in flannel to allow other flannel nodes to see\n## this node for example.  The access_ip is really useful AWS and Google\n## environments where the nodes are accessed remotely by the &quot;public&quot; ip,\n## but don&#039;t know about that address themselves.\n# access_ip: 1.1.1.1\n\n## External LB example config\n## apiserver_loadbalancer_domain_name: &quot;elb.some.domain&quot;\n# loadbalancer_apiserver:\n#   address: 1.2.3.4\n#   port: 1234\n\n## Internal loadbalancers for apiservers\n# loadbalancer_apiserver_localhost: true\n# valid options are &quot;nginx&quot; or &quot;haproxy&quot;\n# loadbalancer_apiserver_type: nginx  # valid values &quot;nginx&quot; or &quot;haproxy&quot;\n\n## If the cilium is going to be used in strict mode, we can use the\n## localhost connection and not use the external LB. If this parameter is\n## not specified, the first node to connect to kubeapi will be used.\n# use_localhost_as_kubeapi_loadbalancer: true\n\n## Local loadbalancer should use this port\n## And must be set port 6443\nloadbalancer_apiserver_port: 6443\n\n## If loadbalancer_apiserver_healthcheck_port variable defined, enables proxy liveness check for nginx.\nloadbalancer_apiserver_healthcheck_port: 8081\n\n### OTHER OPTIONAL VARIABLES\n\n## By default, Kubespray collects nameservers on the host. It then adds the previously collected nameservers in nameserverentries.\n## If true, Kubespray does not include host nameservers in nameserverentries in dns_late stage. However, It uses the nameserver to make sure cluster installed safely in dns_early stage.\n## Use this option with caution, you may need to define your dns servers. Otherwise, the outbound queries such as www.google.com may fail.\n# disable_host_nameservers: false\n\n## Upstream dns servers\n# upstream_dns_servers:\n#   - 8.8.8.8\n#   - 8.8.4.4\n\n## There are some changes specific to the cloud providers\n## for instance we need to encapsulate packets with some network plugins\n## If set the possible values are either &#039;gce&#039;, &#039;aws&#039;, &#039;azure&#039;, &#039;openstack&#039;, &#039;vsphere&#039;, &#039;oci&#039;, or &#039;external&#039;\n## When openstack is used make sure to source in the openstack credentials\n## like you would do when using openstack-client before starting the playbook.\n# cloud_provider:\n\n## When cloud_provider is set to &#039;external&#039;, you can set the cloud controller to deploy\n## Supported cloud controllers are: &#039;openstack&#039;, &#039;vsphere&#039; and &#039;hcloud&#039;\n## When openstack or vsphere are used make sure to source in the required fields\n# external_cloud_provider:\n\n## Set these proxy values in order to update package manager and docker daemon to use proxies\nhttp_proxy: &quot;http:\/\/10.211.55.14:8118&quot;  ##\u9700\u8981\u8bbe\u7f6e\u4e3a\u73af\u5883\u4e2d\u914d\u7f6e\u4e86privoxy\u7684\u4ee3\u7406\u5730\u5740\nhttps_proxy: &quot;http:\/\/10.211.55.14:8118&quot;\n\n## Refer to roles\/kubespray-defaults\/defaults\/main.yml before modifying no_proxy\n# no_proxy: &quot;&quot;\n\n## Some problems may occur when downloading files over https proxy due to ansible bug\n## https:\/\/github.com\/ansible\/ansible\/issues\/32750. Set this variable to False to disable\n## SSL validation of get_url module. Note that kubespray will still be performing checksum validation.\n# download_validate_certs: False\n\n## If you need exclude all cluster nodes from proxy and other resources, add other resources here.\n# additional_no_proxy: &quot;&quot;\n\n## If you need to disable proxying of os package repositories but are still behind an http_proxy set\n## skip_http_proxy_on_os_packages to true\n## This will cause kubespray not to set proxy environment in \/etc\/yum.conf for centos and in \/etc\/apt\/apt.conf for debian\/ubuntu\n## Special information for debian\/ubuntu - you have to set the no_proxy variable, then apt package will install from your source of wish\nskip_http_proxy_on_os_packages: true ##yum\u5b89\u88c5os\u5305\u65f6\u4e0d\u542f\u7528\u4ee3\u7406\uff0c\u5426\u5219\u4f1a\u76f4\u63a5\u5c06\u4ee3\u7406\u5730\u5740\u8bbe\u7f6e\u5230yum.conf\u4e2d\n\n## Since workers are included in the no_proxy variable by default, docker engine will be restarted on all nodes (all\n## pods will restart) when adding or removing workers.  To override this behaviour by only including master nodes in the\n## no_proxy variable, set below to true:\nno_proxy_exclude_workers: false\n\n## Certificate Management\n## This setting determines whether certs are generated via scripts.\n## Chose &#039;none&#039; if you provide your own certificates.\n## Option is  &quot;script&quot;, &quot;none&quot;\n# cert_management: script\n\n## Set to true to allow pre-checks to fail and continue deployment\n# ignore_assert_errors: false\n\n## The read-only port for the Kubelet to serve on with no authentication\/authorization. Uncomment to enable.\n# kube_read_only_port: 10255\n\n## Set true to download and cache container\n# download_container: true\n\n## Deploy container engine\n# Set false if you want to deploy container engine manually.\n# deploy_container_engine: true\n\n## Red Hat Enterprise Linux subscription registration\n## Add either RHEL subscription Username\/Password or Organization ID\/Activation Key combination\n## Update RHEL subscription purpose usage, role and SLA if necessary\n# rh_subscription_username: &quot;&quot;\n# rh_subscription_password: &quot;&quot;\n# rh_subscription_org_id: &quot;&quot;\n# rh_subscription_activation_key: &quot;&quot;\n# rh_subscription_usage: &quot;Development&quot;\n# rh_subscription_role: &quot;Red Hat Enterprise Server&quot;\n# rh_subscription_sla: &quot;Self-Support&quot;\n\n## Check if access_ip responds to ping. Set false if your firewall blocks ICMP.\n# ping_access_ip: true\n\n# sysctl_file_path to add sysctl conf to\n# sysctl_file_path: &quot;\/etc\/sysctl.d\/99-sysctl.conf&quot;\n\n## Variables for webhook token auth https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/authentication\/#webhook-token-authentication\nkube_webhook_token_auth: false\nkube_webhook_token_auth_url_skip_tls_verify: false\n# kube_webhook_token_auth_url: https:\/\/...\n## base64-encoded string of the webhook&#039;s CA certificate\n# kube_webhook_token_auth_ca_data: &quot;LS0t...&quot;\n\n## NTP Settings\n# Start the ntpd or chrony service and enable it at system boot.\nntp_enabled: false\nntp_manage_config: false\nntp_servers:\n  - &quot;0.pool.ntp.org iburst&quot;\n  - &quot;1.pool.ntp.org iburst&quot;\n  - &quot;2.pool.ntp.org iburst&quot;\n  - &quot;3.pool.ntp.org iburst&quot;\n\n## Used to control no_log attribute\nunsafe_show_logs: false<\/code><\/pre>\n<h4 class=\"wp-block-heading\">3.5 \u4e00\u952e\u90e8\u7f72<\/h4>\n<p>\u914d\u7f6e\u6587\u4ef6\u90fd\u8c03\u6574\u597d\u4e86\u540e\uff0c\u5c31\u53ef\u4ee5\u5f00\u59cb\u4e00\u952e\u90e8\u7f72\u5566\uff0c\u4e0d\u8fc7\u90e8\u7f72\u8fc7\u7a0b\u4e0d\u51fa\u610f\u5916\u4f1a\u975e\u5e38\u6162\u3002<\/p>\n<h5 class=\"wp-block-heading\">\u4e00\u952e\u90e8\u7f72<\/h5>\n<p>\u9700\u8981\u4f7f\u7528root\u7528\u6237\u6267\u884cansible-playbook\n&#8211;become\u53c2\u6570\u662f\u5fc5\u987b\u7684\uff0c\u4f8b\u5982\u5728\/etc\u4e2d\u5199\u5165SSL Key\n\u6ca1\u6709become\u53c2\u6570\uff0cplaybook\u5c06\u8fd0\u884c\u5931\u8d25\n-vvvv\u4f1a\u6253\u5370\u6700\u8be6\u7ec6\u7684\u65e5\u5fd7\u4fe1\u606f\uff0c\u5efa\u8bae\u5f00\u542f<\/p>\n<blockquote>\n<p>ansible-playbook -i inventory\/mycluster\/hosts.yaml  &#8211;become &#8211;become-user=root cluster.yml -vvvv<\/p>\n<\/blockquote>\n<p>\u7ecf\u8fc7\u6f2b\u957f\u7684\u7b49\u5f85\u540e\uff0c\u5982\u679c\u6ca1\u6709\u95ee\u9898\uff0c\u6574\u4e2a\u96c6\u7fa4\u90fd\u90e8\u7f72\u8d77\u6765\u5566<\/p>\n<h4 class=\"wp-block-heading\">3.6 \u6e05\u7406\u4ee3\u7406\u8bbe\u7f6e<\/h4>\n<p>\u6e05\u7406\u4ee3\u7406\u8bbe\u7f6e\uff08\u8fd0\u884c\u65f6\u4e0d\u518d\u9700\u8981\u4ee3\u7406\uff0c\u5220\u6389\u4ee3\u7406\u914d\u7f6e\u5373\u53ef\uff09<\/p>\n<h5 class=\"wp-block-heading\">\u5220\u9664docker\u7684http\u4ee3\u7406\uff08\u5728\u6bcf\u4e2a\u8282\u70b9\u6267\u884c\uff09<\/h5>\n<blockquote>\n<p>$ rm -f \/etc\/systemd\/system\/containerd.service.d\/http-proxy.conf\n$ systemctl daemon-reload\n$ systemctl restart containerd<\/p>\n<\/blockquote>\n<h5 class=\"wp-block-heading\">\u5220\u9664yum\u4ee3\u7406\uff08\u5982\u679c\u4e4b\u524d\u6ca1\u6709\u914d\u7f6eskip_http_proxy_on_os_packages: true\uff09<\/h5>\n<p><strong><em># \u628agrep\u51fa\u6765\u7684\u4ee3\u7406\u914d\u7f6e\u624b\u52a8\u5220\u9664\u5373\u53ef<\/em><\/strong><\/p>\n<blockquote>\n<p>$ grep 8118 -r \/etc\/yum*<\/p>\n<\/blockquote>\n<h5 class=\"wp-block-heading\">\u5220\u9664.bash_profile\u4e2d\u4ee3\u7406\u914d\u7f6e\uff08\u5728\u6bcf\u4e2a\u8282\u70b9\u6267\u884c\uff09<\/h5>","protected":false},"excerpt":{"rendered":"<ol>\n<li>\u670d\u52a1\u5668\u8bf4\u660e 1.1 \u8282\u70b9\u8981\u6c42 \u8282\u70b9\u6570 &gt;= 3\u53f0 CPU &gt;= 2c \u5185\u5b58 &gt;= 2G [&hellip;]<\/li>\n<\/ol>","protected":false},"author":1,"featured_media":72,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"googlesitekit_rrm_CAow767EDA:productID":"","footnotes":""},"categories":[22],"tags":[24,23,35,25],"class_list":["post-109","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-k8s","tag-k8s","tag-kubernetes","tag-kubspray","tag-25"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>kubespray\u90e8\u7f72k8s\u96c6\u7fa4 - Winter&#039;s Life<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/win7er.com\/?p=109\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"kubespray\u90e8\u7f72k8s\u96c6\u7fa4 - Winter&#039;s Life\" \/>\n<meta property=\"og:description\" content=\"1. \u670d\u52a1\u5668\u8bf4\u660e 1.1 \u8282\u70b9\u8981\u6c42 \u8282\u70b9\u6570 &gt;= 3\u53f0 CPU &gt;= 2c \u5185\u5b58 &gt;= 2G [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/win7er.com\/?p=109\" \/>\n<meta property=\"og:site_name\" content=\"Winter&#039;s Life\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/knowwinter\/\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/knowwinter\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-11T07:40:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-11T07:43:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/win7er.com\/wp-content\/uploads\/2026\/02\/8b7f8c5792adc2336101a720e11303fa.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"2368\" \/>\n\t<meta property=\"og:image:height\" content=\"1776\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"winter.yu\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/x.com\/winter_know\" \/>\n<meta name=\"twitter:site\" content=\"@winter_know\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"winter.yu\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/win7er.com\\\/?p=109#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/win7er.com\\\/?p=109\"},\"author\":{\"name\":\"winter.yu\",\"@id\":\"https:\\\/\\\/win7er.com\\\/#\\\/schema\\\/person\\\/40b2ae9640523bebb22a847803dbf22a\"},\"headline\":\"kubespray\u90e8\u7f72k8s\u96c6\u7fa4\",\"datePublished\":\"2026-02-11T07:40:26+00:00\",\"dateModified\":\"2026-02-11T07:43:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/win7er.com\\\/?p=109\"},\"wordCount\":2750,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/win7er.com\\\/?p=109#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/win7er.com\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/8b7f8c5792adc2336101a720e11303fa.jpeg\",\"keywords\":[\"K8S\",\"kubernetes\",\"kubspray\",\"\u8fd0\u7ef4\"],\"articleSection\":[\"K8S\"],\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/win7er.com\\\/?p=109#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/win7er.com\\\/?p=109\",\"url\":\"https:\\\/\\\/win7er.com\\\/?p=109\",\"name\":\"kubespray\u90e8\u7f72k8s\u96c6\u7fa4 - Winter&#039;s Life\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/win7er.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/win7er.com\\\/?p=109#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/win7er.com\\\/?p=109#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/win7er.com\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/8b7f8c5792adc2336101a720e11303fa.jpeg\",\"datePublished\":\"2026-02-11T07:40:26+00:00\",\"dateModified\":\"2026-02-11T07:43:24+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/win7er.com\\\/#\\\/schema\\\/person\\\/40b2ae9640523bebb22a847803dbf22a\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/win7er.com\\\/?p=109#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/win7er.com\\\/?p=109\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\\\/\\\/win7er.com\\\/?p=109#primaryimage\",\"url\":\"https:\\\/\\\/win7er.com\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/8b7f8c5792adc2336101a720e11303fa.jpeg\",\"contentUrl\":\"https:\\\/\\\/win7er.com\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/8b7f8c5792adc2336101a720e11303fa.jpeg\",\"width\":2368,\"height\":1776,\"caption\":\"Winter's Life\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/win7er.com\\\/?p=109#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\\\/\\\/win7er.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"kubespray\u90e8\u7f72k8s\u96c6\u7fa4\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/win7er.com\\\/#website\",\"url\":\"https:\\\/\\\/win7er.com\\\/\",\"name\":\"Winter's Life\",\"description\":\"\u6280\u672f\u5206\u4eab | \u7a0b\u5e8f\u5f00\u53d1 | \u4ea7\u54c1\u6d4b\u8bc4 | \u6280\u672f\u54a8\u8be2 | \u8fdc\u7a0b\u534f\u52a9 | \u751f\u6d3b\u611f\u609f | \u884c\u4e1a\u65b0\u95fb\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/win7er.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/win7er.com\\\/#\\\/schema\\\/person\\\/40b2ae9640523bebb22a847803dbf22a\",\"name\":\"winter.yu\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/822954e373be717fced36ce555e788a845ab401b70f421cad86458368d68bc54?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/822954e373be717fced36ce555e788a845ab401b70f421cad86458368d68bc54?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/822954e373be717fced36ce555e788a845ab401b70f421cad86458368d68bc54?s=96&d=mm&r=g\",\"caption\":\"winter.yu\"},\"sameAs\":[\"https:\\\/\\\/win7er.com\",\"https:\\\/\\\/www.facebook.com\\\/knowwinter\\\/\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/x.com\\\/winter_know\"],\"url\":\"https:\\\/\\\/win7er.com\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"kubespray\u90e8\u7f72k8s\u96c6\u7fa4 - Winter&#039;s Life","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/win7er.com\/?p=109","og_locale":"zh_CN","og_type":"article","og_title":"kubespray\u90e8\u7f72k8s\u96c6\u7fa4 - Winter&#039;s Life","og_description":"1. \u670d\u52a1\u5668\u8bf4\u660e 1.1 \u8282\u70b9\u8981\u6c42 \u8282\u70b9\u6570 &gt;= 3\u53f0 CPU &gt;= 2c \u5185\u5b58 &gt;= 2G [&hellip;]","og_url":"https:\/\/win7er.com\/?p=109","og_site_name":"Winter&#039;s Life","article_publisher":"https:\/\/www.facebook.com\/knowwinter\/","article_author":"https:\/\/www.facebook.com\/knowwinter\/","article_published_time":"2026-02-11T07:40:26+00:00","article_modified_time":"2026-02-11T07:43:24+00:00","og_image":[{"width":2368,"height":1776,"url":"https:\/\/win7er.com\/wp-content\/uploads\/2026\/02\/8b7f8c5792adc2336101a720e11303fa.jpeg","type":"image\/jpeg"}],"author":"winter.yu","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/x.com\/winter_know","twitter_site":"@winter_know","twitter_misc":{"\u4f5c\u8005":"winter.yu","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"14 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/win7er.com\/?p=109#article","isPartOf":{"@id":"https:\/\/win7er.com\/?p=109"},"author":{"name":"winter.yu","@id":"https:\/\/win7er.com\/#\/schema\/person\/40b2ae9640523bebb22a847803dbf22a"},"headline":"kubespray\u90e8\u7f72k8s\u96c6\u7fa4","datePublished":"2026-02-11T07:40:26+00:00","dateModified":"2026-02-11T07:43:24+00:00","mainEntityOfPage":{"@id":"https:\/\/win7er.com\/?p=109"},"wordCount":2750,"commentCount":0,"image":{"@id":"https:\/\/win7er.com\/?p=109#primaryimage"},"thumbnailUrl":"https:\/\/win7er.com\/wp-content\/uploads\/2026\/02\/8b7f8c5792adc2336101a720e11303fa.jpeg","keywords":["K8S","kubernetes","kubspray","\u8fd0\u7ef4"],"articleSection":["K8S"],"inLanguage":"zh-Hans","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/win7er.com\/?p=109#respond"]}]},{"@type":"WebPage","@id":"https:\/\/win7er.com\/?p=109","url":"https:\/\/win7er.com\/?p=109","name":"kubespray\u90e8\u7f72k8s\u96c6\u7fa4 - Winter&#039;s Life","isPartOf":{"@id":"https:\/\/win7er.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/win7er.com\/?p=109#primaryimage"},"image":{"@id":"https:\/\/win7er.com\/?p=109#primaryimage"},"thumbnailUrl":"https:\/\/win7er.com\/wp-content\/uploads\/2026\/02\/8b7f8c5792adc2336101a720e11303fa.jpeg","datePublished":"2026-02-11T07:40:26+00:00","dateModified":"2026-02-11T07:43:24+00:00","author":{"@id":"https:\/\/win7er.com\/#\/schema\/person\/40b2ae9640523bebb22a847803dbf22a"},"breadcrumb":{"@id":"https:\/\/win7er.com\/?p=109#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/win7er.com\/?p=109"]}]},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/win7er.com\/?p=109#primaryimage","url":"https:\/\/win7er.com\/wp-content\/uploads\/2026\/02\/8b7f8c5792adc2336101a720e11303fa.jpeg","contentUrl":"https:\/\/win7er.com\/wp-content\/uploads\/2026\/02\/8b7f8c5792adc2336101a720e11303fa.jpeg","width":2368,"height":1776,"caption":"Winter's Life"},{"@type":"BreadcrumbList","@id":"https:\/\/win7er.com\/?p=109#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/win7er.com\/"},{"@type":"ListItem","position":2,"name":"kubespray\u90e8\u7f72k8s\u96c6\u7fa4"}]},{"@type":"WebSite","@id":"https:\/\/win7er.com\/#website","url":"https:\/\/win7er.com\/","name":"Winter's Life","description":"\u6280\u672f\u5206\u4eab | \u7a0b\u5e8f\u5f00\u53d1 | \u4ea7\u54c1\u6d4b\u8bc4 | \u6280\u672f\u54a8\u8be2 | \u8fdc\u7a0b\u534f\u52a9 | \u751f\u6d3b\u611f\u609f | \u884c\u4e1a\u65b0\u95fb","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/win7er.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/win7er.com\/#\/schema\/person\/40b2ae9640523bebb22a847803dbf22a","name":"winter.yu","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/secure.gravatar.com\/avatar\/822954e373be717fced36ce555e788a845ab401b70f421cad86458368d68bc54?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/822954e373be717fced36ce555e788a845ab401b70f421cad86458368d68bc54?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/822954e373be717fced36ce555e788a845ab401b70f421cad86458368d68bc54?s=96&d=mm&r=g","caption":"winter.yu"},"sameAs":["https:\/\/win7er.com","https:\/\/www.facebook.com\/knowwinter\/","https:\/\/x.com\/https:\/\/x.com\/winter_know"],"url":"https:\/\/win7er.com\/?author=1"}]}},"views":0,"_links":{"self":[{"href":"https:\/\/win7er.com\/index.php?rest_route=\/wp\/v2\/posts\/109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/win7er.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/win7er.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/win7er.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/win7er.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=109"}],"version-history":[{"count":1,"href":"https:\/\/win7er.com\/index.php?rest_route=\/wp\/v2\/posts\/109\/revisions"}],"predecessor-version":[{"id":110,"href":"https:\/\/win7er.com\/index.php?rest_route=\/wp\/v2\/posts\/109\/revisions\/110"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/win7er.com\/index.php?rest_route=\/wp\/v2\/media\/72"}],"wp:attachment":[{"href":"https:\/\/win7er.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/win7er.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/win7er.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}