Kubernetes - 本地vagrant部署k8s-cluster

原文

https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/blob/master/README-cn.md

注意存璃,測(cè)試過程中發(fā)現(xiàn):集群入口IP只能用172.17.8.102点额,不能用172.17.8.101蔫慧、172.17.8.103

使用Vagrant和VirtualBox在本地搭建分布式的Kubernetes集群和Istio Service Mesh

Setting up a Kubernetes cluster along with Istio service mesh locally with Vagrant and VirtualBox - English

當(dāng)我們需要在本地開發(fā)時(shí)漆诽,更希望能夠有一個(gè)開箱即用又可以方便定制的分布式開發(fā)環(huán)境,這樣才能對(duì)Kubernetes本身和應(yīng)用進(jìn)行更好的測(cè)試。現(xiàn)在我們使用VagrantVirtualBox來創(chuàng)建一個(gè)這樣的環(huán)境。

注意:kube-proxy使用ipvs模式猪钮。

Demo

準(zhǔn)備環(huán)境

需要準(zhǔn)備以下軟件和環(huán)境:

  • 8G以上內(nèi)存
  • Vagrant 2.0+
  • VirtualBox 5.0 +
  • 提前下載Kubernetes 1.9以上版本(支持最新的1.13.0)的release壓縮包
  • Mac/Linux,Windows不完全支持胆建,僅在windows10下通過

集群

我們使用Vagrant和Virtualbox安裝包含3個(gè)節(jié)點(diǎn)的kubernetes集群躬贡,其中master節(jié)點(diǎn)同時(shí)作為node節(jié)點(diǎn)。

IP 主機(jī)名 組件
172.17.8.101 node1 kube-apiserver眼坏、kube-controller-manager拂玻、kube-scheduler酸些、etcd、kubelet檐蚜、docker魄懂、flannel、dashboard
172.17.8.102 node2 kubelet闯第、docker市栗、flannel、traefik
172.17.8.103 node3 kubelet咳短、docker填帽、flannel

注意:以上的IP、主機(jī)名和組件都是固定在這些節(jié)點(diǎn)的咙好,即使銷毀后下次使用vagrant重建依然保持不變篡腌。

容器IP范圍:172.33.0.0/30

Kubernetes service IP范圍:10.254.0.0/16

安裝的組件

安裝完成后的集群包含以下組件:

  • flannel(host-gw模式)
  • kubernetes dashboard
  • etcd(單節(jié)點(diǎn))
  • kubectl
  • CoreDNS
  • kubernetes(版本根據(jù)下載的kubernetes安裝包而定,支持Kubernetes1.9+)

可選插件

  • Heapster + InfluxDB + Grafana
  • ElasticSearch + Fluentd + Kibana
  • Istio service mesh
  • Helm
  • Vistio
  • Kiali

使用說明

將該repo克隆到本地勾效,下載Kubernetes的到項(xiàng)目的根目錄嘹悼。

git clone https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster.git
cd kubernetes-vagrant-centos-cluster

注意:如果您是第一次運(yùn)行該部署程序,那么可以直接執(zhí)行下面的命令层宫,它將自動(dòng)幫你下載 Kubernetes 安裝包杨伙,下一次你就不需要自己下載了,另外您也可以在這里找到Kubernetes的發(fā)行版下載地址萌腿,下載 Kubernetes發(fā)行版后重命名為kubernetes-server-linux-amd64.tar.gz限匣,并移動(dòng)到該項(xiàng)目的根目錄下。

因?yàn)樵擁?xiàng)目是使用 NFS 的方式掛載到虛擬機(jī)的 /vagrant 目錄中的毁菱,所以在安裝 NFS 的時(shí)候需要您輸入密碼授權(quán)米死。

使用vagrant啟動(dòng)集群。

vagrant up

