成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一個網(wǎng)站的微服務(wù)架構(gòu)實戰(zhàn)(2)k8s遷移

Forelax / 2876人閱讀

摘要:前言我們一起回顧上一篇文章平臺的微服務(wù)架構(gòu)和,一共通過構(gòu)建了三個鏡像數(shù)據(jù)庫,部署前端頁面的,和接口。最近阿里云產(chǎn)品春節(jié)大促銷,我一時沒忍住又買了一臺服務(wù)器,打完折扣還是很貴。是一個非常穩(wěn)定的,可移植的網(wǎng)絡(luò)文件系統(tǒng)。

前言

我們一起回顧上一篇文章《Bees平臺的微服務(wù)架構(gòu)(1)docker和docker-compose》,一共通過Dockerfile構(gòu)建了三個docker鏡像:mysql數(shù)據(jù)庫,部署angular前端頁面的nginx,和springboot接口。然后使用docker-compose來做容器服務(wù)的編排,以保障不同容器之間可以互訪。為了提高開發(fā)的效率,我們還寫了一個自動部署的腳本,實際是只是通過docker-compose.yml啟動和關(guān)閉容器,在本地鏡像庫中生成或刪除鏡像。

不可否認(rèn),docker-compose服務(wù)編排的小巧靈活性讓人愛不釋手,那我們今天為什么要遷移到k8s(kubernetes)上呢?因為k8s的編排能力更強(qiáng),因為k8s可以做跨主機(jī)的分布式集群,因為k8s搭載rancher將更有利于微服務(wù)架構(gòu)的統(tǒng)一管理,等等。

k8s準(zhǔn)備

本文將不講解k8s和rancher的安裝和配置,相關(guān)的安裝文檔和配置文檔網(wǎng)上有很多。最近阿里云產(chǎn)品春節(jié)大促銷,我一時沒忍住又買了一臺服務(wù)器,打完折扣還是很貴。心疼歸心疼,不過這樣我就有兩臺服務(wù)器了,就順便搭建了k8s的集群環(huán)境。

鏡像倉庫

分布式集群帶來的復(fù)雜度就增加了。你沒辦法直接使用本地的鏡像庫地址了,我不想搭建鏡像倉庫,好在阿里的docker鏡像倉庫是免費的,就將最終版的docker鏡像推送到阿里的容器倉庫里面。當(dāng)需要啟動容器時,容器的地址就寫阿里容器倉庫里的地址,后文中會出現(xiàn)。

宿主機(jī)掛載卷

分布式的另一個問題就是宿主機(jī)的掛載卷,如果對上一篇文章印象深刻的話,應(yīng)該記得mysql數(shù)據(jù)庫的數(shù)據(jù)文件和nginx代理的圖片文件等,都是掛載在宿主機(jī)上的。因為docker容器的特性,如果不使用掛載卷,在重啟容器之后容器內(nèi)的數(shù)據(jù)都會丟失。分布式環(huán)境中,不同主機(jī)之間是沒辦法互訪目錄的。我是通過在一臺機(jī)器上搭建了nfs服務(wù)器,將單臺機(jī)器上的目錄開放為共享目錄,具體內(nèi)容下文有介紹。

服務(wù)互訪

不同服務(wù)之間免不了要相互訪問,例如:springboot要訪問數(shù)據(jù)庫和redis,angualr要調(diào)用springboot接口。而且考慮到k8s上經(jīng)常要對某個服務(wù)做多節(jié)點的集群,所以要在注冊中心開放給外界訪問的地址應(yīng)該是集群的地址。

我們在docker-compose上是怎么做的呢?在docker-compose.yml 上定義多個服務(wù)service,每個service對應(yīng)于一個鏡像。容器啟動后,對應(yīng)容器的服務(wù)名稱即可以作為 hostname來使用。

k8s上也有類似的用法,它使用yaml文件,kind類型有很多,例如:Pod表示啟動的服務(wù)是一個pod;ReplicationController則會根據(jù)Pod模板生成一批pod作為集群;Service則相當(dāng)于服務(wù)的注冊,可給與之對應(yīng)的pod副本集群提供訪問地址,等等還有很多。那這個問題Service就能解決,我們給不同的服務(wù)都創(chuàng)建一個Service,這樣就也能同docker-compose一樣通過服務(wù)的名稱就能訪問與之對應(yīng)服務(wù)的pod副本集群。

其他

因為業(yè)務(wù)需要,在之前的三個鏡像的基礎(chǔ)上又加了一個redis鏡像。那么分布式redis、分布式mysql環(huán)境搭建就太麻煩了,如果以后有機(jī)會再多帶帶寫文章來介紹,這次我干脆就只啟動單節(jié)點的mysql和redis。

nfs共享目錄

NFS是Network File System的簡寫,即網(wǎng)絡(luò)文件系統(tǒng),NFS是FreeBSD支持的文件系統(tǒng)中的一種。NFS基于RPC(Remote Procedure Call)遠(yuǎn)程過程調(diào)用實現(xiàn),其允許一個系統(tǒng)在網(wǎng)絡(luò)上與它人共享目錄和文件。通過使用NFS,用戶和程序就可以像訪問本地文件一樣訪問遠(yuǎn)端系統(tǒng)上的文件。NFS是一個非常穩(wěn)定的,可移植的網(wǎng)絡(luò)文件系統(tǒng)。

選用nfs的另一個原因是,nfs服務(wù)在k8s上可以直接作為存儲卷使用,十分方便。

安裝

nfs是基于rpc的,安裝nfs就需要確保已安裝rpcbind,不過一般CentOS都默認(rèn)已安裝了rpcbind

##查找是否已安裝nfs 和 rpcbind
[mpaas@kerry1 k8s]$ rpm -qa | grep nfs
[mpaas@kerry1 k8s]$ rpm -qa | grep rpcbind
##如果沒安裝,則通過有yum安裝
[mpaas@kerry1 k8s]$ yum -y install nfs-utils
[mpaas@kerry1 k8s]$ yum -y install rpcbind

安裝完成后,必須要先啟動rpcbind服務(wù),再啟動nfs服務(wù)

[mpaas@kerry1 k8s]$ systemctl start rpcbind
[mpaas@kerry1 k8s]$ systemctl start nfs-server

設(shè)置開機(jī)啟動

[mpaas@kerry1 k8s]$ systemctl enable rpcbind
[mpaas@kerry1 k8s]$ systemctl enable nfs-server
配置

通過修改 /etc/exports 文件,設(shè)置nfs的共享目錄

/home/nfs/bees/mysql/data *(rw,no_root_squash,no_all_squash,sync)

如上,將 /home/nfs/bees/mysql/data作為共享目錄

星號* 代表可在任意服務(wù)器上訪問該共享目錄,也可以指定特點的ip和端口訪問

括號內(nèi)是參數(shù)設(shè)置,常見的參數(shù)則有:

rw  ro    該目錄分享的權(quán)限是可擦寫 (read-write) 或只讀 (read-only),但最終能不能讀寫,還是與文件系統(tǒng)的 rwx 及身份有關(guān)。

sync  async    sync 代表數(shù)據(jù)會同步寫入到內(nèi)存與硬盤中,async 則代表數(shù)據(jù)會先暫存于內(nèi)存當(dāng)中,而非直接寫入硬盤!

no_root_squash  root_squash    客戶端使用 NFS 文件系統(tǒng)的賬號若為 root 時,系統(tǒng)該如何判斷這個賬號的身份?預(yù)設(shè)的情況下,客戶端 root 的身份會由 root_squash 的設(shè)定壓縮成 nfsnobody, 如此對服務(wù)器的系統(tǒng)會較有保障。但如果你想要開放客戶端使用 root 身份來操作服務(wù)器的文件系統(tǒng),那么這里就得要開 no_root_squash 才行!

all_squash    不論登入 NFS 的使用者身份為何, 他的身份都會被壓縮成為匿名用戶,通常也就是 nobody(nfsnobody) 啦!

anonuid  anongid    anon 意指 anonymous (匿名者) 前面關(guān)于 *_squash 提到的匿名用戶的 UID 設(shè)定值,通常為 nobody(nfsnobody),但是你可以自行設(shè)定這個 UID 的值!當(dāng)然,這個 UID 必需要存在于你的 /etc/passwd 當(dāng)中! anonuid 指的是 UID 而 anongid 則是群組的 GID 啰。

編輯完 /etc/exports 文件后,執(zhí)行下列命令生效

[mpaas@kerry1 k8s]$  exportfs -r

在服務(wù)器端,可執(zhí)行下列命令查看目錄是否共享成功

[mpaas@kerry1 k8s]$ showmount -e localhost
Export list for localhost:
/home/nfs/bees/mysql/data *

也可以在另外一臺機(jī)器上安裝nfs后執(zhí)行上述命令,只需要將localhost換成目標(biāo)服務(wù)器的ip地址即可。

nginx服務(wù)

先啟動nginx來部署angualr,我們需要創(chuàng)建一個RC,根據(jù)模板創(chuàng)建pods,暫時只創(chuàng)建一個pod,后續(xù)如果需要擴(kuò)展再在rancher上管理。

創(chuàng)建bees_angular_rc.yaml,開放pod的80端口

apiVersion: v1
kind: ReplicationController
metadata:
 name: bees-angular
spec:
 replicas: 1
 selector:
  app: bees-angular
 template:
  metadata:
   labels:
    app: bees-angular
  spec:
   containers:
   - name: bees-angular
     image: registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-nginx:v1.0
     ports:
     - containerPort: 80

創(chuàng)建bees_angualr_svc.yaml,設(shè)置nodePort,將pod的80端口映射給宿主機(jī)的30000端口

apiVersion: v1
kind: Service
metadata:
 name: bees-angular
spec:
 type: NodePort
 ports: 
  - port: 80
    nodePort: 30000
 selector:
  app: bees-angular

那么執(zhí)行下列命令即可創(chuàng)建rc和service,與之對應(yīng)的pod也會運行起來

##啟動rc
[mpaas@kerry1 k8s]$ kubectl create -f bees-angular-rc.yaml 
##啟動service
[mpaas@kerry1 k8s]$ kubectl create -f bees-angular-svc.yaml 
##查看pod是否啟動成功
[mpaas@kerry1 k8s]$ kubectl get pods
mysql服務(wù)

創(chuàng)建bees_mysql_rc.yaml,開放pod的3306端口,并將nfs服務(wù)器上的共享目錄 /home/nfs/bees/mysql/data 掛載到容器中

apiVersion: v1
kind: ReplicationController
metadata:
 name: bees-mysql
spec:
 replicas: 1
 selector:
  app: bees-mysql
 template:
  metadata:
   labels:
    app: bees-mysql
  spec:
   containers:
   - name: bees-mysql
     image: registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-mysql:v1.0
     ports:
     - containerPort: 3306
     env:
     - name: MYSQL_ROOT_PASSWORD
       value: 數(shù)據(jù)庫密碼
     volumeMounts:
     - name: mysql-data-persistent-storage
       mountPath: /var/lib/mysql
   volumes:
   - name: mysql-data-persistent-storage
     nfs:
      path: /home/nfs/bees/mysql/data
      server: nfs服務(wù)器的ip

創(chuàng)建bees_mysql_svc.yaml

apiVersion: v1
kind: Service
metadata:
 name: bees-mysql
spec:
 type: NodePort
 ports: 
  - port: 3306
    nodePort: 30003
 selector:
  app: bees-mysql
springboot服務(wù)

bees_springboot_rc.yaml

kind: ReplicationController
metadata:
 name: bees-springboot
spec:
 replicas: 1
 selector:
  app: bees-springboot
 template:
  metadata:
   labels:
    app: bees-springboot
  spec:
   containers:
   - name: bees-springboot
     image: registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-springboot:v1.0
     ports:
     - containerPort: 8010

bees_springboot_svc.yaml

apiVersion: v1
kind: Service
metadata:
 name: bees-springboot
spec:
 type: NodePort
 ports: 
  - port: 8010
    nodePort: 30004
 selector:
  app: bees-springboot

都是一些基礎(chǔ)的代碼使用,這里就不過多寫了。

自動打包鏡像推送倉庫的腳本
#!/bin/bash

echo "nginx版本:"$1
echo "springboot版本:"$2

v_springboot_jar=`find /bees/devops/upload/ -name "*.jar"`
echo "找到j(luò)ar:"$v_springboot_jar
v_angular_zip=`find /bees/devops/upload/ -name "dist.zip"`
echo "找到dist:"$v_angular_zip

docker rmi -f $(docker images|grep "paperbee-nginx" | awk "{print $3}")
docker rmi -f $(docker images|grep "paperbee-springboot" | awk "{print $3}")
echo "刪除原鏡像"

cd /bees/devops/dockerfiles/springboot-k8s/
rm -f *.jar
cp $v_springboot_jar ./bees-0.0.1-SNAPSHOT.jar
docker build -t paperbee-springboot .
echo "生成springboot鏡像"

cd /bees/devops/dockerfiles/angular-k8s/
rm -rf dist/
cp $v_angular_zip ./dist.zip
unzip dist.zip
rm -f dist.zip
docker build -t paperbee-nginx .
echo "生成angular鏡像"

docker login --username=賬號 --password=密碼 registry.cn-hangzhou.aliyuncs.com
echo "登錄docker容器倉庫"

v_nginx_image=$(docker images|grep "paperbee-nginx" | awk "{print $3}")
v_springboot_image=$(docker images|grep "paperbee-springboot" | awk "{print $3}")


docker tag $v_nginx_image registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-nginx:$1
docker push registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-nginx:$1
echo "推送 bees-nginx:"$1


docker tag $v_springboot_image registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-springboot:$2
docker push registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-springboot:$2
echo "推送 bees-springboot:"$2

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/33152.html

相關(guān)文章

  • 容錯性好、易于管理和便于觀察:淺談如何利用K8s全面擁抱微服務(wù)架構(gòu)

    摘要:年月日,論壇首次來到中國,在上??鐕少彆怪行恼匍_并獲得了圓滿成功。擁抱微服務(wù)就成為大勢所趨。和大會日期會議日程通告日期年月日會議活動舉辦日期年月至日和贊助方案和多元化獎學(xué)金現(xiàn)正接受申請和即將首次合體落地中國和購票窗口,立即購票 KubeCon + CloudNativeCon 論壇,作為 CNCF 的旗艦會議,自2016年以來已經(jīng)在北美和歐洲兩地的舊金山、倫敦、硅丘(奧斯?。?、哥本...

    Ku_Andrew 評論0 收藏0
  • 快收藏!5225萬字,微服務(wù)、云原生、容器、K8S、Serverless精華文章集錦

    摘要:正在走遠(yuǎn),新年之初,小數(shù)精選過去一年閱讀量居高的技術(shù)干貨,從容器到微服務(wù)云原生,匯集成篇精華集錦,充分反映了這一年的技術(shù)熱點走向。此文值得收藏,方便隨時搜索和查看。,小數(shù)將繼續(xù)陪伴大家,為朋友們奉獻(xiàn)更有逼格的技術(shù)內(nèi)容。 2017正在走遠(yuǎn),新年之初,小數(shù)精選過去一年閱讀量居高的技術(shù)干貨,從容器、K8S 到微服務(wù)、云原生、Service Mesh,匯集成52篇精華集錦,充分反映了這一年的技...

    AaronYuan 評論0 收藏0
  • 2021 年最新基于 Spring Cloud 的微服務(wù)架構(gòu)分析

    摘要:是一個相對比較新的微服務(wù)框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統(tǒng)解決方案。提供線程池不同的服務(wù)走不同的線程池,實現(xiàn)了不同服務(wù)調(diào)用的隔離,避免了服務(wù)器雪崩的問題。通過互相注冊的方式來進(jìn)行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務(wù)框架,...

    cikenerd 評論0 收藏0
  • 回顧Java 發(fā)展,看 Docker 與Mesos | 數(shù)人云COO謝樂冰@KVM分享實錄

    摘要:馬拉松會匹配每個和提供的資源,然后通過將任務(wù)下發(fā)下去。對外暴露的就是負(fù)載均衡的某個服務(wù),后面自動將流量轉(zhuǎn)發(fā)到某個容器的端口上。還有一直辦法是用內(nèi)網(wǎng)的,這個會維護(hù)現(xiàn)有的容器列表端口,并且返回任意一個的端口,頁實現(xiàn)了負(fù)載均衡和服務(wù)發(fā)現(xiàn)功能。 演講嘉賓 數(shù)人云COO 謝樂冰 在德國工作十年,回國后加入惠普電信運營商部門,擁有多年項目經(jīng)驗和創(chuàng)業(yè)公司工作經(jīng)驗。在數(shù)人云負(fù)責(zé)產(chǎn)品售前和運營,專注行...

    canger 評論0 收藏0

發(fā)表評論

0條評論

Forelax

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<