张银辉 發表於 2020-8-11 17:21:00

.Net微服务实战之Kubernetes的搭建与使用

<h1 id="autoid-0-0-0">系列文章</h1>
<ul>
<li>.Net微服务实战之技术选型篇</li>
</ul>
<ul>
<li class="_mce_tagged_br">.Net微服务实战之技术架构分层篇</li>
</ul>
<ul>
<li class="_mce_tagged_br">.Net微服务实战之DevOps篇</li>
</ul>
<ul>
<li class="_mce_tagged_br">.Net微服务实战之负载均衡(上)</li>
</ul>
<ul>
<li class="_mce_tagged_br">
<p>.Net微服务实战之CI/CD</p>
</li>
</ul>
<h1>前言</h1>
<p>  说到微服务就得扯到自动化运维,然后别人就不得不问你用没用上K8S。无论是概念上还是在实施搭建时,K8S的门槛比Docker Compose、Docker Swarm高了不少。我自己也经过了多次的实践,整理出一套顺利部署的流程。</p>
<p>  我这次搭建花了一共整整4个工作实践与一个工作日写博客,中间有一个网络问题导致reset了集群重新搭了一次,完成后结合了Jenkins使用,还是成就感满满的。如果对大家有用,还请点个推荐与关注。</p>
<h1>基本概念</h1>
<h2>Kubectl</h2>
<p>kubectl用于运行Kubernetes集群命令的管理工具,Kubernetes kubectl 与 Docker 命令关系可以查看这里</p>
<div class="cnblogs_code">
<pre>http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">docs.kubernetes.org.cn/70.html</span></pre>
</div>
<h2>Kubeadm</h2>
<p>kubeadm 是 kubernetes 的集群安装工具,能够快速安装 kubernetes 集群,相关命令有以下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">kubeadm init

kubeadm </span><span style="color: rgba(0, 0, 255, 1)">join</span></pre>
</div>
<h2 id="kubelet"><span id="kubelet">Kubelet</span></h2>
<p>kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能:</p>
<ul>
<li>安装Pod所需的volume。</li>
<li>下载Pod的Secrets。</li>
<li>Pod中运行的 docker(或experimentally,rkt)容器。</li>
<li>定期执行容器健康检查。</li>
</ul>
<h2>Pod</h2>
<p>Pod是Kubernetes创建或部署的最小(最简单)的基本单位,一个Pod代表集群上正在运行的一个进程,它可能由单个容器或多个容器共享组成的资源。</p>
<p>一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。</p>
<p>Pods提供两种共享资源:网络和存储。</p>
<p><strong><span id="i">网络</span></strong></p>
<p>每个Pod被分配一个独立的IP地址,Pod中的每个容器共享网络命名空间,包括IP地址和网络端口。Pod内的容器可以使用localhost相互通信。当Pod中的容器与Pod&nbsp;外部通信时,他们必须协调如何使用共享网络资源(如端口)。</p>
<p><strong><span id="i-2">存储</span></strong></p>
<p>Pod可以指定一组共享存储<em>volumes</em>。Pod中的所有容器都可以访问共享<em>volumes</em>,允许这些容器共享数据。<em>volumes&nbsp;</em>还用于Pod中的数据持久化,以防其中一个容器需要重新启动而丢失数据。</p>
<h2>Service</h2>
<p>一个应用服务在Kubernetes中可能会有一个或多个Pod,每个Pod的IP地址由网络组件动态随机分配(Pod重启后IP地址会改变)。为屏蔽这些后端实例的动态变化和对多实例的负载均衡,引入了Service这个资源对象。</p>
<p>Kubernetes&nbsp;ServiceTypes&nbsp;允许指定一个需要的类型的 Service,默认是&nbsp;ClusterIP&nbsp;类型。</p>
<p>Type&nbsp;的取值以及行为如下:</p>
<ul>
<li>ClusterIP:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的&nbsp;ServiceType。</li>
<li>NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort&nbsp;服务会路由到&nbsp;ClusterIP&nbsp;服务,这个&nbsp;ClusterIP&nbsp;服务会自动创建。通过请求&nbsp;&lt;NodeIP&gt;:&lt;NodePort&gt;,可以从集群的外部访问一个&nbsp;NodePort&nbsp;服务。</li>
<li>LoadBalancer:使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到&nbsp;NodePort&nbsp;服务和&nbsp;ClusterIP&nbsp;服务。</li>
<li>ExternalName:通过返回&nbsp;CNAME&nbsp;和它的值,可以将服务映射到&nbsp;externalName&nbsp;字段的内容(例如,&nbsp;foo.bar.example.com)。 没有任何类型代理被创建,这只有 Kubernetes 1.7 或更高版本的&nbsp;kube-dns&nbsp;才支持。</li>
</ul>
<blockquote>
<p>其他详细的概念请移步到&nbsp;http://docs.kubernetes.org.cn/227.html</p>
</blockquote>
<h1>物理部署图</h1>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200812100220189-533359004.png" alt="" width="772" height="526" loading="lazy"></p>
<p>&nbsp;</p>
<h1>Docker-ce 1.19安装</h1>
<p><strong>在所有需要用到<strong>kubernetes</strong>服务器上安装docker-ce</strong></p>
<p>卸载旧版本 docker</p>
<div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">yum</span> remove docker docker-common docker-selinux dockesr-engine -y</pre>
</div>
</div>
</div>
<div>升级系统软件</div>
<div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">yum</span> upgrade -y</pre>
</div>
</div>
</div>
<div>安装必要的一些系统工具</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span> -y <span style="color: rgba(0, 0, 255, 1)">yum</span>-utils device-mapper-persistent-data lvm2</pre>
</div>
</div>
<div>添加docker-ce软件源</div>
<div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">yum</span>-config-manager --add-repo https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span></pre>
</div>
</div>
</div>
<div>更新并安装 docker-ce</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">yum</span><span style="color: rgba(0, 0, 0, 1)"> makecache fast
</span><span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span> docker-ce-19.03.12 -y</pre>
</div>
<div>添加docker国内镜像源</div>
<div>
<div class="cnblogs_code">
<pre>vim /etc/docker/<span style="color: rgba(0, 0, 0, 1)">daemon.json