如果是首次部署鼎俘,會(huì)自動(dòng)下載centos/7的box哲身,這需要花費(fèi)一些時(shí)間辩涝,另外每個(gè)節(jié)點(diǎn)還需要下載安裝一系列軟件包贸伐,整個(gè)過程大概需要10幾分鐘。

如果您在運(yùn)行vagrant up的過程中發(fā)現(xiàn)無法下載centos/7的box怔揩,可以手動(dòng)下載后將其添加到vagrant中捉邢。

手動(dòng)添加centos/7 box

wget -c http://cloud.centos.org/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-1801_02.VirtualBox.box
vagrant box add CentOS-7-x86_64-Vagrant-1801_02.VirtualBox.box --name centos/7

這樣下次運(yùn)行vagrant up的時(shí)候就會(huì)自動(dòng)讀取本地的centos/7 box而不會(huì)再到網(wǎng)上下載。

Windows 安裝特別說明

執(zhí)行vagrant up之后會(huì)有如下提示:

G:\code\kubernetes-vagrant-centos-cluster>vagrant up
Bringing machine 'node1' up with 'virtualbox' provider...
Bringing machine 'node2' up with 'virtualbox' provider...
Bringing machine 'node3' up with 'virtualbox' provider...
==> node1: Importing base box 'centos/7'...
==> node1: Matching MAC address for NAT networking...
==> node1: Setting the name of the VM: node1
==> node1: Clearing any previously set network interfaces...
==> node1: Specific bridge 'en0: Wi-Fi (AirPort)' not found. You may be asked to specify
==> node1: which network to bridge to.
==> node1: Available bridged network interfaces:
1) Realtek PCIe GBE Family Controller
2) TAP-Windows Adapter V9
==> node1: When choosing an interface, it is usually the one that is
==> node1: being used to connect to the internet.
    node1: Which interface should the network bridge to?
    node1: Which interface should the network bridge to?
    

輸入1之后按回車?yán)^續(xù)商膊。(根據(jù)自己真實(shí)網(wǎng)卡選擇伏伐,node2、node3同樣需要)

node3快要結(jié)束的時(shí)候可能會(huì)有如下錯(cuò)誤:

node3: Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
    node3: Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service to /usr/lib/systemd/system/kube-proxy.service.
    node3: deploy coredns
    node3: /tmp/vagrant-shell: ./dns-deploy.sh: /bin/bash^M: bad interpreter: No such file or directory
    node3: error: no objects passed to apply
    node3: /home/vagrant

解決方法:

vagrant ssh node3
sudo -i
cd /vagrant/addon/dns
yum -y install dos2unix
dos2unix dns-deploy.sh
./dns-deploy.sh -r 10.254.0.0/16 -i 10.254.0.2 |kubectl apply -f -

訪問kubernetes集群

訪問Kubernetes集群的方式有三種:

  • 本地訪問
  • 在VM內(nèi)部訪問
  • Kubernetes dashboard

通過本地訪問

可以直接在你自己的本地環(huán)境中操作該kubernetes集群晕拆,而無需登錄到虛擬機(jī)中藐翎。

要想在本地直接操作Kubernetes集群,需要在你的電腦里安裝kubectl命令行工具,對(duì)于Mac用戶執(zhí)行以下步驟:

wget https://storage.googleapis.com/kubernetes-release/release/v1.11.0/kubernetes-client-darwin-amd64.tar.gz
tar xvf kubernetes-client-darwin-amd64.tar.gz && cp kubernetes/client/bin/kubectl /usr/local/bin

conf/admin.kubeconfig文件放到~/.kube/config目錄下即可在本地使用kubectl命令操作集群吝镣。

mkdir -p ~/.kube
cp conf/admin.kubeconfig ~/.kube/config

我們推薦您使用這種方式堤器。

在虛擬機(jī)內(nèi)部訪問

如果有任何問題可以登錄到虛擬機(jī)內(nèi)部調(diào)試:

vagrant ssh node1
sudo -i
kubectl get nodes

