一、写作目的
出于学习和项目测试目的,想在笔记本上基于虚拟机搭建一个简单的Kubernetes(k8s)集群。没想到因为国内flannel 源服务器集体阵亡,直接使用proxy会导致各种问题,导致我弄了十几个小时,下面给出我的修正方案。由于配置过程很复杂,限于篇幅笔者对一些工具的基本操作(VMware使用、Xshell配置等)会省略,可能没有以前文章那么详细,还请谅解!已经安装好基础设施服务器,并与Windows主机网络互通的,可直接跳转到步骤五
下面给出最终目标:
集群相关:
角色 | ip地址 | 系统环境 |
---|---|---|
master | 192.168.154.10 | centos 7.9.2,基础设施服务器 |
node1 | 192.168.154.11 | centos 7.9.2,基础设施服务器 |
node2 | 192.168.154.12 | centos 7.9.2,基础设施服务器 |
k8s相关版本说明:
Docker | kubeadm | kubectl | kubelet | |
---|---|---|---|---|
版本号 | 18.06.3 | 1.17.4 | 1.17.4 | 1.17.4 |
二、环境准备
- Centos 7.9.2镜像(Centos 7即可,版本尽量满足
下载地址:http://mirrors.163.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso - 代理工具,下面以V2rayN为例
- VMware Workstations Pro 虚拟机(下载最新版即可,限于篇幅,请读者自行安装并激活)
三、Centos基础设施服务器搭建(资源消耗很小,笔者的笔记本6700HQ+16G内存开5个感觉也没问题)
(VMware的使用不是本文的重点,笔者在这里仅对关键位置给出说明。三个虚拟机这里的设置是一样的,硬件配置可以有差异)
- 硬件配置如下(其余默认即可)
磁盘 内存 CPU 40G+ 1G+ 2核心,线程总数不少于2 - 语言选择中文-中国
- “安装位置” 点击去,然后直接点击完成(即默认设置)
- “软件选择” 修改为基础设施服务器
- “网络和主机名” 按照如下步骤修改:
- 分别修改主机名为“master”、“node1”、“node2”,三个虚拟机不要设置为一样了!!
- 进入“配置”-“常规”, 勾选“可用时自动链接到这个网络”
- 查看虚拟机LAN口网段。查看VMware的“编辑”–“虚拟网络编辑器”–“VMnet8”
由图可知,笔者虚拟机LAN网段ip为:192.168.154.*,网关地址为:192.168.154.2(VMware默认网关主机号是2)
进入“配置”-“IPv4设置”,参照步骤三,进行如图所示设置(记得同步修改网段ip,不要照抄)。DNS服务器我们采用阿里DNS:223.5.5.5,保存即可。截图以master主机为例:**
开始安装,点击上面设置root密码。安装完毕后重启即可
四、配置windows主机网络*
确保VMware为主机(windows)分配ip。进入VMware的“编辑”–“虚拟网络编辑器”–“VMnet8”,勾选“将主机虚拟网络适配器连接至此网络”
设置主机的VMnet8虚拟网卡静态ip:192.168.154.1 (根据步骤三中经验,同步修改,不要照抄)
验证是否成功(请确保虚拟机均已经开机)。主机与虚拟机互相ping即可
五、通过Xshell(用户自行下载安装)连接三台虚拟机(非必须,但是笔者推荐这么做,因为Xshell支持多台服务器同时操作,可以加快配置速度)
1 | Centos基础设置服务器默认已经支持ssh,所以不同安装额外操作 |
小技巧:Xshell任意终端右键,勾选“发送键输入到所有会话”,可以将命令在所有终端同步操作,使得我们可以同时配置三台服务器。
六、为k8s初始化Centos(以下操作,可三台服务器同步操作)
有的读者可能直接从这里开始,未避免不必要bug,请尽量确保系统版本为Centos 7.9
1
2# 查看系统版本
cat /etc/redhat-release关闭系统防火墙,并禁止其自启动
1
2
3# 终端键入
systemctl stop firewalld
systemctl disable firewalld配置host表(采用DNS更好,测试/学习为目的,我们可以简单点)
1
2
3
4
5
6# 终端键入
cat >> /etc/hosts << EOF
192.168.18.10 master
192.168.18.11 node1
192.168.18.12 node2
EOF设置网络时间同步
1
2
3
4
5
6# 终端键入
yum install -y ntpdate
ntpdate time.windows.com
# 验证系统时间,键入
date关闭selinux(重启后才会生效,这步暂不重启)
1
2# 终端键入
sed -i 's/enforcing/disabled/' /etc/selinux/config关闭swap分区(重启后才会生效,这步暂不重启)
1 | # 终端键入 |
将桥接的IPv4流量传递到iptables的链
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 在每个节点上将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 加载br_netfilter模块
modprobe br_netfilter
# 查看是否加载
lsmod | grep br_netfilter
# 生效
sysctl --system开启ipvs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 安装
yum -y install ipset ipvsadm
# 修改配置文件
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 授权、运行、检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 检查是否加载
lsmod | grep -e ipvs -e nf_conntrack_ipv4重启三台机器
1 | reboot |
- 验证selinux是否关闭,swap分区是否关闭
1
2
3
4
5# 验证selinux
getenforce
#验证swap分区
free -m
七、配置http proxy(可三台服务器同步操作)
注:笔者所查阅的教程几乎都是采用的国内源,但是最后安装CNI网络时,由于flannel国内源集体阵亡,会导致临门一脚的时候宣告失败。如果读者在安装时fauy.io国内镜像源恢复,可省略略这一步。
Windows代理工具开启局域网代理功能(大部分代理都是支持的),然后在Centos配置系统代理
- 记下底部网络端口,对应地址应该为:“http://192.168.154.1:10809”
- 配置服务器
1 | vim /etc/profile |
代理生效:
1 | source /etc/profile |
如果你想取消proxy,只需要终端键入:
1 | unset http_proxy |
测试proxy
1 | curl www.google.com |
注:全局/Pac是跟随windows自动适应的
- 下面还要再配置docker proxy,否则后面会出现bug代理生效:
1
2
3
4
5
6
7
8mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/http-proxy.conf
# http-proxy.conf内容如下:
[Service]
Environment="HTTP_PROXY=http://192.168.154.1:10809" "NO_PROXY=localhost,127.0.0.1,192.168.154.10,192.168.154.11,192.168.154.12,10.244.0.0/16,docker-registry.somecorporation.com"
1 | sudo systemctl daemon-reload |
验证代理:
1 | systemctl show docker --property Environment |
八、配置Docker****(以下操作,可三台服务器同步操作)
- 安装Docker
1
2
3
4
5
6
7
8wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7
systemctl enable docker && systemctl start docker
# 查看docker版本
docker version
九、安装kubeadm、kubelet和kubectl(以下操作,可三台服务器同步操作)
配置yum镜像源(虽然有代理,不过国内镜像源肯定还是快一点)
1
2
3
4
5
6
7
8
9cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF安装
1
yum install -y --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0
确保Docker使用的cgroup drvier和kubelet使用的cgroup drver一致
1
2
3
4
5vim /etc/sysconfig/kubelet
# 内容如下:
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"设置开机自启动
1
systemctl enable kubelet
十、部署master节点(切勿在node节点设置)
初始化
1
2
3
4
5
6# 应同步修改“192.168.154.10”、“v1.17.4”,其余保持不变
kubeadm init \
--apiserver-advertise-address=192.168.154.10 \
--kubernetes-version v1.17.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16根据提示,键入
1
2
3mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
十一、部署node节点(不要在master节点设置)
在master节点上,键入
1 | kubeadm token create --print-join-command |
系统会输出一条命令,复制并粘贴到node节点运行即可,命令如下(具体命令有差异,仅供参考):
1 | kubeadm join 192.168.154.10:6443 --token 5dkam1.8v4coi4tsvtj7ede --discovery-token-ca-cert-hash sha256:252da6842f1ce2b6b90981111734bff000e0cac551f88cea5ca5155c61e85861 |
运行完毕,在master节点执行
1 | kubectl get nodes |
十二、搭建flannel网络(以下命令仅在master节点执行)
1 | # 如果您的代理没有问题,下面的命令直接执行即可 |
稍等片刻(大概有几十MB的文件下载)。通过如下命令查看进度
1 | kubectl get pods -n kube-system |
如下图所示即为安装完毕:
此时在master查看节点状态
1 | kubectl get nodes |
节点状态为ready即为搭建完毕
十三、部署nginx,测试环境(master节点执行)
1 | kubectl create deployment nginx --image=nginx:1.14-alpine # 创建服务 |
由图可知,外部端口为31547,在主机访问:http://192.168.154.10:31547,能看到如下界面即为成功。
十四、配置kubectl自动补全(可选)
1 | yum install -y bash-completion |