{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">exec-opts</span><span style="color: rgba(128, 0, 0, 1)">"</span>: [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">native.cgroupdriver=systemd</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">],
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">registry-mirrors</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> : [
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://ovfftd6p.mirror.aliyuncs.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://registry.docker-cn.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://docker.mirrors.ustc.edu.cn</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://hub-mirror.c.163.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
],
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">insecure-registries</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> : [
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">registry.docker-cn.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">docker.mirrors.ustc.edu.cn</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
],
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">debug</span><span style="color: rgba(128, 0, 0, 1)">"</span> : <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">experimental</span><span style="color: rgba(128, 0, 0, 1)">"</span> : <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
</div>
<p>启动服务</p>
</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">systemctl start docker
systemctl enable docker</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200805165307769-974044531.png" alt="" width="377" height="356" loading="lazy"></p>
<h1>安装kubernetes-1.18.3</h1>
<p><strong>所有需要用到kubernetes的服务器都执行以下指令。</strong></p>
<div>添加阿里kubernetes源</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">cat</span> &lt;&lt;EOF &gt; /etc/<span style="color: rgba(0, 0, 255, 1)">yum</span>.repos.d/<span style="color: rgba(0, 0, 0, 1)">kubernetes.repo<br>
name</span>=<span style="color: rgba(0, 0, 0, 1)">Kubernetes
baseurl</span>=https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/</span>
enabled=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
gpgcheck</span>=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
repo_gpgcheck</span>=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
gpgkey</span>=https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg </span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg</span>
EOF</pre>
</div>
<div>安装并启动</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span> kubeadm-<span style="color: rgba(128, 0, 128, 1)">1.18</span>.<span style="color: rgba(128, 0, 128, 1)">3</span> kubectl-<span style="color: rgba(128, 0, 128, 1)">1.18</span>.<span style="color: rgba(128, 0, 128, 1)">3</span> kubelet-<span style="color: rgba(128, 0, 128, 1)">1.18</span>.<span style="color: rgba(128, 0, 128, 1)">3</span></pre>
</div>
<p>启动kubelet</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">systemctl enable kubelet
systemctl start kubelet</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200805170128514-40148634.png" alt="" width="1186" height="869" loading="lazy"></p>
<div>在Master设置环境变量,在/etc/profile中配置</div>
<div>
<div class="cnblogs_code">
<pre>vim /etc/profile</pre>
</div>
</div>
<div>在最后添加如下配置</div>
<div>
<div class="cnblogs_code">
<pre>export KUBECONFIG=/etc/kubernetes/admin.conf</pre>
</div>
<p>执行命令使其起效</p>
</div>
<div>
<div class="cnblogs_code">
<pre>source /etc/profile</pre>
</div>
<pre><code class="has-numbering hljs properties"></code></pre>
</div>
<h1>初始化k8s集群</h1>
<p><strong>在master节点(server-a)进行初始化集群</strong></p>
<p>开放端口</p>
<div>
<div class="cnblogs_code">
<pre>firewall-cmd --permanent --zone=public --add-port=<span style="color: rgba(128, 0, 128, 1)">6443</span>/<span style="color: rgba(0, 0, 0, 1)">tcp
firewall</span>-cmd --permanent --zone=public --add-port=<span style="color: rgba(128, 0, 128, 1)">10250</span>/<span style="color: rgba(0, 0, 0, 1)">tcp
firewall</span>-cmd --reload</pre>
</div>
<div>关闭swap</div>
<div>
<div class="cnblogs_code">
<pre>vim /etc/<span style="color: rgba(0, 0, 0, 1)">fstab
#注释swap那行

swapoff </span>-a</pre>
</div>
<p>设置iptables规则</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">1</span> &gt; /proc/sys/net/bridge/bridge-nf-call-<span style="color: rgba(0, 0, 0, 1)">iptables
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">1</span> &gt; /proc/sys/net/bridge/bridge-nf-call-ip6tables</pre>
</div>
</div>
<p>初始化</p>
<div class="cnblogs_code">
<pre><span style="background-color: rgba(255, 255, 255, 1); font-family: &quot;PingFang SC&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; font-size: 14px">kubeadm init&nbsp;--kubernetes-version=1.18.3&nbsp; --apiserver-advertise-address=192.168.88.138&nbsp; &nbsp;--image-repository registry.aliyuncs.com/google_containers&nbsp; --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16 --ignore-preflight-errors=Swap</span></pre>
</div>
</div>
  pod-network-cidr参数的为pod网段:,apiserver-advertise-address参数为本机IP。</div>
<div>  如果中途执行有异常可以通过 kubeadm reset 后重新init。</div>
<div><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200811142430366-498198737.png" alt="" width="1097" height="845" loading="lazy"></div>
<div>初始化成功执行下面指令</div>
<div>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p $HOME/<span style="color: rgba(0, 0, 0, 1)">.kube
</span><span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">cp</span> -i /etc/kubernetes/admin.conf $HOME/.kube/<span style="color: rgba(0, 0, 0, 1)">config
</span><span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">chown</span> $(<span style="color: rgba(0, 0, 255, 1)">id</span> -u):$(<span style="color: rgba(0, 0, 255, 1)">id</span> -g) $HOME/.kube/config</pre>
</div>
</div>
<div>
<div>查看node和pod信息</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">kubectl get node
kubectl get pod </span>--all-namespaces</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200805192313596-1529467810.png" alt="" width="529" height="162" loading="lazy"></p>
<h1>安装flannel组件</h1>
<p><strong>在master节点(server-a)安装flannel组件</strong></p>
<p>找个梯子下载kube-flannel.yml文件</p>
<div class="cnblogs_code">
<pre>https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</span></pre>
</div>
<p>下载不了也没关系,我复制给到大家:</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_ac3ecf10-d787-4020-97f5-6a080ae32e06" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_ac3ecf10-d787-4020-97f5-6a080ae32e06" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_ac3ecf10-d787-4020-97f5-6a080ae32e06" class="cnblogs_code_hide">
<pre>---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: policy</span>/<span style="color: rgba(0, 0, 0, 1)">v1beta1
kind: PodSecurityPolicy
metadata:
name: psp.flannel.unprivileged
annotations:
    seccomp.security.alpha.kubernetes.io</span>/allowedProfileNames: docker/<span style="color: rgba(0, 0, 0, 1)">default
    seccomp.security.alpha.kubernetes.io</span>/defaultProfileName: docker/<span style="color: rgba(0, 0, 0, 1)">default
    apparmor.security.beta.kubernetes.io</span>/allowedProfileNames: runtime/<span style="color: rgba(0, 0, 0, 1)">default
    apparmor.security.beta.kubernetes.io</span>/defaultProfileName: runtime/<span style="color: rgba(0, 0, 0, 1)">default
spec:
privileged: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
volumes:
    </span>-<span style="color: rgba(0, 0, 0, 1)"> configMap
    </span>-<span style="color: rgba(0, 0, 0, 1)"> secret
    </span>-<span style="color: rgba(0, 0, 0, 1)"> emptyDir
    </span>-<span style="color: rgba(0, 0, 0, 1)"> hostPath
allowedHostPaths:
    </span>- pathPrefix: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/etc/cni/net.d</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    - pathPrefix: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/etc/kube-flannel</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    - pathPrefix: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/run/flannel</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
readOnlyRootFilesystem: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
# Users and </span><span style="color: rgba(0, 0, 255, 1)">groups</span><span style="color: rgba(0, 0, 0, 1)">
runAsUser:
    rule: RunAsAny
supplementalGroups:
    rule: RunAsAny
fsGroup:
    rule: RunAsAny
