輕鬆搭建Kubernetes 1.2版執行環境
Kubernetes簡稱k8s,是谷歌於2014年開始主導的開源專案,提供了以容器為中心的部署、伸縮和運維平臺。截止目前它的最新版本為1.2。搭建環境之前建議先了解一下kubernetes的相關知識,可以參考《如果有10000臺機器,你想怎麼玩?》系列文章。本文從零開始搭建一個kubernetes叢集。
準備工作
我們需要先安裝
virtualBox和
vagrant。通過vagrant來驅動virtualBox搭建一個虛擬測試環境。首先在本地任意路徑新建一個空資料夾比如 test
,執行以下命令:
mkdir test
cd test
vagrant init minimum/ubuntu-trusty64-docker
vi Vagrantfile
裡面應該有一句 config.vm.box = "minimum/ubuntu-trusty64-docker"
,在它的下面新增如下幾行程式碼,相當於給它分配三臺虛擬機器,一臺叫做master,它的IP是
192.168.33.17;另兩臺叫做 node1和node2,它們的IP是
192.168.33.18和 192.168.33.19。
config.vm.define "master" do | host |
host.vm.hostname = "master"
host.vm.network "private_network" , ip: "192.168.33.17"
end
config.vm.define "node1" do | host |
host.vm.hostname = "node1"
host.vm.network "private_network", ip: "192.168.33.18"
end
config.vm.define "node2" do | host |
host.vm.hostname = "node2"
host.vm.network "private_network", ip: "192.168.33.19"
end
這個vagrant映象已經在ubuntu的基礎上幫我們安裝了docker,用起來很方便。然後分別在三個終端執行以下命令啟動並連線三臺虛擬機器。
vagrant up
vagrant ssh master
virtual box host terminal 2
vagrant ssh node1
virtual box host terminal 3
vagrant ssh node2
這個vagrant映象預設的docker版本為1.9.0,如果你願意,可以用下面的命令將其升級為1.10.3,但這不是必須的:
all or nonesudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
sudo sh -c "echo deb https://apt.dockerproject.org/repo ubuntu-trusty main > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get purge lxc-docker
sudo apt-cache policy docker-engine
sudo apt-get install docker-engine
sudo service docker restart
docker -v
搭建網路環境
為了打通不同主機上的容器的網路連線,最簡單的方法是安裝一個覆蓋網路,這裡我們使用flannel。它使用etcd來配置,所以我們需要先執行一個etcd例項。下面在master虛擬機器上用容器執行一個etcd例項:
masterdocker run -d \
--net=host \
--restart=always \
--name=etcd \
-v /var/etcd/data:/var/etcd/data \
kubernetes/etcd:2.0.5 \
/usr/local/bin/etcd \
--addr=192.168.33.17:4001 \
--bind-addr=0.0.0.0:4001 \
--data-dir=/var/etcd/data
接下來往etcd裡插入flannel的配置資料。這裡指定flannel可以使用的IP地址為 10.0.0.0/8
區間:
docker exec -it etcd etcdctl set /qinghua.github.io/network/config '{"Network": "10.0.0.0/8"}'
然後安裝並在後臺執行flannel:
master node1 node2wget -c https://github.com/coreos/flannel/releases/download/v0.5.5/flannel-0.5.5-linux-amd64.tar.gz
tar zxvf flannel-0.5.5-linux-amd64.tar.gz
sudo flannel-0.5.5/flanneld --etcd-endpoints=http://192.168.33.17:4001 --etcd-prefix=/qinghua.github.io/network --iface=eth1 > flannel.log 2>&1 &
cat flannel.log
Flannel啟動完成後,會獲得一個可用於分配的IP集合,並存放到 /run/flannel/subnet.env
裡。我們需要配置一下docker的可用IP為可用於分配的IP:
source /run/flannel/subnet.env sudo sh -c "echo DOCKER_OPTS=\\\"--bip=$FLANNEL_SUBNET --mtu=$FLANNEL_MTU\\\" >> /etc/default/docker" sudo service docker restart
搭建k8s環境
終於輪到k8s啦。首先需要下載並解壓kubernetes 1.2.0版:
master node1 node2wget -c https://github.com/kubernetes/kubernetes/releases/download/v1.2.0/kubernetes.tar.gz
tar zxvf kubernetes.tar.gz
tar zxvf kubernetes/server/kubernetes-server-linux-amd64.tar.gz
解壓出來的檔案裡面含了一些啟動master需要的docker映象檔案,將它們匯入:
masterdocker load -i kubernetes/server/bin/kube-apiserver.tar
docker load -i kubernetes/server/bin/kube-controller-manager.tar
docker load -i kubernetes/server/bin/kube-scheduler.tar
docker images
有條件科學上網的童鞋可以自行準備 gcr.io/google_containers/etcd:2.2.1
這個映象,否則就湊合著使用先前的kubernetes/etcd:2.0.5
。注意,這裡為了簡單起見,使用同一套etcd。真實環境裡,flannel和kubernetes使用的etcd是分開的。接下來開始啟動api server:
docker run -d \
--name=apiserver \
--net=host \
gcr.io/google_containers/kube-apiserver:e68c6af15d4672feef7022e94ee4d9af \
kube-apiserver \
--insecure-bind-address=192.168.33.17 \
--service-cluster-ip-range=11.0.0.0/16 \
--etcd-servers=http://192.168.33.17:4001
然後是controller manager:
masterdocker run -d \
--name=cm \
gcr.io/google_containers/kube-controller-manager:b9107c794e0564bf11719dc554213f7b \
kube-controller-manager \
--master=192.168.33.17:8080
最後是scheduler:
masterdocker run -d \
--name=scheduler \
gcr.io/google_containers/kube-scheduler:903b34d5ed7367ec4dddf846675613c9 \
kube-scheduler \
--master=192.168.33.17:8080
伺服器啟動完畢,可以執行以下命令來檢視版本,咱們用的是1.2:
masterkubernetes/server/bin/kubectl -s 192.168.33.17:8080 version
接下來該客戶端了。首先啟動kubelet:
node1 node2NODE_IP=`ifconfig eth1 | grep 'inet addr:' | cut -d: -f2 | cut -d' ' -f1` sudo kubernetes/server/bin/kubelet --api-servers=192.168.33.17:8080 --node-ip=$NODE_IP > kubelet.log 2>&1 & cat kubelet.log
Kuberlet啟動完成後,在master上就可以看到了:
masterkubernetes/server/bin/kubectl -s 192.168.33.17:8080 get no
最後啟動kube-proxy:
node1 node2sudo kubernetes/server/bin/kube-proxy --master=192.168.33.17:8080 > proxy.log 2>&1 &
cat proxy.log
測試k8s環境
環境安裝好了,接下來試著啟動一個pod。啟動之前,由於kubernetes需要通過gcr.io/google_containers/pause:2.0的小映象來管理pod的網路。它會自動下載,如果沒有科學上網導致下載不到,那麼可以先用docker hub上的kubernetes/pause來代替:
node1 node2docker pull kubernetes/pause
docker tag kubernetes/pause gcr.io/google_containers/pause:2.0
然後就可以用命令列在任意一臺虛擬機器上執行一個tomcat,並生成服務:
mastercat << EOF >tomcat.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: tomcat
spec:
replicas: 1
selector:
app: tomcat
template:
metadata:
name: tomcat
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8.0.30-jre8
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: tomcat
labels:
app: tomcat
spec:
type: NodePort
selector:
app: tomcat
ports:
- port: 80
targetPort: 8080
nodePort: 30088
EOF
kubernetes/server/bin/kubectl -s 192.168.33.17:8080 create -f tomcat.yaml
一開始由於需要下載tomcat映象可能會慢點,隨時可以用下面的命令來檢視進度:
masterkubernetes/server/bin/kubectl -s 192.168.33.17:8080 describe po tomcat
可以用下面的命令來檢視pod、replication controller、service和endpoint:
masterkubernetes/server/bin/kubectl -s 192.168.33.17:8080 get po kubernetes/server/bin/kubectl -s 192.168.33.17:8080 get rc kubernetes/server/bin/kubectl -s 192.168.33.17:8080 get svc kubernetes/server/bin/kubectl -s 192.168.33.17:8080 get ep
我們看到的endpoint裡,應該有一個tomcat。在我的虛擬機器上它的ENDPOINTS是 10.0.8.3:8080
,訪問一下:
POD_IP=`kubernetes/server/bin/kubectl -s 192.168.33.17:8080 get ep tomcat -o jsonpath={.subsets[*].addresses[*].ip}` echo $POD_IP curl $POD_IP:8080
順利的話,這三臺虛擬機器任意一臺都可以訪問這個tomcat的endpoint。由於啟動這三臺vagrant虛擬機器的主機上並沒有安裝flannel,所以目前就別想用主機的瀏覽器開啟這個網址啦。但是,由於我們建立服務的時候型別設定為NodePort,這樣外部是可以通過任意node的特定埠訪問這個服務的。也就是說,下面這兩個url都是可以在叢集外部訪問的,並且效果一樣:
初步測試完畢,可以使用以下命令來刪除剛才建立的tomcat系列物件:
masterkubernetes/server/bin/kubectl -s 192.168.33.17:8080 delete -f tomcat.yaml