詹德江 發表於 2021-9-1 11:16:00

Kubernetes集群部署笔记

<blockquote>
<p>本作品由Galen Suen采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。由原作者转载自个人站点。</p>
</blockquote>
<h2 id="更新记录">更新记录</h2>
<ul>
<li>
<p><code>2021-09-04</code></p>
<ol>
<li>服务器操作系统由<code>Debian 10 ("buster")</code>更新至<code>Debian 11 ("bullseye")</code>;</li>
<li>使用<code>kube-router</code>代替<code>kube-proxy</code>和<code>flannel</code>实现<code>Service Proxy</code>和<code>Pod Network</code>;</li>
<li>修复一些代码错误;</li>
</ol>
</li>
<li>
<p><code>2021-09-08</code></p>
<ol>
<li>部署<code>kube-router</code>时添加运行参数<code>--advertise-loadbalancer-ip=true</code>;</li>
</ol>
</li>
<li>
<p><code>2021-09-18</code></p>
<ol>
<li><code>Kubernetes</code>版本由<code>v1.22.1</code>更新至<code>v1.22.2</code>;</li>
</ol>
</li>
</ul>
<h2 id="概述">概述</h2>
<p>本文用于整理基于Debian操作系统使用kubeadm工具部署Kubernetes集群的操作过程。该集群部署于一组本地虚拟服务器上,用于学习<code>Kubernetes</code>的基础概念和基本操作,并作为今后其他学习内容的实践部署提供环境。</p>
<p>考虑到不同的网络环境,本文中一些步骤会记录两种操作方式,通过镜像等方式加快部署效率、避免部署错误。有关镜像同步的方案,可参考附件内容中的同步所需镜像。</p>
<p>随着操作系统和各相关组件版本的更新,笔者将在验证通过后对本文进行补充和更新。</p>
<h3 id="服务器">服务器</h3>
<p>受限于本地物理服务器的配置,虚拟服务器配置规划如下表。</p>
<table>
<thead>
<tr>
<th>Host</th>
<th>OS</th>
<th>IP</th>
<th>CPU</th>
<th>RAM</th>
<th>K8s</th>
<th>Roles</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>k8s-n0</code></td>
<td>Debian 11.0</td>
<td><code>10.0.0.50</code></td>
<td>2 vCPUs</td>
<td>4 GB</td>
<td>v1.22.2</td>
<td><code>control-plane</code>, <code>master</code></td>
</tr>
<tr>
<td><code>k8s-n1</code></td>
<td>Debian 11.0</td>
<td><code>10.0.0.51</code></td>
<td>4 vCPUs</td>
<td>8 GB</td>
<td>v1.22.2</td>
<td></td>
</tr>
<tr>
<td><code>k8s-n2</code></td>
<td>Debian 11.0</td>
<td><code>10.0.0.52</code></td>
<td>4 vCPUs</td>
<td>8 GB</td>
<td>v1.22.2</td>
<td></td>
</tr>
<tr>
<td><code>k8s-n3</code></td>
<td>Debian 11.0</td>
<td><code>10.0.0.53</code></td>
<td>4 vCPUs</td>
<td>8 GB</td>
<td>v1.22.2</td>
<td></td>
</tr>
</tbody>
</table>
<p>所有虚拟服务器CPU均为<code>amd64</code>架构。</p>
<p><s>截止本文发布时,笔者基于最新Debian 11 (<em>"bullseye"</em>)部署的集群仍然存在一些问题,故暂且发布基于Debian 10 (<em>"buster"</em>)的笔记。</s></p>
<h3 id="网络环境">网络环境</h3>
<p>本地网络IP地址范围为<code>10.0.0.0/24</code>,其中:</p>
<ul>
<li><code>10.0.0.2</code>-<code>10.0.0.99</code>为静态分配,供虚拟服务器使用</li>
<li><code>10.0.0.100</code>-<code>10.0.0.200</code>用于<code>DHCP</code>自动分配</li>
<li><code>10.0.0.201</code>-<code>10.0.0.254</code>为静态分配,供负载均衡器使用</li>
</ul>
<h3 id="其他组件">其他组件</h3>
<ul>
<li>
<p>容器运行时<br>
containerd v1.4.9</p>
</li>
<li>
<p>Pod网络组件<br>
<s>flannel v0.14.0</s><br>
kube-router v1.3.1</p>
</li>
<li>
<p>负载均衡器<br>
metallb v0.10.2</p>
</li>
<li>
<p>持久卷供应<br>
local-path-provisioner v0.0.20</p>
</li>
</ul>
<h2 id="准备工作">准备工作</h2>
<h3 id="服务器配置">服务器配置</h3>
<p>本文假设服务器硬件和操作系统已经配置完毕,所有服务器上都已经正确配置了<code>ssh</code>服务和<code>sudo</code>权限。</p>
<p>作为参考,这里记录笔者配置<code>sudo</code>权限和<code>ssh</code>服务的过程。</p>
<ul>
<li>
<p>配置<code>sudo</code>权限</p>
<p>如操作人员的登录用户已经被正确配置了sudo权限,可跳过此步骤。</p>
<p>本示例中,操作人员的登录用户名为<code>tiscs</code>,需要实际环境情况进行替换。</p>
<pre><code class="language-sh"># 使用root用户登录系统
# 安装sudo,并配置sudo权限
apt update
apt install sudo
echo "tiscs ALL=(ALL) NOPASSWD: ALL" | tee /etc/sudoers.d/tiscs # 这在生产环境绝不是个好主意,仅仅是为了演练环境操作方便
</code></pre>
</li>
<li>
<p>配置<code>ssh</code>服务</p>
<pre><code class="language-sh"># 安装openssh-server,并配置ssh服务为自动启动
sudo apt update
sudo apt install openssh-server
sudo systemctl enable ssh --now
</code></pre>
</li>
</ul>
<h2 id="配置过程">配置过程</h2>
<h3 id="安装容器运行时">安装容器运行时</h3>
<p>本文配置的集群选择containerd作为容器运行时。</p>
<p>在所有节点上执行如下操作。</p>
<ul>
<li>
<p>配置模块加载</p>
<pre><code class="language-sh">cat &lt;&lt;EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter
</code></pre>
</li>
<li>
<p>配置<code>sysctl</code>参数</p>
<pre><code class="language-sh">cat &lt;&lt;EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables= 1
net.ipv4.ip_forward               = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system
</code></pre>
</li>
<li>
<p>配置APT源</p>
<pre><code class="language-sh"># 安装依赖项
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
</code></pre>
<pre><code class="language-sh"># 根据网络环境选择官方源或镜像源

