解決阿里雲ECS下kubeadm部署k8s沒法指定公網IP

背景

通常狀況下,"kubeadm"部署集羣時指定"--apiserver-advertise-address=<public_ip>"參數,便可在其餘機器上,經過公網ip join到本機器,然而,阿里雲ecs裏沒配置公網ip,etcd會沒法啓動,致使初始化失敗。node

環境、工具

阿里雲ECS學生機、ECS對應的公網ip、kubeadm1.15.四、kubelet1.15.四、kubectl1.15.四、ubuntu18.04.三、linux4.15.0-66-generic、docker18.9.7linux

步驟

準備

該實現須要在kubeadm初始化過程當中對etcd進行修改,而kubeadm初始化是阻塞的,所以,須要創建兩個ssh對話,即用ssh工具新建兩個標籤,一個用來初始化節點,另外一個在初始化過程當中修改配置文件。注意是初始化過程當中,每次運行kubeadm init,kubeadm都會生成etcd的配置文件,若是提早修改了配置文件,在運行kubeadm init時會把修改的結果覆蓋,那麼也就沒有做用了。
docker

運行kubeadm

輸入命令"kubeadm init --kubernetes-version=<your_versin> --apiserver-advertise-address=<public_ip>"

此時會卡在ubuntu

[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.

修改etcd.yaml

在輸入上述命令後,kubeadm即開始了master節點的初始化,可是因爲etcd配置文件不正確,因此etcd沒法啓動,要對該文件進行修改。
文件路徑"/etc/kubernetes/manifests/etcd.yaml"。api

修改前

修改後

此處"xxx"爲公網ip,要關注的是"--listen-client-urls"和"--listen-peer-urls"。須要把"--listen-client-urls"後面的公網ip刪除,把"--listen-peer-urls"改成本地的地址。bash

鏈接master節點

稍等片刻以後,master節點就初始化好了

拷貝"root"後面的鏈接token,在其餘服務器,如騰訊雲或阿里雲ecs上就能夠join這臺master。

此時再安裝好網絡插件便可
服務器

過程記錄

  1. 當指定"--apiserver-advertise-address"爲公網ip時,kubeadm會在"[kubelet-check] Initial timeout of 40s passed."後卡很長時間,而後提示說初始化失敗:
    網絡

  2. 查看kubelet日誌,未發現有價值的錯誤提示。因而進行了第二次嘗試,並新建了一個ssh對話,用來查看在初始化的時候docker容器的狀態。ssh

  3. 發現etcd的容器處於退出狀態:
  4. 因而對該容器打個log:

    顯示沒法指定ip,ip爲公網ip
  5. 查看kubeadm生成的etcd配置文件,"xxx"爲個人公網ip:

    發現kubeadm自動把"--listen-peer-urls"改成了kubeadm初始化時指定的"--apiserver-advertise-address",即公網ip,並且"--listen-client-urls=",後面也加上了公網ip。這兩個參數大概意思是指定要監聽的ip地址,而阿里雲學生機ecs的網卡沒有配置公網ip,所以就沒法指定該ip,致使etcd沒法正常啓動。對其進行修改便可,經測試,worker node 能夠經過指定的公網ip join到master node,能夠完成項目部署。
    工具

相關文章
相關標籤/搜索