Kubernetes dashboard

還可以直接通過dashboard UI來訪問:https://172.17.8.101:8443

可以在本地執(zhí)行以下命令獲取token的值(需要提前安裝kubectl):

kubectl -n kube-system describe secret `kubectl -n kube-system get secret|grep admin-token|cut -d " " -f1`|grep "token:"|tr -s " "|cut -d " " -f2

注意:token的值也可以在vagrant up的日志的最后看到。

[圖片上傳失敗...(image-33ba1f-1546677071807)]

只有當(dāng)你安裝了下面的heapster組件后才能看到上圖中的監(jiān)控metrics末贾。

Windows下Chrome/Firefox訪問

如果提示NET::ERR_CERT_INVALID闸溃,則需要下面的步驟

進(jìn)入本項(xiàng)目目錄

vagrant ssh node1
sudo -i
cd /vagrant/addon/dashboard/
mkdir certs
openssl req -nodes -newkey rsa:2048 -keyout certs/dashboard.key -out certs/dashboard.csr -subj "/C=/ST=/L=/O=/OU=/CN=kubernetes-dashboard"
openssl x509 -req -sha256 -days 365 -in certs/dashboard.csr -signkey certs/dashboard.key -out certs/dashboard.crt
kubectl delete secret kubernetes-dashboard-certs -n kube-system
kubectl create secret generic kubernetes-dashboard-certs --from-file=certs -n kube-system
kubectl delete pods $(kubectl get pods -n kube-system|grep kubernetes-dashboard|awk '{print $1}') -n kube-system #重新創(chuàng)建dashboard

刷新瀏覽器之后點(diǎn)擊高級(jí),選擇跳過即可打開頁面拱撵。

組件

Heapster監(jiān)控

創(chuàng)建Heapster監(jiān)控:

kubectl apply -f addon/heapster/

訪問Grafana

使用Ingress方式暴露的服務(wù)辉川,在本地/etc/hosts中增加一條配置:

172.17.8.102 grafana.jimmysong.io

訪問Grafana:http://grafana.jimmysong.io

[圖片上傳失敗...(image-9cbaab-1546677071807)]

Traefik

部署Traefik ingress controller和增加ingress配置:

kubectl apply -f addon/traefik-ingress

在本地/etc/hosts中增加一條配置:

172.17.8.102 traefik.jimmysong.io

訪問Traefik UI:http://traefik.jimmysong.io

[圖片上傳失敗...(image-c15eb8-1546677071807)]

EFK

使用EFK做日志收集。

kubectl apply -f addon/efk/

注意:運(yùn)行EFK的每個(gè)節(jié)點(diǎn)需要消耗很大的CPU和內(nèi)存拴测,請(qǐng)保證每臺(tái)虛擬機(jī)至少分配了4G內(nèi)存乓旗。

Helm

用來部署helm。

hack/deploy-helm.sh

Service Mesh

我們使用 istio 作為 service mesh昼扛。

安裝

Istio release 頁面下載istio的安裝包寸齐,安裝istio命令行工具,將istioctl命令行工具放到你的$PATH目錄下抄谐,對(duì)于Mac用戶:

wget https://github.com/istio/istio/releases/download/1.0.0/istio-1.0.0-osx.tar.gz
tar xvf istio-1.0.0-osx.tar.gz
mv bin/istioctl /usr/local/bin/

在Kubernetes中部署istio:

kubectl apply -f addon/istio/istio-demo.yaml
kubectl apply -f addon/istio/istio-ingress.yaml

運(yùn)行示例

我們開啟了Sidecar自動(dòng)注入渺鹦。

kubectl label namespace default istio-injection=enabled
kubectl apply -n default -f yaml/istio-bookinfo/bookinfo.yaml
kubectl apply -n default -f yaml/istio-bookinfo/bookinfo-gateway.yaml
kubectl apply -n default -f yaml/istio-bookinfo/destination-rule-all.yaml