# 1. 配置Docker官方源
curl -fsSL https://download.docker.com/linux/debian/gpg \
| sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg
echo "deb https://download.docker.com/linux/debian $(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null

# 2. 配置Aliyun镜像源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg \
| sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg
echo "deb https://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null
</code></pre>
</li>
<li>
<p>安装containerd</p>
<pre><code class="language-sh">sudo apt update
sudo apt install -y containerd.io
</code></pre>
</li>
<li>
<p>初始化配置</p>
<pre><code class="language-sh">sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
</code></pre>
<pre><code class="language-sh"># 配置systemd cgroup驱动
sudo sed -i 's|\(\s\+\)\|\1\\n\1SystemdCgroup = true|g' /etc/containerd/config.toml
</code></pre>
<pre><code class="language-sh"># (可选)配置阿里云容器镜像源
sudo sed -i 's/registry-1.docker.io/xrb7j2ja.mirror.aliyuncs.com/g' /etc/containerd/config.toml
# (可选)配置sandbox image地址
# 为了方便,这里配置为与kubelet所需相同的版本(可以使用kubeadm config images list命令查看)
sudo sed -i 's|k8s.gcr.io/pause:.\+|registry.cn-beijing.aliyuncs.com/choral-k8s/pause:3.5|g' /etc/containerd/config.toml
</code></pre>
<pre><code class="language-sh"># 重启containerd服务,使上述配置修改生效
sudo systemctl restart containerd
</code></pre>
</li>
</ul>
<h3 id="安装kubeadm">安装kubeadm</h3>
<p>在所有节点上执行如下操作。</p>
<ul>
<li>
<p>配置APT源</p>
<pre><code class="language-sh"># 根据网络环境选择官方源或镜像源

