主要的坑列表:
- 集群節點間不會共享鏡像
- 初始化集群要加上版本號
- ingress雙網卡問題
- dashboard證書問題
- ingress代理dashboard
虛擬機創建
主要注意點是網卡的選擇,不要選擇網上教程常見的NAT+Host-only雙網卡的模式,否則可能因為默認網卡為NAT,使得虛擬機之間無法連通,出現難以配置或難以排查的莫名奇妙問題
網卡選擇:由上圖可知,選擇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 <<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