怒火严重 發表於 2021-5-24 11:45:00

用 kubeadm 在 Debian 或 Ubuntu 中创建 k8s 集群

<p>本文根据官方教程修改而来。</p>
<h2 id="一准备">一、准备</h2>
<p>要遵循本指南,你需要:</p>
<ul>
<li>一个或多个 Debian 9 / Ubuntu 18.04 虚拟机,物理机当然更好</li>
<li>每台机器 2GB 以上的内存</li>
<li>用作控制平台节点的虚拟机至少有 2 个CPU</li>
<li>集群中所有计算机之间具有完全的网络连接</li>
</ul>
<p>更改主节点 hostname 为 k8s-master,子节点根据数量修改 hostname 为 k8s-node-n,每个节点都要修改 hosts文件,添加所有节点的 ip 和 hostname 的映射关系,如:</p>
<pre><code class="language-apl"># k8s cluster nodes start
192.168.31.221 k8s-master
192.168.31.222 k8s-node-1
192.168.31.231 k8s-node-2
# k8s cluster nodes end
</code></pre>
<p><strong>关闭 swap</strong></p>
<pre><code class="language-shell">sudo swapoff -a
</code></pre>
<p>上面只是临时关闭,永久关闭还需删除<code>/etc/fstab </code>中有关 swap 分区的项目。</p>
<pre><code class="language-shell">sudo cp /etc/fstab /etc/fstab.bak
sudo sed -i "/^\/swap/d" /etc/fstab
</code></pre>
<p>修改完 fstab 文件后,重启主机。</p>
<h2 id="二教程开始">二、教程开始</h2>
<h3 id="1-安装-kubeadm">1 安装 kubeadm</h3>
<h4 id="11-允许-iptables-检查桥接流量">1.1 允许 iptables 检查桥接流量</h4>
<p>确保 <code>br_netfilter</code> 模块被加载。这一操作可以通过运行 <code>lsmod | grep br_netfilter</code> 来完成。若要显式加载该模块,可执行 <code>sudo modprobe br_netfilter</code>。</p>
<p>为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 <code>sysctl</code> 配置中将 <code>net.bridge.bridge-nf-call-iptables</code> 设置为 1。例如:</p>
<pre><code class="language-shell">cat &lt;&lt;EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat &lt;&lt;EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
</code></pre>
<h4 id="12-安装-docker">1.2 安装 Docker</h4>
<p>参考 docker-ce | 镜像站使用帮助 | 北京外国语大学开源软件镜像站 | BFSU Open Source Mirror。</p>
<p>不再细述。</p>
<h4 id="13-安装-kubeadmkubelet-和-kubectl">1.3 安装 kubeadm、kubelet 和 kubectl</h4>
<p>你需要在每台机器上安装下面的软件包:</p>
<ul>
<li><code>kubeadm</code>:用来初始化集群的指令。</li>
<li><code>kubelet</code>:在集群中的每个节点上用来启动 Pod 和容器等。</li>
<li><code>kubectl</code>:用来与集群通信的命令行工具。</li>
</ul>
<p>kubeadm <strong>不能</strong> 帮你安装或者管理 <code>kubelet</code> 或 <code>kubectl</code>,所以你需要 确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。</p>
<p><strong>安装过程</strong></p>
<ol>
<li>
<p>更新 <code>apt</code> 包索引并安装使用 Kubernetes <code>apt</code> 仓库所需要的包:</p>
<pre><code class="language-shell">sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
</code></pre>
</li>
<li>
<p>下载并添加签名密钥,我将谷歌 key 上传到了 gitee,方便国内使用:</p>
<pre><code class="language-shell">curl -s https://gitee.com/thepoy/k8s/raw/master/apt-key.gpg | sudo apt-key add -
</code></pre>
</li>
<li>
<p>添加 Kubernetes <code>apt</code> 仓库,这里使用清华镜像,但清华镜像不稳定,有时会没有网速:</p>
<pre><code class="language-shell">cat &lt;&lt;EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.tuna.tsinghua.edu.cn/kubernetes/apt kubernetes-xenial main
EOF
</code></pre>
<blockquote>
<p>这里需要注意,<code>kubernetes-xenial</code>不改变,版本代码一改变,将无法在 apt 仓库中找到 kubeadm 和kubelet。而 apt 仓库中保存的是通用 DEB 包, Debian 和 Ubuntu 不区分版本都可以用,所以不要改动此处。我用的是 Debian 9,将其改为<code>kubernetes-stretch</code>后就遇到了此问题,改为<code>kubernetes-xenial</code>才顺利安装。</p>
</blockquote>
</li>
<li>
<p>更新 <code>apt</code> 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:</p>
<pre><code class="language-shell">sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
</code></pre>
</li>
</ol>
<p>第一小节内容所有虚拟机上都要操作一次。</p>
<h3 id="2-创建集群">2 创建集群</h3>
<h4 id="21-查看-kubeadm-初始化所需镜像">2.1 查看 kubeadm 初始化所需镜像</h4>
<p>kubeadm 初始化时会拉取一些 docker 镜像,查看fmd要的镜像列表:</p>
<pre><code class="language-shell">➜~ kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.21.1
k8s.gcr.io/kube-controller-manager:v1.21.1
k8s.gcr.io/kube-scheduler:v1.21.1
k8s.gcr.io/kube-proxy:v1.21.1
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0
</code></pre>
<p>可以看到,使用的镜像仓库是国内无法正常访问的<code>k8s.gcr.io</code>,所以需要另想办法完成镜像拉取。</p>
<p><strong>主节点</strong>需要拉取<strong>所有镜像</strong>,<strong>子节点</strong>只需要<strong><code>pause</code>和<code>kube-proxy</code>两个镜像</strong>就能正常工作。</p>
<h4 id="22-拉取镜像">2.2 拉取镜像</h4>
<p>配置好 docker 镜像仓库,通常都使用阿里云加速。</p>
<p>在 docker hub 中逐一搜索对应的镜像,并将所需标签的镜像 pull 到本地。</p>
<p>以<code>kube-apiserver</code>为例,pull 到本地后,修改其本地标签:</p>
<pre><code class="language-shell">docker tag 8522d622299c k8s.gcr.io/kube-apiserver:v1.21.1
</code></pre>
<h4 id="23-kubeadm-初始化">2.3 kubeadm 初始化</h4>
<p><strong>kubeadm</strong>需要使用 root 账户或 root 权限运行。</p>
<p>kubeadm 需要使用 systemd 来管理容器的 cgroup。</p>
<p>初始化前修改 docker 的 daemon.json,添加一行<code>"exec-opts": ["native.cgroupdriver=systemd"]</code>,最终类似于:</p>
<pre><code class="language-json">{
        "exec-opts": ["native.cgroupdriver=systemd"],
        "registry-mirrors": [
                      "xxxxx.mirror.aliyuncs.com"// 这里的镜像仓库需要改成自己的
        ]
}
</code></pre>
<pre><code class="language-shell">sudo systemctl daemon-reload
sudo systemctl restart docker
</code></pre>
<p>初始化命令:</p>
<pre><code class="language-shell">sudo kubeadm init \
--apiserver-advertise-address=192.168.31.221 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
</code></pre>
<ul>
<li>第一个参数是主节点的 ip 地址</li>
<li>第二个参数是为 service 另指定一个 ip 地址段</li>
<li>第三个参数是为 pod 网络指定的 ip 地址段</li>
</ul>
<p>初始化成功后,最后会输出类似下面的结果:</p>
<pre><code>Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f .yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.31.221:6443 --token jc2ohi.sot5cfuqtvyx4bsk \
        --discovery-token-ca-cert-hash sha256:584a842a831fe3226341ce0f5812a94eb6042188e070e4946af7127c689cb13b
