踩坑记:基于virtualbox搭建k8s集群+ingress+dashboard


主要的坑列表:

  1. 集群节点间不会共享镜像
  2. 初始化集群要加上版本号
  3. ingress双网卡问题
  4. dashboard证书问题
  5. ingress代理dashboard

虚拟机创建

主要注意点是网卡的选择,不要选择网上教程常见的NAT+Host-only双网卡的模式,否则可能因为默认网卡为NAT,使得虚拟机之间无法连通,出现难以配置或难以排查的莫名奇妙问题

VirtualBox网卡类型对比-官网文档

网卡选择:由上图可知,选择NAT Network(不是NAT),或者Bridged,使得只需要单张网卡,就实现虚拟机之间、虚拟机和宿主机、虚拟机和外网都可以连通

NAT Network先通过全局配置创建一个适配器,然后创建虚拟机时才能选择

NAT Network配置宿主机和虚拟机连通:在全局配置中的NAT Network适配器设置端口转发,然后通过ssh won@localhost -p 转发端口登陆

集群创建

官网文档大体步骤:

  1. 关闭交换区
  2. 安装docker-ce、kubelet、kubeadm、kubectl
  3. 在主节点初始化集群
  4. 安装网络插件
  5. 把主节点设为可参与工作调度
  6. 把工作节点加入集群

最好每个节点都配置docker和k8s的阿里云镜像

坑1:初始化集群前,在所有的节点上手动下载所需的gcr镜像,用kubeadm config images list命令可列出所需的镜像列表

  1. gcr镜像被屏蔽,需要通过国内镜像站手动下载,并修改tag。可以选择Azure镜像站下载
  2. 集群节点间不会共享已下载镜像,各自联网下载,因此需要到每个节点手动下载gcr镜像

坑2:初始化集群命令要加上kubelet版本号(--kubernetes-version):否则会通过已被屏蔽的链接联网查询版本号

安装ingress

  1. 安装基于nginx实现的ingress controller:选择裸金属安装方式
  2. 配置ingress资源类型:配置代理规则

ingress安装后能否成功使用,与之前选择的虚拟机网卡类型有关系,如果选择双网卡,根据官网教程安装后还不能直接使用,我在此卡住很久

安装dashboard

官网文档

  1. 安装dashboard
  2. 创建用户

服务类型改为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,因此要相应改一下

  1. 创建自签证书,其中CN参数使用主节点的IP
  2. 删除dashboard自建的证书kubernetes-dashboard-certs
  3. 导入自签证书证书,名称和命名空间以dashboard的自建证书要一致
  4. 重启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

相关