原文
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
當(dāng)我們需要在本地開發(fā)時(shí)漆诽,更希望能夠有一個(gè)開箱即用又可以方便定制的分布式開發(fā)環(huán)境,這樣才能對(duì)Kubernetes本身和應(yīng)用進(jìn)行更好的測(cè)試。現(xiàn)在我們使用Vagrant和VirtualBox來創(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ù)蛹含。
詳細(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)目主到。
參考
- Kubernetes Handbook——Kubernetes中文指南/云原生應(yīng)用架構(gòu)實(shí)踐手冊(cè)
- duffqiu/centos-vagrant
- coredns/deployment
- Kubernetes 1.8 kube-proxy 開啟 ipvs
- Vistio—使用Netflix的Vizceral可視化Istio service mesh
更多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>