踩坑记:基于virtualbox搭建k8s集群+ingress+dashboard
主要的坑列表:
- 集群节点间不会共享镜像
- 初始化集群要加上版本号
- ingress双网卡问题
- dashboard证书问题
- ingress代理dashboard
虚拟机创建
主要注意点是网卡的选择,不要选择网上教程常见的NAT+Host-only双网卡的模式,否则可能因为默认网卡为NAT,使得虚拟机之间无法连通,出现难以配置或难以排查的莫名奇妙问题
VirtualBox网卡类型对比-官网文档
网卡选择:由上图可知,选择NAT Network(不是NAT),或者Bridged,使得只需要单张网卡,就实现虚拟机之间、虚拟机和宿主机、虚拟机和外网都可以连通
NAT Network先通过全局配置创建一个适配器,然后创建虚拟机时才能选择
NAT Network配置宿主机和虚拟机连通:在全局配置中的NAT Network适配器设置端口转发,然后通过ssh won@localhost -p 转发端口
登陆
集群创建
官网文档大体步骤:
- 关闭交换区
- 安装docker-ce、kubelet、kubeadm、kubectl
- 在主节点初始化集群
- 安装网络插件
- 把主节点设为可参与工作调度
- 把工作节点加入集群
最好每个节点都配置docker和k8s的阿里云镜像
坑1:初始化集群前,在所有的节点上手动下载所需的gcr镜像,用kubeadm config images list
命令可列出所需的镜像列表
- gcr镜像被屏蔽,需要通过国内镜像站手动下载,并修改tag。可以选择Azure镜像站下载
- 集群节点间不会共享已下载镜像,各自联网下载,因此需要到每个节点手动下载gcr镜像
坑2:初始化集群命令要加上kubelet版本号(--kubernetes-version):否则会通过已被屏蔽的链接联网查询版本号
安装ingress
- 安装基于nginx实现的ingress controller:选择裸金属安装方式
- 配置ingress资源类型:配置代理规则
ingress安装后能否成功使用,与之前选择的虚拟机网卡类型有关系,如果选择双网卡,根据官网教程安装后还不能直接使用,我在此卡住很久
安装dashboard
官网文档
- 安装dashboard
- 创建用户
服务类型改为NodePort
以上两个步骤只能使用kubectl proxy的方式访问,不适合长期使用,可直接将yaml文件中service类型设为NodePort,然后便可使用节点IP直接访问
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
# 设置服务类型
type: NodePort
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
pod启动报错“panic: Get "xxx/kubernetes-dashboard-csrf": dial tcp 10.43.0.1:443: connect: no route to host”
关闭防火墙
证书问题使得chrome无法访问
,要注意此博文中安装证书时使用的命名空间是kube-system,但最新的dashboard的命名空间是kubernetes-dashboard,因此要相应改一下
- 创建自签证书,其中CN参数使用主节点的IP
- 删除dashboard自建的证书kubernetes-dashboard-certs
- 导入自签证书证书,名称和命名空间以dashboard的自建证书要一致
- 重启dashboard pod
一些具体操作命令
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
sudo systemctl enable docker && sudo systemctl start docker
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat </etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
sudo systemctl enable kubelet && sudo systemctl start kubelet
# 主节点
# 列出所需镜像,手动从az下载镜像
kubeadm config images list
必须指定版本,否则会自动下载镜像
若报需要关闭swap,则先执行一下关闭swap命令,不用重启
kubeadm init --kubernetes-version=v1.17.0 --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.56.105
# 子节点
把主节点的所有镜像打包并加载到子节点上,否则子节点和主节点一样,会无法下载镜像,导致节点的状态一直为NotReady
导出镜像
docker save $(docker images -q) -o /path/to/save/mydockersimages.tar
导出镜像tag
docker images | sed '1d' | awk '{print $1 " " $2 " " $3}' > mydockersimages.list
加载镜像
docker load -i /path/to/save/mydockersimages.tar
导入tag
while read REPOSITORY TAG IMAGE_ID
do
echo "== Tagging $REPOSITORY $TAG $IMAGE_ID =="
docker tag "$IMAGE_ID" "$REPOSITORY:$TAG"
done < mydockersimages.list
加入集群
kubeadm join 192.168.56.105:6443 --token d1zs9d.rmm4x30h8pa2z8sl \
--discovery-token-ca-cert-hash sha256:8d81dd7af402a41119d1e243ddd88b25ba91df11defa75bc91eb1de1a82a1f61