背景
雖然官方已有一個vagrant開發環境可用於mac,但是有幾個問題:
-
guest os是fedora,我不熟悉也不喜歡
-
使用了並不是必須的salt來裝k8s,沒有必要
-
國內使用的話需要配置翻牆代理,我本人用的不是vpn而是proxy,比較麻煩些
-
部分信息稍老,且更新比較慢,而k8s的開發迭代速度很快
因此,我準備按照下述方法構建mac下開發環境:
-
使用vagrant+virtualbox用於cluster物理環境管理,即:負責拉起控制節點和K8S集羣節點,掛載外部資源文件到VM內,並配置公共網絡便於訪問各節點和使用代理。其實就是相當於把vagrant當單機版IaaS使用。
-
使用官方ubuntu bare-metal cluster的安裝方式,完成K8S集羣軟件安裝
部署方式
爲了節省資源及簡化介紹,下文中只用兩臺VM,功能分別是:
-
k8s-ctl:作爲控制節點,完成待部署的k8s版本準備、kubectl工具安裝等,遠程連接到k8s master
-
k8s-master:k8s集羣master節點,是個standalone的模式,即:master和node都裝在一臺VM上
注:視情況後繼可以增加多個k8s-node節點,參考下文配置流程即可。
部署過程
Vagrant
假定環境已安裝好Vagrant(1.6.2以上)和Virtualbox(4.3),然後需要做三件事:
-
準備好box文件,可以到vagrant官方倉庫下載:http://www.vagrantbox.es/。我這裏使用的是:Ubuntu 14.04 with Docker enabled (based on amd64 server iso file)
vagrant box add ubuntu-14.04-amd64 https://github.com/jose-lpa/packer-ubuntu_14.04/releases/download/v2.0/ubuntu-14.04.box
-
創建一個目錄(本文假定路徑爲~/k8s/deploy/),也即vagrantfile所在目錄
mkdir -p ~/k8s/deploy cd ~/k8s/deploy
-
編寫Vagrantfile文件:在deploy目錄新建一個文件Vagrantfile,寫入下述內容:
Vagrant.configure(2) do |config| config.vm.define "k8s-ctl" do |c| c.vm.box = "ubuntu-14.04-amd64" c.vm.network "public_network" end config.vm.define "k8s-master" do |c| c.vm.box = "ubuntu-14.04-amd64" c.vm.network "public_network" end end
然後就可以通過vagrant up啓動兩臺VM,然後可以ssh進入k8s-ctl:
vagrant up
vagrant ssh k8s-ctl
安裝k8s
這部分主要參考官方ubuntu安裝guide,但基於使用場景不同做了一些改動。
主要如下步驟:
-
獲取可部署的k8s release
首先下載任意一個k8s release版本(注:此並不是將要部署的版本,而是作爲部署環境),建議在host上的~/k8s/deploy,也即是掛載到VM內的/vagrant目錄。
cd ~/k8s/deploy wget https://github.com/kubernetes/kubernetes/releases/download/v1.0.6/kubernetes.tar.gz -O - | tar -zxf -
然後,我們就可以進入k8s-ctl,開始進行部署前的準備工作:
vagrant ssh k8s-ctl # 可選:配置HTTP代理鏈接github、s3、gcr.io,若用VPN則不需要 export http_proxy=http://<proxy-ip>:<proxy-port> export https_proxy=https://<proxy-ip>:<proxy-port> cd /vagrant/kubernetes/cluster/ubuntu
修改./build.sh,在文件頭添加:
FLANNEL_VERSION=0.5.3 ETCD_VERSION=2.2.0 KUBE_VERSION=1.0.6
然後執行 `./build.sh`,正常結束後,當前路徑下會多出一個`binaries/`目錄,保存的是k8s多個二進制執行文件。
-
修改部署配置
config-default.sh文件頭部添加如下內容:
nodes="[email protected]" role="ai" NUM_MINIONS=1
注:這裏`nodes`按照自己環境的情況修改
-
開始部署
export KUBERNETES_PROVIDER=ubuntu cd /vagrant/kubernetes/cluster/ ./kube-up.sh
注1:如果提示需要sshkey,則`ssh-keygen && ssh-add` 注2:如果validate不成功,可能是因爲使用的box鏡像缺少一些需要的軟件,ssh進入k8s-master VM進行安裝,如docker、pgrep、bridge-utils、apt-transport-https。 注3:部署過程中出錯,可以使用`./kube-down.sh`進行回退 注4:部署過程如果出現網絡錯誤,注意排查:每個node上/etc/hosts都已經配置了host-name,以及取消了proxy設置: unset http_proxy, https_proxy
-
驗證部署結果
通過kubectl命令可以check集羣狀態,以及訪問k8s master的api-server
vagrant@vagrant:/vagrant/kubernetes/cluster$ ./kubectl.sh get nodes NAME LABELS STATUS 192.168.0.108 kubernetes.io/hostname=192.168.0.108 Ready vagrant@vagrant:/vagrant/kubernetes/cluster$ curl 192.168.0.108:8080/api { "versions": [ "v1" ] }
其他
-
可以把下述內容添加到~/.bashrc便於k8s操作:
export KUBERNETES_PROVIDER=ubuntu export PATH=$PATH:/vagrant/kubernetes/cluster/ubuntu/binaries alias kc="kubectl"
-
可以在集羣上安裝k8s的addons,比如DNS、KubeUI、KubeDash,可以通過下述命令部署自帶的DNS
cd cluster/ubuntu ./deployAddons.sh
-
國內如果沒用VPN,需要在k8s-master(如果集羣,則在所有節點)上配置Docker代理,否則無法pull鏡像,Ubuntu下:
sudo echo "export http_proxy=\"http://<proxy-ip>:<proxy-port>\"" >> /etc/default/docker sudo echo "export https_proxy=\"https://<proxy-ip>:<proxy-port>\"" >> /etc/default/docker sudo service docker restart
-
SSH免賬號登錄的方法:kube-up過程需要多次ssh登錄到各個nodes執行操作,以及scp發送文件,可以配置密鑰對進行免賬號登錄:
# 在Master節點生成祕鑰文件 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa # 將祕鑰文件拷貝到所有節點 ssh-copy-id -i ~/.ssh/id_dsa.pub vagrant@<node-ip>