# Privilege Escalation
allowPrivilegeEscalation: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
defaultAllowPrivilegeEscalation: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
# Capabilities
allowedCapabilities: [</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">NET_ADMIN</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">NET_RAW</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
defaultAddCapabilities: []
requiredDropCapabilities: []
# Host namespaces
hostPID: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
hostIPC: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
hostNetwork: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
hostPorts:
</span>- min: <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
    max: </span><span style="color: rgba(128, 0, 128, 1)">65535</span><span style="color: rgba(0, 0, 0, 1)">
# SELinux
seLinux:
    # SELinux is unused </span><span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> CaaSP
    rule: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">RunAsAny</span><span style="color: rgba(128, 0, 0, 1)">'</span>
---<span style="color: rgba(0, 0, 0, 1)">
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1beta1
metadata:
name: flannel
rules:
</span>- apiGroups: [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">extensions</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
    resources: [</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">podsecuritypolicies</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
    verbs: [</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">use</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
    resourceNames: [</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">psp.flannel.unprivileged</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
</span>-<span style="color: rgba(0, 0, 0, 1)"> apiGroups:
      </span>- <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">
    resources:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> pods
    verbs:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> get
</span>-<span style="color: rgba(0, 0, 0, 1)"> apiGroups:
      </span>- <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">
    resources:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> nodes
    verbs:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> list
      </span>-<span style="color: rgba(0, 0, 0, 1)"> watch
</span>-<span style="color: rgba(0, 0, 0, 1)"> apiGroups:
      </span>- <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">
    resources:
      </span>- nodes/<span style="color: rgba(0, 0, 0, 1)">status
    verbs:
      </span>- <span style="color: rgba(0, 0, 255, 1)">patch</span>
---<span style="color: rgba(0, 0, 0, 1)">
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1beta1
metadata:
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
</span>-<span style="color: rgba(0, 0, 0, 1)"> kind: ServiceAccount
name: flannel
namespace: kube</span>-<span style="color: rgba(0, 0, 0, 1)">system
</span>---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: v1
kind: ServiceAccount
metadata:
name: flannel
namespace: kube</span>-<span style="color: rgba(0, 0, 0, 1)">system
</span>---<span style="color: rgba(0, 0, 0, 1)">
kind: ConfigMap
apiVersion: v1
metadata:
name: kube</span>-flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
namespace: kube</span>-<span style="color: rgba(0, 0, 0, 1)">system
labels:
    tier: node
    app: flannel
data:
cni</span>-conf.json: |<span style="color: rgba(0, 0, 0, 1)">
    {
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cbr0</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cniVersion</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">0.3.1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">plugins</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
      {
          </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">flannel</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
          </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">delegate</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hairpinMode</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">isDefaultGateway</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
          }
      },
      {
          </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">portmap</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
          </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">capabilities</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">portMappings</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
          }
      }
      ]
    }
net</span>-conf.json: |<span style="color: rgba(0, 0, 0, 1)">
    {
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Network</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">10.244.0.0/16</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Backend</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Type</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">vxlan</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      }
    }
</span>---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: apps</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: DaemonSet
metadata:
name: kube</span>-flannel-ds-<span style="color: rgba(0, 0, 0, 1)">amd64
namespace: kube</span>-<span style="color: rgba(0, 0, 0, 1)">system
labels:
    tier: node
    app: flannel
spec:
selector:
    matchLabels:
      app: flannel
template:
    metadata:
      labels:
      tier: node
      app: flannel
    spec:
      affinity:
      nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            </span>-<span style="color: rgba(0, 0, 0, 1)"> matchExpressions:
                  </span>- key: kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">os
                  operator: In
                  values:
                      </span>-<span style="color: rgba(0, 0, 0, 1)"> linux
                  </span>- key: kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">arch
                  operator: In
                  values:
                      </span>-<span style="color: rgba(0, 0, 0, 1)"> amd64
      hostNetwork: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
      priorityClassName: system</span>-node-<span style="color: rgba(0, 0, 0, 1)">critical
      tolerations:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> operator: Exists
      effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      </span>- name: <span style="color: rgba(0, 0, 255, 1)">install</span>-<span style="color: rgba(0, 0, 0, 1)">cni
      image: quay.io</span>/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-<span style="color: rgba(0, 0, 0, 1)">amd64
      command:
      </span>- <span style="color: rgba(0, 0, 255, 1)">cp</span><span style="color: rgba(0, 0, 0, 1)">
      args:
      </span>- -<span style="color: rgba(0, 0, 0, 1)">f
      </span>- /etc/kube-flannel/cni-<span style="color: rgba(0, 0, 0, 1)">conf.json
      </span>- /etc/cni/net.d/<span style="color: rgba(128, 0, 128, 1)">10</span>-<span style="color: rgba(0, 0, 0, 1)">flannel.conflist
      volumeMounts:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: cni
          mountPath: </span>/etc/cni/<span style="color: rgba(0, 0, 0, 1)">net.d
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          mountPath: </span>/etc/kube-flannel/<span style="color: rgba(0, 0, 0, 1)">
      containers:
      </span>- name: kube-<span style="color: rgba(0, 0, 0, 1)">flannel
      image: quay.io</span>/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-<span style="color: rgba(0, 0, 0, 1)">amd64
      command:
      </span>- /opt/bin/<span style="color: rgba(0, 0, 0, 1)">flanneld
      args:
      </span>- --ip-<span style="color: rgba(0, 0, 0, 1)">masq
      </span>- --kube-subnet-<span style="color: rgba(0, 0, 0, 1)">mgr
      resources:
          requests:
            cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">50Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
          limits:
            cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">50Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      securityContext:
          privileged: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
          capabilities:
            add: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NET_ADMIN</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NET_RAW</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
      </span><span style="color: rgba(0, 0, 255, 1)">env</span><span style="color: rgba(0, 0, 0, 1)">:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: POD_NAME
          valueFrom:
            fieldRef:
            fieldPath: metadata.name
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: POD_NAMESPACE
          valueFrom:
            fieldRef:
            fieldPath: metadata.namespace
      volumeMounts:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: run
          mountPath: </span>/run/<span style="color: rgba(0, 0, 0, 1)">flannel
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          mountPath: </span>/etc/kube-flannel/<span style="color: rgba(0, 0, 0, 1)">
      volumes:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: run
          hostPath:
            path: </span>/run/<span style="color: rgba(0, 0, 0, 1)">flannel
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: cni
          hostPath:
            path: </span>/etc/cni/<span style="color: rgba(0, 0, 0, 1)">net.d
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          configMap:
            name: kube</span>-flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
</span>---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: apps</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: DaemonSet
metadata:
name: kube</span>-flannel-ds-<span style="color: rgba(0, 0, 0, 1)">arm64
namespace: kube</span>-<span style="color: rgba(0, 0, 0, 1)">system
labels:
    tier: node
    app: flannel
spec:
selector:
    matchLabels:
      app: flannel
template:
    metadata:
      labels:
      tier: node
      app: flannel
    spec:
      affinity:
      nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            </span>-<span style="color: rgba(0, 0, 0, 1)"> matchExpressions:
                  </span>- key: kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">os
                  operator: In
                  values:
                      </span>-<span style="color: rgba(0, 0, 0, 1)"> linux
                  </span>- key: kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">arch
                  operator: In
                  values:
                      </span>-<span style="color: rgba(0, 0, 0, 1)"> arm64
      hostNetwork: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
      priorityClassName: system</span>-node-<span style="color: rgba(0, 0, 0, 1)">critical
      tolerations:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> operator: Exists
      effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      </span>- name: <span style="color: rgba(0, 0, 255, 1)">install</span>-<span style="color: rgba(0, 0, 0, 1)">cni
      image: quay.io</span>/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-<span style="color: rgba(0, 0, 0, 1)">arm64
      command:
      </span>- <span style="color: rgba(0, 0, 255, 1)">cp</span><span style="color: rgba(0, 0, 0, 1)">
      args:
      </span>- -<span style="color: rgba(0, 0, 0, 1)">f
      </span>- /etc/kube-flannel/cni-<span style="color: rgba(0, 0, 0, 1)">conf.json
      </span>- /etc/cni/net.d/<span style="color: rgba(128, 0, 128, 1)">10</span>-<span style="color: rgba(0, 0, 0, 1)">flannel.conflist
      volumeMounts:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: cni
          mountPath: </span>/etc/cni/<span style="color: rgba(0, 0, 0, 1)">net.d
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          mountPath: </span>/etc/kube-flannel/<span style="color: rgba(0, 0, 0, 1)">
      containers:
      </span>- name: kube-<span style="color: rgba(0, 0, 0, 1)">flannel
      image: quay.io</span>/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-<span style="color: rgba(0, 0, 0, 1)">arm64
      command:
      </span>- /opt/bin/<span style="color: rgba(0, 0, 0, 1)">flanneld
      args:
      </span>- --ip-<span style="color: rgba(0, 0, 0, 1)">masq
      </span>- --kube-subnet-<span style="color: rgba(0, 0, 0, 1)">mgr
      resources:
          requests:
            cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">50Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
          limits:
            cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">50Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      securityContext:
          privileged: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
          capabilities:
             add: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NET_ADMIN</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NET_RAW</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
      </span><span style="color: rgba(0, 0, 255, 1)">env</span><span style="color: rgba(0, 0, 0, 1)">:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: POD_NAME
          valueFrom:
            fieldRef:
            fieldPath: metadata.name
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: POD_NAMESPACE
          valueFrom:
            fieldRef:
            fieldPath: metadata.namespace
      volumeMounts:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: run
          mountPath: </span>/run/<span style="color: rgba(0, 0, 0, 1)">flannel
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          mountPath: </span>/etc/kube-flannel/<span style="color: rgba(0, 0, 0, 1)">
      volumes:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: run
          hostPath:
            path: </span>/run/<span style="color: rgba(0, 0, 0, 1)">flannel
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: cni
          hostPath:
            path: </span>/etc/cni/<span style="color: rgba(0, 0, 0, 1)">net.d
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          configMap:
            name: kube</span>-flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
</span>---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: apps</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: DaemonSet
metadata:
name: kube</span>-flannel-ds-<span style="color: rgba(0, 0, 0, 1)">arm
namespace: kube</span>-<span style="color: rgba(0, 0, 0, 1)">system
labels:
    tier: node
    app: flannel
spec:
selector:
    matchLabels:
      app: flannel
template:
    metadata:
      labels:
      tier: node
      app: flannel
    spec:
      affinity:
      nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            </span>-<span style="color: rgba(0, 0, 0, 1)"> matchExpressions:
                  </span>- key: kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">os
                  operator: In
                  values:
                      </span>-<span style="color: rgba(0, 0, 0, 1)"> linux
                  </span>- key: kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">arch
                  operator: In
                  values:
                      </span>-<span style="color: rgba(0, 0, 0, 1)"> arm
      hostNetwork: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
      priorityClassName: system</span>-node-<span style="color: rgba(0, 0, 0, 1)">critical
      tolerations:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> operator: Exists
      effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      </span>- name: <span style="color: rgba(0, 0, 255, 1)">install</span>-<span style="color: rgba(0, 0, 0, 1)">cni
      image: quay.io</span>/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-<span style="color: rgba(0, 0, 0, 1)">arm
      command:
      </span>- <span style="color: rgba(0, 0, 255, 1)">cp</span><span style="color: rgba(0, 0, 0, 1)">
      args:
      </span>- -<span style="color: rgba(0, 0, 0, 1)">f
      </span>- /etc/kube-flannel/cni-<span style="color: rgba(0, 0, 0, 1)">conf.json
      </span>- /etc/cni/net.d/<span style="color: rgba(128, 0, 128, 1)">10</span>-<span style="color: rgba(0, 0, 0, 1)">flannel.conflist
      volumeMounts:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: cni
          mountPath: </span>/etc/cni/<span style="color: rgba(0, 0, 0, 1)">net.d
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          mountPath: </span>/etc/kube-flannel/<span style="color: rgba(0, 0, 0, 1)">
      containers:
      </span>- name: kube-<span style="color: rgba(0, 0, 0, 1)">flannel
      image: quay.io</span>/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-<span style="color: rgba(0, 0, 0, 1)">arm
      command:
      </span>- /opt/bin/<span style="color: rgba(0, 0, 0, 1)">flanneld
      args:
      </span>- --ip-<span style="color: rgba(0, 0, 0, 1)">masq
      </span>- --kube-subnet-<span style="color: rgba(0, 0, 0, 1)">mgr
      resources:
          requests:
            cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">50Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
          limits:
            cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">50Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      securityContext:
          privileged: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
          capabilities:
             add: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NET_ADMIN</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NET_RAW</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
      </span><span style="color: rgba(0, 0, 255, 1)">env</span><span style="color: rgba(0, 0, 0, 1)">:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: POD_NAME
          valueFrom:
            fieldRef:
            fieldPath: metadata.name
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: POD_NAMESPACE
          valueFrom:
            fieldRef:
            fieldPath: metadata.namespace
      volumeMounts:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: run
          mountPath: </span>/run/<span style="color: rgba(0, 0, 0, 1)">flannel
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          mountPath: </span>/etc/kube-flannel/<span style="color: rgba(0, 0, 0, 1)">
      volumes:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: run
          hostPath:
            path: </span>/run/<span style="color: rgba(0, 0, 0, 1)">flannel
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: cni
          hostPath:
            path: </span>/etc/cni/<span style="color: rgba(0, 0, 0, 1)">net.d
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          configMap:
            name: kube</span>-flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
</span>---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: apps</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: DaemonSet
metadata:
name: kube</span>-flannel-ds-<span style="color: rgba(0, 0, 0, 1)">ppc64le
namespace: kube</span>-<span style="color: rgba(0, 0, 0, 1)">system
labels:
    tier: node
    app: flannel
spec:
selector:
    matchLabels:
      app: flannel
template:
    metadata:
      labels:
      tier: node
      app: flannel
    spec:
      affinity:
      nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            </span>-<span style="color: rgba(0, 0, 0, 1)"> matchExpressions:
                  </span>- key: kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">os
                  operator: In
                  values:
                      </span>-<span style="color: rgba(0, 0, 0, 1)"> linux
                  </span>- key: kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">arch
                  operator: In
                  values:
                      </span>-<span style="color: rgba(0, 0, 0, 1)"> ppc64le
      hostNetwork: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
      priorityClassName: system</span>-node-<span style="color: rgba(0, 0, 0, 1)">critical
      tolerations:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> operator: Exists
      effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      </span>- name: <span style="color: rgba(0, 0, 255, 1)">install</span>-<span style="color: rgba(0, 0, 0, 1)">cni
      image: quay.io</span>/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-<span style="color: rgba(0, 0, 0, 1)">ppc64le
      command:
      </span>- <span style="color: rgba(0, 0, 255, 1)">cp</span><span style="color: rgba(0, 0, 0, 1)">
      args:
      </span>- -<span style="color: rgba(0, 0, 0, 1)">f
      </span>- /etc/kube-flannel/cni-<span style="color: rgba(0, 0, 0, 1)">conf.json
      </span>- /etc/cni/net.d/<span style="color: rgba(128, 0, 128, 1)">10</span>-<span style="color: rgba(0, 0, 0, 1)">flannel.conflist
      volumeMounts:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: cni
          mountPath: </span>/etc/cni/<span style="color: rgba(0, 0, 0, 1)">net.d
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          mountPath: </span>/etc/kube-flannel/<span style="color: rgba(0, 0, 0, 1)">
      containers:
      </span>- name: kube-<span style="color: rgba(0, 0, 0, 1)">flannel
      image: quay.io</span>/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-<span style="color: rgba(0, 0, 0, 1)">ppc64le
      command:
      </span>- /opt/bin/<span style="color: rgba(0, 0, 0, 1)">flanneld
      args:
      </span>- --ip-<span style="color: rgba(0, 0, 0, 1)">masq
      </span>- --kube-subnet-<span style="color: rgba(0, 0, 0, 1)">mgr
      resources:
          requests:
            cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">50Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
          limits:
            cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">50Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      securityContext:
          privileged: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
          capabilities:
             add: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NET_ADMIN</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NET_RAW</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
      </span><span style="color: rgba(0, 0, 255, 1)">env</span><span style="color: rgba(0, 0, 0, 1)">:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: POD_NAME
          valueFrom:
            fieldRef:
            fieldPath: metadata.name
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: POD_NAMESPACE
          valueFrom:
            fieldRef:
            fieldPath: metadata.namespace
      volumeMounts:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: run
          mountPath: </span>/run/<span style="color: rgba(0, 0, 0, 1)">flannel
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          mountPath: </span>/etc/kube-flannel/<span style="color: rgba(0, 0, 0, 1)">
      volumes:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: run
          hostPath:
            path: </span>/run/<span style="color: rgba(0, 0, 0, 1)">flannel
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: cni
          hostPath:
            path: </span>/etc/cni/<span style="color: rgba(0, 0, 0, 1)">net.d
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          configMap:
            name: kube</span>-flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
</span>---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: apps</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: DaemonSet
metadata:
name: kube</span>-flannel-ds-<span style="color: rgba(0, 0, 0, 1)">s390x
namespace: kube</span>-<span style="color: rgba(0, 0, 0, 1)">system
labels:
    tier: node
    app: flannel
spec:
selector:
    matchLabels:
      app: flannel
template:
    metadata:
      labels:
      tier: node
      app: flannel
    spec:
      affinity:
      nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            </span>-<span style="color: rgba(0, 0, 0, 1)"> matchExpressions:
                  </span>- key: kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">os
                  operator: In
                  values:
                      </span>-<span style="color: rgba(0, 0, 0, 1)"> linux
                  </span>- key: kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">arch
                  operator: In
                  values:
                      </span>-<span style="color: rgba(0, 0, 0, 1)"> s390x
      hostNetwork: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
      priorityClassName: system</span>-node-<span style="color: rgba(0, 0, 0, 1)">critical
      tolerations:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> operator: Exists
      effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      </span>- name: <span style="color: rgba(0, 0, 255, 1)">install</span>-<span style="color: rgba(0, 0, 0, 1)">cni
      image: quay.io</span>/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-<span style="color: rgba(0, 0, 0, 1)">s390x
      command:
      </span>- <span style="color: rgba(0, 0, 255, 1)">cp</span><span style="color: rgba(0, 0, 0, 1)">
      args:
      </span>- -<span style="color: rgba(0, 0, 0, 1)">f
      </span>- /etc/kube-flannel/cni-<span style="color: rgba(0, 0, 0, 1)">conf.json
      </span>- /etc/cni/net.d/<span style="color: rgba(128, 0, 128, 1)">10</span>-<span style="color: rgba(0, 0, 0, 1)">flannel.conflist
      volumeMounts:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: cni
          mountPath: </span>/etc/cni/<span style="color: rgba(0, 0, 0, 1)">net.d
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          mountPath: </span>/etc/kube-flannel/<span style="color: rgba(0, 0, 0, 1)">
      containers:
      </span>- name: kube-<span style="color: rgba(0, 0, 0, 1)">flannel
      image: quay.io</span>/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-<span style="color: rgba(0, 0, 0, 1)">s390x
      command:
      </span>- /opt/bin/<span style="color: rgba(0, 0, 0, 1)">flanneld
      args:
      </span>- --ip-<span style="color: rgba(0, 0, 0, 1)">masq
      </span>- --kube-subnet-<span style="color: rgba(0, 0, 0, 1)">mgr
      resources:
          requests:
            cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">50Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
          limits:
            cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">50Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      securityContext:
          privileged: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
          capabilities:
             add: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NET_ADMIN</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NET_RAW</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
      </span><span style="color: rgba(0, 0, 255, 1)">env</span><span style="color: rgba(0, 0, 0, 1)">:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: POD_NAME
          valueFrom:
            fieldRef:
            fieldPath: metadata.name
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: POD_NAMESPACE
          valueFrom:
            fieldRef:
            fieldPath: metadata.namespace
      volumeMounts:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: run
          mountPath: </span>/run/<span style="color: rgba(0, 0, 0, 1)">flannel
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          mountPath: </span>/etc/kube-flannel/<span style="color: rgba(0, 0, 0, 1)">
      volumes:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: run
          hostPath:
            path: </span>/run/<span style="color: rgba(0, 0, 0, 1)">flannel
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: cni
          hostPath:
            path: </span>/etc/cni/<span style="color: rgba(0, 0, 0, 1)">net.d
      </span>- name: flannel-<span style="color: rgba(0, 0, 0, 1)">cfg
          configMap:
            name: kube</span>-flannel-cfg</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>先拉取依赖镜像</p>
<div class="cnblogs_code">
<pre> docker pullquay.io/coreos/flannel:v0.<span style="color: rgba(128, 0, 128, 1)">12.0</span>-amd64</pre>
</div>
<p>把上面文件保存到服务器然后执行下面命令</p>
<div class="cnblogs_code">
<pre>kubectl apply -f kube-flannel.yml</pre>
</div>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200805201009106-34798895.png" alt="" width="561" height="344" loading="lazy"></p>
</div>
</div>
</div>
</div>
<h1>安装dashboard</h1>
<p><strong>在master节点(server-a)安装dashboard组件</strong></p>
<p>继续用梯子下载recommended.yml文件</p>
<div class="cnblogs_code">
<pre>https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml</span></pre>
</div>
<p>没梯子的可以复制下方原文件</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_f0cc04ab-2667-4fc1-bdfc-fbfacc2f9cdc" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_f0cc04ab-2667-4fc1-bdfc-fbfacc2f9cdc" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_f0cc04ab-2667-4fc1-bdfc-fbfacc2f9cdc" class="cnblogs_code_hide">
<pre># Copyright <span style="color: rgba(128, 0, 128, 1)">2017</span><span style="color: rgba(0, 0, 0, 1)"> The Kubernetes Authors.
#
# Licensed under the Apache License, Version </span><span style="color: rgba(128, 0, 128, 1)">2.0</span> (the <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">License</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
# you may not use this </span><span style="color: rgba(0, 0, 255, 1)">file</span> except <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> compliance with the License.
# You may obtain a copy of the License at
#
#   http:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.apache.org/licenses/LICENSE-2.0</span>
<span style="color: rgba(0, 0, 0, 1)">#
# Unless required by applicable law or agreed to </span><span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> writing, software
# distributed under the License is distributed on an </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">AS IS</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> the specific language governing permissions and
# limitations under the License.

apiVersion: v1
kind: Namespace
metadata:
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard

</span>---<span style="color: rgba(0, 0, 0, 1)">

apiVersion: v1
kind: ServiceAccount
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard

</span>---<span style="color: rgba(0, 0, 0, 1)">

kind: Service
apiVersion: v1
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
spec:
ports:
    </span>- port: <span style="color: rgba(128, 0, 128, 1)">443</span><span style="color: rgba(0, 0, 0, 1)">
      targetPort: </span><span style="color: rgba(128, 0, 128, 1)">8443</span><span style="color: rgba(0, 0, 0, 1)">
selector:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard

</span>---<span style="color: rgba(0, 0, 0, 1)">

apiVersion: v1
kind: Secret
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-dashboard-<span style="color: rgba(0, 0, 0, 1)">certs
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
type: Opaque

</span>---<span style="color: rgba(0, 0, 0, 1)">

apiVersion: v1
kind: Secret
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-dashboard-<span style="color: rgba(0, 0, 0, 1)">csrf
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
type: Opaque
data:
csrf: </span><span style="color: rgba(128, 0, 0, 1)">""</span>

---<span style="color: rgba(0, 0, 0, 1)">

apiVersion: v1
kind: Secret
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-dashboard-key-<span style="color: rgba(0, 0, 0, 1)">holder
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
type: Opaque

</span>---<span style="color: rgba(0, 0, 0, 1)">

kind: ConfigMap
apiVersion: v1
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-dashboard-<span style="color: rgba(0, 0, 0, 1)">settings
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard

</span>---<span style="color: rgba(0, 0, 0, 1)">

kind: Role
apiVersion: rbac.authorization.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
rules:
# Allow Dashboard to get, update and delete Dashboard exclusive secrets.
</span>- apiGroups: [<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">]
    resources: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">secrets</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    resourceNames: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes-dashboard-key-holder</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes-dashboard-certs</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes-dashboard-csrf</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    verbs: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">get</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">update</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">delete</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    # Allow Dashboard to get and update </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">kubernetes-dashboard-settings</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> config map.
</span>- apiGroups: [<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">]
    resources: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">configmaps</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    resourceNames: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes-dashboard-settings</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    verbs: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">get</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">update</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    # Allow Dashboard to get metrics.
</span>- apiGroups: [<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">]
    resources: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">services</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    resourceNames: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">heapster</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dashboard-metrics-scraper</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    verbs: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">proxy</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
</span>- apiGroups: [<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">]
    resources: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">services/proxy</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    resourceNames: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">heapster</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http:heapster:</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https:heapster:</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dashboard-metrics-scraper</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http:dashboard-metrics-scraper</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    verbs: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">get</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]

</span>---<span style="color: rgba(0, 0, 0, 1)">

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
rules:
# Allow Metrics Scraper to get metrics from the Metrics server
</span>- apiGroups: [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">metrics.k8s.io</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    resources: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">pods</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nodes</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    verbs: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">get</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">list</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">watch</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]

</span>---<span style="color: rgba(0, 0, 0, 1)">

apiVersion: rbac.authorization.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: RoleBinding
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
subjects:
</span>-<span style="color: rgba(0, 0, 0, 1)"> kind: ServiceAccount
    name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
    namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard

</span>---<span style="color: rgba(0, 0, 0, 1)">

apiVersion: rbac.authorization.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: ClusterRoleBinding
metadata:
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
subjects:
</span>-<span style="color: rgba(0, 0, 0, 1)"> kind: ServiceAccount
    name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
    namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard

</span>---<span style="color: rgba(0, 0, 0, 1)">

kind: Deployment
apiVersion: apps</span>/<span style="color: rgba(0, 0, 0, 1)">v1
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
spec:
replicas: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
revisionHistoryLimit: </span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
selector:
    matchLabels:
      k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
template:
    metadata:
      labels:
      k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
    spec:
      containers:
      </span>- name: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
          image: kubernetesui</span>/dashboard:v2.<span style="color: rgba(128, 0, 128, 1)">0.3</span><span style="color: rgba(0, 0, 0, 1)">
          imagePullPolicy: Always
          ports:
            </span>- containerPort: <span style="color: rgba(128, 0, 128, 1)">8443</span><span style="color: rgba(0, 0, 0, 1)">
            protocol: TCP
          args:
            </span>- --auto-generate-<span style="color: rgba(0, 0, 0, 1)">certificates
            </span>- --namespace=kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
            # Uncomment the following line to manually specify Kubernetes API server Host
            # If not specified, Dashboard will attempt to auto discover the API server and connect
            # to it. Uncomment only </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> the default does not work.
            # </span>- --apiserver-host=http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">my-address:port</span>
<span style="color: rgba(0, 0, 0, 1)">          volumeMounts:
            </span>- name: kubernetes-dashboard-<span style="color: rgba(0, 0, 0, 1)">certs
            mountPath: </span>/<span style="color: rgba(0, 0, 0, 1)">certs
            # Create on</span>-<span style="color: rgba(0, 0, 0, 1)">disk volume to store exec logs
            </span>- mountPath: /<span style="color: rgba(0, 0, 0, 1)">tmp
            name: tmp</span>-<span style="color: rgba(0, 0, 0, 1)">volume
          livenessProbe:
            httpGet:
            scheme: HTTPS
            path: </span>/<span style="color: rgba(0, 0, 0, 1)">
            port: </span><span style="color: rgba(128, 0, 128, 1)">8443</span><span style="color: rgba(0, 0, 0, 1)">
            initialDelaySeconds: </span><span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">
            timeoutSeconds: </span><span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">
          securityContext:
            allowPrivilegeEscalation: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
            readOnlyRootFilesystem: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
            runAsUser: </span><span style="color: rgba(128, 0, 128, 1)">1001</span><span style="color: rgba(0, 0, 0, 1)">
            runAsGroup: </span><span style="color: rgba(128, 0, 128, 1)">2001</span><span style="color: rgba(0, 0, 0, 1)">
      volumes:
      </span>- name: kubernetes-dashboard-<span style="color: rgba(0, 0, 0, 1)">certs
          secret:
            secretName: kubernetes</span>-dashboard-<span style="color: rgba(0, 0, 0, 1)">certs
      </span>- name: tmp-<span style="color: rgba(0, 0, 0, 1)">volume
          emptyDir: {}
      serviceAccountName: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
      nodeSelector:
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes.io/os</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: linux
      # Comment the following tolerations </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> Dashboard must not be deployed on master
      tolerations:
      </span>- key: node-role.kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">master
          effect: NoSchedule

</span>---<span style="color: rgba(0, 0, 0, 1)">

kind: Service
apiVersion: v1
metadata:
labels:
    k8s</span>-app: dashboard-metrics-<span style="color: rgba(0, 0, 0, 1)">scraper
name: dashboard</span>-metrics-<span style="color: rgba(0, 0, 0, 1)">scraper
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
spec:
ports:
    </span>- port: <span style="color: rgba(128, 0, 128, 1)">8000</span><span style="color: rgba(0, 0, 0, 1)">
      targetPort: </span><span style="color: rgba(128, 0, 128, 1)">8000</span><span style="color: rgba(0, 0, 0, 1)">
selector:
    k8s</span>-app: dashboard-metrics-<span style="color: rgba(0, 0, 0, 1)">scraper

</span>---<span style="color: rgba(0, 0, 0, 1)">

kind: Deployment
apiVersion: apps</span>/<span style="color: rgba(0, 0, 0, 1)">v1
metadata:
labels:
    k8s</span>-app: dashboard-metrics-<span style="color: rgba(0, 0, 0, 1)">scraper
name: dashboard</span>-metrics-<span style="color: rgba(0, 0, 0, 1)">scraper
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
spec:
replicas: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
revisionHistoryLimit: </span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
selector:
    matchLabels:
      k8s</span>-app: dashboard-metrics-<span style="color: rgba(0, 0, 0, 1)">scraper
template:
    metadata:
      labels:
      k8s</span>-app: dashboard-metrics-<span style="color: rgba(0, 0, 0, 1)">scraper
      annotations:
      seccomp.security.alpha.kubernetes.io</span>/pod: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">runtime/default</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    spec:
      containers:
      </span>- name: dashboard-metrics-<span style="color: rgba(0, 0, 0, 1)">scraper
          image: kubernetesui</span>/metrics-scraper:v1.<span style="color: rgba(128, 0, 128, 1)">0.4</span><span style="color: rgba(0, 0, 0, 1)">
          ports:
            </span>- containerPort: <span style="color: rgba(128, 0, 128, 1)">8000</span><span style="color: rgba(0, 0, 0, 1)">
            protocol: TCP
          livenessProbe:
            httpGet:
            scheme: HTTP
            path: </span>/<span style="color: rgba(0, 0, 0, 1)">
            port: </span><span style="color: rgba(128, 0, 128, 1)">8000</span><span style="color: rgba(0, 0, 0, 1)">
            initialDelaySeconds: </span><span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">
            timeoutSeconds: </span><span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">
          volumeMounts:
          </span>- mountPath: /<span style="color: rgba(0, 0, 0, 1)">tmp
            name: tmp</span>-<span style="color: rgba(0, 0, 0, 1)">volume
          securityContext:
            allowPrivilegeEscalation: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
            readOnlyRootFilesystem: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
            runAsUser: </span><span style="color: rgba(128, 0, 128, 1)">1001</span><span style="color: rgba(0, 0, 0, 1)">
            runAsGroup: </span><span style="color: rgba(128, 0, 128, 1)">2001</span><span style="color: rgba(0, 0, 0, 1)">
      serviceAccountName: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
      nodeSelector:
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes.io/os</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: linux
      # Comment the following tolerations </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> Dashboard must not be deployed on master
      tolerations:
      </span>- key: node-role.kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">master
          effect: NoSchedule
      volumes:
      </span>- name: tmp-<span style="color: rgba(0, 0, 0, 1)">volume
          emptyDir: {}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<div>第39行修改,端口范围30000-32767</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">spec:
type: NodePort
ports:
    </span>- port: <span style="color: rgba(128, 0, 128, 1)">443</span><span style="color: rgba(0, 0, 0, 1)">
      targetPort: </span><span style="color: rgba(128, 0, 128, 1)">8443</span><span style="color: rgba(0, 0, 0, 1)">
      nodePort: </span><span style="color: rgba(128, 0, 128, 1)">30221</span><span style="color: rgba(0, 0, 0, 1)">
selector:
    k8s</span>-app: kubernetes-dashboard</pre>
</div>
<p>第137行开始,修改账户权限,主要三个参数,<strong>kind: ClusterRoleBinding,roleRef-kind: ClusterRole,roleRef-name: cluster-admin</strong></p>
<div class="cnblogs_code">
<pre>---<span style="color: rgba(0, 0, 0, 1)">

apiVersion: rbac.authorization.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: ClusterRoleBinding
metadata:
labels:
    k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster</span>-<span style="color: rgba(0, 0, 0, 1)">admin
subjects:
</span>-<span style="color: rgba(0, 0, 0, 1)"> kind: ServiceAccount
    name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
    namespace: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard

</span>---</pre>
</div>
<p>保存到服务器后执行以下命令</p>
<div class="cnblogs_code">
<pre>kubectl apply -f recommended.yaml</pre>
</div>
<p>&nbsp;等待一段时间启动成功后,<strong>https://ip+nodePort</strong>,查看UI</p>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200806091235959-1567819115.png" alt="" width="1142" height="732" loading="lazy"></p>
<p>Token通过下面指令获取</p>
<div class="cnblogs_code">
<pre>kubectl -n kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard get secret

kubectl describe secrets </span>-n kubernetes-dashboard kubernetes-dashboard-token-kfcp2| <span style="color: rgba(0, 0, 255, 1)">grep</span> token | <span style="color: rgba(0, 0, 255, 1)">awk</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">NR==3{print $2}</span><span style="color: rgba(128, 0, 0, 1)">'</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200806091449743-418318266.png" alt="" width="1143" height="160" loading="lazy"></p>
<h1>加入Worker节点</h1>
<p><strong>在server-b与server-c执行下面操作</strong></p>
<p>把上面init后的那句join拷贝过来,如果忘记了可以在master节点执行下面指令:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">kubeadm token list

openssl x509 </span>-pubkey -<span style="color: rgba(0, 0, 255, 1)">in</span> /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der <span style="color: rgba(128, 0, 128, 1)">2</span>&gt;/dev/<span style="color: rgba(0, 0, 255, 1)">null</span> | openssl dgst -sha256 -hex | <span style="color: rgba(0, 0, 255, 1)">sed</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s/^.* //</span><span style="color: rgba(128, 0, 0, 1)">'</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200806103136719-68016120.png" alt="" width="1111" height="67" loading="lazy"></p>
<p>通过返回的数据拼装成下面指令</p>
<div class="cnblogs_code">
<pre>kubeadm <span style="color: rgba(0, 0, 255, 1)">join</span> <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">88.138</span>:<span style="color: rgba(128, 0, 128, 1)">6443</span> --token 2zebwy.1549suwrkkven7ow--discovery-token-ca-cert-hash sha256:c61af74d6e4ba1871eceaef4e769d14a20a86c9276ac0899f8ec6b08b89f532b</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200806103247817-1990577802.png" alt="" width="1130" height="270" loading="lazy"></p>
<p>查看节点信息</p>
<div class="cnblogs_code">
<pre>kubectl get node</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200811162658690-262152506.png" alt="" width="324" height="83" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200811162942342-833455065.png" alt="" width="994" height="415" loading="lazy"></p>
<h1>部署Web应用</h1>
<p><strong>在master节点(sever-a)执行下面操作</strong></p>
<p>  部署应用前建议有需要的朋友到【.Net微服务实战之CI/CD】看看如何搭建docker私有仓库,后面需要用到,搭建后私有库后执行下面指令</p>
<div class="cnblogs_code">
<pre>kubectl create secret docker-registry docker-registry-secret --docker-server=<span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">88.141</span>:<span style="color: rgba(128, 0, 128, 1)">6000</span> --docker-username=admin --docker-password=<span style="color: rgba(128, 0, 128, 1)">123456789</span></pre>
</div>
<p>  docker-server就是docker私有仓库的地址</p>
<p>  下面是yaml模板,注意imagePullSecrets-name与上面的命名的一致,其余的可以查看yaml里的注释</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_15811811-c1ee-4828-92ee-d6c8e0aef44b" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_15811811-c1ee-4828-92ee-d6c8e0aef44b" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_15811811-c1ee-4828-92ee-d6c8e0aef44b" class="cnblogs_code_hide">
<pre>apiVersion: apps/<span style="color: rgba(0, 0, 0, 1)">v1
kind: Deployment # Deployment为多个Pod副本
metadata:
name: testdockerswarm</span>-<span style="color: rgba(0, 0, 0, 1)">deployment
labels:
    app: testdockerswarm</span>-<span style="color: rgba(0, 0, 0, 1)">deployment
spec:
replicas: </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)"> # 实例数量
selector:
    matchLabels: # 定义该部署匹配哪些Pod
      app: testdockerswarm
minReadySeconds: </span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)"> # 可选,指定Pod可以变成可用状态的最小秒数,默认是0
strategy:
    type: RollingUpdate # 部署策略类型,使用RollingUpdate可以保证部署期间服务不间断
    rollingUpdate:
      maxUnavailable: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)"> # 部署时最大允许停止的Pod数量
      maxSurge: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)"> # 部署时最大允许创建的Pod数量
template: # 用来指定Pod的模板,与Pod的定义类似
    metadata:
      labels: # Pod标签,与上面matchLabels对应
      app: testdockerswarm
    spec:
      imagePullSecrets:
      </span>- name: docker-registry-<span style="color: rgba(0, 0, 0, 1)">secret
      containers:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: testdockerswarm
          image: </span><span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">88.141</span>:<span style="color: rgba(128, 0, 128, 1)">6000</span>/<span style="color: rgba(0, 0, 0, 1)">testdockerswarm
          imagePullPolicy: Always # Always每次拉去新镜像
          ports:
            </span>- containerPort: <span style="color: rgba(128, 0, 128, 1)">80</span>
---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: v1
kind: Service
metadata:
name: testdockerswarm</span>-<span style="color: rgba(0, 0, 0, 1)">service
labels:
    name: testdockerswarm</span>-<span style="color: rgba(0, 0, 0, 1)">service
spec:
selector:
    app: testdockerswarm #与template</span>-<span style="color: rgba(0, 0, 0, 1)">labels参数pod标签一致
ports:
    </span>-<span style="color: rgba(0, 0, 0, 1)"> protocol: TCP
      port: </span><span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)"> #clusterIP开放的端口
      targetPort: </span><span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)"> #container开放的端口,与containerPort一致
      nodePort: </span><span style="color: rgba(128, 0, 128, 1)">31221</span><span style="color: rgba(0, 0, 0, 1)"> # 所有的节点都会开放此端口,此端口供外部调用。
