kubeadm HA master(v1.14.0)离线包 + 自动化脚本 + 常用插件 For Centos/Fedora
<p>关于kubernetes v1.14.0:</p><p>kubeadm开始建议使用systemd作为节点的cgroup控制器,因此建议读者参考本文流程配置docker为使用systemd,而非默认的Cgroupfs。<br>kubelet额外的引入了对conntrack的依赖。<br>Linux 5.0.x版内核已被支持。</p>
<p><br>关于其他plugins:<br>本次release集成的是calico3.5.3版本,使用host-local模式ipam。最新版的calico(3.6.0)中,calico-ipam功能已经成熟并在官方manifest中默认启用,然而3.6.0存在一些问题因而没能通过我的部署测试。<br>本次release集成的traefik是最新的稳定版本1.7.9,traefik:2.0已经发布,但尚处于alpha2测试阶段。<br>我在项目的feature-prom-rook分支添加了Rook和Prometheus的测试yaml,读者有兴趣的话可以试用一下。<br>理论上升级内核并不是必要的</p>
<p>本文中出现的全部下载连接见下表:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">文件名 下载链接 提取码 MD5
helm</span>-v2.<span style="color: rgba(128, 0, 128, 1)">13.1</span>-linux-<span style="color: rgba(0, 0, 0, 1)">amd64.tar.gz 百度盘 crv5 ffbe37fe328d99156d14a950bbd8107c
k8s</span>-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span>-<span style="color: rgba(0, 0, 0, 1)">rpms.tgz 百度盘 okdg 7cccc6b10e17a6c640baced768aab274
k8s</span>-repo-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span><span style="color: rgba(0, 0, 0, 1)"> 百度盘 88ua 96af3a2da51460f8e51321e15094fdd2
kernel</span>-ml-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">4</span>.tgz 百度盘 twl3 8e546a243f6fd5ca3ebe1d30079d2bac</pre>
</div>
<p>本文中的自动化部署脚本可以在Lentil1016/kubeadm-ha找到,欢迎Star/Fork/提issue和PR。</p>
<p>升级过程的录像可以在本链接查看</p>
<p>集群方案:</p>
<div class="cnblogs_code">
<pre>发行版:CentOS <span style="color: rgba(128, 0, 128, 1)">7</span> & Fedora <span style="color: rgba(128, 0, 128, 1)">29</span><span style="color: rgba(0, 0, 0, 1)">
容器运行时:Docker</span>-<span style="color: rgba(128, 0, 128, 1)">18.09</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(0, 0, 0, 1)">ce
内核: </span><span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(128, 0, 128, 1)">200</span><span style="color: rgba(0, 0, 0, 1)">.fc29.x86_64
版本:Kubernetes: </span><span style="color: rgba(128, 0, 128, 1)">1.14</span>.<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
网络方案: Calico v3.</span><span style="color: rgba(128, 0, 128, 1)">5.3</span><span style="color: rgba(0, 0, 0, 1)">
kube</span>-<span style="color: rgba(0, 0, 0, 1)">proxy mode: IPVS
master高可用方案:keepalived LVS
DNS插件: CoreDNS </span><span style="color: rgba(128, 0, 128, 1)">1.3</span>.<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
metrics插件:metrics</span>-server v0.<span style="color: rgba(128, 0, 128, 1)">3.1</span><span style="color: rgba(0, 0, 0, 1)">
dashboard:kubernetes</span>-dashboard v1.<span style="color: rgba(128, 0, 128, 1)">10.1</span><span style="color: rgba(0, 0, 0, 1)">
ingress控制器:traefik </span><span style="color: rgba(128, 0, 128, 1)">1.7</span>.<span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">
helm </span>& tiller:v2.<span style="color: rgba(128, 0, 128, 1)">13.1</span></pre>
</div>
<p>0x01 Kubernetes集群搭建<br>集群结构摘要<br>此处为举列说明,假定各个机器的主机信息以及IP分布如下,需要额外说明的是,由于私有仓库需要占用80端口,与ingress controller冲突,因此为私有仓库单独准备一台机器是必要的:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Host Name Role IP</span><span style="color: rgba(0, 0, 0, 1)">
centos</span>-<span style="color: rgba(128, 0, 128, 1)">7</span>-x86-<span style="color: rgba(128, 0, 128, 1)">64</span>-<span style="color: rgba(128, 0, 128, 1)">29</span>-<span style="color: rgba(128, 0, 128, 1)">80</span> master-<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.132</span><span style="color: rgba(0, 0, 0, 1)">
centos</span>-<span style="color: rgba(128, 0, 128, 1)">7</span>-x86-<span style="color: rgba(128, 0, 128, 1)">64</span>-<span style="color: rgba(128, 0, 128, 1)">29</span>-<span style="color: rgba(128, 0, 128, 1)">81</span> master-<span style="color: rgba(128, 0, 128, 1)">2</span> <span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.133</span><span style="color: rgba(0, 0, 0, 1)">
centos</span>-<span style="color: rgba(128, 0, 128, 1)">7</span>-x86-<span style="color: rgba(128, 0, 128, 1)">64</span>-<span style="color: rgba(128, 0, 128, 1)">29</span>-<span style="color: rgba(128, 0, 128, 1)">82</span> master-<span style="color: rgba(128, 0, 128, 1)">3</span> <span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.134</span><span style="color: rgba(0, 0, 0, 1)">
– Virtual IP </span><span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.119</span><span style="color: rgba(0, 0, 0, 1)">
node1 worker </span><span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.129</span><span style="color: rgba(0, 0, 0, 1)">
node2 worker </span><span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.130</span><span style="color: rgba(0, 0, 0, 1)">
node3 worker </span><span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.131</span></pre>
</div>
<p>进行系统配置</p>
<p>在所有机器上下载内核rpm包,并且执行下面的脚本,配置注记:</p>
<p>关闭防火墙、selinux<br>关闭系统的Swap,Kubernetes 1.8开始要求。<br>关闭linux swap空间的swappiness<br>配置L2网桥在转发包时会被iptables的FORWARD规则所过滤,该配置被CNI插件需要,更多信息请参考Network Plugin Requirements(https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#network-plugin-requirements)</p>
<p>升级内核到最新,原因见issue#19(https://github.com/Lentil1016/kubeadm-ha/issues/19)<br>开启IPVS<br>如果发现elrepo-kernel源中的内核版本过高或过低,无法满足要求,可以使用下面测试过的5.0.4版本rpm包:</p>
<p># 所有主机:基本系统配置</p>
<div class="cnblogs_code">
<pre># 关闭Selinux/<span style="color: rgba(0, 0, 0, 1)">firewalld
systemctl stop firewalld
systemctl disable firewalld
setenforce </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
sed </span>-i <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">s/SELINUX=enforcing/SELINUX=disabled/g</span><span style="color: rgba(128, 0, 0, 1)">"</span> /etc/selinux/<span style="color: rgba(0, 0, 0, 1)">config
# 关闭交换分区
swapoff </span>-<span style="color: rgba(0, 0, 0, 1)">a
yes </span>| cp /etc/fstab /etc/<span style="color: rgba(0, 0, 0, 1)">fstab_bak
cat </span>/etc/fstab_bak |grep -v swap > /etc/<span style="color: rgba(0, 0, 0, 1)">fstab
# 设置网桥包经IPTables,core文件生成路径
echo </span><span style="color: rgba(128, 0, 0, 1)">"""
</span>vm.swappiness = <span style="color: rgba(128, 0, 128, 1)">0</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)">
net.ipv4.conf.all.rp_filter </span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
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(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)"> > /etc/sysctl.conf</span>
sysctl -<span style="color: rgba(0, 0, 0, 1)">p
# 同步时间
yum install </span>-<span style="color: rgba(0, 0, 0, 1)">y ntpdate
ntpdate </span>-<span style="color: rgba(0, 0, 0, 1)">u ntp.api.bz
# 升级内核
rpm </span>-Uvh http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm ;yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y</span>
<span style="color: rgba(0, 0, 0, 1)">
# 检查默认内核版本是否大于4.</span><span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)">,否则请调整默认启动参数
grub2</span>-<span style="color: rgba(0, 0, 0, 1)">editenv list
#重启以更换内核
reboot
# 确认内核版本后,开启IPVS
uname </span>-<span style="color: rgba(0, 0, 0, 1)">a
cat </span>> /etc/sysconfig/modules/ipvs.modules <<<span style="color: rgba(0, 0, 0, 1)">EOF
#</span>!/bin/<span style="color: rgba(0, 0, 0, 1)">bash
ipvs_modules</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> kernel_module <span style="color: rgba(0, 0, 255, 1)">in</span> \${ipvs_modules}; <span style="color: rgba(0, 0, 255, 1)">do</span>
/sbin/modinfo -F filename \${kernel_module} > /dev/<span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(128, 0, 128, 1)">2</span>>&<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> [ $? -eq <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> ]; then
</span>/sbin/<span style="color: rgba(0, 0, 0, 1)">modprobe \${kernel_module}
fi
done
EOF
chmod </span><span style="color: rgba(128, 0, 128, 1)">755</span> /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod |<span style="color: rgba(0, 0, 0, 1)"> grep ip_vs
安装配置Docker
Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信,因此docker安装完成后,还需要手动修改iptables规则。
# 所有主机:安装配置docker
# 安装docker
yum install </span>-y yum-utils device-mapper-persistent-<span style="color: rgba(0, 0, 0, 1)">data lvm2
yum</span>-config-<span style="color: rgba(0, 0, 0, 1)">manager \
</span>--add-<span style="color: rgba(0, 0, 0, 1)">repo \
https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">download.docker.com/linux/centos/docker-ce.repo</span>
<span style="color: rgba(0, 0, 0, 1)">
yum makecache fast
yum install </span>-y docker-<span style="color: rgba(0, 0, 0, 1)">ce
# 编辑systemctl的Docker启动文件和配置文件
sed </span>-i <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT</span><span style="color: rgba(128, 0, 0, 1)">"</span> /usr/lib/systemd/system/<span style="color: rgba(0, 0, 0, 1)">docker.service
mkdir </span>-p /etc/<span style="color: rgba(0, 0, 0, 1)">docker
cat </span>> /etc/docker/daemon.json <<<span style="color: rgba(0, 0, 0, 1)">EOF
{
</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)">log-driver</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)">json-file</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)">log-opts</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)">max-size</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)">100m</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)">storage-driver</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)">overlay2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
EOF
# 启动docker
systemctl daemon</span>-<span style="color: rgba(0, 0, 0, 1)">reload
systemctl enable docker
systemctl start docker
安装私有镜像库
如果不能FQ,需要使用本文提供的私有镜像源,则还需要为docker做如下配置,将K8s官方镜像库的几个域名设置为insecure</span>-<span style="color: rgba(0, 0, 0, 1)">registry,然后设置hosts使它们指向私有源。
# 所有主机:http私有源配置
# 额外为Docker配置私有源
cat </span>> /etc/docker/daemon.json <<<span style="color: rgba(0, 0, 0, 1)">EOF
{
</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(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">harbor.io</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)">k8s.gcr.io</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)">gcr.io</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)">quay.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)">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)">log-driver</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)">json-file</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)">log-opts</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)">max-size</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)">100m</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)">storage-driver</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)">overlay2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
EOF
systemctl restart docker
# 下载镜像,我把相关镜像上传到dockhub上,执行下面脚本
cat </span>> pull_images.sh <<<span style="color: rgba(0, 0, 0, 1)">EOF
#</span>! /bin/<span style="color: rgba(0, 0, 0, 1)">sh
</span><span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span> kube-proxy:v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span> kube-controller-manager:v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span> kube-scheduler:v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span> kube-apiserver:v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span> coredns:<span style="color: rgba(128, 0, 128, 1)">1.3</span>.<span style="color: rgba(128, 0, 128, 1)">1</span> etcd:<span style="color: rgba(128, 0, 128, 1)">3.3</span>.<span style="color: rgba(128, 0, 128, 1)">10</span> pause:<span style="color: rgba(128, 0, 128, 1)">3.1</span> traefik:<span style="color: rgba(128, 0, 128, 1)">1.7</span>.<span style="color: rgba(128, 0, 128, 1)">9</span> addon-resizer:<span style="color: rgba(128, 0, 128, 1)">1.8</span>.<span style="color: rgba(128, 0, 128, 1)">4</span> metrics-server-amd64:v0.<span style="color: rgba(128, 0, 128, 1)">3.1</span> kubernetes-dashboard-amd64:v1.<span style="color: rgba(128, 0, 128, 1)">10.1</span>
<span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
docker pull kangkangluma</span>/k8s-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span>-<span style="color: rgba(0, 0, 0, 1)">$i
docker tag kangkangluma</span>/k8s-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span>-$i k8s.gcr.io/<span style="color: rgba(0, 0, 0, 1)">$i
docker rmi kangkangluma</span>/k8s-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span>-<span style="color: rgba(0, 0, 0, 1)">$i
done
</span><span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span> node:v3.<span style="color: rgba(128, 0, 128, 1)">5.3</span> cni:v3.<span style="color: rgba(128, 0, 128, 1)">5.3</span>
<span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
docker pull kangkangluma</span>/k8s-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span>-<span style="color: rgba(0, 0, 0, 1)">$i
docker tag kangkangluma</span>/k8s-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span>-$i quay.io/calico/<span style="color: rgba(0, 0, 0, 1)">$i
docker rmi kangkangluma</span>/k8s-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span>-<span style="color: rgba(0, 0, 0, 1)">$i
done
EOF
sh pull_images.sh
安装配置kubernetes
基本安装
下载文件:
k8s</span>-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span>-<span style="color: rgba(0, 0, 0, 1)">rpms.tgz 百度盘 okdg 7cccc6b10e17a6c640baced768aab274
并放置在k8s各个master和worker主机上
# master </span>&<span style="color: rgba(0, 0, 0, 1)"> worker:安装kubernetes
yum install </span>-<span style="color: rgba(0, 0, 0, 1)">y socat keepalived ipvsadm conntrack
cd </span>/path/to/downloaded/<span style="color: rgba(0, 0, 0, 1)">file
tar </span>-xzvf k8s-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span>-<span style="color: rgba(0, 0, 0, 1)">rpms.tgz
cd k8s</span>-v1.<span style="color: rgba(128, 0, 128, 1)">14.0</span><span style="color: rgba(0, 0, 0, 1)">
rpm </span>-Uvh * --<span style="color: rgba(0, 0, 0, 1)">force
systemctl enable kubelet
kubeadm version </span>-o <span style="color: rgba(0, 0, 255, 1)">short</span><span style="color: rgba(0, 0, 0, 1)">
配置免密码登陆
# master</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">:生成ssh密钥对
ssh</span>-<span style="color: rgba(0, 0, 0, 1)">keygen
# 三次回车后,密钥生成完成
cat </span>~/.ssh/<span style="color: rgba(0, 0, 0, 1)">id_rsa.pub
# 得到该机器的公钥如下图</span></pre>
</div>
<p> </p>
<p><br>将该公钥复制,并分别登陆到master-1 master-2 master-3的root用户,将它令起一行粘贴到 ~/.ssh/authorized_keys 文件中,包括master-1自己</p>
<p>复制完成后,从master-1上分别登陆master-1 master-2 master-3测试是否可以免密码登陆(请不要跳过这一步),可以的话便可以继续执行下一步</p>
<p>部署HA Master<br>HA Master的部署过程已经自动化,请在master-1上执行如下命令,并注意修改IP</p>
<p># 部署HA master</p>
<p>cd ~/<br> <br># 创建集群信息文件</p>
<div class="cnblogs_code">
<pre>echo <span style="color: rgba(128, 0, 0, 1)">"""
</span>CP0_IP=<span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.132</span><span style="color: rgba(0, 0, 0, 1)">
CP1_IP</span>=<span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.133</span><span style="color: rgba(0, 0, 0, 1)">
CP2_IP</span>=<span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.134</span><span style="color: rgba(0, 0, 0, 1)">
VIP</span>=<span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.119</span><span style="color: rgba(0, 0, 0, 1)">
NET_IF</span>=<span style="color: rgba(0, 0, 0, 1)">eth0
CIDR</span>=<span style="color: rgba(128, 0, 128, 1)">10.244</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(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)"> > ./cluster-info</span>
<span style="color: rgba(0, 0, 0, 1)">
bash </span>-c <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$(curl -fsSL https://raw.githubusercontent.com/Lentil1016/kubeadm-ha/1.14.0/kubeha-gen.sh)</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p># 该步骤将可能持续2到10分钟,在该脚本进行安装部署前,将有一次对安装信息进行检查确认的机会<br>可以在本链接查看我在自己的环境上安装全过程的录像,安装结束后会打印出如下的信息,最后一行为加入集群的命令。</p>
<p> </p>
<p>访问dashboard<br>如果需要访问kubernetes dashboard或traefik dashboard,只需要在浏览器所在机器上配置到任意master的hosts解析,然后访问对应域名即可。</p>
<div class="cnblogs_code">
<pre>echo <span style="color: rgba(128, 0, 0, 1)">"""
</span><span style="color: rgba(128, 0, 128, 1)">172.18</span>.<span style="color: rgba(128, 0, 128, 1)">128.119</span> dashboard.multi.io ingress.multi.io<span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)"> >> /etc/hosts</span></pre>
</div>
<p><br>测试发现有时kubernetes dashboard容器会不响应请求,如果出现该情况请尝试删除dashboard的pod以重新启动该pod,即可解决该问题。</p>
<p>安装helm<br>如果需要安装helm,请先下载离线包:</p>
<div class="cnblogs_code">
<pre>helm-v2.<span style="color: rgba(128, 0, 128, 1)">13.1</span>-linux-<span style="color: rgba(0, 0, 0, 1)">amd64.tar.gz 百度盘 crv5 ffbe37fe328d99156d14a950bbd8107c
cd </span>/path/to/helm-v2.<span style="color: rgba(128, 0, 128, 1)">13.1</span>-linux-amd64.tar.gz/<span style="color: rgba(0, 0, 0, 1)">
tar </span>-xzvf helm-v2.<span style="color: rgba(128, 0, 128, 1)">13.1</span>-linux-<span style="color: rgba(0, 0, 0, 1)">amd64.tar.gz
cd linux</span>-<span style="color: rgba(0, 0, 0, 1)">amd64
cp helm </span>/usr/local/<span style="color: rgba(0, 0, 0, 1)">bin
helm init </span>--service-account=kubernetes-dashboard-admin --skip-refresh --<span style="color: rgba(0, 0, 0, 1)">upgrade
helm version
加入work node
现在可以将各节点入编到集群中。join command是由kubeadm动态生成的,其基本形式如下</span></pre>
</div>
<p> </p>
<p># worker:将worker编入集群</p>
<div class="cnblogs_code">
<pre>kubeadm join <span style="color: rgba(128, 0, 128, 1)">10.130</span>.<span style="color: rgba(128, 0, 128, 1)">29.83</span>:<span style="color: rgba(128, 0, 128, 1)">6443</span> --token 4n3hvt.sb8qjmno6l47tsww --discovery-token-ca-cert-hash sha256:a7f1de577bd8677a5d7fe4d765993645ae25d8b52a63a1133b74a595a7bb2e0f</pre>
</div>
<p><br>其中包含了节点入编集群所需要携带的验证token,以防止外部恶意的节点进入集群。每个token自生成起24小时后过期。届时如果需要加入新的节点,则需要重新生成新的join token,请使用下面的命令生成,注意改写IP:</p>
<div class="cnblogs_code">
<pre># master-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">:生成指向VIP的Join Command
kubeadm token create </span>--print-join-command</pre>
</div>
<p><br>随后到worker节点执行刚刚生成的join command即可将该节点编入集群。</p>
<p> </p>
<p>至此,HA master Kubernetes 集群搭建完毕</p><br><br>
来源:https://www.cnblogs.com/malukang/p/11428870.html
頁:
[1]