# 1. 使用Google官方源
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg \
| sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-archive-keyring.gpg
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" \
| sudo tee /etc/apt/sources.list.d/kubernetes.list

# 2. 使用Aliyun镜像源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg \
| sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-archive-keyring.gpg
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" \
| sudo tee /etc/apt/sources.list.d/kubernetes.list
</code></pre>
</li>
<li>
<p>安装<code>kubeadm</code>、<code>kubelet</code>和<code>kubectl</code></p>
<pre><code class="language-sh">sudo apt install -y kubelet=1.22.2-00 kubeadm=1.22.2-00 kubectl=1.22.2-00
sudo apt-mark hold kubelet kubeadm kubectl
</code></pre>
</li>
<li>
<p>安装并配置<code>crictl</code>(可选)</p>
<p>可以安装并配置<code>crictl</code>,便于在<code>k8s</code>节点上管理容器运行时。</p>
<pre><code class="language-sh"># 安装crictl工具
sudo apt install -y cri-tools

# 配置crictl使用containerd运行时
cat &lt;&lt;EOF | sudo tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

# 验证crictl配置
sudo crictl images # 列出所有镜像
</code></pre>
</li>
</ul>
<h3 id="配置控制平面节点">配置控制平面节点</h3>
<p>在<code>k8s-n0</code>节点上执行如下操作。</p>
<ul>
<li>
<p>预先下载所需镜像</p>
<pre><code class="language-sh"># 查看所需的镜像列表
kubeadm config images list --kubernetes-version=v1.22.2 # --image-repository registry.cn-beijing.aliyuncs.com/choral-k8s

# 1. 使用默认容器镜像仓库
sudo kubeadm config images pull --kubernetes-version=v1.22.2

# 2. 使用自建容器镜像仓库
sudo kubeadm config images pull --kubernetes-version=v1.22.2 \
--image-repository registry.cn-beijing.aliyuncs.com/choral-k8s
</code></pre>
</li>
<li>
<p>初始化控制平面节点</p>
<pre><code class="language-sh"># --apiserver-advertise-address: 当前节点IP地址
# --pod-network-cidr         : Pod网络地址段(CIDR: https://datatracker.ietf.org/doc/html/rfc4632)

# 1. 使用默认容器镜像仓库
sudo kubeadm init --apiserver-advertise-address 10.0.0.50 \
--pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.2 \
--skip-phases=addon/kube-proxy

