由于还是学生没有这么多钱买服务器,所以只能混着用啦。
如果全部用的是虚拟机的话正常部署就行,本文主要是解决如何把k8s部署在服务器的公网ip上,让虚拟机的node节点能添加进来(虚拟机没有公网ip,一般只有内网的ip)
环境
两台ubuntu18.04的虚拟机,一台Ubuntu18.04的服务器
由于虚拟机会使用dhcp,导致IP地址会不断变化,因此需要设置静态ip
下面一系列操作最好使用root来操作
准备工作
设置静态ip
先使用这个命令来查看当前网络的网关,记着当前的网关
route -n
然后去设置静态路由
vim /etc/netplan/01-network-manager-all.yaml
进入后按照下面模板来修改
network:
ethernets:
ens33:
addresses: [xxx.xxx.xxx.xxx/24] #设置固定ip
gateway4: xxx.xxx.xxx.xxx #此处为上面查看到的网关
dhcp4: no #关闭动态分配ip
optional: true
nameservers:
addresses: [8.8.8.8,8.8.4.4]
version: 2
renderer: NetworkManager
最后通过命令
netplan apply
使上面的修改生效
其它准备工作
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭selinux(先执行setenceforce 0,若第一次执行失败,按照提示下载对应的deb再执行即可)
setenforce 0 # 临时
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
上面的永久命令里可能selinux里面的不一定使config,根据个人情况修改
关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
将桥接的IPv4流量传递到iptables的链
vim /etc/sysctl.d/k8s.conf
在文件里面输入
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
保存退出后执行
sysctl --system # 生效
开始搭建
配置host
执行命令
vim /etc/hosts
输入
作为master的服务器的ip k8smaster
作为第一个node节点的ip k8snode1
作为第二个node节点的ip k8snode2
设置主机名
hostnamectl set-hostname <hostname>
安装基础组件
下载docker
apt-get update
apt-get install docker.io
下载完成后输入
docker --version
若显示版本号则证明下载成功
配置安装源地址
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
vim /etc/apt/sources.list.d/kubernetes.list
在文件里输入
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
然后执行
apt-get update
安装kubeadm,kubelet和kubectl
master和node均要
这里特别注意版本的对应关系,我这里安装的都是1.18.0,一开始我安装的是1.23.6,在kubeadm init的时候出现的
[kubelet-check] Initial timeout of 40s passed.
无法解决,每个版本有不同的解决办法
注意版本不能低于1.13.0,但也不能高于1.24.0,好像是1.24.0后kubernetes不支持docker了
可以使用命令
apt-cache madison package
查看要安装的包的版本
apt-get install -y kubelet=1.18.0-00 kubeadm=1.18.0-00 kubectl=1.18.0-00
然后输入以下命令,不然在初始化时有可能会报错
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}
重启docker
systemctl daemon-reload
systemctl restart docker
master初始化
kubeadm init \
--apiserver-advertise-address=you master ip \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
该命令如果是按照本文的版本号进行操作,会出现以下错误,(其它版本可参考)
在输入上述命令后,kubeadm即开始了master节点的初始化,但是由于etcd配置文件不正确,所以etcd无法启动,要对etcd.yaml文件进行修改。
这里需要注意 etcd.yaml文件是在kubeadm init命令执行才会出现的,所以需要你再打开另一个master的ssh窗口,一个窗口在执行kubeadm init,立马切到另外一个窗口,找到etcd.yaml文件,命令:
vim /etc/kubernetes/manifests/etcd.yaml
此处"43.143.65.53"为master公网ip,要关注的是"–listen-client-urls"和"–listen-peer-urls"。需要把–listen-client-urls后面的公网IP删除,把–listen-peer-urls改成127.0.0.1:2380
出现如下结果则说明初始化成功
此时执行下列命令来创建集群
# 若此时已经是root下执行的就不需要加sudo
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
接着执行
kubectl get nodes
即可看到当前集群下的节点
加入节点
在node节点执行刚刚初始化成功最后显示的那一串命令,即kubeadm join …,如果忘了可以在master中执行以下命令来查看
kubeadm token create --print-join-command