HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    docker高可用(docker高可用實(shí)現(xiàn))

    發(fā)布時(shí)間:2023-04-19 03:16:53     稿源: 創(chuàng)意嶺    閱讀: 122        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于docker高可用的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端

    官網(wǎng):https://ai.de1919.com

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    docker高可用(docker高可用實(shí)現(xiàn))

    一、k8s高可用部署:keepalived + haproxy

    最近依照網(wǎng)上不少文章部署K8s高可用集群,遇到了一些麻煩,在這里記錄下來。

    根據(jù)K8s官方文檔將HA拓?fù)浞譃閮煞N,Stacked etcd topology(堆疊ETCD)和External etcd topology(外部ETCD)。 https://kubernetes.cn/docs/setup/production-environment/tools/kubeadm/ha-topology/#external-etcd-topology

    堆疊ETCD : 每個(gè)master節(jié)點(diǎn)上運(yùn)行一個(gè)apiserver和etcd, etcd只與本節(jié)點(diǎn)apiserver通信。

    外部ETCD : etcd集群運(yùn)行在單獨(dú)的主機(jī)上,每個(gè)etcd都與apiserver節(jié)點(diǎn)通信。

    官方文檔主要是解決了高可用場景下apiserver與etcd集群的關(guān)系, 三master節(jié)點(diǎn)防止單點(diǎn)故障。但是集群對(duì)外訪問接口不可能將三個(gè)apiserver都暴露出去,一個(gè)掛掉時(shí)還是不能自動(dòng)切換到其他節(jié)點(diǎn)。官方文檔只提到了一句“使用負(fù)載均衡器將apiserver暴露給工作程序節(jié)點(diǎn)”,而這恰恰是生產(chǎn)環(huán)境中需要解決的重點(diǎn)問題。

    Notes: 此處的負(fù)載均衡器并不是kube-proxy,此處的Load Balancer是針對(duì)apiserver的。

    下面以一個(gè)實(shí)驗(yàn)驗(yàn)證高可用性。準(zhǔn)備三臺(tái)機(jī)器以及一個(gè)vip(阿里云,openstack等都有提供)。

    haproxy提供高可用性,負(fù)載均衡,基于TCP和HTTP的代理,支持?jǐn)?shù)以萬記的并發(fā)連接。 https://github.com/haproxy/haproxy

    haproxy可安裝在主機(jī)上,也可使用docker容器實(shí)現(xiàn)。文本采用第二種。

    創(chuàng)建配置文件/etc/haproxy/haproxy.cfg,重要部分以中文注釋標(biāo)出:

    在三個(gè)節(jié)點(diǎn)啟動(dòng)haproxy

    keepalived是以VRRP(虛擬路由冗余協(xié)議)協(xié)議為基礎(chǔ), 包括一個(gè)master和多個(gè)backup。 master劫持vip對(duì)外提供服務(wù)。master發(fā)送組播,backup節(jié)點(diǎn)收不到vrrp包時(shí)認(rèn)為master宕機(jī),此時(shí)選出剩余優(yōu)先級(jí)最高的節(jié)點(diǎn)作為新的master, 劫持vip。keepalived是保證高可用的重要組件。

    keepalived可安裝在主機(jī)上,也可使用docker容器實(shí)現(xiàn)。文本采用第二種。( https://github.com/osixia/docker-keepalived )

    配置keepalived.conf, 重要部分以中文注釋標(biāo)出:

    啟動(dòng)keepalived:

    查看keepalived master容器日志:

    查看master vip:

    可以看到vip已綁定到keepalived master

    下面進(jìn)行破壞性測試:

    暫停keepalived master節(jié)點(diǎn)haproxy

    查看keepalived master日志

    可以看到haproxy檢測失敗,priority降低,同時(shí)另一節(jié)點(diǎn)10.53.61.195 priority 比master節(jié)點(diǎn)高,master置為backup

    查看10.53.61.195 keepalived日志:

    可以看到10.53.61.195被選舉為新的master。

    至此高可用實(shí)驗(yàn)完成,接下來就是使用kubeadm安裝k8s組件,這里就不展開了。

    二、Nacos Server Docker部署集群踩坑

    我們的應(yīng)用是AWS云原生環(huán)境,之前在美國區(qū)域使用的是nacos-server.jar進(jìn)行安裝(ec2),后面開展新的區(qū)域部署時(shí)準(zhǔn)備將所有的ec2應(yīng)用全部轉(zhuǎn)換為ecs部署,包括Nacos。我們參考Naocs官網(wǎng)Docker鏡像集群默認(rèn)方式部署,控制臺(tái)能夠正常方式并創(chuàng)建Namespace和congfig。但是到了應(yīng)用注冊時(shí)就報(bào)錯(cuò)了:

    最后還因?yàn)镹acos之間也無法互相注冊成功,導(dǎo)致大量日志輸出,頻繁GC,最后Nacos服務(wù)宕機(jī)。

    查詢網(wǎng)絡(luò)以及官網(wǎng)issu也沒統(tǒng)一的處理意見,大多是說版本問題,我們從1.4.0降級(jí)到1.3.0也都沒法解決問題。

    通過仔細(xì)的排查日志、Nacos Server日志,經(jīng)過小一個(gè)小時(shí),最終找到問題,原來是因?yàn)椋?/p>

    改成Docker-standalone模式。數(shù)據(jù)持久化用mysql,使用aws負(fù)載均衡器能保證高可用,從而達(dá)到Nacos 集群的效果。

    三、kubeadm搭建高可用K8s集群

    準(zhǔn)備3臺(tái)機(jī)器,分別設(shè)置hostname如下所示(此處主要是為了便于標(biāo)識(shí)不同的機(jī)器,其實(shí)不設(shè)置hostname也可以正常搭建):

    參考《 使用Kubeadm搭建Kubernetes(1.13.1)集群 》在 master1 搭建一個(gè)單master節(jié)點(diǎn)的k8s集群。

    參考《 使用Kubeadm搭建Kubernetes(1.13.1)集群 》在 master2 和 master3 安裝 docker、kubeadm 、 kubectl、flannel ,但不要執(zhí)行 kubeadm init 。(如果執(zhí)行了 kubeadm init 也沒關(guān)系,再執(zhí)行 kubeadm reset 就行了)。

    然后在 master1 節(jié)點(diǎn) /etc/kubernetes/ 目錄下執(zhí)行 tar -czvf pki.tar.gz pki 對(duì) pki 目錄進(jìn)行壓縮生成 pki.tar.gz 文件。

    將pki.tar.gz文件上傳到第二和第三個(gè)master節(jié)點(diǎn){$HOME}/~目錄下(可以用scp、rsync、sz/rz等命令都可以)。

    然后在第二和第三個(gè)master節(jié)點(diǎn){$HOME}/~目錄下執(zhí)行如下命令將證書拷貝到 /etc/kubernetes/pki/ 目錄下:

    注意:一定要?jiǎng)h除etcd相關(guān)的證書,否則會(huì)把整個(gè)k8s集群搞掛。

    在第一步master1搭建完成后,會(huì)得到如下的 kubeadm join 命令。這一步在master2和master3分別執(zhí)行該 kubeadm join 命令即可。

    注意:一定要加上參數(shù) --experimental-control-plane

    登錄master1,修改 /etc/kubernetes/manifests/etcd.yaml 。這一步的目的是啟動(dòng)只有一個(gè)etcd節(jié)點(diǎn)的集群,然后往這個(gè)集群中添加新節(jié)點(diǎn)等待數(shù)據(jù)同步。

    然后重啟kubelet

    通過 sudo docker ps 查看啟動(dòng)的etcd容器ID

    通過 sudo docker exec -it b69913e36ce1 sh 進(jìn)入容器內(nèi)。

    通過下面的命令可以查看當(dāng)前etcd集群的節(jié)點(diǎn)列表:

    可以看到當(dāng)前集群中只有一個(gè)節(jié)點(diǎn):

    此時(shí),apiserver已經(jīng)可以正常訪問etcd,可以通過 kubectl get nodes 驗(yàn)證一下:

    如果不小心在master節(jié)點(diǎn)上執(zhí)行了 sudo kubeadm reset -f ,導(dǎo)致節(jié)點(diǎn)重置,etcd容器被kill,數(shù)據(jù)清空。直接通過 kubeadm join xxx 并不能直接將該節(jié)點(diǎn)添加回去,而會(huì)報(bào)出下面的錯(cuò)誤:

    解決方案參考文檔: Kubernetes master無法加入etcd 集群解決方法

    解決方法:

    1.在kubeadm-config刪除的狀態(tài)不存在的etcd節(jié)點(diǎn):

    把上邊的刪掉:

    我嘗試了方案一,然后重新執(zhí)行下面的命令,問題就成功解決了。

    效果如下:

    在執(zhí)行kubectl join xxx命令時(shí),出現(xiàn)這種情況是和docker殘留信息有關(guān)系,可以考慮重啟docker:

    這樣反復(fù)多試幾次就成功了(個(gè)人經(jīng)驗(yàn))。

    出現(xiàn)這種情況的原因是:該master節(jié)點(diǎn)安裝flannel失敗了。

    此時(shí),如果查看kubelet的狀態(tài),一般是啟動(dòng)失敗的狀態(tài)。通過 sudo journalctl xe - no-pager 可以看到如下報(bào)錯(cuò)誤信息:

    這種情況可以嘗試手動(dòng)安裝flannel,然后重啟機(jī)器就可以解決,flannel安裝過程參考《 安裝Kubernetes報(bào)錯(cuò):STATUS NotReady 》

    如果上述方式不管用,可以嘗試下面的方式:

    四、使用docker搭建flink集群

    【參考】: https://blog.csdn.net/lizhe_dashuju/article/details/100541121

    1.拉取centos鏡像

    $ docker pull centos:latest

    2.創(chuàng)建兩個(gè)節(jié)點(diǎn)

    $ docker run --name flinkmaster -d -p 8081:8081 centos -it /bin/bash

    $ docker run --name flinkworker -d centos -it /bin/bash

    3.安裝jdk 1.8

    $ yum search java|grep jdk

    $ yum install -y java-1.8.0-openjdk.x86_64

    4.將flink安裝包c(diǎn)p到容器,解壓縮

    docker cp flink-1.8.1-bin-scala_2.12.tgz flinkmaster:/usr

    docker cp flink-1.8.1-bin-scala_2.12.tgz flinkworker:/usr

    tar xvf flink-1.8.1-bin-scala_2.12.tgz

    5.修改兩個(gè)機(jī)器的/etc/hosts,都增加如下內(nèi)容。

    172.17.0.3 f3a573de76af

    172.17.0.4 0379a31fd702

    172.17.0.3 flinkmaster

    172.17.0.4 flinkworker

    注意,兩個(gè)節(jié)點(diǎn)的hostname是隨機(jī)生成的,注意自己修改。

    【Flink 集群搭建,Standalone,集群部署,HA高可用部署參考】: https://developer.aliyun.com/article/765741

    【Linux 集群免密登錄配置,雙向免密參考】:

    https://ipooli.com/2020/04/linux_host/?spm=a2c6h.12873639.0.0.7ee664deehTPTo

    1.centos安裝sshd:

    $ yum -y install openssh-server

    $ yum -y install openssh-clients

    2.啟動(dòng)sshd服務(wù)

    $ /usr/sbin/sshd -D

    3.修改root密碼

    yum -y install passwd

    passwd root

    4.flinkmaster和flinkworker生成密鑰對(duì)

    $ ssh-keygen -t rsa

    之后根據(jù)提示,回車 進(jìn)入.ssh目錄會(huì)看見 id_rsa (私鑰) 和 id_rsa.pub (公鑰)兩個(gè)文件。

    6.將公鑰文件拷貝到另外兩臺(tái)主機(jī) 使用 ssh-copy-id 命令

    $ ssh-copy-id -i ~/.ssh/id_ rsa.pub root@flinkworker

    7.驗(yàn)證登錄

    ssh root@flinkworker

    如果不提示輸入密碼則成功。

    1.修改配置文件

    $ vim ./conf/flink-conf.yaml

    修改如下幾個(gè)參數(shù):

    jobmanager.rpc.address: flinkmaster

    jobmanager.rpc.port: 6123

    jobmanager.heap.size: 1024m

    taskmanager.memory.process.size: 1568m

    taskmanager.numberOfTaskSlots: 2

    parallelism.default: 2</pre>

    $ vim ./conf/masters

    修改為:

    flinkmaster:8081

    $ vim ./conf/worker

    修改為:

    flinkmaster

    flinkmaster

    2.拷貝到其他機(jī)器

    scp -r /usr/flink-1.12.2/ root@flinkworker:/usr/

    3.啟動(dòng)集群

    在flinkmaster上執(zhí)行

    ./bin/start-cluster.sh

    4.訪問 http://localhost:8081/

    2個(gè)Task Managers,1個(gè)Job Managers為flinkmaster

    以上就是關(guān)于docker高可用相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。


    推薦閱讀:

    windows7無權(quán)訪問文件夾(windows7無權(quán)限訪問文件夾)

    Dou訂單為何刪除不了(抖音訂單為什么刪除不了)

    shadow讀音(shadow讀音發(fā)音)

    門頭設(shè)計(jì)網(wǎng)站(門頭設(shè)計(jì)網(wǎng)站推薦)

    華與華經(jīng)典廣告(華與華經(jīng)典廣告文案)