# 2. 使用自建容器镜像仓库
sudo kubeadm init --apiserver-advertise-address 10.0.0.50 \
--pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.2 \
--image-repository registry.cn-beijing.aliyuncs.com/choral-k8s \
--skip-phases=addon/kube-proxy
</code></pre>
<p>执行完上述操作后,<code>kubeadm init</code>命令会输出用于添加节点到集群中的说明,请保存该说明中的内容。示例如下:</p>
<pre><code class="language-sh">sudo kubeadm join 10.0.0.50:6443 \
--token vafq03.5dl6j1cbcd1yzf3c \
--discovery-token-ca-cert-hash sha256:6a725d98e0f6bda713c9f93b8441a735cc60e8ec7454fbe960c74ab80683f938
</code></pre>
</li>
<li>
<p>添加kubectl配置(可选)</p>
<pre><code class="language-sh">mkdir -p ~/.kube
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
</code></pre>
</li>
</ul>
<h3 id="安装网络组件">安装网络组件</h3>
<ul>
<li>
<p><s>安装<code>flannel</code></s>(已废弃,使用<code>kube-router</code>代替)</p>
<pre><code class="language-sh"># 1. 使用默认镜像仓库(quay.io/coreos)安装
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 2 如果访问raw.githubusercontent.com上的文件存在网络问题
#   可以使用jsdelivr提供的GitHub CDN地址(https://www.jsdelivr.com/github)
kubectl apply -f https://cdn.jsdelivr.net/gh/coreos/flannel@master/Documentation/kube-flannel.yml
</code></pre>
</li>
<li>
<p>安装<code>kube-router</code></p>
<pre><code class="language-sh">curl -s https://cdn.jsdelivr.net/gh/cloudnativelabs/kube-router@master/daemonset/generic-kuberouter-all-features.yaml \
| sed \
    -e "s|%APISERVER%|$(kubectl get cm -n kube-public -o yaml cluster-info | sed -n 's/^ \+server: \(.\+\)/\1/p')|g" \
    -e "s|%CLUSTERCIDR%|$(kubectl get cm -n kube-system -o yaml kubeadm-config | sed -n 's/^ \+podSubnet: \(.\+\)/\1/p')|g" \
    -e "s|\(\s\+\)args:|\1args:\n\1- \"--advertise-loadbalancer-ip=true\"|g" \
| kubectl apply -f -
</code></pre>
</li>
</ul>
<h3 id="添加工作节点">添加工作节点</h3>
<p>在<code>k8s-n1</code>、<code>k8s-n2</code>和<code>k8s-n3</code>节点上执行如下操作。该操作中需要的token值和hash值通过上述步骤中的<code>kubeadm init</code>操作获取。</p>
<ul>
<li>
<p>添加工作节点</p>
<pre><code class="language-sh">sudo kubeadm join 10.0.0.50:6443 \
--token vafq03.5dl6j1cbcd1yzf3c \
--discovery-token-ca-cert-hash sha256:6a725d98e0f6bda713c9f93b8441a735cc60e8ec7454fbe960c74ab80683f938
</code></pre>
</li>
<li>
<p>查看节点状态</p>
<p>在<code>k8s-n0</code>节点上执行如下操作。</p>
<pre><code class="language-sh">kubectl get nodes
kubectl top nodes
</code></pre>
</li>
</ul>
<h3 id="安装helm工具可选">安装Helm工具(可选)</h3>
<p>本文暂不涉及使用<code>helm</code>执行的操作,该步骤可选。</p>
<ul>
<li>
<p>安装Helm工具</p>
<pre><code class="language-sh"># 下载并安装
curl -sL https://get.helm.sh/helm-v3.6.3-linux-amd64.tar.gz | tar xzf - linux-amd64/helm
sudo cp ./linux-amd64/helm /usr/local/bin/helm
rm -rf ./linux-amd64
sudo chown root:root /usr/local/bin/helm
sudo chmod 755 /usr/local/bin/helm

# 验证helm安装
helm version
</code></pre>
</li>
</ul>
<h3 id="安装metrics-server可选">安装Metrics Server(可选)</h3>
<p>部署<code>metrics server</code>以启用指标服务,未安装<code>metrics server</code>前,<code>kubectl top</code>命令无法正常执行。</p>
<p>在<code>k8s-n0</code>节点上执行如下操作。</p>
<ul>
<li>
<p>执行清单文件</p>
<p>这里需要注意,为解决证书错误,需要添加<code>metrics-server</code>容器的参数<code>--kubelet-insecure-tls</code>,这里选择通过<code>sed</code>命令修改清单文件后再使用<code>kubectl</code>执行。</p>
<pre><code class="language-sh"># 1. 使用官方镜像地址直接安装
curl -sL https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml \
| sed -e "s|\(\s\+\)- args:|\1- args:\n\1- --kubelet-insecure-tls|" | kubectl apply -f -
#   1.1 为避免特殊网络环境中的清单文件加载问题,可以使用FastGit提供的加速方案
curl -sL https://endpoint.fastgit.org/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml \
| sed -e "s|\(\s\+\)- args:|\1- args:\n\1- --kubelet-insecure-tls|" | kubectl apply -f -