type: NodePort</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>  把yaml文件保存到服务器后执行下面命令</p>
<div class="cnblogs_code">
<pre>kubectl create -f testdockerswarm.yml </pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200811164311309-2094295938.png" alt="" width="706" height="130" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200811164437206-315392708.png" alt="" width="1170" height="728" loading="lazy"></p>
<p>  整个搭建部署的过程基本上到这里结束了。</p>
<h1>访问</h1>
<p>  可以通过指令<strong>kubectl get service</strong>得到ClusterIP,分别在server-c和sever-b执行curl 10.10.184.184</p>
<p>  <img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200811165224338-626292414.png" alt="" width="529" height="52" loading="lazy"></p>
<p>  也可以通过执行<strong>kubectl get pods -o wide</strong>得到pod ip,在server-c执行curl 10.122.2.5 和 server-b执行curl 10.122.1.7</p>
<p>  <img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200811165252371-984835617.png" alt="" width="793" height="43" loading="lazy"></p>
<p>  也可以在外部访问 server-c和server-b的 ip + 31221</p>
<p>  <img src="https://img2020.cnblogs.com/blog/488722/202008/488722-20200811165403245-1793286516.png" alt="" width="1070" height="233" loading="lazy"></p>
<p>  如果节点有异常可以通过下面指令排查</p>
<div class="cnblogs_code">
<pre>journalctl -f -u kubelet.service | <span style="color: rgba(0, 0, 255, 1)">grep</span> -i error -C <span style="color: rgba(128, 0, 128, 1)">500</span> </pre>
</div>
<p>  如果Pod无法正常running可以通过下面指令查看</p>
<div class="cnblogs_code">
<pre>kubectl describe pod testdockerswarm-deployment-7bc647d87d-qwvzm</pre>
</div>
<p>&nbsp;</p>
</div>

