VirtualBox(vagrant) + k8s单节点(只有master)
在生产环境中,建议k8s使用至少三个节点的集群,以确保高可用性。不过也可以在单节点上安装和运行集群,方便用于学习和测试目的。但因为所有组件都在同一个节点上运行,它不具备高可用性和故障恢复功能。由于内存资源分配不够等原因,本博客记录单节点k8s部署流程。
前言:在生产环境中,建议k8s使用至少三个节点的集群,以确保高可用性。不过也可以在单节点上安装和运行集群,方便用于学习和测试目的。但因为所有组件都在同一个节点上运行,它不具备高可用性和故障恢复功能。
由于内存资源分配不够等原因,本博客记录单节点k8s部署流程。
一、实验环境
操作系统
Windows 10
涉及版本
Docker 19.03.6
Kubernetes 1.17.3
kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
Kubesphere 3.0.0
一些工具
VirtualBox-6.0.10-132072-Win
Vagrant_2.2.19_x86_64
Git for Windows
Xshell7
Xftp7
二、准备工作:Win10下基于VirtualBox+Vagrant的Linux环境搭建
1、下载并安装Virtualbox
Download_Old_Builds_6_0 – Oracle VM VirtualBox
版本选择:VirtualBox-6.0.10-132072-Win
2、下载并安装Vagrant
Install Vagrant Install or update to v2.2.19 of Vagrant to get started.
版本选择:vagrant_2.2.19_x86_64
下载后安装,没有太多问题
唯一可能遇到的问题:CPU需要开启虚拟化
3、编写Vagrantfile
文件命名为Vagrantfile,放在全英文路径文件夹下
Vagrant.configure("2") do |config|
# 设置虚拟机的Box
config.vm.box = "centos/7"
config.vm.define "k8s-node" do |node|
# 设置虚拟机的主机名
node.vm.hostname = "k8s-node"
node.vm.provider "virtualbox" do |vb|
# 设置虚拟机的内存大小
vb.memory = 4096
# 设置虚拟机的CPU个数
vb.cpus = 4
end
# 设置虚拟机的IP
node.vm.network "private_network", ip: "192.168.56.100"
end
end
注意:IP不是随意设置,需要ipconfig
查询VirtualBox IP配置
4、Git Bash中使用vagrant up命令
在Vagrantfile的文件夹右键选择Git Bash Here
执行vagrant up
命令
打开virtualbox可以看到正在运行的虚拟机
文件夹中会生成.vagrant文件
除了Vagrantfile,其它文件都是目前阶段暂时不需要的
可能遇到的问题
1、需要在非中文无空格目录下
2、没有Gitbash直接在文件目录使用cmd命令行也可以
3、其实 vagrant 完全可以一键部署全部 k8s 集群。参考下面两个链接
kubernetes-vagrant-centos-cluster
k8s-playground
5、vagrant ssh连接至k8s-node
使用vagrant ssh k8s-node
连接
并su root
切换到root
密码是vagrant
6、开启root的密码访问权限
修改文件vi /etc/ssh/sshd_config
找到PasswordAuthentication并将no修改成yes
i进入insert模式
esc :wq 退出并保持
重启服务service sshd restart
6、使用Xshell7连接到k8s-node
使用两次exit;
即可退出
打开Xshell7,连接192.168.56.100
输入用户名root密码vagrant
记住用户名密码
6、设置linux环境
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
关闭 selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
关闭 swap:
swapoff -a 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab 永久
free -g 验证,swap 必须为 0;
添加主机名与 IP 对应关系
vi /etc/hosts
10.0.2.15 k8s-node
将桥接的 IPv4 流量传递到 iptables 的链:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
一些问题
1、开启CPU虚拟化
具体开启方法需要确认你的计算机型号和CPU、BIOS的型号
过老的计算机是不支持虚拟化技术的
一般虚拟化都是开启的
2、虚拟机名称过长
解决方法:
3、vagrant up时一直卡在 SSH auth method: private key
报错信息如下:
Timed out while waiting for the machine to boot. This means that Vagrant was unable to communicate with the guest machine within the configured ("config.vm.boot_timeout" value) time period.
If you look above, you should be able to see the error(s) that Vagrant had when attempting to connect to the machine. These errors are usually good hints as to what may be wrong.
If you're using a custom box, make sure that networking is properly working and you're able to connect to the machine. It is a common problem that networking isn't setup properly in these boxes. Verify that authentication configurations are also setup properly, as well.
If the box appears to be booting properly, you may want to increase the timeout ("config.vm.boot_timeout") value.
这个错误表示 Vagrant 在配置的超时时间内无法与虚拟机通信
一般是因为VirtualBox和Vagrant版本不适配
可以尝试升级 Vagrant 版本或VirtualBox版本
三、所有节点安装docker、kubeadm、kubelet、kubectl
1、安装Docker -CE
卸载系统之前的 docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装必须的依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
设置 docker repo 的 yum 位置
sudo yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安装 docker,以及 docker-cli
yum install docker-ce-19.03.6 docker-ce-cli-19.03.6 containerd.io
2、配置镜像加速
配置 docker 加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ke9h1pt4.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3、启动Docker && 设置docker开机启动
启动 docker & 设置 docker 开机自启
systemctl enable docker
4、添加阿里云Yum源
添加阿里云 yum 源
$ cat > /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
5、安装kubeadm,kubelet和kubectl
安装 kubeadm,kubelet 和 kubectl
yum list|grep kube
yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
systemctl enable kubelet
6、开机启动
开机启动
systemctl start kubelet
7、查看kubelet的状态
检查kubelet服务
systemctl status kubelet.service
三、部署k8s-master
直接执行kubeadm init,会由于墙的网络原因失败,如下图
因此先执行master_images.sh文件
1、创建并执行master_images.sh
#!/bin/bash
images=(
kube-apiserver:v1.17.3
kube-proxy:v1.17.3
kube-controller-manager:v1.17.3
kube-scheduler:v1.17.3
coredns:1.6.5
etcd:3.4.3-0
pause:3.1
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
done
查看创建的master_images.sh权限
ls
ll
添加权限chmod 700 master_images.sh
执行master_images.sh文件
./master_images.sh
2、初始化kubeadm
查看IP
ip route show
我的IP是10.0.2.15,如果不一样需要更改下面命令中的IP地址
master 节点初始化
kubeadm init \
--apiserver-advertise-address=10.0.2.15 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
测试 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果有多个节点需要kubeadm join加入
我这里只有一个节点因此不需要
具体令牌根据初始化给出的提示即可,如下图
kubeadm join 10.0.2.15:6443 --token 8mldxi.oxlzlcbcc1a35i6j \
> --discovery-token-ca-cert-hash sha256:67a5bc5efa82acc47f1fb943821ebaa5a9ce698fbf4248511a3d0d365c99d5a7
3、安装POD网络插件(CNI)
网络插件有很多,这里选择flannel
k8s插件集合
获取flannel的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
查看安装的状态
kubectl get pods --all-namespaces
一些问题
1、kube-system的coredns一直处于Pending状态
通过查阅官方文档,发现这是预期之中的
官方文档
coredns一直pending肯定是网络插件原因
但是我在flannel已经running的情况下,仍然coredns跑不起来
查看coredns的pod日志
kubectl describe pod -n kube-system coredns
报错如下
0/1 nodes are available: 1 node(s) had taints that the pod didn‘t tolerate.
这是因为master有污点
kubectl taint nodes --all node-role.kubernetes.io/master-
继续查看日志,这时正常报错
[failed to find plugin "flannel" in path [/opt/cni/bin]]
network plugin is not ready: cni config uninitialized
这是因为在1.0.0版本后CNI Plugins中没有flannel,查看 /opt/cni/bin 缺少 flannel
需要下载CNI插件
github下载地址:CNI plugins v0.8.6
下载后上传到Linux解压即可
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz
复制 flannel 到 /opt/cni/bin/
cp flannel /opt/cni/bin/
再次查看节点状态,恢复正常
2、swap只是临时禁用
报错
The connection to the server 10.0.2.15:6443 was refused
查看日志
journalctl -fu kubelet
running with swap on is not supported. Please disable swap.
发现很明显是swap的问题,因为只是临时禁用了swap,因此下次启动时,需要再次关闭
运行以下命令即可永久禁用swap
# 禁用swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
禁用Swap,机器重启后不生效
swapoff -a
cp -p /etc/fstab /etc/fstab.bak$(date '+%Y%m%d%H%M%S')
sed -i "s/\/dev\/mapper\/centos-swap/\#\/dev\/mapper\/centos-swap/g" /etc/fstab
systemctl daemon-reload
systemctl restart kubelet
更多推荐
所有评论(0)