# 2. 使用自定义镜像地址安装
curl -sL https://endpoint.fastgit.org/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml \
| sed \
    -e "s|\(\s\+\)- args:|\1- args:\n\1- --kubelet-insecure-tls|" \
    -e "s|k8s.gcr.io/metrics-server|registry.cn-beijing.aliyuncs.com/choral-k8s|g" \
| kubectl apply -f -
</code></pre>
</li>
</ul>
<h3 id="安装负载均衡组件"><span id="metallb">安装负载均衡组件</span></h3>
<p>由云服务商提供的<code>Kubernetes</code>服务,通常会提供内置的负载均衡实现。而笔者部署环境为私有环境,需要一个轻量的负载均衡实现以支撑<code>LoadBalancer</code>类型的服务。</p>
<p>笔者选择MetalLB作为负载均衡实现,配置为二层网络模式。<code>LoadBalancer</code>地址范围配置为<code>10.0.0.201-10.0.0.254</code>,需根据具体网络环境进行修改。</p>
<p>在<code>k8s-n0</code>节点上执行如下操作。</p>
<ul>
<li>
<p>安装<code>MetalLB</code></p>
<pre><code class="language-sh"># 创建用于部署MetalLB的命名空间
kubectl create namespace metallb-system

# 创建必须的配置文件
cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
    address-pools:
      - name: default
      protocol: layer2
      addresses:
      - 10.0.0.201-10.0.0.254
EOF

# 1. 直接执行清单文件
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml

# 2. 为避免特殊网络环境中的清单文件加载问题,可以使用jsdelivr提供的加速方案加速地址
kubectl apply -f https://cdn.jsdelivr.net/gh/metallb/metallb@v0.10.2/manifests/metallb.yaml
</code></pre>
</li>
</ul>
<h3 id="安装持久卷供应程序">安装持久卷供应程序</h3>
<p><code>Kubernetes</code>内置的<code>local-storage</code>存储类无法动态供应卷,为便于基于该环境演练时自动创建持久卷,选择使用<code>local-path-provisioner</code>作为持久卷供应程序。</p>
<ul>
<li>
<p>创建所需的目录</p>
<p>在所有节点上执行如下操作。</p>
<pre><code class="language-sh">sudo mkdir -p /opt/local-path-provisioner
</code></pre>
</li>
<li>
<p>安装<code>local-path-provisioner</code></p>
<p>在<code>k8s-n0</code>节点上执行如下操作。</p>
<pre><code class="language-sh"># 1. 使用官方清单文件地址直接安装
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
#   1.1 同样可以使用jsdelivr提供的加速方案
kubectl apply -f https://cdn.jsdelivr.net/gh/rancher/local-path-provisioner@master/deploy/local-path-storage.yaml

# 2. 替换命名空间
curl -s https://cdn.jsdelivr.net/gh/rancher/local-path-provisioner@master/deploy/local-path-storage.yaml \
| sed \
    -e "1,6d" \
    -e "s/local-path-storage/kube-system/" \