在您自己的本地主機(jī)的/etc/hosts文件中增加如下配置項(xiàng)。

172.17.8.102 grafana.istio.jimmysong.io
172.17.8.102 prometheus.istio.jimmysong.io
172.17.8.102 servicegraph.istio.jimmysong.io
172.17.8.102 jaeger-query.istio.jimmysong.io

我們可以通過下面的URL地址訪問以上的服務(wù)蛹含。

Service URL
grafana http://grafana.istio.jimmysong.io
servicegraph http://servicegraph.istio.jimmysong.io/dotviz, http://servicegraph.istio.jimmysong.io/graph,http://servicegraph.istio.jimmysong.io/force/forcegraph.html
tracing http://jaeger-query.istio.jimmysong.io
productpage http://172.17.8.101:31380/productpage

詳細(xì)信息請(qǐng)參閱:https://istio.io/zh/docs/examples/bookinfo/

[圖片上傳失敗...(image-6ef5dc-1546677071807)]

Vistio

Vizceral是Netflix發(fā)布的一個(gè)開源項(xiàng)目毅厚,用于近乎實(shí)時(shí)地監(jiān)控應(yīng)用程序和集群之間的網(wǎng)絡(luò)流量。Vistio是使用Vizceral對(duì)Istio和網(wǎng)格監(jiān)控的改進(jìn)浦箱。它利用Istio Mixer生成的指標(biāo)吸耿,然后將其輸入Prometheus。Vistio查詢Prometheus并將數(shù)據(jù)存儲(chǔ)在本地以允許重播流量酷窥。

# Deploy vistio via kubectl
kubectl -n default apply -f addon/vistio/

# Expose vistio-api
kubectl -n default port-forward $(kubectl -n default get pod -l app=vistio-api -o jsonpath='{.items[0].metadata.name}') 9091:9091 &

# Expose vistio in another terminal window
kubectl -n default port-forward $(kubectl -n default get pod -l app=vistio-web -o jsonpath='{.items[0].metadata.name}') 8080:8080 &

如果一切都已經(jīng)啟動(dòng)并準(zhǔn)備就緒咽安,您就可以訪問Vistio UI,開始探索服務(wù)網(wǎng)格網(wǎng)絡(luò)蓬推,訪問http://localhost:8080 您將會(huì)看到類似下圖的輸出妆棒。

[圖片上傳失敗...(image-2cda6f-1546677071807)]

更多詳細(xì)內(nèi)容請(qǐng)參考Vistio—使用Netflix的Vizceral可視化Istio service mesh

Kiali

Kiali是一個(gè)用于提供Istio service mesh觀察性的項(xiàng)目沸伏,更多信息請(qǐng)查看https://kiali.io糕珊。

在本地該項(xiàng)目的根路徑下執(zhí)行下面的命令:

kubectl apply -n istio-system -f addon/kiali

Kiali web地址:http://172.17.8.101:31439

用戶名/密碼:admin/admin

[圖片上傳失敗...(image-c32ffd-1546677071808)]

注意:Kilia使用Jaeger做追蹤,請(qǐng)不用屏蔽kilia頁面的彈出窗口毅糟。

Weave scope

Weave scope可用于監(jiān)控红选、可視化和管理Docker&Kubernetes集群,詳情見https://www.weave.works/oss/scope/

在本地該項(xiàng)目的根路徑下執(zhí)行下面的命令:

kubectl apply -f addon/weave-scope

在本地的/etc/hosts下增加一條記錄姆另。

172.17.8.102 scope.weave.jimmysong.io

現(xiàn)在打開瀏覽器喇肋,訪問http://scope.weave.jimmysong.io/

[圖片上傳失敗...(image-85e41a-1546677071808)]

管理

除了特別說明坟乾,以下命令都在當(dāng)前的repo目錄下操作。