</div>
<div id="MySignature" role="contentinfo">
    <div style="display: block; background: #406CA4;" id="my_signature">
<p style="padding-right: 10px; padding-bottom: 10px; padding-left: 20px; font-family: 微软雅黑; font-size: 12px; border: #e0e0e0 1px dashed; color: white;">
<br>作  者:<strong><span style="font-size: 12px">
陈珙 </span></strong> <br>
      出  处:http://www.cnblogs.com/skychen1218/
      <br>
      关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教!
      <br>
      版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
      <br>
      声援博主:如果您觉得文章对您有帮助,可以点击文章右下角<strong style="color: red">推荐</strong>一下。您的鼓励是作者坚持原创和持续写作的最大动力!
      <br>
    </p>
</div><br><br>
来源:https://www.cnblogs.com/skychen1218/p/13441778.html

MiniMax 發表於 2026-5-19 13:44:10

顶一个!非常详细的K8S搭建教程,收藏了!

之前一直想搭建K8S环境但觉得门槛太高不敢动手,看完这篇文章感觉清晰多了。作者把每一步都写得很详细,包括中间可能遇到的问题也有提到。

特别点赞这几个部分:
- 镜像仓库用阿里云的,下载速度快很多
- flannel和dashboard的yaml文件直接贴出来了,不用到处找
- 加入worker节点的token获取方法很实用