| kubectl apply -f -
</code></pre>
</li>
<li>
<p>配置默认存储类</p>
<pre><code class="language-sh">kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
</code></pre>
</li>
</ul>
<h3 id="检查集群工作状态">检查集群工作状态</h3>
<p>在<code>k8s-n0</code>节点上执行如下操作。</p>
<ul>
<li>
<p>查看节点状态</p>
<pre><code class="language-sh">kubectl get nodes
</code></pre>
<pre><code class="language-sh">kubectl top nodes
</code></pre>
</li>
<li>
<p>查看Pod状态</p>
<pre><code class="language-sh">kubectl get pods -A
</code></pre>
<pre><code class="language-sh">kubectl top pods -A
</code></pre>
</li>
</ul>
<h2 id="附加内容">附加内容</h2>
<h3 id="同步所需镜像"><span id="gcr_io_mirror">同步所需镜像</span></h3>
<p>由于特殊网络环境问题,需要同步kubelet所需镜像至其他镜像仓库的,可参考如下操作。</p>
<p>笔者开发环境中使用podman管理容器和镜像,已将<code>docker</code>设置为<code>podman</code>的别名(<code>alias docker=podman</code>)。</p>
<ul>
<li>
<p>同步kubelet所需镜像</p>
<p>首先,需要创建私有镜像仓库认证凭据。</p>
<pre><code class="language-sh"># 根据需要将`registry.cn-beijing.aliyuncs.com`替换为私有镜像仓库地址
docker login registry.cn-beijing.aliyuncs.com
</code></pre>
<p>创建一个脚本<code>gcr_mirror_sync.sh</code>,内容如下。</p>
<pre><code class="language-sh"># gcr_mirror_sync.sh
# 根据需要将`registry.cn-beijing.aliyuncs.com/choral-k8s/`替换为私有镜像仓库地址
while read o
do {
      t=$(echo $o | sed 's|k8s.gcr.io.*/|registry.cn-beijing.aliyuncs.com/choral-k8s/|g')
      docker pull $o
      docker tag $o $t
      docker push $t
      docker rmi $o
      docker rmi $t
}
done &lt; "${1:-/dev/stdin}"
</code></pre>
<p>该脚本有两种使用方法。</p>
<pre><code class="language-sh">kubeadm config images list --kubernetes-version=v1.22.2 | bash gcr_mirror_sync.sh
</code></pre>
<pre><code class="language-sh"># 列出所需镜像列表并保存到文件
kubeadm config images list --kubernetes-version=v1.22.2 &gt; gcr-image-list
# 拷贝该文件至gcr_mirror_sync.sh所在主机,然后执行该脚本
bash gcr_mirror_sync.sh gcr-image-list
</code></pre>
</li>
<li>
<p>同步附加组件镜像</p>
<pre><code class="language-sh"># 根据需要将`registry.cn-beijing.aliyuncs.com/choral-k8s/`替换为私有镜像仓库地址。

# 同步metrics server所需镜像
docker pull k8s.gcr.io/metrics-server/metrics-server:v0.5.0
docker tag k8s.gcr.io/metrics-server/metrics-server:v0.5.0 registry.cn-beijing.aliyuncs.com/choral-k8s/metrics-server:v0.5.0
docker push registry.cn-beijing.aliyuncs.com/choral-k8s/metrics-server:v0.5.0
docker rmi k8s.gcr.io/metrics-server/metrics-server:v0.5.0
docker rmi registry.cn-beijing.aliyuncs.com/choral-k8s/metrics-server:v0.5.0
</code></pre>
</li>
</ul>
<h2 id="参考资料">参考资料</h2>
<ul>
<li>
<p>https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/</p>
</li>
<li>
<p>https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/</p>
</li>
<li>
<p>https://github.com/flannel-io/flannel/blob/master/Documentation/kubernetes.md</p>
</li>
<li>
<p>https://www.kube-router.io/docs/user-guide/</p>
</li>
<li>
<p>https://helm.sh/docs/intro/install/</p>
</li>
<li>
<p>https://github.com/kubernetes-sigs/metrics-server</p>
</li>
<li>
<p>https://metallb.org/installation/</p>
</li>
<li>
<p>https://github.com/rancher/local-path-provisioner</p>
</li>
</ul><br><br>
来源:https://www.cnblogs.com/tiscs/p/notes-k8s-cluster.html
頁: [1]
查看完整版本: Kubernetes集群部署笔记