kubeadm安装kubernetes(v1.18.8)
<h1>1. 前言</h1><p> kubernetes版本更新迭代非常快,上一篇写kubernetes搭建时,版本还是v1.15.0,现在已经更新到v1.18。看kubernetes在github的官方仓库,8月14日小版本已经到了v1.18.8。本篇文章基于kubeadm搭建kubernetes v1.18.8版。<br>本篇文章与上篇文章几点不同之处:<br> 1. 操作系统采用CentOS。<br> 2. master采用单节点,如果要搭建多master高可用集群可以参考上篇文章。<br> 3. 解决无法访问kubernetes官方容器镜像仓库问题,上篇文章直接从kubernetes官方拉取镜像。<br> 4. docker加速,解决从dockerhub拉镜像慢问题。<br> 5. kube-proxy开启ivps,使用ipvs替代iptables转发流量。<br> 6. 给出了一些常见的错误及排错思路。<br> 话不多说,那就直奔主题,走起~~~</p>
<h1>2. 环境准备</h1>
<table border="0" align="left">
<tbody>
<tr>
<td>机器名称</td>
<td>机器配置</td>
<td>机器系统</td>
<td>IP地址</td>
<td>角色</td>
</tr>
<tr>
<td>master1</td>
<td>2C4G</td>
<td>CentOS7.6</td>
<td>10.13.1.11</td>
<td>主节点</td>
</tr>
<tr>
<td>node1</td>
<td>2C4G</td>
<td>CentOS7.6</td>
<td>10.13.1.15</td>
<td>工作节点1</td>
</tr>
<tr>
<td>node2</td>
<td>2C4G</td>
<td>CentOS7.6</td>
<td>10.13.1.16</td>
<td>工作节点2</td>
</tr>
</tbody>
</table>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>说明:<br>硬件配置要求:2C2G +;<br>操作系统要求:CentOS7 +<br>防火墙说明:如果使用的是云厂商的虚拟机,主节点安全组需放行tcp端口6443、2379-2380、10250-12025,工作节点安全组需放行tcp端口:10250、30000-32767</p>
<h1>3. 实操过程</h1>
<h2>3.1 关闭防火墙和selinux</h2>
<div class="cnblogs_code">
<pre>root@master1 ~<span style="color: rgba(0, 0, 0, 1)">]# systemctl stop firewalld
# setenforce <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
# <span style="color: rgba(0, 0, 255, 1)">sed</span> -i <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s/^SELINUX=.*/SELINUX=disabled/</span><span style="color: rgba(128, 0, 0, 1)">'</span> /etc/selinux/config</pre>
</div>
<h2>3.2 关闭交换分区</h2>
<div class="cnblogs_code">
<pre>root@master1 ~]# swapoff -<span style="color: rgba(0, 0, 0, 1)">a
永久关闭,修改</span>/etc/fstab,注释掉swap一行</pre>
</div>
<h2>3.3 修改hosts文件</h2>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">cat</span> >> /etc/hosts <<<span style="color: rgba(0, 0, 0, 1)"> EOF
</span><span style="color: rgba(128, 0, 128, 1)">10.13</span>.<span style="color: rgba(128, 0, 128, 1)">1.11</span><span style="color: rgba(0, 0, 0, 1)"> master1
</span><span style="color: rgba(128, 0, 128, 1)">10.13</span>.<span style="color: rgba(128, 0, 128, 1)">1.15</span><span style="color: rgba(0, 0, 0, 1)"> node1
</span><span style="color: rgba(128, 0, 128, 1)">10.13</span>.<span style="color: rgba(128, 0, 128, 1)">1.16</span> node2</pre>
</div>
<h2>3.4 时间同步</h2>
<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> chrony -<span style="color: rgba(0, 0, 0, 1)">y
# systemctl start chronyd
# systemctl enable chronyd
# chronyc sources</pre>
</div>
<h2>3.5 修改内核参数</h2>
<p>让iptables能查看桥接流量</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">cat</span> > /etc/sysctl.d/k8s.conf <<<span style="color: rgba(0, 0, 0, 1)"> EOF
net.ipv4.ip_forward </span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
net.bridge.bridge</span>-nf-call-ip6tables = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
net.bridge.bridge</span>-nf-call-iptables = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
# sysctl --system</pre>
</div>
<h2>3.6 加载ipvs模块</h2>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">modprobe</span> --<span style="color: rgba(0, 0, 0, 1)"> ip_vs
# <span style="color: rgba(0, 0, 255, 1)">modprobe</span> --<span style="color: rgba(0, 0, 0, 1)"> ip_vs_rr
# <span style="color: rgba(0, 0, 255, 1)">modprobe</span> --<span style="color: rgba(0, 0, 0, 1)"> ip_vs_wrr
# <span style="color: rgba(0, 0, 255, 1)">modprobe</span> --<span style="color: rgba(0, 0, 0, 1)"> ip_vs_sh
# <span style="color: rgba(0, 0, 255, 1)">modprobe</span> --<span style="color: rgba(0, 0, 0, 1)"> nf_conntrack_ipv4
# <span style="color: rgba(0, 0, 255, 1)">lsmod</span> | <span style="color: rgba(0, 0, 255, 1)">grep</span><span style="color: rgba(0, 0, 0, 1)"> ip_vs
# <span style="color: rgba(0, 0, 255, 1)">lsmod</span> | <span style="color: rgba(0, 0, 255, 1)">grep</span><span style="color: rgba(0, 0, 0, 1)"> nf_conntrack_ipv4
# <span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span> -y ipvsadm</pre>
</div>
<h2> 3.7 安装并配置docker</h2>
<h3> 3.7.1 修改docker的yum源为阿里源</h3>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">wget</span> 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 -O /etc/yum.repos.d/docker-ce.repo</span>
<span style="color: rgba(0, 0, 0, 1)">或者
# <span style="color: rgba(0, 0, 255, 1)">yum</span>-config-manager --add-repo http:<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>
<h3>3.7.2 安装docker</h3>
<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> -y docker-<span style="color: rgba(0, 0, 0, 1)">ce
# docker --<span style="color: rgba(0, 0, 0, 1)">version<br>Docker version 19.03.12, build 48a66213fe
# systemctl enable docker
# systemctl start docker</pre>
</div>
<h3>3.7.3 配置docker加速并修改驱动</h3>
<p>网上有很多大佬无私地提供了一些dockerhub加速地址,可以选择几个使用。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">cat</span> /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)">https://1nj0zren.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)">https://kfwkfulq.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)">https://2lqq34jg.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)">https://pee6w651.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://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)">https://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://f1361db2.m.daocloud.io</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)">https://registry.docker-cn.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
]
}
# systemctl restart docker
# docker <span style="color: rgba(0, 0, 255, 1)">info</span> | <span style="color: rgba(0, 0, 255, 1)">grep</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cgroup Driver</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Cgroup Driver: systemd</span></pre>
</div>
<p> kubernetes官方建议docker驱动采用systemd,当然可以不修改,只是kubeadm init时会有warning(: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/)可以忽略,生产环境建议修改,因为更稳定。</p>
<h2>3.8 安装kubernents组件</h2>
<h3>3.8.1 配置kubernentes的yum源为阿里源</h3>
<p>因为国内无法访问kubernents的官方yum源,所以需要修改</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">cat</span> <<EOF | <span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">tee</span> /etc/<span style="color: rgba(0, 0, 255, 1)">yum</span>.repos.d/<span style="color: rgba(0, 0, 0, 1)">kubernetes.repo
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)">0</span><span style="color: rgba(0, 0, 0, 1)">
repo_gpgcheck</span>=<span style="color: rgba(128, 0, 128, 1)">0</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></pre>
</div>
<h3>3.8.2 安装组件</h3>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> -y <span style="color: rgba(0, 0, 255, 1)">install</span><span style="color: rgba(0, 0, 0, 1)"> kubelet kubeadm kubectl
# kubelet --<span style="color: rgba(0, 0, 0, 1)">version
Kubernetes v1.</span><span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)">
# systemctl start kubelet</pre>
</div>
<p>此时kubelet处于不断重启状态,因为集群还没有初始化,kubelet等待kubeadm初始化完成后运行状态正常。</p>
<h2>3.9 初始化集群</h2>
<h3>3.9.1 查看初始化需要的镜像</h3>
<div class="cnblogs_code">
<pre># kubeadm config images list
W0822 </span><span style="color: rgba(128, 0, 128, 1)">15</span>:<span style="color: rgba(128, 0, 128, 1)">58</span>:<span style="color: rgba(128, 0, 128, 1)">54.182176</span> <span style="color: rgba(128, 0, 128, 1)">25602</span> configset.go:<span style="color: rgba(128, 0, 128, 1)">202</span>] WARNING: kubeadm cannot validate component configs <span style="color: rgba(0, 0, 255, 1)">for</span> API <span style="color: rgba(0, 0, 255, 1)">groups</span><span style="color: rgba(0, 0, 0, 1)">
k8s.gcr.io</span>/kube-apiserver:v1.<span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)">
k8s.gcr.io</span>/kube-controller-manager:v1.<span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)">
k8s.gcr.io</span>/kube-scheduler:v1.<span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)">
k8s.gcr.io</span>/kube-proxy:v1.<span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)">
k8s.gcr.io</span>/pause:<span style="color: rgba(128, 0, 128, 1)">3.2</span><span style="color: rgba(0, 0, 0, 1)">
k8s.gcr.io</span>/etcd:<span style="color: rgba(128, 0, 128, 1)">3.4</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
k8s.gcr.io</span>/coredns:<span style="color: rgba(128, 0, 128, 1)">1.6</span>.<span style="color: rgba(128, 0, 128, 1)">7</span></pre>
</div>
<h3>3.9.2 kubeadm init介绍</h3>
<p> 初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。<br>可选参数:<br>--apiserver-advertise-address apiserver的监听地址,有多块网卡时需要指定<br>--apiserver-bind-port apiserver的监听端口,默认是6443<br>--cert-dir 通讯的ssl证书文件,默认/etc/kubernetes/pki<br>--control-plane-endpoint 控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加<br>--image-repository 拉取镜像的镜像仓库,默认是k8s.gcr.io<br>--kubernetes-version 指定kubernetes版本<br>--pod-network-cidr pod资源的网段,需与pod网络插件的值设置一致<br>--service-cidr service资源的网段<br>--service-dns-domain service全域名的后缀,默认是cluster.local</p>
<h3>3.9.3 kubeadm指定具体参数初始化 </h3>
<p> 因为以上镜像都需要从kubernetes官方镜像仓库拉取,国内无法访问,所以需要设置国内的阿里镜像仓库。<br>但是目前至发稿为止,阿里的kube-apiserver、kube-controller、proxy镜像只更新到v1.18.6所以无法拉取到v1.18.8版镜像。<br> 如果你需要安装的kubernetes版本是v1.18.6及以下那么请继续往下走,如果是v1.18.7及以上请跳过这一步进入下一步。</p>
<h4>3.9.3.1 初始化</h4>
<div class="cnblogs_code">
<pre># kubeadm init --kubernetes-version=v1.<span style="color: rgba(128, 0, 128, 1)">18.6</span>--apiserver-advertise-address <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span> --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">16</span> --service-cidr <span style="color: rgba(128, 0, 128, 1)">10.10</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">16</span>
--kubernetes-version 请指定为你需要安装的v1.<span style="color: rgba(128, 0, 128, 1)">18</span>.6及以下的版本。</pre>
</div>
<p>初始化成功后会出现如下信息</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822220223865-694583745.png" alt="" loading="lazy"></p>
<h4> 3.9.3.2 开启ipvs</h4>
<p>修改kube-proxy的configmap</p>
<div class="cnblogs_code">
<pre># kubectl edit cm kube-proxy -n=kube-<span style="color: rgba(0, 0, 0, 1)">system
修改mode: ipvs</span></pre>
</div>
<h3>3.9.4 kubeadm指定配置文件初始化</h3>
<h4>3.9.4.1 下载kubernetes所需的全部镜像</h4>
<p>dockerhub上面已经有大佬已经上传了最新的1.18.8镜像,这里我们直接下载下来即可。</p>
<div class="cnblogs_code">
<pre># vim images.txt
kube</span>-apiserver:v1.<span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)"> # node节点不需要
kube</span>-controller-manager:v1.<span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)"> # node节点不需要
kube</span>-scheduler:v1.<span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)"> # node节点不需要
kube</span>-proxy:v1.<span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)">
pause:</span><span style="color: rgba(128, 0, 128, 1)">3.2</span><span style="color: rgba(0, 0, 0, 1)">
etcd:</span><span style="color: rgba(128, 0, 128, 1)">3.4</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> # node节点不需要
coredns:</span><span style="color: rgba(128, 0, 128, 1)">1.6</span>.<span style="color: rgba(128, 0, 128, 1)">7</span><span style="color: rgba(0, 0, 0, 1)"> # node节点不需要
# vim images.<span style="color: rgba(0, 0, 255, 1)">sh</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> image <span style="color: rgba(0, 0, 255, 1)">in</span> `<span style="color: rgba(0, 0, 255, 1)">cat</span><span style="color: rgba(0, 0, 0, 1)"> images.txt`
</span><span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
docker pull gotok8s</span>/<span style="color: rgba(0, 0, 0, 1)">$image
docker tag gotok8s</span>/$image k8s.gcr.io/<span style="color: rgba(0, 0, 0, 1)">$image
docker rmi gotok8s</span>/<span style="color: rgba(0, 0, 0, 1)">$image
</span><span style="color: rgba(0, 0, 255, 1)">done</span><span style="color: rgba(0, 0, 0, 1)">
# <span style="color: rgba(0, 0, 255, 1)">sh</span> images.<span style="color: rgba(0, 0, 255, 1)">sh</span></pre>
</div>
<h4>3.9.4.2 配置初始化文件</h4>
<div class="cnblogs_code">
<pre># kubeadm config print init-defaults ><span style="color: rgba(0, 0, 0, 1)"> kubeadm.yaml
# vim kubeadm.yaml
apiVersion: kubeadm.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1beta2
bootstrapTokens:
</span>- <span style="color: rgba(0, 0, 255, 1)">groups</span><span style="color: rgba(0, 0, 0, 1)">:
</span>- system:bootstrappers:kubeadm:default-node-<span style="color: rgba(0, 0, 0, 1)">token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
</span>-<span style="color: rgba(0, 0, 0, 1)"> signing
</span>-<span style="color: rgba(0, 0, 0, 1)"> authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: </span><span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(0, 0, 0, 1)"># 修改为本机ip地址,多块网卡可以指定具体ip
bindPort: </span><span style="color: rgba(128, 0, 128, 1)">6443</span><span style="color: rgba(0, 0, 0, 1)">
nodeRegistration:
criSocket: </span>/var/run/<span style="color: rgba(0, 0, 0, 1)">dockershim.sock
name: master1
taints:
</span>-<span style="color: rgba(0, 0, 0, 1)"> effect: NoSchedule
key: node</span>-role.kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">master
</span>---<span style="color: rgba(0, 0, 0, 1)">
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1beta2
certificatesDir: </span>/etc/kubernetes/<span style="color: rgba(0, 0, 0, 1)">pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: </span>/var/lib/<span style="color: rgba(0, 0, 0, 1)">etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.</span><span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)"> # 修改为最新版本
networking:
dnsDomain: cluster.local
serviceSubnet: </span><span style="color: rgba(128, 0, 128, 1)">10.10</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)"> # service网段
podSubnet: </span><span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)"> # pod网段,需与网络插件网段一致
scheduler: {}
</span>---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: kubeproxy.config.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1alpha1
kind: KubeProxyConfiguration
mode: ipvs # 开启ipvs
# kubeadm init --config=kubeadm.yaml</pre>
</div>
<p>可以看到久违的成功</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822220824129-1964299192.png" alt="" loading="lazy"></p>
<h4>3.9.4.3 配置kubectl与kube-apiserver交互</h4>
<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 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 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/<span style="color: rgba(0, 0, 0, 1)">config
至此可以使用kubectl查看集群节点状态了
# kubectl get nodes</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822220903585-1395405195.png" alt="" loading="lazy"></p>
<p> 可以看到版本是v1.18.8最新版,但是master状态是NotReady,因为此时还没有安装网络组件。</p>
<h3> 3.9.5 安装网络组件 </h3>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">wget</span> https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">docs.projectcalico.org/v3.14/manifests/calico.yaml</span>
# kubectl apply -f calico.yaml</pre>
</div>
<p>此时再来看节点状态,已经正常</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822221123077-1247754647.png" alt="" loading="lazy"></p>
<p>查组件状态</p>
<div class="cnblogs_code">
<pre># kubectl get cs</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822221215195-150811728.png" alt="" loading="lazy"></p>
<h2>3.10 worker节点加入集群</h2>
<div class="cnblogs_code">
<pre># kubeadm <span style="color: rgba(0, 0, 255, 1)">join</span> <span style="color: rgba(128, 0, 128, 1)">10.13</span>.<span style="color: rgba(128, 0, 128, 1)">1.11</span>:<span style="color: rgba(128, 0, 128, 1)">6443</span> --token abcdef.0123456789abcdef --discovery-token-ca-cert-<span style="color: rgba(0, 0, 0, 1)">hash sha256:c214cf4c42766dd3d4ab2842c11efbefd54aa445993708ccdbdb8f111658445e
同样的第二个worker节点加入集群
此次查看集群状态
# kubectl get nodes
# kubectl get pods -A</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200823104541968-1471699527.png" alt="" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200823214400500-2118045122.png" alt="" loading="lazy"></p>
<p>如果join的token之前没有记住,没关系,在master重新生成一下</p>
<div class="cnblogs_code">
<pre># kubeadm token create --print-<span style="color: rgba(0, 0, 255, 1)">join</span>-command</pre>
</div>
<p>可以看到节点和个组件的pod状态均正常,至此集群搭建完毕!</p>
<h1>4. trouble shooting</h1>
<p><strong> 出现了问题不可怕,因为如果不非常仔细,按照文档敲下来很有可能会出错。可怕的是,出错了连去网上多搜索一下都懒得搜,甚至开始抱怨。kubernets已经很成熟了,网上的资料非常多,出现的问题很多人也遇到过,在网上基本都有大佬给出回答。</strong></p>
<h2>4.1 初始化集群长期卡住,最终报错</h2>
<p>拉镜像失败</p>
<div class="cnblogs_code">
<pre>: failed to pull image k8s.gcr.io/kube-apiserver:v1.<span style="color: rgba(128, 0, 128, 1)">18.8</span>: output: Error response from daemon: Get https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)</span>
, error: exit status <span style="color: rgba(128, 0, 128, 1)">1</span></pre>
</div>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822221526164-1288480628.png" alt="" loading="lazy"></p>
<p>执行拉镜像脚本</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">sh</span> images.<span style="color: rgba(0, 0, 255, 1)">sh</span></pre>
</div>
<p><span style="font-size: 1.5em">4.2 网桥报错</span></p>
<div class="cnblogs_code">
<pre>W0822 <span style="color: rgba(128, 0, 128, 1)">17</span>:<span style="color: rgba(128, 0, 128, 1)">05</span>:<span style="color: rgba(128, 0, 128, 1)">25.135752</span> <span style="color: rgba(128, 0, 128, 1)">3367</span> configset.go:<span style="color: rgba(128, 0, 128, 1)">202</span>] WARNING: kubeadm cannot validate component configs <span style="color: rgba(0, 0, 255, 1)">for</span> API <span style="color: rgba(0, 0, 255, 1)">groups</span><span style="color: rgba(0, 0, 0, 1)">
Using Kubernetes version: v1.</span><span style="color: rgba(128, 0, 128, 1)">18.8</span><span style="color: rgba(0, 0, 0, 1)">
Running pre</span>-<span style="color: rgba(0, 0, 0, 1)">flight checks
: kubelet service is not enabled, please run <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">systemctl enable kubelet.service</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
error execution phase preflight: Some fatal errors occurred:
: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
If you know what you are doing, you can </span><span style="color: rgba(0, 0, 255, 1)">make</span> a check non-fatal with `--ignore-preflight-errors=<span style="color: rgba(0, 0, 0, 1)">...`
To see the stack trace of this error execute with </span>--v=<span style="color: rgba(128, 0, 128, 1)">5</span> or higher</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822221722081-600123311.png" alt="" loading="lazy"></p>
<p>检查前面的内核参数是否修改<br>net.ipv4.ip_forward = 1<br>net.bridge.bridge-nf-call-ip6tables = 1<br>net.bridge.bridge-nf-call-iptables = 1</p>
<h2>4.3 kubelet-check健康检查报错</h2>
<div class="cnblogs_code">
<pre> The HTTP call equal to <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">curl -sSL http://localhost:10248/healthz</span><span style="color: rgba(128, 0, 0, 1)">'</span> failed with error: Get http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">localhost:10248/healthz: dial tcp: lookup localhost on 198.18.254.40:53: no such host.</span>
It seems like the kubelet isn<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t running or healthy.</span>
The HTTP call equal to <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">curl -sSL http://localhost:10248/healthz</span><span style="color: rgba(128, 0, 0, 1)">'</span> failed with error: Get http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">localhost:10248/healthz: dial tcp: lookup localhost on 198.18.254.40:53: no such host.</span>
It seems like the kubelet isn<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t running or healthy.</span>
The HTTP call equal to <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">curl -sSL http://localhost:10248/healthz</span><span style="color: rgba(128, 0, 0, 1)">'</span> failed with error: Get http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">localhost:10248/healthz: dial tcp: lookup localhost on 198.18.254.40:53: no such host.</span>
It seems like the kubelet isn<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t running or healthy.</span>
The HTTP call equal to <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">curl -sSL http://localhost:10248/healthz</span><span style="color: rgba(128, 0, 0, 1)">'</span> failed with error: Get http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">localhost:10248/healthz: dial tcp: lookup localhost on 198.18.254.40:53: no such host.</span>
It seems like the kubelet isn<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t running or healthy.</span>
The HTTP call equal to <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">curl -sSL http://localhost:10248/healthz</span><span style="color: rgba(128, 0, 0, 1)">'</span> failed with error: Get http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">localhost:10248/healthz: dial tcp: lookup localhost on 198.18.254.40:53: no such host.</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822221828178-851987712.png" alt="" loading="lazy"></p>
<p>检查hosts文件,本机地址解析是否被删除了<br>127.0.0.1 localhost</p>
<h2>4.4 查看组件处于不健康状态</h2>
<div class="cnblogs_code">
<pre># kubectl get cs</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822221913290-1107873216.png" alt="" loading="lazy"></p>
<p>发现controller-manager和scheduler状态是不健康<br>如果节点都处于Ready后,实际上该状态是不影响的。<br>因为kubeadm v1.18.6及以后的版本,是默认不开启controller-manager的10252和scheduler的10251端口的,一般10251和10252是监听在http上面,不需要证书认证,属于不安全的端口。<br>查看机器监听端口,发现默认这两个端口没有监听</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822221938422-1032104809.png" alt="" loading="lazy"></p>
<p>可以将/etc/kubernetes/manifests/kube-controller-manager.yaml、/etc/kubernetes/manifests/kube-scheduler.yaml中--port=0注释掉,再次kubect get cs组件状态,这时都是ok了。<br>默认不监听http端口,但是客户端查看组件状态有默认是检查http端口,不知道这算不算是kuberadm的一个小bug呢,哈哈~~~</p>
<h2>4.5 worker节点加入集群后长期处于NotReady</h2>
<p>查看node</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822222020345-733421768.png" alt="" loading="lazy"></p>
<p>查看pod状态,kube-proxy一直处于创建状态,网络组件calico一直处于初始化</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822222041160-868675984.png" alt="" loading="lazy"></p>
<p>kubect describe pod查看报错:FailedCreatePodSandBox</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822222109111-1638202310.png" alt="" loading="lazy"></p>
<p>说明节点没有pull基础镜像pause,到相应节点上面去拉取pause镜像即可。</p>
<h2>4.6 node节点运行一段时间后出现错误</h2>
<p>查看pod状态</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822222200706-192828345.png" alt="" loading="lazy"></p>
<p> 查看报错的pod,发现cgroup报错</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822222305256-318670946.png" alt="" loading="lazy"></p>
<p> 到node节点查看kubelet也在报错</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822222325142-1294627072.png" alt="" loading="lazy"></p>
<p>原因是docker的驱动改为了systemd,但是kubelet的驱动没有改<br>kubelet的驱动是在kubeadm join初始化的时候与docker保持一致的,docker修改了,kubelet也需要修改</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">sed</span> -i <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s/--cgroup-driver=cgroupfs/--cgroup-driver=systemd/g</span><span style="color: rgba(128, 0, 0, 1)">'</span> /var/lib/kubelet/kubeadm-flags.<span style="color: rgba(0, 0, 255, 1)">env</span><span style="color: rgba(0, 0, 0, 1)">
# systemctl restart kubelet</pre>
</div>
<p>同样如果node节点处于NotReady,kubelet一直在重启,也需要检查kubelet的cgroup驱动是否和docker的一致。</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822222349856-1832979882.png" alt="" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822222403839-263509932.png" alt="" loading="lazy"></p>
<h2>4.7 worker节点加入节点后,网络组件一直不ready,一直重启</h2>
<p>该pod一直处于Running和CrashLoopBackOff交替状态</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822222440167-721009150.png" alt="" loading="lazy"></p>
<p>查看pod日志,发现有大量的健康检查错误</p>
<p><img src="https://img2020.cnblogs.com/blog/1450914/202008/1450914-20200822222501944-465930276.png" alt="" loading="lazy"></p>
<p>到node节点上查看hosts文件,本机地址解析是否被删除了<br>127.0.0.1 localhost</p>
<h1>参考文档</h1>
<p>https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/<br>https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/</p>
<p> </p>
<p><strong>全剧终</strong></p>
<p> </p>
<p> </p>
<h2> </h2>
<p> </p><br><br>
来源:https://www.cnblogs.com/technology178/p/13547342.html
頁:
[1]