Kubernetes - 本地vagrant部署k8s-cluster

原文

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

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

當(dāng)我們需要在本地開(kāi)發(fā)時(shí),更希望能夠有一個(gè)開(kāi)箱即用又可以方便定制的分布式開(kāi)發(fā)環(huán)境,這樣才能對(duì)Kubernetes本身和應(yīng)用進(jìn)行更好的測(cè)試?,F(xiàn)在我們使用VagrantVirtualBox來(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ù)。

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è)開(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)目。

參考

更多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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容