掛起

將當(dāng)前的虛擬機(jī)掛起蝶防,以便下次恢復(fù)糊渊。

vagrant suspend

恢復(fù)

恢復(fù)虛擬機(jī)的上次狀態(tài)。

vagrant resume

注意:我們每次掛起虛擬機(jī)后再重新啟動(dòng)它們的時(shí)候慧脱,看到的虛擬機(jī)中的時(shí)間依然是掛載時(shí)候的時(shí)間渺绒,這樣將導(dǎo)致監(jiān)控查看起來比較麻煩。因此請(qǐng)考慮先停機(jī)再重新啟動(dòng)虛擬機(jī)菱鸥。

重啟

停機(jī)后重啟啟動(dòng)宗兼。

vagrant halt
vagrant up
# login to node1
vagrant ssh node1
# run the prosivision scripts
/vagrant/hack/k8s-init.sh
exit
# login to node2
vagrant ssh node2
# run the prosivision scripts
/vagrant/hack/k8s-init.sh
exit
# login to node3
vagrant ssh node3
# run the prosivision scripts
/vagrant/hack/k8s-init.sh
sudo -i
cd /vagrant/hack
./deploy-base-services.sh
exit

現(xiàn)在你已經(jīng)擁有一個(gè)完整的基礎(chǔ)的kubernetes運(yùn)行環(huán)境,在該repo的根目錄下執(zhí)行下面的命令可以獲取kubernetes dahsboard的admin用戶的token氮采。

hack/get-dashboard-token.sh

根據(jù)提示登錄即可殷绍。

清理

清理虛擬機(jī)。

vagrant destroy
rm -rf .vagrant

注意

僅做開發(fā)測(cè)試使用鹊漠,不要在生產(chǎn)環(huán)境使用該項(xiàng)目主到。

參考

更多Istio和Service Mesh的資訊請(qǐng)?jiān)L問ServiceMesher社區(qū)和關(guān)注社區(qū)的微信公眾號(hào)。

<p align="center">
<img src="https://ws1.sinaimg.cn/large/00704eQkgy1fshv989hhqj309k09k0t6.jpg" alt="ServiceMesher微信公眾號(hào)二維碼"/>
</p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躯概,一起剝皮案震驚了整個(gè)濱河市登钥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娶靡,老刑警劉巖牧牢,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異姿锭,居然都是意外死亡塔鳍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門呻此,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轮纫,“玉大人,你說我怎么就攤上這事焚鲜≌仆伲” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵恃泪,是天一觀的道長(zhǎng)郑兴。 經(jīng)常有香客問我犀斋,道長(zhǎng)贝乎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任叽粹,我火速辦了婚禮览效,結(jié)果婚禮上却舀,老公的妹妹穿的比我還像新娘。我一直安慰自己锤灿,他們只是感情好挽拔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著但校,像睡著了一般螃诅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上状囱,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天术裸,我揣著相機(jī)與錄音,去河邊找鬼亭枷。 笑死袭艺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叨粘。 我是一名探鬼主播猾编,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼升敲!你這毒婦竟也來了答倡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤驴党,失蹤者是張志新(化名)和其女友劉穎苇羡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼻弧,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡设江,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了攘轩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叉存。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖度帮,靈堂內(nèi)的尸體忽然破棺而出歼捏,到底是詐尸還是另有隱情,我是刑警寧澤笨篷,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布瞳秽,位于F島的核電站,受9級(jí)特大地震影響率翅,放射性物質(zhì)發(fā)生泄漏练俐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一冕臭、第九天 我趴在偏房一處隱蔽的房頂上張望腺晾。 院中可真熱鬧燕锥,春花似錦、人聲如沸悯蝉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼻由。三九已至暇榴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蕉世,已是汗流浹背跺撼。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讨彼,地道東北人歉井。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哈误,于是被迫代替她去往敵國(guó)和親哩至。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容