摘要:本文將介紹如何使用部署微服務,包括服務發現,監控,路由,日志。如何查看二進制文件的動態依賴動態依賴庫動態依賴庫編譯使用,而使用的是所以在下編譯的文件一般不能直接使用在環境。
Deploying Micro-services on Kubernetes
本文將介紹如何使用 kubernetes 部署微服務,包括 服務發現,監控,路由,日志。用實際的例子來演示自動化流程。主要分為以下幾個部分:
5分鐘搭建 K8S 集群
部署 CNI 網絡
部署監控服務
部署網關
部署日志服務
部署一個應用
5分鐘搭建 K8S 集群第一次完全手動搭建集群大約花了一周時間,主要的問題是在于
K8S的組件多,每個程序的參數有不少,哪些是關鍵的參數需要花時間搞清楚。
萬惡的墻,代理訪問外網比較慢
CNI網絡問題,主要是 CNI 網段和云上的局域網網段沖突了,基礎知識缺失導致
K8S 的證書和驗證方式不清楚
本文相關代碼位于github, 歡迎star。
手動部署可以參考我之前的博文,即便是完全熟悉部署流程,不寫腳本的情況下,如果純手動 setup 或者 tear down 一個集群,都是比較耗時間的。直到發現了這個工具 kubeadm, 世界美好了。
這個工具對操作系統有限制, ubuntu 16.04 或 centos 7 以上。其實當初也看到了這個工具, 不過 因為系統限制,并且kubeadm還在alpha版本,又想手動擼一遍部署過程,所以沒直接采用。 不過 kubeadm 不建議在生產環境中使用,在 官方文檔中的 limitation 中有詳細解釋.
文檔 中第一點就說了, kubeadm部署的是 single master,意味著不是高可用,謹慎使用。 但是作為演示實例再合適不過。
小插曲: 因為最近發布的 k8s 1.6 的 kubeadm 有一個bug,導致用以下步驟安裝會有問題,為此社區里有人提了一個patch, 步驟有些多,我寫在本文最后了。
kubeadm v1.6.1 已經修復了bug。
開始部署步驟:
在 Digital Ocean 中開三臺機器, centos 7,建議2C2G,按小時計費用不了多少錢,用完就銷毀。 如果還沒有注冊賬號,并且覺得本文對你有幫助,可以用我的 referral link 注冊,可以得到 10美金, 鏈接. 發現一個更便宜的vps, vultr, 還是SSD
登錄三臺機器,安裝必要組件.
yum clean yum update -y cat </etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF setenforce 0 yum install -y docker kubelet kubeadm kubectl kubernetes-cni systemctl enable docker && systemctl start docker systemctl enable kubelet && systemctl start kubelet # 補充幾點 # 1. 因為1.6開始K8S開啟了 RBAC 驗證,需要在啟動 kubelet 的參數中添加 --authentication-token-webhook vim vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 添加 --authentication-token-webhook # 2. 如果是 centos, 還需要添加 --cgroup-driver=systemd # 3. v1.6開始,apiserver禁用了 insecure-port, 需要拷貝 /var/kubernetes/ 下的 admin config, 作為驗證配置.
選擇一臺作為master, 運行
kubeadm init # 輸出 Your Kubernetes master has initialized successfully! You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: http://kubernetes.io/docs/admin/addons/ You can now join any number of machines by running the following on each node: kubeadm join --token=e344fa.e007ce406eb41f07 104.236.166.119
完成后會看到提示: `kubeadm join --token=311971.7260777a25d70ac8 104.236.166.119`
在其他兩臺機器上分別運行以上提示的命令
在 master 上查看狀態, kubectl get nodes, 如果看到一共有2個node,一個master, 則表示集群創建成功。
部署CNI網絡kubeadm 自動部署了一個插件,就是 kube-dns, 用于服務發現,但是到這里你會發現 kube-dns 這個服務沒有啟動成功,因為我們還沒有部署CNI網絡。
kubectl get pods --all-namespaces | grep dns
這里有比較多的選擇,我使用了 calico,因為性能比較好,支持一鍵部署。 這里有一篇對比容器網絡的文章,優缺點介紹比較全面, Battlefield: Calico, Flannel, Weave and Docker Overlay Network
配置文件在cni目錄下,或者可以直接在master運行:
# for v1.6.0 kubectl apply -f http://docs.projectcalico.org/v2.1/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml
再次查看 dns 服務是否運行成功吧。
# 按需安裝 git 和 dig yum install -y bind-utils git監控
在部署之前,我們需要對兩臺node標記角色,k8s是通過label來自定義各個資源的類型的。
首先確定兩臺node的name, 通過 kubectl get nodes來查看,之后挑選其中一臺作為前端機器(frontend).
kubectl label node centos-2gb-sfo1-03 role=frontend
這里把centos-2gb-sfo2-node1換成你的 node name
Prometheus應用 monitor 目錄下的兩個配置文件,如下
kubectl create -f prometheus.config.yaml kubectl create -f prometheus.deploy.yaml
接下來打開 http://front-end-ip:30900 就能看到 prometheus 的界面
Grafanakubectl create -f grafana.deploy.yaml
打開 http://front-end-ip:30200 就能看到 grafana 的界面.
還需要添加一個 Data Source. 選擇 Promethues, 地址填上:
http://promethues:9090, 因為有kube-dns,所以這樣就能訪問 pod 中的 service
添加模板,內容為 grafana.config.k8s.json, 這個模板是針對 k8s 集群的儀表模板,添加時選擇對應的 Data Source,然后就能看到效果。
網關類似上面的步驟,配置文件在 gateway 目錄下,運行
kubectl create -f traefik.yaml
這樣在 http://front-end-ip:30088 能看到 網關的 dashboard。
traefik 可以監聽 etcd 中注冊的 ingress 的變化,根據 ingress 資源來自動配置路由, 下面會有具體的示例。最后的效果是, 后端服務的配置文件中定義他自己的 服務domain 和 prefix, traefik會自動添加這個路由, 這樣就可以通過gateway來訪問后端服務了。
日志收集官方有推薦的Log系統: cAdvisor 和 Heapster.
我比較偏愛 ELK, 主要是生態比較好。有兩種方式應用:
第一種是每個Pod都多加一個 sidecar - Filebeat, 在每個后端服務配置文件中指定本地log的路徑(利用 k8s 的 emptyDir 這個volume),在filebeat的配置中指定這個路徑,實現日志收集
還有一種是Filebeat作為 DaemonSet 運行在每臺機器,利用 k8s 的 hostPath 這個volume, 這樣每臺機器只有一個 filebeat 運行,監聽一個指定目錄;后端服務約定好log都寫入這個目錄的子目錄中,這樣也能達到收集效果。
我比較推薦第二種方式,工作量稍微小一些。
第一個服務終于到了這個緊張刺激的環節。
源文件在 hello-app 目錄下,一個簡單的 http service, 主要包含兩個路由:
/metrics 返回 prometheus 抓取的數據格式
/ 其他Path,返回一個隨機id和URI
log 日志輸入 /tmp/hello-log/hello-app.log;
想要達到的效果是:
配置文件中配好路由,自動注冊到 gateway
promethues 自動發現服務,抓取 http://hello:8080/metrics 的監控數據
日志能夠自動收集
app 的配置文件位于 hello-app 目錄下, 運行:
kubectl create -f hello.yaml
接著去 gateway 和 prometheus 的 dashboard 看下,會發現服務已經被發現;
再測試一下通過gateway是否能訪問到 hello-app 這個服務:
curl http://front-end-ip:30087/v1/hello -H "Host: www.hello.local" #結果為: ID:5577006791947779410 path:/hello編譯安裝 kubeadm
下載 kubernetes 項目, checkout v1.6.0, 必須是這個tag
cherry-pick 89557110ed4693a7d23e515e738ced266e099365
KUBE_BUILD_PLATFORMS=linux/amd64 hack/make-rules/build.sh cmd/kubeadm
把生成的 _output 文件打包,放入服務器上
按照本文第一部分的步驟 yum 安裝 docker, kubelet
編輯文件 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 添加 參數--cgroup-driver=systemd
sudo systemctl daemon-reload && sudo systemctl restart kubelet.service
kubeadm init 能完成,但是 node 狀態是 not-ready,因為 cni 沒有配置.
復制 /etc/kubernetes/admin.conf 文件到 ~/.kube/config 然后 執行 kubectl get nodes才可以,因為新版的apiserver啟動時,把 insecure-port 禁用了,8080端口不再可用.
Alpine Linux這次還遇到一個問題, alpine的docker鏡像使用不順利,ubuntu, centos下編譯的文件在 alpine 下無法運行, 記得之前還運行成功過,這次得仔細找找原因。
如何打包出最小鏡像 靜態編譯CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o hello hello-app/*.go
the -a flag means to rebuild all the packages we’re using, which means all the imports will be rebuilt with cgo disabled.
https://github.com/golang/go/...
建議使用 bash 作為 base image, 畢竟還有一些操作例如 mkdir, mv , cp 等需要執行。
如何查看 二進制文件 的 動態依賴?
# ldd hello linux-vdso.so.1 => (0x00007ffde7df8000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff931ae5000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff93171e000) /lib64/ld-linux-x86-64.so.2 (0x00005637b0ae4000) # readelf -d hello Dynamic section at offset 0x697100 contains 19 entries: Tag Type Name/Value 0x0000000000000004 (HASH) 0xa959e0 0x0000000000000006 (SYMTAB) 0xa95e60 0x000000000000000b (SYMENT) 24 (bytes) 0x0000000000000005 (STRTAB) 0xa95c40 0x000000000000000a (STRSZ) 518 (bytes) 0x0000000000000007 (RELA) 0xa95650 0x0000000000000008 (RELASZ) 24 (bytes) 0x0000000000000009 (RELAENT) 24 (bytes) 0x0000000000000003 (PLTGOT) 0xa97000 0x0000000000000015 (DEBUG) 0x0 0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0] // 動態依賴庫 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] // 動態依賴庫 0x000000006ffffffe (VERNEED) 0xa95960 0x000000006fffffff (VERNEEDNUM) 2 0x000000006ffffff0 (VERSYM) 0xa95920 0x0000000000000014 (PLTREL) RELA 0x0000000000000002 (PLTRELSZ) 648 (bytes) 0x0000000000000017 (JMPREL) 0xa95680 0x0000000000000000 (NULL) 0x0Alpine 編譯
alpine linux 使用 musl libc,而 ubuntu, centos 使用的是 glibc, 所以在 ubuntu,centos下編譯的文件一般不能直接使用在 alpine 環境。
# export WORKDIR=/go/src/hello-app # docker run --rm -v $GOPATH/src:/go/src -v "$PWD":${WORKDIR} -w ${WORKDIR} golang:1.8-alpine go build -o hello-alpine hello-app/main.go
注意,編譯的依賴package 被映射入了 /go/src 中; -w 表示 working directory.
http://web-rat.com/posts/2016...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/33021.html
摘要:本文將介紹如何使用部署微服務,包括服務發現,監控,路由,日志。如何查看二進制文件的動態依賴動態依賴庫動態依賴庫編譯使用,而使用的是所以在下編譯的文件一般不能直接使用在環境。 Deploying Micro-services on Kubernetes 本文將介紹如何使用 kubernetes 部署微服務,包括 服務發現,監控,路由,日志。用實際的例子來演示自動化流程。主要分為以下幾個部...
摘要:本文是網易容器云平臺的微服務化實踐系列文章的第一篇。網易容器云平臺的前身是網易應用自動部署平臺,它能夠利用云提供的基礎設施,實現包括構建和部署一體化在內的整個應用生命周期管理。目前網易云容器服務團隊以的方式管理著微服務,每周構建部署次數。 此文已由作者馮常健授權網易云社區發布。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗。 摘要:網易云容器平臺期望能給實施了微服務架構的團隊提供完...
摘要:王磊此次演講的題目為容器新技術架構下的運維實踐,詳細為大家講解了在基于構建容器的過程中,如何以應用為中心,通過新的技術工具對服務節點集群平臺等多個方面進行管理運維,提高系統的自動化運維能力。 2018年11月16-17日,運維&容器技術盛會 CNUTCon 全球運維技術大會在上海·光大會展中心成功舉辦。時速云聯合創始人兼 CTO 王磊受邀參加此次大會,并發表主題演講。王磊此次演講的題目...
摘要:本屆大會議題數量接近,比去年規模較大的北美峰會多出了近一倍。同時還在華為伙伴公有云等云平臺上創建集群并接入了他們的平臺,以便于快速響應技術峰會等大型活動期間暴漲的計算量。Kubernetes,云原生,service mesh,這些驚人的全球增長趨勢,令人欣喜之余迫不及待想要看看云原生在未來究竟會發展出怎樣一派繁榮的景象。 容器領域最具影響力的技術峰會之一 KubeCon + Cloud...
摘要:自年月舉辦以來,規模持續增大。本屆大會議題數量接近,比去年規模較大的北美峰會多出了近一倍。同時還在華為伙伴公有云等云平臺上創建集群并接入了他們的平臺,以便于快速響應技術峰會等大型活動期間暴漲的計算量。 Kubernetes,云原生,service mesh,這些驚人的全球增長趨勢,令人欣喜之余迫不及待想要看看...
閱讀 3916·2021-11-16 11:44
閱讀 3116·2021-11-12 10:36
閱讀 3373·2021-10-08 10:04
閱讀 1257·2021-09-03 10:29
閱讀 391·2019-08-30 13:50
閱讀 2605·2019-08-29 17:14
閱讀 1735·2019-08-29 15:32
閱讀 1081·2019-08-29 11:27