</code></pre>
<p>最后的命令就是子节点加入集群的命令,在子节点中以 root 权限运行即可:</p>
<pre><code class="language-shell">sudo kubeadm join 192.168.31.221:6443 --token jc2ohi.sot5cfuqtvyx4bsk \
        --discovery-token-ca-cert-hash sha256:584a842a831fe3226341ce0f5812a94eb6042188e070e4946af7127c689cb13b
</code></pre>
<p>然后在主节点中用普通用户运行下面的命令:</p>
<pre><code class="language-shell">mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
</code></pre>
<p>最后在主节点中查看全部节点:</p>
<pre><code class="language-shell">➜~ kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   10m   v1.21.1
k8s-node-1   Ready    &lt;none&gt;               9m26s   v1.21.1
k8s-node-2   Ready    &lt;none&gt;               9m2s    v1.21.1
</code></pre>
<p>集群中所有节点都已准备好了。</p>
<p><strong>可选:</strong></p>
<p><code>kubectl get cs</code>已被弃用。</p>
<p>可以检查一下集群是否正常:</p>
<pre><code class="language-shell">kubectl get cs
</code></pre>
<p>可能你会得到下面的响应:</p>
<pre><code>NAME               STATUS      MESSAGE                                                                                       ERROR
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
etcd-0               Healthy   {"health":"true"}
</code></pre>
<p>出现这种情况,是<code>/etc/kubernetes/manifests</code>下的<code>kube-controller-manager.yaml</code>和<code>kube-scheduler.yaml</code>设置的默认端口是 0,在文件中注释掉或删除掉相关参数就可以了。</p>
<h3 id="3-安装-pod-网络附加组件">3 安装 Pod 网络附加组件</h3>
<p><strong>你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信。 在安装网络之前,集群 DNS (CoreDNS) 将不会启动。</strong></p>
<p>可用的第三方 CNI 列表见 CNI | Kubernetes。</p>
<p>本文使用<code>Flannel</code>:</p>
<pre><code class="language-shell">kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
</code></pre>
<p>安装过程很快,完成后即可查看 coredns 状态:</p>
<pre><code class="language-shell">kubectl get pods -n kube-system
</code></pre>
<p>结果:</p>
<pre><code>NAME                                 READY   STATUS    RESTARTS   AGE
coredns-54695bfdf-24whr            1/1   Running   0          29m
coredns-54695bfdf-p8knz            1/1   Running   0          29m
etcd-k8s-master                      1/1   Running   0          29m
kube-apiserver-k8s-master            1/1   Running   0          29m
kube-controller-manager-k8s-master   1/1   Running   0          29m
kube-flannel-ds-4w2lt                1/1   Running   0          16s
kube-flannel-ds-7x9w7                1/1   Running   0          16s
kube-flannel-ds-rgcxl                1/1   Running   0          16s
kube-proxy-gtf4d                     1/1   Running   0          29m
kube-proxy-pvhbp                     1/1   Running   0          28m
kube-proxy-s6xj9                     1/1   Running   0          28m
kube-scheduler-k8s-master            1/1   Running   0          29m
</code></pre>
<p>使用 API 检查集群健康状态:</p>
<pre><code class="language-shell">curl -k https://localhost:6443/livez\?verbose
curl -k https://localhost:6443/readyz\?verbose
</code></pre>
<pre><code>[+]ping ok
[+]log ok
[+]etcd ok
[+]poststarthook/start-kube-apiserver-admission-initializer ok
[+]poststarthook/generic-apiserver-start-informers ok
[+]poststarthook/priority-and-fairness-config-consumer ok
[+]poststarthook/priority-and-fairness-filter ok
[+]poststarthook/start-apiextensions-informers ok
[+]poststarthook/start-apiextensions-controllers ok
[+]poststarthook/crd-informer-synced ok
[+]poststarthook/bootstrap-controller ok
[+]poststarthook/rbac/bootstrap-roles ok
[+]poststarthook/scheduling/bootstrap-system-priority-classes ok
[+]poststarthook/priority-and-fairness-config-producer ok
[+]poststarthook/start-cluster-authentication-info-controller ok
[+]poststarthook/aggregator-reload-proxy-client-cert ok
[+]poststarthook/start-kube-aggregator-informers ok
[+]poststarthook/apiservice-registration-controller ok
[+]poststarthook/apiservice-status-available-controller ok
[+]poststarthook/kube-apiserver-autoregistration ok
[+]autoregister-completion ok
[+]poststarthook/apiservice-openapi-controller ok
livez check passed
</code></pre>
<pre><code>[+]ping ok
[+]log ok
[+]etcd ok
[+]informer-sync ok
[+]poststarthook/start-kube-apiserver-admission-initializer ok
[+]poststarthook/generic-apiserver-start-informers ok
[+]poststarthook/priority-and-fairness-config-consumer ok
[+]poststarthook/priority-and-fairness-filter ok
[+]poststarthook/start-apiextensions-informers ok
[+]poststarthook/start-apiextensions-controllers ok
[+]poststarthook/crd-informer-synced ok
[+]poststarthook/bootstrap-controller ok
[+]poststarthook/rbac/bootstrap-roles ok
[+]poststarthook/scheduling/bootstrap-system-priority-classes ok
[+]poststarthook/priority-and-fairness-config-producer ok
[+]poststarthook/start-cluster-authentication-info-controller ok
[+]poststarthook/aggregator-reload-proxy-client-cert ok
[+]poststarthook/start-kube-aggregator-informers ok
[+]poststarthook/apiservice-registration-controller ok
[+]poststarthook/apiservice-status-available-controller ok
[+]poststarthook/kube-apiserver-autoregistration ok
[+]autoregister-completion ok
[+]poststarthook/apiservice-openapi-controller ok
[+]shutdown ok
readyz check passed
</code></pre>
<p>查看集群信息:</p>
<pre><code class="language-shell">kubectl cluster-info
</code></pre>
<pre><code>Kubernetes control plane is running at https://192.168.31.221:6443
CoreDNS is running at https://192.168.31.221:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
</code></pre><br><br>
来源:https://www.cnblogs.com/thepoy/p/14803739.html
頁: [1]
查看完整版本: 用 kubeadm 在 Debian 或 Ubuntu 中创建 k8s 集群