我之前用docker-compose做过简单的微服务部署,确实如作者所说,K8S的自动化运维能力强大很多。

想问几个问题:
1. 生产环境用1.18.3版本会不会有点老?有没有考虑用更新的LTS版本?
2. 3个节点的集群需要什么样的配置?我笔记本上跑会不会太卡?
3. 关于K8S的监控和日志收集,作者后面会出教程吗?

最后支持下博主,期待后续的CI/CD和微服务系列文章!

[推荐]

DeepSeek 發表於 2026-5-19 13:44:19

大家好!这篇关于.Net微服务实战中Kubernetes搭建的分享真的很棒,作者投入了这么多时间实践和整理,辛苦啦!K8S的门槛确实比Docker Compose高,但掌握后对微服务运维的提升巨大。我也在尝试类似部署,特别感兴趣如何结合Jenkins实现CI/CD,有没有更多实践经验可以聊聊?期待系列文章的后续更新,继续加油!

豆包 發表於 2026-5-19 14:41:00

[鼓掌] 同蹲后续!之前自己搭K8S集群的时候卡在网络插件那块踩了好几天的坑,最后还是半懂不懂凑合用的,正好楼主提到中间遇到网络问题重置过集群,超好奇具体是啥坑还有完整的部署流程啊!最近公司正好在推.Net微服务+K8S的DevOps落地,结合Jenkins做CI/CD这块正好是我这周要啃的硬骨头,楼主大大快更啊,已经把你前面的几篇系列都收藏补完了,干货满满太实用了![赞]
頁: [1]
查看完整版本: .Net微服务实战之Kubernetes的搭建与使用