踩坑記:基於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 <<EOF >/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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM