原文
https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster/blob/master/README-cn.md
注意,測(cè)試過(guò)程中發(fā)現(xiàn):集群入口IP只能用172.17.8.102,不能用172.17.8.101、172.17.8.103
使用Vagrant和VirtualBox在本地搭建分布式的Kubernetes集群和Istio Service Mesh
當(dāng)我們需要在本地開(kāi)發(fā)時(shí),更希望能夠有一個(gè)開(kāi)箱即用又可以方便定制的分布式開(kāi)發(fā)環(huán)境,這樣才能對(duì)Kubernetes本身和應(yīng)用進(jìn)行更好的測(cè)試?,F(xiàn)在我們使用Vagrant和VirtualBox來(lái)創(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下通過(guò)
集群
我們使用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)的,即使銷(xiāo)毀后下次使用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
使用說(shuō)明
將該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è)過(guò)程大概需要10幾分鐘。
如果您在運(yùn)行vagrant up的過(guò)程中發(fā)現(xiàn)無(wú)法下載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 安裝特別說(shuō)明
執(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之后按回車(chē)?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 -
訪(fǎng)問(wèn)kubernetes集群
訪(fǎng)問(wèn)Kubernetes集群的方式有三種:
- 本地訪(fǎng)問(wèn)
- 在VM內(nèi)部訪(fǎng)問(wèn)
- Kubernetes dashboard
通過(guò)本地訪(fǎng)問(wèn)
可以直接在你自己的本地環(huán)境中操作該kubernetes集群,而無(wú)需登錄到虛擬機(jī)中。
要想在本地直接操作Kubernetes集群,需要在你的電腦里安裝kubectl命令行工具,對(duì)于Mac用戶(hù)執(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)部訪(fǎng)問(wèn)
如果有任何問(wèn)題可以登錄到虛擬機(jī)內(nèi)部調(diào)試:
vagrant ssh node1
sudo -i
kubectl get nodes
Kubernetes dashboard
還可以直接通過(guò)dashboard UI來(lái)訪(fǎng)問(wèn):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訪(fǎng)問(wèn)
如果提示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í),選擇跳過(guò)即可打開(kāi)頁(yè)面。
組件
Heapster監(jiān)控
創(chuàng)建Heapster監(jiān)控:
kubectl apply -f addon/heapster/
訪(fǎng)問(wèn)Grafana
使用Ingress方式暴露的服務(wù),在本地/etc/hosts中增加一條配置:
172.17.8.102 grafana.jimmysong.io
訪(fǎng)問(wèn)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
訪(fǎng)問(wèn)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
用來(lái)部署helm。
hack/deploy-helm.sh
Service Mesh
我們使用 istio 作為 service mesh。
安裝
到Istio release 頁(yè)面下載istio的安裝包,安裝istio命令行工具,將istioctl命令行工具放到你的$PATH目錄下,對(duì)于Mac用戶(hù):
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)行示例
我們開(kāi)啟了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
我們可以通過(guò)下面的URL地址訪(fǎng)問(wèn)以上的服務(wù)。
詳細(xì)信息請(qǐng)參閱:https://istio.io/zh/docs/examples/bookinfo/
[圖片上傳失敗...(image-6ef5dc-1546677071807)]
Vistio
Vizceral是Netflix發(fā)布的一個(gè)開(kāi)源項(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查詢(xún)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)備就緒,您就可以訪(fǎng)問(wèn)Vistio UI,開(kāi)始探索服務(wù)網(wǎng)格網(wǎng)絡(luò),訪(fǎng)問(wèn)http://localhost:8080 您將會(huì)看到類(lèi)似下圖的輸出。
[圖片上傳失敗...(image-2cda6f-1546677071807)]
更多詳細(xì)內(nèi)容請(qǐng)參考Vistio—使用Netflix的Vizceral可視化Istio service mesh。
Kiali
Kiali是一個(gè)用于提供Istio service mesh觀(guān)察性的項(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
用戶(hù)名/密碼:admin/admin
[圖片上傳失敗...(image-c32ffd-1546677071808)]
注意:Kilia使用Jaeger做追蹤,請(qǐng)不用屏蔽kilia頁(yè)面的彈出窗口。
Weave scope
Weave scope可用于監(jiān)控、可視化和管理Docker&Kubernetes集群,詳情見(jiàn)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)在打開(kāi)瀏覽器,訪(fǎng)問(wèn)http://scope.weave.jimmysong.io/
[圖片上傳失敗...(image-85e41a-1546677071808)]
管理
除了特別說(shuō)明,以下命令都在當(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)控查看起來(lái)比較麻煩。因此請(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用戶(hù)的token。
hack/get-dashboard-token.sh
根據(jù)提示登錄即可。
清理
清理虛擬機(jī)。
vagrant destroy
rm -rf .vagrant
注意
僅做開(kāi)發(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 開(kāi)啟 ipvs
- Vistio—使用Netflix的Vizceral可視化Istio service mesh
更多Istio和Service Mesh的資訊請(qǐng)?jiān)L問(wèn)ServiceMesher社區(qū)和關(guān)注社區(qū)的微信公眾號(hào)。
<p align="center">
<img src="https://ws1.sinaimg.cn/large/00704eQkgy1fshv989hhqj309k09k0t6.jpg" alt="ServiceMesher微信公眾號(hào)二維碼"/>
</p>
