{"id":1886,"date":"2023-03-30T23:03:01","date_gmt":"2023-03-30T15:03:01","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1886"},"modified":"2023-04-22T09:00:17","modified_gmt":"2023-04-22T01:00:17","slug":"install-kubernetes-single-master-node","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/30\/install-kubernetes-single-master-node\/","title":{"rendered":"\u5b89\u88c5 Kubernetes \u5355Master\u8282\u70b9"},"content":{"rendered":"<p>kubeadm \u662f Kubernetes \u5b98\u65b9\u652f\u6301\u7684\u5b89\u88c5\u65b9\u5f0f\uff0c\u201c\u4e8c\u8fdb\u5236\u201d \u4e0d\u662f\u3002\u91c7\u7528 kubernetes.io \u5b98\u65b9\u63a8\u8350\u7684 kubeadm \u5de5\u5177\u5b89\u88c5 kubernetes \u96c6\u7fa4\u3002<\/p>\n<p>\u5b89\u88c5\u540e\u7684\u62d3\u6251\u56fe\u5982\u4e0b\uff1a<\/p>\n<p><!-- more --><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.kuboard.cn\/images\/topology\/k8s.png\" alt=\"Kubernetes\u5355Master\u8282\u70b9\" \/><\/p>\n<h2>\u68c0\u67e5 centos \/ hostname<\/h2>\n<pre><code># \u5728 master \u8282\u70b9\u548c worker \u8282\u70b9\u90fd\u8981\u6267\u884c\n$ cat \/etc\/redhat-release\n\n# \u6b64\u5904 hostname \u7684\u8f93\u51fa\u5c06\u4f1a\u662f\u8be5\u673a\u5668\u5728 Kubernetes \u96c6\u7fa4\u4e2d\u7684\u8282\u70b9\u540d\u5b57\n# \u4e0d\u80fd\u4f7f\u7528 localhost \u4f5c\u4e3a\u8282\u70b9\u7684\u540d\u5b57\n$ hostname\n\n# \u8bf7\u4f7f\u7528 lscpu \u547d\u4ee4\uff0c\u6838\u5bf9 CPU \u4fe1\u606f\n# Architecture: x86_64    \u672c\u5b89\u88c5\u6587\u6863\u4e0d\u652f\u6301 arm \u67b6\u6784\n# CPU(s):       2         CPU \u5185\u6838\u6570\u91cf\u4e0d\u80fd\u4f4e\u4e8e 2\n$ lscpu<\/code><\/pre>\n<p>\u5982\u679c\u9700\u8981\u4fee\u6539 hostname\uff0c\u53ef\u6267\u884c\u5982\u4e0b\u6307\u4ee4\uff1a<\/p>\n<pre><code># \u4fee\u6539 hostname\n$ hostnamectl set-hostname your-new-host-name\n# \u67e5\u770b\u4fee\u6539\u7ed3\u679c\n$ hostnamectl status\n# \u8bbe\u7f6e hostname \u89e3\u6790\n$ echo &quot;127.0.0.1   $(hostname)&quot; &gt;&gt; \/etc\/hosts<\/code><\/pre>\n<h2>\u68c0\u67e5\u7f51\u7edc<\/h2>\n<p>\u5728\u6240\u6709\u8282\u70b9\u6267\u884c\u547d\u4ee4<\/p>\n<ul>\n<li><code>ip route show<\/code>\uff1a\u53ef\u4ee5\u77e5\u9053\u673a\u5668\u7684\u9ed8\u8ba4\u7f51\u5361\uff0c\u901a\u5e38\u662f eth0\uff0c\u5982 default via 172.21.0.1 dev eth0<\/li>\n<li><code>ip address<\/code>\uff1a\u53ef\u663e\u793a\u9ed8\u8ba4\u7f51\u5361\u7684 IP \u5730\u5740\uff0cKubernetes \u5c06\u4f7f\u7528\u6b64 IP \u5730\u5740\u4e0e\u96c6\u7fa4\u5185\u7684\u5176\u4ed6\u8282\u70b9\u901a\u4fe1\uff0c\u5982 172.17.216.80<\/li>\n<\/ul>\n<p>\u6240\u6709\u8282\u70b9\u4e0a Kubernetes \u6240\u4f7f\u7528\u7684 IP \u5730\u5740\u5fc5\u987b\u53ef\u4ee5\u4e92\u901a\uff08\u65e0\u9700 NAT \u6620\u5c04\u3001\u65e0\u5b89\u5168\u7ec4\u6216\u9632\u706b\u5899\u9694\u79bb\uff09<\/p>\n<h2>\u5b89\u88c5docker\u53cakubelet<\/h2>\n<p>\uff081\uff09\u5b89\u88c5 docker\/kubelet \u9700\u6ee1\u8db3\u6761\u4ef6\uff1a<\/p>\n<ul>\n<li>\u4efb\u610f\u8282\u70b9 centos \u7248\u672c\u4e3a 7.6\/7.7 \u6216 7.8<\/li>\n<li>\u4efb\u610f\u8282\u70b9 CPU \u5185\u6838\u6570\u91cf\u5927\u4e8e\u7b49\u4e8e 2\uff0c\u4e14\u5185\u5b58\u5927\u4e8e\u7b49\u4e8e 4G<\/li>\n<li>\u4efb\u610f\u8282\u70b9 hostname \u4e0d\u662f localhost\uff0c\u4e14\u4e0d\u5305\u542b\u4e0b\u5212\u7ebf\u3001\u5c0f\u6570\u70b9\u3001\u5927\u5199\u5b57\u6bcd<\/li>\n<li>\u4efb\u610f\u8282\u70b9\u90fd\u6709\u56fa\u5b9a\u7684\u5185\u7f51 IP \u5730\u5740<\/li>\n<li>\u4efb\u610f\u8282\u70b9\u90fd\u53ea\u6709\u4e00\u4e2a\u7f51\u5361\uff0c\u5982\u679c\u6709\u7279\u6b8a\u76ee\u7684\uff0c\u53ef\u4ee5\u5728\u5b8c\u6210 K8S \u5b89\u88c5\u540e\u518d\u589e\u52a0\u65b0\u7684\u7f51\u5361<\/li>\n<li>\u4efb\u610f\u8282\u70b9\u4e0a Kubelet\u4f7f\u7528\u7684 IP \u5730\u5740 \u53ef\u4e92\u901a\uff08\u65e0\u9700 NAT \u6620\u5c04\u5373\u53ef\u76f8\u4e92\u8bbf\u95ee\uff09\uff0c\u4e14\u6ca1\u6709\u9632\u706b\u5899\u3001\u5b89\u5168\u7ec4\u9694\u79bb<\/li>\n<li>\u4efb\u610f\u8282\u70b9\u4e0d\u4f1a\u76f4\u63a5\u4f7f\u7528 docker run \u6216 docker-compose \u8fd0\u884c\u5bb9\u5668<\/li>\n<\/ul>\n<p>\uff082\uff09\u4f7f\u7528 root \u8eab\u4efd\u5728\u6240\u6709\u8282\u70b9\u6267\u884c\u5982\u4e0b\u4ee3\u7801\uff0c\u4ee5\u5b89\u88c5\u8f6f\u4ef6\uff1a<\/p>\n<ul>\n<li>docker<\/li>\n<li>nfs-utils<\/li>\n<li>kubectl \/ kubeadm \/ kubelet<\/li>\n<\/ul>\n<pre><code># \u5728 master \u8282\u70b9\u548c worker \u8282\u70b9\u90fd\u8981\u6267\u884c\n# \u6700\u540e\u4e00\u4e2a\u53c2\u6570 1.19.2 \u7528\u4e8e\u6307\u5b9a kubenetes \u7248\u672c\uff0c\u652f\u6301\u6240\u6709 1.19.x \u7248\u672c\u7684\u5b89\u88c5\n# \u817e\u8baf\u4e91 docker hub \u955c\u50cf\n# export REGISTRY_MIRROR=&quot;https:\/\/mirror.ccs.tencentyun.com&quot;\n# DaoCloud \u955c\u50cf\n# export REGISTRY_MIRROR=&quot;http:\/\/f1361db2.m.daocloud.io&quot;\n# \u534e\u4e3a\u4e91\u955c\u50cf\n# export REGISTRY_MIRROR=&quot;https:\/\/05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com&quot;\n# \u963f\u91cc\u4e91 docker hub \u955c\u50cf\nexport REGISTRY_MIRROR=https:\/\/registry.cn-hangzhou.aliyuncs.com\ncurl -sSL https:\/\/kuboard.cn\/install-script\/v1.19.x\/install_kubelet.sh\nsh -s 1.19.2<\/code><\/pre>\n<p>\u8bf7\u5c06\u811a\u672c\u6700\u540e\u7684<code>1.19.2<\/code>\u66ff\u6362\u6210\u9700\u8981\u7684\u7248\u672c\u53f7\uff0c\u811a\u672c\u4e2d\u95f4\u7684<code>v1.19.x<\/code>\u4e0d\u8981\u66ff\u6362<\/p>\n<p>Docker\u7248\u672c\u53f7\u53c2\u8003\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/docs.docker.com\/engine\/release-notes\/\">https:\/\/docs.docker.com\/engine\/release-notes\/<\/a><br \/>\nKubernetes\u7248\u672c\u53f7\u53c2\u8003\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/releases\">https:\/\/github.com\/kubernetes\/kubernetes\/releases<\/a><\/p>\n<blockquote>\n<p>\u9644\uff1a<code>install_kubelet.sh<\/code>\u811a\u672c\u5185\u5bb9\uff0c\u4e0b\u8f7d\u540e\u53ef\u4fee\u6539Docker\u7248\u672c\u53f7\uff0c\u53c2\u8003\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/mirrors.aliyun.com\/docker-ce\/linux\/centos\/7\/x86_64\/stable\/Packages\/\">https:\/\/mirrors.aliyun.com\/docker-ce\/linux\/centos\/7\/x86_64\/stable\/Packages\/<\/a><\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n\n# \u5728 master \u8282\u70b9\u548c worker \u8282\u70b9\u90fd\u8981\u6267\u884c\n\n# \u5b89\u88c5 docker\n# \u53c2\u8003\u6587\u6863\u5982\u4e0b\n# https:\/\/docs.docker.com\/install\/linux\/docker-ce\/centos\/ \n# https:\/\/docs.docker.com\/install\/linux\/linux-postinstall\/\n\n# \u5378\u8f7d\u65e7\u7248\u672c\nyum remove -y docker \\\ndocker-client \\\ndocker-client-latest \\\ndocker-ce-cli \\\ndocker-common \\\ndocker-latest \\\ndocker-latest-logrotate \\\ndocker-logrotate \\\ndocker-selinux \\\ndocker-engine-selinux \\\ndocker-engine\n\n# \u8bbe\u7f6e yum repository\nyum install -y yum-utils \\\ndevice-mapper-persistent-data \\\nlvm2\nyum-config-manager --add-repo http:\/\/mirrors.aliyun.com\/docker-ce\/linux\/centos\/docker-ce.repo\n\n# \u5b89\u88c5\u5e76\u542f\u52a8 docker\nyum install -y docker-ce-19.03.11 docker-ce-cli-19.03.11 containerd.io-1.2.13\n\nmkdir \/etc\/docker || true\n\ncat &gt; \/etc\/docker\/daemon.json &lt;&lt;EOF\n{\n  &quot;registry-mirrors&quot;: [&quot;${REGISTRY_MIRROR}&quot;],\n  &quot;exec-opts&quot;: [&quot;native.cgroupdriver=systemd&quot;],\n  &quot;log-driver&quot;: &quot;json-file&quot;,\n  &quot;log-opts&quot;: {\n    &quot;max-size&quot;: &quot;100m&quot;\n  },\n  &quot;storage-driver&quot;: &quot;overlay2&quot;,\n  &quot;storage-opts&quot;: [\n    &quot;overlay2.override_kernel_check=true&quot;\n  ]\n}\nEOF\n\nmkdir -p \/etc\/systemd\/system\/docker.service.d\n\n# Restart Docker\nsystemctl daemon-reload\nsystemctl enable docker\nsystemctl restart docker\n\n# \u5b89\u88c5 nfs-utils\n# \u5fc5\u987b\u5148\u5b89\u88c5 nfs-utils \u624d\u80fd\u6302\u8f7d nfs \u7f51\u7edc\u5b58\u50a8\nyum install -y nfs-utils\nyum install -y wget\n\n# \u5173\u95ed \u9632\u706b\u5899\nsystemctl stop firewalld\nsystemctl disable firewalld\n\n# \u5173\u95ed SeLinux\nsetenforce 0\nsed -i &quot;s\/SELINUX=enforcing\/SELINUX=disabled\/g&quot; \/etc\/selinux\/config\n\n# \u5173\u95ed swap\nswapoff -a\nyes | cp \/etc\/fstab \/etc\/fstab_bak\ncat \/etc\/fstab_bak |grep -v swap &gt; \/etc\/fstab\n\n# \u4fee\u6539 \/etc\/sysctl.conf\n# \u5982\u679c\u6709\u914d\u7f6e\uff0c\u5219\u4fee\u6539\nsed -i &quot;s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g&quot;  \/etc\/sysctl.conf\nsed -i &quot;s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g&quot;  \/etc\/sysctl.conf\nsed -i &quot;s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g&quot;  \/etc\/sysctl.conf\nsed -i &quot;s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g&quot;  \/etc\/sysctl.conf\nsed -i &quot;s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g&quot;  \/etc\/sysctl.conf\nsed -i &quot;s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g&quot;  \/etc\/sysctl.conf\nsed -i &quot;s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g&quot;  \/etc\/sysctl.conf\n# \u53ef\u80fd\u6ca1\u6709\uff0c\u8ffd\u52a0\necho &quot;net.ipv4.ip_forward = 1&quot; &gt;&gt; \/etc\/sysctl.conf\necho &quot;net.bridge.bridge-nf-call-ip6tables = 1&quot; &gt;&gt; \/etc\/sysctl.conf\necho &quot;net.bridge.bridge-nf-call-iptables = 1&quot; &gt;&gt; \/etc\/sysctl.conf\necho &quot;net.ipv6.conf.all.disable_ipv6 = 1&quot; &gt;&gt; \/etc\/sysctl.conf\necho &quot;net.ipv6.conf.default.disable_ipv6 = 1&quot; &gt;&gt; \/etc\/sysctl.conf\necho &quot;net.ipv6.conf.lo.disable_ipv6 = 1&quot; &gt;&gt; \/etc\/sysctl.conf\necho &quot;net.ipv6.conf.all.forwarding = 1&quot;  &gt;&gt; \/etc\/sysctl.conf\n# \u6267\u884c\u547d\u4ee4\u4ee5\u5e94\u7528\nsysctl -p\n\n# \u914d\u7f6eK8S\u7684yum\u6e90\ncat &lt;&lt;EOF &gt; \/etc\/yum.repos.d\/kubernetes.repo\n[kubernetes]\nname=Kubernetes\nbaseurl=http:\/\/mirrors.aliyun.com\/kubernetes\/yum\/repos\/kubernetes-el7-x86_64\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=0\ngpgkey=http:\/\/mirrors.aliyun.com\/kubernetes\/yum\/doc\/yum-key.gpg\n       http:\/\/mirrors.aliyun.com\/kubernetes\/yum\/doc\/rpm-package-key.gpg\nEOF\n\n# \u5378\u8f7d\u65e7\u7248\u672c\nyum remove -y kubelet kubeadm kubectl\n\n# \u5b89\u88c5kubelet\u3001kubeadm\u3001kubectl\n# \u5c06 ${1} \u66ff\u6362\u4e3a kubernetes \u7248\u672c\u53f7\uff0c\u4f8b\u5982 1.19.0\nyum install -y kubelet-${1} kubeadm-${1} kubectl-${1}\n\n# \u91cd\u542f docker\uff0c\u5e76\u542f\u52a8 kubelet\nsystemctl daemon-reload\nsystemctl restart docker\nsystemctl enable kubelet &amp;&amp; systemctl start kubelet\n\ndocker version<\/code><\/pre>\n<h2>\u521d\u59cb\u5316 master \u8282\u70b9<\/h2>\n<p>\u5173\u4e8e\u521d\u59cb\u5316\u65f6\u7528\u5230\u7684\u73af\u5883\u53d8\u91cf<\/p>\n<ul>\n<li><code>APISERVER_NAME<\/code> \u4e0d\u80fd\u662f master \u7684 hostname<\/li>\n<li><code>APISERVER_NAME<\/code> \u5fc5\u987b\u5168\u4e3a\u5c0f\u5199\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u5c0f\u6570\u70b9\uff0c\u4e0d\u80fd\u5305\u542b\u51cf\u53f7<\/li>\n<li><code>POD_SUBNET<\/code> \u6240\u4f7f\u7528\u7684\u7f51\u6bb5\u4e0d\u80fd\u4e0e master\u8282\u70b9\/worker\u8282\u70b9 \u6240\u5728\u7684\u7f51\u6bb5\u91cd\u53e0\u3002\u8be5\u5b57\u6bb5\u7684\u53d6\u503c\u4e3a\u4e00\u4e2a CIDR \u503c\uff0c\u5982\u679c\u60a8\u5bf9 CIDR \u8fd9\u4e2a\u6982\u5ff5\u8fd8\u4e0d\u719f\u6089\uff0c\u8bf7\u4ecd\u7136\u6267\u884c export POD_SUBNET=10.100.0.1\/16 \u547d\u4ee4\uff0c\u4e0d\u505a\u4fee\u6539<\/li>\n<\/ul>\n<p>\u8bf7\u5c06\u811a\u672c\u6700\u540e\u7684 1.19.2 \u66ff\u6362\u6210\u60a8\u9700\u8981\u7684\u7248\u672c\u53f7\uff0c \u811a\u672c\u4e2d\u95f4\u7684 v1.19.x \u4e0d\u8981\u66ff\u6362<\/p>\n<pre><code class=\"language-bash\"># \u53ea\u5728 master \u8282\u70b9\u6267\u884c\n# \u66ff\u6362 x.x.x.x \u4e3a master \u8282\u70b9\u5b9e\u9645 IP\uff08\u52a1\u5fc5\u4f7f\u7528\u5185\u7f51 IP\uff09\n# export \u547d\u4ee4\u53ea\u5728\u5f53\u524d shell \u4f1a\u8bdd\u4e2d\u6709\u6548\uff0c\u5f00\u542f\u65b0\u7684 shell \u7a97\u53e3\u540e\uff0c\u5982\u679c\u8981\u7ee7\u7eed\u5b89\u88c5\u8fc7\u7a0b\uff0c\u8bf7\u91cd\u65b0\u6267\u884c\u6b64\u5904\u7684 export \u547d\u4ee4\nexport MASTER_IP=x.x.x.x\n# \u66ff\u6362 apiserver.demo \u4e3a \u60a8\u60f3\u8981\u7684 dnsName\nexport APISERVER_NAME=apiserver.demo\n# Kubernetes \u5bb9\u5668\u7ec4\u6240\u5728\u7684\u7f51\u6bb5\uff0c\u8be5\u7f51\u6bb5\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u7531 kubernetes \u521b\u5efa\uff0c\u4e8b\u5148\u5e76\u4e0d\u5b58\u5728\u4e8e\u5b9e\u9645\u7269\u7406\u7f51\u7edc\u4e2d\nexport POD_SUBNET=10.100.0.1\/16\necho &quot;${MASTER_IP}    ${APISERVER_NAME}&quot; &gt;&gt; \/etc\/hosts\ncurl -sSL https:\/\/kuboard.cn\/install-script\/v1.19.x\/init_master.sh | sh -s 1.19.2<\/code><\/pre>\n<p>\u611f\u8c22 <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/zhangguanzhang\/google_containers\">https:\/\/github.com\/zhangguanzhang\/google_containers<\/a> \u63d0\u4f9b\u6700\u65b0\u7684 google_containers \u56fd\u5185\u955c\u50cf<\/p>\n<ul>\n<li>\u5982\u78b0\u5230\u4e0d\u80fd\u4e0b\u8f7d docker \u955c\u50cf\u7684\u60c5\u51b5\uff0c\u5c1d\u8bd5\u5c06\u521d\u59cb\u5316\u811a\u672c\u91cc\u7684<code>imageRepository: registry.aliyuncs.com\/k8sxio<\/code>\u6539\u4e3a<code>imageRepository: gcr.azk8s.cn\/google-containers<\/code><\/li>\n<li>\u91cd\u65b0\u521d\u59cb\u5316 master \u8282\u70b9\u524d\uff0c\u8bf7\u5148\u6267\u884c<code>kubeadm reset -f<\/code>\u64cd\u4f5c<\/li>\n<\/ul>\n<blockquote>\n<p><code>init_master.sh<\/code>\u811a\u672c\u5185\u5bb9\uff0c\u4e0b\u8f7d\u540e\u53ef\u4fee\u6539 calico \u7248\u672c\u53f7\uff0c\u53c2\u8003\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/docs.projectcalico.org\/release-notes\/\">https:\/\/docs.projectcalico.org\/release-notes\/<\/a><br \/>\n\u5b89\u88c5 calico \u7f51\u7edc\u63d2\u4ef6\u53c2\u8003\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/docs.projectcalico.org\/getting-started\/kubernetes\/self-managed-onprem\/onpremises\">https:\/\/docs.projectcalico.org\/getting-started\/kubernetes\/self-managed-onprem\/onpremises<\/a><\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n\n# \u53ea\u5728 master \u8282\u70b9\u6267\u884c\n\n# \u811a\u672c\u51fa\u9519\u65f6\u7ec8\u6b62\u6267\u884c\nset -e\n\nif [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then\n  echo -e &quot;\\033[31;1m\u8bf7\u786e\u4fdd\u60a8\u5df2\u7ecf\u8bbe\u7f6e\u4e86\u73af\u5883\u53d8\u91cf POD_SUBNET \u548c APISERVER_NAME \\033[0m&quot;\n  echo \u5f53\u524dPOD_SUBNET=$POD_SUBNET\n  echo \u5f53\u524dAPISERVER_NAME=$APISERVER_NAME\n  exit 1\nfi\n\n# \u67e5\u770b\u5b8c\u6574\u914d\u7f6e\u9009\u9879 https:\/\/godoc.org\/k8s.io\/kubernetes\/cmd\/kubeadm\/app\/apis\/kubeadm\/v1beta2\nrm -f .\/kubeadm-config.yaml\ncat &lt;&lt;EOF &gt; .\/kubeadm-config.yaml\napiVersion: kubeadm.k8s.io\/v1beta2\nkind: ClusterConfiguration\nkubernetesVersion: v${1}\nimageRepository: registry.aliyuncs.com\/k8sxio\ncontrolPlaneEndpoint: &quot;${APISERVER_NAME}:6443&quot;\nnetworking:\n  serviceSubnet: &quot;10.96.0.0\/16&quot;\n  podSubnet: &quot;${POD_SUBNET}&quot;\n  dnsDomain: &quot;cluster.local&quot;\nEOF\n\n# kubeadm init\n# \u6839\u636e\u60a8\u670d\u52a1\u5668\u7f51\u901f\u7684\u60c5\u51b5\uff0c\u60a8\u9700\u8981\u7b49\u5019 3 - 10 \u5206\u949f\nkubeadm init --config=kubeadm-config.yaml --upload-certs\n\n# \u914d\u7f6e kubectl\nrm -rf \/root\/.kube\/\nmkdir \/root\/.kube\/\ncp -i \/etc\/kubernetes\/admin.conf \/root\/.kube\/config\n\n# \u5b89\u88c5 calico \u7f51\u7edc\u63d2\u4ef6\n# \u53c2\u8003\u6587\u6863 https:\/\/docs.projectcalico.org\/v3.13\/getting-started\/kubernetes\/self-managed-onprem\/onpremises\necho &quot;\u5b89\u88c5calico-3.13.1&quot;\nrm -f calico-3.13.1.yaml\nwget https:\/\/kuboard.cn\/install-script\/calico\/calico-3.13.1.yaml\nkubectl apply -f calico-3.13.1.yaml<\/code><\/pre>\n<h3>\u68c0\u67e5 master \u521d\u59cb\u5316\u7ed3\u679c<\/h3>\n<pre><code class=\"language-bash\"># \u53ea\u5728 master \u8282\u70b9\u6267\u884c\n\n# \u6267\u884c\u5982\u4e0b\u547d\u4ee4\uff0c\u7b49\u5f85 3-10 \u5206\u949f\uff0c\u76f4\u5230\u6240\u6709\u7684\u5bb9\u5668\u7ec4\u5904\u4e8e Running \u72b6\u6001\nwatch kubectl get pod -n kube-system -o wide\n\n# \u67e5\u770b master \u8282\u70b9\u521d\u59cb\u5316\u7ed3\u679c\nkubectl get nodes -o wide<\/code><\/pre>\n<blockquote>\n<p><code>-o wide<\/code>\u9009\u9879\u53ef\u4ee5\u67e5\u770b\u5b58\u5728\u54ea\u4e2a\u5bf9\u5e94\u7684\u8282\u70b9<\/p>\n<\/blockquote>\n<h3>\u5e38\u89c1\u9519\u8bef\u5206\u6790<\/h3>\n<p>\uff081\uff09<code>ImagePullBackoff \/ Pending<\/code><\/p>\n<p>\u5982\u679c<code>kubectl get pod -n kube-system -o wide<\/code>\u7684\u8f93\u51fa\u7ed3\u679c\u4e2d\u51fa\u73b0<code>ImagePullBackoff<\/code>\u6216\u8005\u957f\u65f6\u95f4\u5904\u4e8e<code>Pending<\/code>\u7684\u60c5\u51b5\uff0c\u8bf7\u53c2\u8003 <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/www.kuboard.cn\/learning\/faq\/image-pull-backoff.html\" title=\"\u67e5\u770b\u955c\u50cf\u6293\u53d6\u8fdb\u5ea6\">\u67e5\u770b\u955c\u50cf\u6293\u53d6\u8fdb\u5ea6<\/a><\/p>\n<p>\uff082\uff09ContainerCreating<\/p>\n<p>\u5982\u679c<code>kubectl get pod -n kube-system -o wide<\/code>\u7684\u8f93\u51fa\u7ed3\u679c\u4e2d\u67d0\u4e2a Pod \u957f\u671f\u5904\u4e8e<code>ContainerCreating<\/code>\u3001<code>PodInitializing<\/code>\u6216<code>Init:0\/3<\/code>\u7684\u72b6\u6001\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a<\/p>\n<ul>\n<li>\u67e5\u770b\u8be5 Pod \u7684\u72b6\u6001\uff0c\u4f8b\u5982\uff1a<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">kubectl describe pod kube-flannel-ds-amd64-8l25c -n kube-system<\/code><\/pre>\n<p>\u5982\u679c\u8f93\u51fa\u7ed3\u679c\u4e2d\uff0c\u6700\u540e\u4e00\u884c\u663e\u793a\u7684\u662f<code>Pulling image<\/code>\uff0c\u8bf7\u8010\u5fc3\u7b49\u5f85\uff0c\u6216\u8005\u53c2\u8003 <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/www.kuboard.cn\/learning\/faq\/image-pull-backoff.html\" title=\"\u67e5\u770b\u955c\u50cf\u6293\u53d6\u8fdb\u5ea6\">\u67e5\u770b\u955c\u50cf\u6293\u53d6\u8fdb\u5ea6<\/a><\/p>\n<pre><code class=\"language-bash\">Normal  Pulling    44s   kubelet, k8s-worker-02  Pulling image &quot;quay.io\/coreos\/flannel:v0.12.0-amd64&quot;<\/code><\/pre>\n<ul>\n<li>\u5c06\u8be5 Pod \u5220\u9664\uff0c\u7cfb\u7edf\u4f1a\u81ea\u52a8\u91cd\u5efa\u4e00\u4e2a\u65b0\u7684 Pod\uff0c\u4f8b\u5982\uff1a<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">kubectl delete pod kube-flannel-ds-amd64-8l25c -n kube-system<\/code><\/pre>\n<h2>\u521d\u59cb\u5316 worker\u8282\u70b9<\/h2>\n<h3>\u83b7\u5f97 join\u547d\u4ee4\u53c2\u6570<\/h3>\n<p>\u5728 master \u8282\u70b9\u4e0a\u6267\u884c<\/p>\n<pre><code class=\"language-bash\"># \u53ea\u5728 master \u8282\u70b9\u6267\u884c\nkubeadm token create --print-join-command<\/code><\/pre>\n<p>\u53ef\u83b7\u53d6<code>kubeadm join<\/code>\u547d\u4ee4\u53ca\u53c2\u6570\uff0c\u5982\u4e0b\u6240\u793a<\/p>\n<pre><code class=\"language-bash\"># kubeadm token create \u547d\u4ee4\u7684\u8f93\u51fa\nkubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303<\/code><\/pre>\n<blockquote>\n<p>\u8be5 token \u7684\u6709\u6548\u65f6\u95f4\u4e3a 2 \u4e2a\u5c0f\u65f6\uff0c2\u5c0f\u65f6\u5185\uff0c\u53ef\u4ee5\u4f7f\u7528\u6b64 token \u521d\u59cb\u5316\u4efb\u610f\u6570\u91cf\u7684 worker \u8282\u70b9\u3002<\/p>\n<\/blockquote>\n<h3>\u521d\u59cb\u5316worker<\/h3>\n<p>\u9488\u5bf9\u6240\u6709\u7684 worker \u8282\u70b9\u6267\u884c<\/p>\n<pre><code class=\"language-bash\"># \u53ea\u5728 worker \u8282\u70b9\u6267\u884c\n# \u66ff\u6362 x.x.x.x \u4e3a master \u8282\u70b9\u7684\u5185\u7f51 IP\nexport MASTER_IP=x.x.x.x\n# \u66ff\u6362 apiserver.demo \u4e3a\u521d\u59cb\u5316 master \u8282\u70b9\u65f6\u6240\u4f7f\u7528\u7684 APISERVER_NAME\nexport APISERVER_NAME=apiserver.demo\necho &quot;${MASTER_IP}    ${APISERVER_NAME}&quot; &gt;&gt; \/etc\/hosts\n\n# \u66ff\u6362\u4e3a master \u8282\u70b9\u4e0a kubeadm token create \u547d\u4ee4\u7684\u8f93\u51fa\nkubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303<\/code><\/pre>\n<h3>\u68c0\u67e5\u521d\u59cb\u5316\u7ed3\u679c<\/h3>\n<p>\u5728 master \u8282\u70b9\u4e0a\u6267\u884c<\/p>\n<pre><code class=\"language-bash\"># \u53ea\u5728 master \u8282\u70b9\u6267\u884c\n\nkubectl get nodes -o wide<\/code><\/pre>\n<p>\u8f93\u51fa\u7ed3\u679c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre><code class=\"language-bash\">[root@demo-master-a-1 ~]# kubectl get nodes\nNAME     STATUS   ROLES    AGE     VERSION\ndemo-master-a-1   Ready    master   5m3s    v1.19.x\ndemo-worker-a-1   Ready    &lt;none&gt;   2m26s   v1.19.x\ndemo-worker-a-2   Ready    &lt;none&gt;   3m56s   v1.19.x<\/code><\/pre>\n<h3>worker\u8282\u70b9join\u4e0d\u6210\u529f\u5206\u6790<\/h3>\n<p>\uff081\uff09worker \u8282\u70b9\u4e0d\u80fd\u8bbf\u95ee apiserver<\/p>\n<p>\u5728worker\u8282\u70b9\u6267\u884c\u4ee5\u4e0b\u8bed\u53e5\u53ef\u9a8c\u8bc1worker\u8282\u70b9\u662f\u5426\u80fd\u8bbf\u95ee apiserver<\/p>\n<pre><code class=\"language-bash\">curl -ik https:\/\/apiserver.demo:6443<\/code><\/pre>\n<p>\u5982\u679c\u4e0d\u80fd\uff0c\u8bf7\u5728 master \u8282\u70b9\u4e0a\u9a8c\u8bc1<\/p>\n<pre><code class=\"language-bash\">curl -ik https:\/\/localhost:6443<\/code><\/pre>\n<p>\u6b63\u5e38\u8f93\u51fa\u7ed3\u679c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre><code class=\"language-json\">HTTP\/1.1 403 Forbidden\nCache-Control: no-cache, private\nContent-Type: application\/json\nX-Content-Type-Options: nosniff\nDate: Fri, 15 Nov 2019 04:34:40 GMT\nContent-Length: 233\n\n{\n  &quot;kind&quot;: &quot;Status&quot;,\n  &quot;apiVersion&quot;: &quot;v1&quot;,\n  &quot;metadata&quot;: {\n...<\/code><\/pre>\n<p>\u5982\u679c master \u8282\u70b9\u80fd\u591f\u8bbf\u95ee apiserver\u3001\u800c worker \u8282\u70b9\u4e0d\u80fd\uff0c\u5219\u8bf7\u68c0\u67e5\u81ea\u5df1\u7684\u7f51\u7edc\u8bbe\u7f6e<\/p>\n<ul>\n<li>\/etc\/hosts \u662f\u5426\u6b63\u786e\u8bbe\u7f6e\uff1f<\/li>\n<li>\u662f\u5426\u6709\u5b89\u5168\u7ec4\u6216\u9632\u706b\u5899\u7684\u9650\u5236\uff1f<\/li>\n<\/ul>\n<p>\uff082\uff09worker \u8282\u70b9\u9ed8\u8ba4\u7f51\u5361<\/p>\n<p>Kubelet\u4f7f\u7528\u7684 IP \u5730\u5740 \u4e0e master \u8282\u70b9\u53ef\u4e92\u901a\uff08\u65e0\u9700 NAT \u6620\u5c04\uff09\uff0c\u4e14\u6ca1\u6709\u9632\u706b\u5899\u3001\u5b89\u5168\u7ec4\u9694\u79bb<br \/>\n\u5982\u679c\u4f7f\u7528 vmware \u6216 virtualbox \u521b\u5efa\u865a\u62df\u673a\u7528\u4e8e K8S \u5b66\u4e60\uff0c\u53ef\u4ee5\u5c1d\u8bd5 NAT \u6a21\u5f0f\u7684\u7f51\u7edc\uff0c\u800c\u4e0d\u662f\u6865\u63a5\u6a21\u5f0f\u7684\u7f51\u7edc<\/p>\n<p>\uff083\uff09\u79fb\u9664worker\u8282\u70b9\u5e76\u91cd\u8bd5<\/p>\n<blockquote>\n<p>WARNING\uff1a\u6b63\u5e38\u60c5\u51b5\u4e0b\uff0c\u65e0\u9700\u79fb\u9664 worker \u8282\u70b9\uff0c\u5982\u679c\u6dfb\u52a0\u5230\u96c6\u7fa4\u51fa\u9519\uff0c\u53ef\u4ee5\u79fb\u9664 worker \u8282\u70b9\uff0c\u518d\u91cd\u65b0\u5c1d\u8bd5\u6dfb\u52a0<\/p>\n<\/blockquote>\n<p>\u5728\u51c6\u5907\u79fb\u9664\u7684 worker \u8282\u70b9\u4e0a\u6267\u884c<\/p>\n<pre><code class=\"language-bash\"># \u53ea\u5728 worker \u8282\u70b9\u6267\u884c\nkubeadm reset -f<\/code><\/pre>\n<p>\u5728 master \u8282\u70b9 <code>demo-master-a-1<\/code> \u4e0a\u6267\u884c<\/p>\n<pre><code class=\"language-bash\"># \u53ea\u5728 master \u8282\u70b9\u6267\u884c\nkubectl get nodes -o wide<\/code><\/pre>\n<p>\u5982\u679c\u5217\u8868\u4e2d\u6ca1\u6709\u8981\u79fb\u9664\u7684\u8282\u70b9\uff0c\u5219\u5ffd\u7565\u4e0b\u4e00\u4e2a\u6b65\u9aa4<\/p>\n<pre><code class=\"language-bash\"># \u53ea\u5728 master \u8282\u70b9\u6267\u884c\nkubectl delete node demo-worker-x-x<\/code><\/pre>\n<p>TIP\uff1a<\/p>\n<ul>\n<li>\u5c06 <code>demo-worker-x-x<\/code> \u66ff\u6362\u4e3a\u8981\u79fb\u9664\u7684 worker \u8282\u70b9\u7684\u540d\u5b57<\/li>\n<li>worker \u8282\u70b9\u7684\u540d\u5b57\u53ef\u4ee5\u901a\u8fc7\u5728\u8282\u70b9 <code>demo-master-a-1<\/code> \u4e0a\u6267\u884c <code>kubectl get nodes<\/code> \u547d\u4ee4\u83b7\u5f97<\/li>\n<\/ul>\n<h2>\u5b89\u88c5 Ingress Controller<\/h2>\n<h3>\u5feb\u901f\u521d\u59cb\u5316<\/h3>\n<p>\u5728 master \u8282\u70b9\u4e0a\u6267\u884c<\/p>\n<pre><code class=\"language-bash\"># \u53ea\u5728 master \u8282\u70b9\u6267\u884c\nkubectl apply -f https:\/\/kuboard.cn\/install-script\/v1.19.x\/nginx-ingress.yaml<\/code><\/pre>\n<blockquote>\n<p>\u9644\uff1ayaml\u6587\u4ef6\u5185\u5bb9\uff0c\u53ef\u4fee\u6539nginx-ingress\u7248\u672c\u53f7\uff0c\u53c2\u8003\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/nginxinc\/kubernetes-ingress\/releases\">https:\/\/github.com\/nginxinc\/kubernetes-ingress\/releases<\/a><\/p>\n<\/blockquote>\n<pre><code class=\"language-yml\"># \u5982\u679c\u6253\u7b97\u7528\u4e8e\u751f\u4ea7\u73af\u5883\uff0c\u8bf7\u53c2\u8003 https:\/\/github.com\/nginxinc\/kubernetes-ingress\/blob\/v1.5.5\/docs\/installation.md \u5e76\u6839\u636e\u60a8\u81ea\u5df1\u7684\u60c5\u51b5\u505a\u8fdb\u4e00\u6b65\u5b9a\u5236\n\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: nginx-ingress\n\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: nginx-ingress \n  namespace: nginx-ingress\n\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: default-server-secret\n  namespace: nginx-ingress\ntype: Opaque\ndata:\n  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN2akNDQWFZQ0NRREFPRjl0THNhWFhEQU5CZ2txaGtpRzl3MEJBUXNGQURBaE1SOHdIUVlEVlFRRERCWk8KUjBsT1dFbHVaM0psYzNORGIyNTBjbTlzYkdWeU1CNFhEVEU0TURreE1qRTRNRE16TlZvWERUSXpNRGt4TVRFNApNRE16TlZvd0lURWZNQjBHQTFVRUF3d1dUa2RKVGxoSmJtZHlaWE56UTI5dWRISnZiR3hsY2pDQ0FTSXdEUVlKCktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUwvN2hIUEtFWGRMdjNyaUM3QlBrMTNpWkt5eTlyQ08KR2xZUXYyK2EzUDF0azIrS3YwVGF5aGRCbDRrcnNUcTZzZm8vWUk1Y2Vhbkw4WGM3U1pyQkVRYm9EN2REbWs1Qgo4eDZLS2xHWU5IWlg0Rm5UZ0VPaStlM2ptTFFxRlBSY1kzVnNPazFFeUZBL0JnWlJVbkNHZUtGeERSN0tQdGhyCmtqSXVuektURXUyaDU4Tlp0S21ScUJHdDEwcTNRYzhZT3ExM2FnbmovUWRjc0ZYYTJnMjB1K1lYZDdoZ3krZksKWk4vVUkxQUQ0YzZyM1lma1ZWUmVHd1lxQVp1WXN2V0RKbW1GNWRwdEMzN011cDBPRUxVTExSakZJOTZXNXIwSAo1TmdPc25NWFJNV1hYVlpiNWRxT3R0SmRtS3FhZ25TZ1JQQVpQN2MwQjFQU2FqYzZjNGZRVXpNQ0F3RUFBVEFOCkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWpLb2tRdGRPcEsrTzhibWVPc3lySmdJSXJycVFVY2ZOUitjb0hZVUoKdGhrYnhITFMzR3VBTWI5dm15VExPY2xxeC9aYzJPblEwMEJCLzlTb0swcitFZ1U2UlVrRWtWcitTTFA3NTdUWgozZWI4dmdPdEduMS9ienM3bzNBaS9kclkrcUI5Q2k1S3lPc3FHTG1US2xFaUtOYkcyR1ZyTWxjS0ZYQU80YTY3Cklnc1hzYktNbTQwV1U3cG9mcGltU1ZmaXFSdkV5YmN3N0NYODF6cFErUyt1eHRYK2VBZ3V0NHh3VlI5d2IyVXYKelhuZk9HbWhWNThDd1dIQnNKa0kxNXhaa2VUWXdSN0diaEFMSkZUUkk3dkhvQXprTWIzbjAxQjQyWjNrN3RXNQpJUDFmTlpIOFUvOWxiUHNoT21FRFZkdjF5ZytVRVJxbStGSis2R0oxeFJGcGZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\n  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdi91RWM4b1JkMHUvZXVJTHNFK1RYZUprckxMMnNJNGFWaEMvYjVyYy9XMlRiNHEvClJOcktGMEdYaVN1eE9ycXgrajlnamx4NXFjdnhkenRKbXNFUkJ1Z1B0ME9hVGtIekhvb3FVWmcwZGxmZ1dkT0EKUTZMNTdlT1l0Q29VOUZ4amRXdzZUVVRJVUQ4R0JsRlNjSVo0b1hFTkhzbysyR3VTTWk2Zk1wTVM3YUhudzFtMApxWkdvRWEzWFNyZEJ6eGc2clhkcUNlUDlCMXl3VmRyYURiUzc1aGQzdUdETDU4cGszOVFqVUFQaHpxdmRoK1JWClZGNGJCaW9CbTVpeTlZTW1hWVhsMm0wTGZzeTZuUTRRdFFzdEdNVWozcGJtdlFmazJBNnljeGRFeFpkZFZsdmwKMm82MjBsMllxcHFDZEtCRThCay90elFIVTlKcU56cHpoOUJUTXdJREFRQUJBb0lCQVFDZklHbXowOHhRVmorNwpLZnZJUXQwQ0YzR2MxNld6eDhVNml4MHg4Mm15d1kxUUNlL3BzWE9LZlRxT1h1SENyUlp5TnUvZ2IvUUQ4bUFOCmxOMjRZTWl0TWRJODg5TEZoTkp3QU5OODJDeTczckM5bzVvUDlkazAvYzRIbjAzSkVYNzZ5QjgzQm9rR1FvYksKMjhMNk0rdHUzUmFqNjd6Vmc2d2szaEhrU0pXSzBwV1YrSjdrUkRWYmhDYUZhNk5nMUZNRWxhTlozVDhhUUtyQgpDUDNDeEFTdjYxWTk5TEI4KzNXWVFIK3NYaTVGM01pYVNBZ1BkQUk3WEh1dXFET1lvMU5PL0JoSGt1aVg2QnRtCnorNTZud2pZMy8yUytSRmNBc3JMTnIwMDJZZi9oY0IraVlDNzVWYmcydVd6WTY3TWdOTGQ5VW9RU3BDRkYrVm4KM0cyUnhybnhBb0dCQU40U3M0ZVlPU2huMVpQQjdhTUZsY0k2RHR2S2ErTGZTTXFyY2pOZjJlSEpZNnhubmxKdgpGenpGL2RiVWVTbWxSekR0WkdlcXZXaHFISy9iTjIyeWJhOU1WMDlRQ0JFTk5jNmtWajJTVHpUWkJVbEx4QzYrCk93Z0wyZHhKendWelU0VC84ajdHalRUN05BZVpFS2FvRHFyRG5BYWkyaW5oZU1JVWZHRXFGKzJyQW9HQkFOMVAKK0tZL0lsS3RWRzRKSklQNzBjUis3RmpyeXJpY05iWCtQVzUvOXFHaWxnY2grZ3l4b25BWlBpd2NpeDN3QVpGdwpaZC96ZFB2aTBkWEppc1BSZjRMazg5b2pCUmpiRmRmc2l5UmJYbyt3TFU4NUhRU2NGMnN5aUFPaTVBRHdVU0FkCm45YWFweUNweEFkREtERHdObit3ZFhtaTZ0OHRpSFRkK3RoVDhkaVpBb0dCQUt6Wis1bG9OOTBtYlF4VVh5YUwKMjFSUm9tMGJjcndsTmVCaWNFSmlzaEhYa2xpSVVxZ3hSZklNM2hhUVRUcklKZENFaHFsV01aV0xPb2I2NTNyZgo3aFlMSXM1ZUtka3o0aFRVdnpldm9TMHVXcm9CV2xOVHlGanIrSWhKZnZUc0hpOGdsU3FkbXgySkJhZUFVWUNXCndNdlQ4NmNLclNyNkQrZG8wS05FZzFsL0FvR0FlMkFVdHVFbFNqLzBmRzgrV3hHc1RFV1JqclRNUzRSUjhRWXQKeXdjdFA4aDZxTGxKUTRCWGxQU05rMXZLTmtOUkxIb2pZT2pCQTViYjhibXNVU1BlV09NNENoaFJ4QnlHbmR2eAphYkJDRkFwY0IvbEg4d1R0alVZYlN5T294ZGt5OEp0ek90ajJhS0FiZHd6NlArWDZDODhjZmxYVFo5MWpYL3RMCjF3TmRKS2tDZ1lCbyt0UzB5TzJ2SWFmK2UwSkN5TGhzVDQ5cTN3Zis2QWVqWGx2WDJ1VnRYejN5QTZnbXo5aCsKcDNlK2JMRUxwb3B0WFhNdUFRR0xhUkcrYlNNcjR5dERYbE5ZSndUeThXczNKY3dlSTdqZVp2b0ZpbmNvVlVIMwphdmxoTUVCRGYxSjltSDB5cDBwWUNaS2ROdHNvZEZtQktzVEtQMjJhTmtsVVhCS3gyZzR6cFE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=\n\n---\nkind: ConfigMap\napiVersion: v1\nmetadata:\n  name: nginx-config\n  namespace: nginx-ingress\ndata:\n  server-names-hash-bucket-size: &quot;1024&quot;\n\n---\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io\/v1\nmetadata:\n  name: nginx-ingress\nrules:\n- apiGroups:\n  - &quot;&quot;\n  resources:\n  - services\n  - endpoints\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - &quot;&quot;\n  resources:\n  - secrets\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - &quot;&quot;\n  resources:\n  - configmaps\n  verbs:\n  - get\n  - list\n  - watch\n  - update\n  - create\n- apiGroups:\n  - &quot;&quot;\n  resources:\n  - pods\n  verbs:\n  - list\n- apiGroups:\n  - &quot;&quot;\n  resources:\n  - events\n  verbs:\n  - create\n  - patch\n- apiGroups:\n  - extensions\n  resources:\n  - ingresses\n  verbs:\n  - list\n  - watch\n  - get\n- apiGroups:\n  - &quot;extensions&quot;\n  resources:\n  - ingresses\/status\n  verbs:\n  - update\n- apiGroups:\n  - k8s.nginx.org\n  resources:\n  - virtualservers\n  - virtualserverroutes\n  verbs:\n  - list\n  - watch\n  - get\n\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io\/v1\nmetadata:\n  name: nginx-ingress\nsubjects:\n- kind: ServiceAccount\n  name: nginx-ingress\n  namespace: nginx-ingress\nroleRef:\n  kind: ClusterRole\n  name: nginx-ingress\n  apiGroup: rbac.authorization.k8s.io\n\n---\napiVersion: apps\/v1\nkind: DaemonSet\nmetadata:\n  name: nginx-ingress\n  namespace: nginx-ingress\n  annotations:\n    prometheus.io\/scrape: &quot;true&quot;\n    prometheus.io\/port: &quot;9113&quot;\nspec:\n  selector:\n    matchLabels:\n      app: nginx-ingress\n  template:\n    metadata:\n      labels:\n        app: nginx-ingress\n    spec:\n      serviceAccountName: nginx-ingress\n      containers:\n      - image: nginx\/nginx-ingress:1.5.5\n        name: nginx-ingress\n        ports:\n        - name: http\n          containerPort: 80\n          hostPort: 80\n        - name: https\n          containerPort: 443\n          hostPort: 443\n        - name: prometheus\n          containerPort: 9113\n        env:\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.name\n        args:\n          - -nginx-configmaps=$(POD_NAMESPACE)\/nginx-config\n          - -default-server-tls-secret=$(POD_NAMESPACE)\/default-server-secret\n         #- -v=3 # Enables extensive logging. Useful for troubleshooting.\n         #- -report-ingress-status\n         #- -external-service=nginx-ingress\n         #- -enable-leader-election\n          - -enable-prometheus-metrics\n         #- -enable-custom-resources<\/code><\/pre>\n<h3>\u914d\u7f6e\u57df\u540d\u89e3\u6790<\/h3>\n<p>\u5c06\u57df\u540d<code>*.demo.yourdomain.com<\/code>\u89e3\u6790\u5230<code>demo-worker-a-2<\/code>\u7684 IP \u5730\u5740<code>z.z.z.z<\/code>\uff08\u4e5f\u53ef\u4ee5\u662f<code>demo-worker-a-1<\/code>\u7684\u5730\u5740<code>y.y.y.y<\/code>\uff09<\/p>\n<p>\u9a8c\u8bc1\u914d\u7f6e\uff1a\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee<code>a.demo.yourdomain.com<\/code>\uff0c\u5c06\u5f97\u5230 404 NotFound \u9519\u8bef\u9875\u9762<\/p>\n<h3>\u5378\u8f7dIngressController<\/h3>\n<p>\u53ea\u5728\u60a8\u60f3\u9009\u62e9\u5176\u4ed6 Ingress Controller \u7684\u60c5\u51b5\u4e0b\u5378\u8f7d\uff0c\u5728 master \u8282\u70b9\u4e0a\u6267\u884c<\/p>\n<pre><code class=\"language-bash\"># \u53ea\u5728 master \u8282\u70b9\u6267\u884c\nkubectl delete -f https:\/\/kuboard.cn\/install-script\/v1.19.x\/nginx-ingress.yaml<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>kubeadm \u662f Kubernetes \u5b98\u65b9\u652f\u6301\u7684\u5b89\u88c5\u65b9\u5f0f\uff0c\u201c\u4e8c\u8fdb\u5236\u201d \u4e0d\u662f\u3002\u91c7\u7528 kubernetes.i [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[356],"class_list":["post-1886","post","type-post","status-publish","format-standard","hentry","category-k8s","tag-kubernetes"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1886","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1886"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1886\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1886"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1886"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1886"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}