本文是繼《微服務(wù)架構(gòu)系列一:關(guān)鍵技術(shù)與原理研究》的后續(xù),系列一中論述了微服務(wù)研究的背景和意義,主要調(diào)研了傳統(tǒng)架構(gòu)的發(fā)展以及存在的問(wèn)題和微服務(wù)架構(gòu)的由來(lái),然后針對(duì)微服務(wù)架構(gòu)的設(shè)計(jì)原則、容器技術(shù)、服務(wù)發(fā)現(xiàn)、通信機(jī)制、持續(xù)集成等方面進(jìn)行了分析與研究,并簡(jiǎn)單講述了谷歌Kubernetes的相關(guān)組件和原理。系列二依據(jù)系列一中講述的相關(guān)技術(shù),進(jìn)行了業(yè)務(wù)原理分析和建模,然后一步步實(shí)現(xiàn)了基于機(jī)器學(xué)習(xí)的密碼強(qiáng)度評(píng)測(cè)服務(wù),搭建相關(guān)環(huán)境并部署編排服務(wù)和進(jìn)行了相關(guān)驗(yàn)證,最后對(duì)微服務(wù)架構(gòu)設(shè)計(jì)進(jìn)行了總結(jié)和展望,并簡(jiǎn)單概述了后續(xù)系列的工作。
基于機(jī)器學(xué)習(xí)的密碼強(qiáng)度評(píng)測(cè)微服務(wù)實(shí)現(xiàn)
隨著互聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展和廣泛應(yīng)用,在數(shù)據(jù)信息日益敏感的當(dāng)下,網(wǎng)絡(luò)安全問(wèn)題也變得日益嚴(yán)峻。加上數(shù)字化和網(wǎng)絡(luò)化在生活中的普及,防止數(shù)據(jù)遭到未經(jīng)授權(quán)訪(fǎng)問(wèn)變得越來(lái)越重要,由于便于理解,使用簡(jiǎn)單和部署成本低,自從互聯(lián)網(wǎng)誕生以來(lái),文本密碼幾乎應(yīng)用于需要保護(hù)我們的數(shù)據(jù)的每一個(gè)地方,盡管它們有許多已知的缺陷[1][2][3]。評(píng)測(cè)密碼強(qiáng)度的方式有很多,除了常規(guī)的基于字符種類(lèi)規(guī)則,也有借助猜測(cè)熵和最小熵對(duì)密碼強(qiáng)度進(jìn)行估計(jì)的研究[4],基于模糊概率上下文無(wú)關(guān)語(yǔ)法的密碼強(qiáng)度估計(jì)[5]。
機(jī)器學(xué)習(xí)是人工智能領(lǐng)域中最能體現(xiàn)智能的分支,從歷史看,機(jī)器學(xué)習(xí)也是人工智能領(lǐng)域發(fā)展最快的分支之一[6]。本章節(jié)會(huì)通過(guò)機(jī)器學(xué)習(xí)方法去對(duì)密碼強(qiáng)弱進(jìn)行分類(lèi),并通過(guò)Python把對(duì)應(yīng)算法即K最近鄰算法,決策樹(shù)算法實(shí)現(xiàn)成微服務(wù),供上游調(diào)用,以組成整體微服務(wù)架構(gòu)中核心業(yè)務(wù)部分。另外因?yàn)闄C(jī)器學(xué)習(xí)相關(guān)算法研究及實(shí)現(xiàn)不是本文重點(diǎn),同時(shí)鑒于時(shí)間和篇幅,對(duì)于樸素貝葉斯、多層感知器、支持向量機(jī)等其它適用于密碼強(qiáng)度評(píng)測(cè)的機(jī)器學(xué)習(xí)算法,在本文就不做討論和相關(guān)具體實(shí)現(xiàn)了,而且已經(jīng)有相關(guān)研究對(duì)其它幾種算法進(jìn)行了可行性論述[7][8],后續(xù)可能會(huì)通過(guò)發(fā)起Github上的開(kāi)源項(xiàng)目去繼續(xù)研究和探討。
1. K-最近鄰算法
K 最近鄰算法(k-Nearest Neighbor),簡(jiǎn)稱(chēng)KNN,是一個(gè)在理論上比較成熟的算法,也是目前最簡(jiǎn)單的機(jī)器學(xué)習(xí)算法之一,它是一種惰性學(xué)習(xí)算法(分類(lèi)器不需使用訓(xùn)練數(shù)據(jù)集進(jìn)行訓(xùn)練,訓(xùn)練的時(shí)間復(fù)雜度為0,有利有弊,與其它惰性學(xué)習(xí)算法一樣,KNN的計(jì)算復(fù)雜度會(huì)隨著訓(xùn)練集的空間大小增大而增大,也就是說(shuō)分類(lèi)復(fù)雜度為O(n)),是在1968年由 Cover 和Hart 提出的。該算法的思想是:如果一個(gè)樣本它的特征空間中,有K個(gè)最相似也就是最鄰近的樣本的大多數(shù)都屬于一個(gè)分類(lèi),那么這個(gè)樣本也屬于這個(gè)分類(lèi)。當(dāng)然算法的前提是,所選的K個(gè)樣本都是經(jīng)過(guò)正確分類(lèi)過(guò)的,一般K是不大于20的整數(shù)。一句話(huà)概括就是找到離自己最近的K個(gè)點(diǎn)中的大多數(shù)同一分類(lèi)的類(lèi)別作為自己的類(lèi)別。
距離計(jì)算數(shù)學(xué)描述:
對(duì)于任意的特征向量x:
ar(x)表示實(shí)例x的第r個(gè)屬性值,兩個(gè)實(shí)例xi和xj之間的距離定義為d(xi xj)
根據(jù)歐式距離公式:
訓(xùn)練算法:
對(duì)于每個(gè)訓(xùn)練實(shí)例
分類(lèi)算法:
給定一個(gè)要分類(lèi)的查詢(xún)實(shí)例xq,在訓(xùn)練實(shí)例列表中選出最鄰近xq的k個(gè)實(shí)例,并用x1…xk來(lái)表示,定義離散目標(biāo)函數(shù)
V是有限集合{v1,v2... vs},則
其中如果a=b那么
否則
對(duì)前面的K最近鄰算法做一下簡(jiǎn)單修改,使其能被用于逼近連續(xù)值的目標(biāo)函數(shù),為了達(dá)到此目標(biāo),我們只需要讓算法計(jì)算K個(gè)最臨近實(shí)例的平均值,而不再是計(jì)算其中的最普遍的值,定義實(shí)值目標(biāo)函數(shù)
則
2. 決策樹(shù)
決策樹(shù)(Decision Tree),顧名思義,是一種樹(shù)——依托策略抉擇而建立的樹(shù)。在機(jī)器學(xué)習(xí)里面,它是一個(gè)預(yù)測(cè)模型,它所代表的是一個(gè)對(duì)象的屬性和值之間的映射關(guān)系。決策樹(shù)是應(yīng)用最廣的歸納推理算法之一,屬于監(jiān)督學(xué)習(xí)中的一種,所謂監(jiān)督學(xué)習(xí),就是給定一定數(shù)量的都有屬于自己的一些屬性以及類(lèi)別的樣本。其中類(lèi)別是根據(jù)數(shù)據(jù)本身屬性確定的,然后,通過(guò)對(duì)樣本數(shù)據(jù)進(jìn)行訓(xùn)練學(xué)習(xí)得到一個(gè)分類(lèi)器,得到的分類(lèi)器可以對(duì)新出現(xiàn)的實(shí)例進(jìn)行分類(lèi),這種機(jī)器學(xué)習(xí)方式就被稱(chēng)為監(jiān)督學(xué)習(xí)。
我們可以用下面的箭線(xiàn)圖1-1來(lái)形象的表示決策的過(guò)程的各個(gè)階段之間的聯(lián)系。
圖1-1決策樹(shù)決策過(guò)程關(guān)系圖
選擇分割的方法可以有很多,但最終目的一致:也就是對(duì)目標(biāo)類(lèi)嘗試進(jìn)行最佳分割,由于從根到葉子有多條路徑,一條規(guī)則對(duì)應(yīng)一條路徑,很明顯,決策樹(shù)是一顆二叉樹(shù)或多叉樹(shù)。
決策樹(shù)有四種構(gòu)成要素,決策結(jié)點(diǎn)、狀態(tài)節(jié)點(diǎn)、方案枝、概率枝。決策結(jié)點(diǎn)也叫方塊結(jié)點(diǎn);狀態(tài)結(jié)點(diǎn)又叫圓形結(jié)點(diǎn);決策結(jié)點(diǎn)引出若干條分支每條分支代表一個(gè)方案,故稱(chēng)方案枝;狀態(tài)結(jié)點(diǎn)又會(huì)引出很多分支,代表不同的狀態(tài),由于上面會(huì)反映客觀狀態(tài)和出現(xiàn)的頻率,每個(gè)分支又被稱(chēng)為概率枝,在概率枝的末端會(huì)有該狀態(tài)下所達(dá)到結(jié)果也就是權(quán)重值。如圖1-2所示。
圖1-2決策樹(shù)圖標(biāo)示例
決策樹(shù)分類(lèi)的思想跟大學(xué)報(bào)志愿類(lèi)似,我們會(huì)考慮,學(xué)校層次是名校、985還是211等,然后地域是南方還是北方、專(zhuān)業(yè)是否熱門(mén)等因素,不同的因素不同的人會(huì)有不同的側(cè)重,所謂因人而異,那么就需要具體情況具體分析和決策。如果把每一個(gè)未知的選項(xiàng)都?xì)w類(lèi)到已有的分類(lèi)類(lèi)別中就形成了一顆決策樹(shù)。
3. 訓(xùn)練數(shù)據(jù)準(zhǔn)備
訓(xùn)練數(shù)據(jù)是利用了2014年俄羅斯黑客在網(wǎng)上公布的近500萬(wàn)Gmail郵箱及對(duì)應(yīng)密碼,再加上密碼強(qiáng)度分類(lèi)——把這部分密碼重新請(qǐng)求谷歌密碼強(qiáng)度驗(yàn)證服務(wù)https://accounts.google.com/RatePassword得到的與相應(yīng)密碼對(duì)應(yīng)的密碼強(qiáng)度數(shù)據(jù)。技術(shù)上是通過(guò)PHP來(lái)抓取的,因?yàn)?a href="http://ttokpm.com/analog/" target="_blank">模擬請(qǐng)求比較簡(jiǎn)單,主要是用Curl偽造User-Agent等相關(guān)Header,借助于multi_exec,并發(fā)100,速度還是比較快的,不到一天就抓完了。需要注意的是谷歌服務(wù)器對(duì)IP訪(fǎng)問(wèn)有一定的限制,所以這部分操作是事先在網(wǎng)絡(luò)上尋找免費(fèi)的代理IP,集合到共享內(nèi)存,然后用另外一個(gè)腳本去取IP并用此IP訪(fǎng)問(wèn)百度,如果HTTP請(qǐng)求在一秒鐘返回200,在給當(dāng)前IP權(quán)值加1,一秒鐘未返回或返回非200,則減1,加1最大到7,減1最小到-3,一段時(shí)間后,就會(huì)有一個(gè)相對(duì)活躍的IP池,供抓取腳本隨機(jī)選取利用。
之所以抓取谷歌密碼強(qiáng)度數(shù)據(jù),是因?yàn)樵谡{(diào)研了包括12306注冊(cè),百度賬號(hào)注冊(cè),騰訊QQ注冊(cè),阿里的淘寶注冊(cè),Microsoft Bing,F(xiàn)acebook賬號(hào)注冊(cè),Google Gmail注冊(cè)等相對(duì)較大的網(wǎng)站后發(fā)現(xiàn),除了Facebook對(duì)于非法或簡(jiǎn)單密碼是通過(guò)服務(wù)端返回比較有意思的"請(qǐng)選擇更安全的密碼。密碼必須多于 6 個(gè)字符,并且對(duì)你意義獨(dú)特,使其他人難以猜出。"信息,Google是通過(guò)前端返回最短長(zhǎng)度提示以及服務(wù)端返回弱,一般,較強(qiáng),強(qiáng)的密碼強(qiáng)度提示外,其它網(wǎng)站及應(yīng)用都是通過(guò)純前端的規(guī)則來(lái)進(jìn)行限制和提示,比如字符的長(zhǎng)短,數(shù)字,大小寫(xiě),特殊字符的種類(lèi)多少等。
4. 數(shù)據(jù)預(yù)處理
密碼按長(zhǎng)度和字符類(lèi)型劃分為五個(gè)維度,分別是密碼長(zhǎng)度,是否含有數(shù)字,是否含有大寫(xiě)字母,是否含有小寫(xiě)字母,是否含有特殊字符。程序簡(jiǎn)單實(shí)現(xiàn)如圖1-3所示。
圖1-3數(shù)據(jù)預(yù)處理python主要代碼
5. 算法實(shí)現(xiàn)
5.1 K最近鄰算法密碼評(píng)測(cè)
對(duì)未知密碼強(qiáng)度密碼實(shí)施KNN分類(lèi)算法偽代碼如下:
1)計(jì)算已知密碼強(qiáng)度數(shù)據(jù)計(jì)算密碼強(qiáng)度向量與當(dāng)前密碼向量之間的距離
2)對(duì)上一步計(jì)算結(jié)果按照距離遞減排序
3)選出與當(dāng)前密碼向量距離最小的Top K個(gè)密碼向量,K為20
4)確定Top K個(gè)向量所在類(lèi)別占數(shù)據(jù)集或抽樣數(shù)據(jù)集密碼強(qiáng)度的比例
5)返回Top K個(gè)向量比例最高的密碼強(qiáng)度為當(dāng)前密碼向量密碼強(qiáng)度
經(jīng)過(guò)數(shù)據(jù)打散,抽樣,并按等同比例獲取四種密碼強(qiáng)度數(shù)據(jù),用Matplotlib畫(huà)散點(diǎn)圖如圖1-4所示,從圖中密碼強(qiáng)度分布中,大致可以看出符號(hào)種類(lèi)越多越強(qiáng),密碼位數(shù)越多越強(qiáng)的規(guī)律。
圖1-4 KNN數(shù)據(jù)建模呈現(xiàn)圖
5.2 決策樹(shù)算法密碼強(qiáng)度評(píng)測(cè)
對(duì)未知密碼強(qiáng)度密碼實(shí)施決策樹(shù)分類(lèi)算法偽代碼如下:
1)創(chuàng)建唯一的影響密碼強(qiáng)度分類(lèi)的因素列表
2)計(jì)算每種劃分方式下密碼強(qiáng)度數(shù)據(jù)的香農(nóng)熵
3)找出最好的信息增益計(jì)算方式
4)因?yàn)樘卣髦涤卸鄠€(gè),一次劃分后可以再次劃分?jǐn)?shù)據(jù),需要遞歸劃分?jǐn)?shù)據(jù)
5)存儲(chǔ)訓(xùn)練數(shù)據(jù)得到的樹(shù),并能夠解析決策樹(shù),以供新密碼向量遍歷
6)比較當(dāng)前密碼向量的與樹(shù)節(jié)點(diǎn)的值,如果到達(dá)葉子節(jié)點(diǎn),返回這個(gè)葉子節(jié)點(diǎn)的密碼強(qiáng)度分類(lèi)。
經(jīng)過(guò)數(shù)據(jù)打散,抽樣,并按等同比例獲取四種密碼強(qiáng)度數(shù)據(jù),通過(guò)上述算法實(shí)現(xiàn)后得到如下決策樹(shù):
{'密碼字符種類(lèi)': {1: {'密碼長(zhǎng)度': {8:弱, 9:一般, :一般, 11:一般, 12:弱, 13:弱, 14:一般, 15:弱, 16:一般}}, 2: {'密碼長(zhǎng)度': {8:弱 , 9:弱, :一般, 11:較強(qiáng), 12:一般, 13:一般, 14:一般, 15:強(qiáng), 16:一般}}, 3: {'密碼長(zhǎng)度': {8:一般, 9:較強(qiáng), :較強(qiáng), 11:強(qiáng), 12:較強(qiáng), 13:強(qiáng), 14:強(qiáng), 15:強(qiáng), 16:強(qiáng)}}, 4: {'密碼長(zhǎng)度': {8:強(qiáng), 9:較強(qiáng), :強(qiáng), 11:較強(qiáng), 12:強(qiáng), 13:強(qiáng), 14:強(qiáng), 15:強(qiáng), 16:強(qiáng)}}}
用Matplotlib展示如圖1-5所示(其中葉結(jié)點(diǎn)的阿拉伯?dāng)?shù)字1,2,3,4分別代表密碼強(qiáng)度弱,一般,較強(qiáng)強(qiáng))。通過(guò)決策樹(shù)我們更能清晰地觀察到,密碼強(qiáng)度與密碼種類(lèi)強(qiáng)相關(guān),密碼種類(lèi)越多,相同密碼位數(shù)的密碼強(qiáng)度越強(qiáng)。
圖1-5密碼強(qiáng)度決策樹(shù)
環(huán)境搭建,測(cè)試實(shí)驗(yàn)
搭建Kubernetes的方式有很多,在研究過(guò)程中,經(jīng)過(guò)從最初的在本地虛擬機(jī)原生搭建1.6,在阿里云服務(wù)器上用Kubeadm搭建1.8,本地虛擬機(jī)Kubeadm搭建1.10,本地Vagrant搭建1.11,谷歌云服務(wù)器Kubernets Engine直接搭建1.12等實(shí)驗(yàn)。發(fā)現(xiàn)本地原生搭建是最麻煩的,因?yàn)榧捍罱ㄟ^(guò)程中需要通過(guò)自創(chuàng)建各種證書(shū),一步步的安裝各個(gè)組件和啟動(dòng)各個(gè)節(jié)點(diǎn),較繁瑣。谷歌云直接用Kubnernets引擎搭建是最迅捷的,只需要選擇需要版本就可以。綜合考慮研究部分步驟的必要性及通用性?xún)r(jià)值,最終選擇在阿里云服務(wù)器采用Kubeadm搭建,Kubeadm是官方提供的自動(dòng)化安裝工具,自動(dòng)配置了必要的服務(wù)和安全的認(rèn)證,主要組件都變成Pod而非操作系統(tǒng)進(jìn)程,這樣可以不斷檢測(cè)其狀態(tài)并且進(jìn)行相應(yīng)的容錯(cuò)處理,本章主要內(nèi)容就是借助Kubeadm搭建高可用Kuberntes集群,并講述了在部分核心資源不可獲取時(shí)如何應(yīng)對(duì)[10]。
1. Docker及Docker-Registry搭建
1.1 安裝Docker
Docker安裝相對(duì)Etcd比較簡(jiǎn)單,可以選擇如下三種方式之一:
1)通過(guò)配置軟件源安裝:
官方源:
為了確認(rèn)所下載軟件包的合法性,需要添加軟件源的 GPG 密鑰,命令參考如下:
curl -fsSL https://download.docker.com/linux/debian/gpg> key.gpgapt-keyaddkey.gpg
然后,我們需要向 source.list 中添加 Docker CE 軟件源:
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/debian $(lsb_release -cs) stable"
國(guó)內(nèi)源:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo apt-key add -sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable"
然后執(zhí)行更新安裝
apt-get updateapt-get install docker-ce
2)腳本安裝:
Docker官方為了簡(jiǎn)化安裝流程,提供了一套便捷的安裝腳本
curl -fsSL get.docker.com -o get-docker.sh sh get-docker.sh --mirror Aliyun
執(zhí)行此命令后,腳本就會(huì)自動(dòng)將一切準(zhǔn)備工作做好,并把 Docker CE 的 Edge 版本安裝在系統(tǒng)中。
3)二進(jìn)制安裝:
下載,解壓,復(fù)制相關(guān)文件到指定目錄:
wget https://get.docker.com/builds/Linux/x86_64/docker-17.05.0-ce.tgztar -xvf docker-17.05.0-ce.tgzcp docker/docker* /usr/local/bin/cp docker/completion/bash/docker /etc/bash_completion.d/
配置/etc/systemd/system/docker.service:
[Unit] Description=Docker Application Container Engine Documentation=http://docs.docker.io [Service] Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin" EnvironmentFile=-/run/flannel/docker ExecStart=/usr/bin/dockerd --log-level=error $DOCKER_NETWORK_OPTIONS ExecReload=/bin/kill -s HUP $MAINPID Restart=on-failure RestartSec=5 LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target
啟動(dòng):
systemctl enable dockersystemctl start docker
1.2 Docker-Registry搭建
有了Docker,搭建Docker-Registry就更簡(jiǎn)單了,借助于Registry鏡像,可以用如下命令一鍵搭建:
docker run -d -p 5000:5000 -v /opt/registry/data:/var/lib/registry --restart=always --name registry registry
除此外可以利用Nginx作為反向代理打造私有registry,還可以順帶定制化域名訪(fǎng)問(wèn),比如localtest.registry..com:9000,如下就是nginx反向代理做的簡(jiǎn)單登錄認(rèn)證相關(guān)命令及配置:
htpasswd -c /etc/nginx/docker-registry.passwd passwordserver { listen 9000; auth_basic "Dokcer-registryAccess"; auth_basic_user_file /etc/nginx/dokcer-registry.passwd; location / { proxy_pass http://ip:5000; }}
當(dāng)然除此外如果需要外網(wǎng)訪(fǎng)問(wèn)并對(duì)安全有更高要求,依然可以通過(guò)Nginx添加SSL證書(shū),開(kāi)啟相關(guān)配置使用HTTPS方式請(qǐng)求。
這里需要注意的是,搭建好Kubernetes后需要添加本地指定的Docker-registry,使用如下命令,不然默認(rèn)是連接docker.hub。
kubectl create secret docker-registry--docker-server=localtest.registry.com:9000--docker-username=username--docker-password=password--docker-email=username@xxmail.com
2. Etcd集群搭建
前面已經(jīng)提到了Etcd的原理和用途,在這里Ectd作為Kubernetes集群中非常重要的組件,用以存儲(chǔ)集群中所有的網(wǎng)絡(luò)配置及相關(guān)對(duì)象的狀態(tài)信息。
2.1二進(jìn)制模式安裝
下載二進(jìn)制文件,解壓,然后拷貝到指定目錄,命令參考如圖2-1。
圖2-1 Etcd二進(jìn)制下載相關(guān)命令
分別在三個(gè)服務(wù)器節(jié)點(diǎn)按圖2-2所示命令進(jìn)行配置。
圖2-2 Etcd二進(jìn)制安裝命令
上述配置,name是節(jié)點(diǎn)名稱(chēng),initial-advertise-peer-urls是集群其他節(jié)點(diǎn)地址,listen-peer-urls是用于與其他節(jié)點(diǎn)通訊的監(jiān)聽(tīng)地址,advertise-client-urls是知客戶(hù)端地址,initial-cluster-token 是集群的ID,initial-cluster是集群中所有節(jié)點(diǎn),initial-cluster-state是集群狀態(tài)是初始化還是已存在。除此外還有很多參數(shù),比較重要的比如data-dir 指定節(jié)點(diǎn)的數(shù)據(jù)存儲(chǔ)目錄,這些數(shù)據(jù)包括節(jié)點(diǎn)ID,集群ID,集群初始化配置,Snapshot文件等。再就是可以通過(guò)安全相關(guān)參數(shù)即ca-file,cert-file,key-file配置TLS模式,實(shí)現(xiàn)更安全的模式。
集群建立后,可以通過(guò)curl http://10.0.30.101:2379/v2/members或etcdctl命令查看集群信息,具體如圖2-3所示。
圖2-3 Etcd集群狀態(tài)信息
2.2 Docker模式搭建
Docker方式跟二進(jìn)制方式大同小異,只是每個(gè)ectd節(jié)點(diǎn)運(yùn)行在一個(gè)docker容器中,具體命令如圖2-4所示。
圖2-4 Docker搭建Etcd命令(1)
圖2-4 Docker搭建Etcd命令(2)
3. Kubernetes集群搭建
3.1 安裝Kubeadm、Kubelet、Kubectl
網(wǎng)絡(luò)正常及有正常可用apt源的時(shí)候很簡(jiǎn)單,就是簡(jiǎn)單的如下更新安裝:apt-get update&&apt-get install Kubeadm Kubelet Kubectl,這里額外介紹一種在研究初期無(wú)安裝源及無(wú)可用命令行翻墻配置時(shí)的方式。
1)翻墻下載packages索引
https://packages.cloud.google.com/apt/dists/Kubernetes-xenial/main/binary-amd64/Packages
這里選擇1.8版本,具體索引如下:
2)根據(jù)Filename下載對(duì)應(yīng)的deb
https://packages.cloud.google.com/apt/pool/Kubeadm_1.8.0-00_amd64_22842ddc6d1ffabc04718f384ac001ffa56324cc61e6c3a7c991337bf3e39e06.debhttps://packages.cloud.google.com/apt/pool/Kubectl_1.8.0-00_amd64_9bd409d2a0300d4b550cd2a7fd2eca6437ea0767805f6fd807912b245ec949ed.debhttps://packages.cloud.google.com/apt/pool/Kubelet_1.8.0-00_amd64_00b7c77c924d654c7def52c83cfeb9a3d1836c1e7b40683c3fe8207b0bd299d1.deb
3)構(gòu)建本地軟件源并更新安裝
dpkg-scanpackages ./| gzip - > ./Packages.gzapt-get updateapt-get install Kubeadmapt-get install Kubeletapt-get install Kubectl
4)配置kubeadm init的配置文件
由于在新版本中,kubeadm init已經(jīng)廢棄了--external-etcd-endpoints參數(shù),所以要引用外部高可用Etcd集群,我們需要手動(dòng)為Kubeadm創(chuàng)建yaml配置文件kube-config.yaml,然后執(zhí)行kubeadm init --config=kube-config.yaml,Ectd相關(guān)配置如圖2-5所示:
圖2-5 Kubeadm初始化時(shí)Kube-config.yaml配置文件
3.2 Kubeadm初始化
1)準(zhǔn)備相關(guān)鏡像
因?yàn)镵ubeadm在初始化集群時(shí)候拉取gcr.io中的鏡像也要求能夠科學(xué)上網(wǎng),雖然目前已經(jīng)有一些網(wǎng)站提供相關(guān)鏡像,但為了更快速尤其是用到指定版本或最新版本,這里借助于dockerhub的Configure Automated Builds,依據(jù)Github的Dockerfile轉(zhuǎn)存谷歌容器倉(cāng)庫(kù)(gcr.io)的鏡像,轉(zhuǎn)存命令很簡(jiǎn)單,以調(diào)度器為例:
FROM gcr.io/google_containers/kube-scheduler-amd64:v1.6.0,具體Dockerhub配置如圖2-6所示。
圖2-6 Dockerhub配置Github自動(dòng)構(gòu)建圖
之后通過(guò)命令拉取下來(lái)重新打一下標(biāo)簽就行:
docker pull raysail/kube-scheduler-amd64:v1.8.0dockertag raysail/kube-scheduler-amd64:v1.8.0gcr.io/google_containers/kube-scheduler-amd64:v1.8.0
需要轉(zhuǎn)存的鏡像鏡像列表如下:
gcr.io/google_containers/kube-scheduler-amd64:v1.8.0gcr.io/google_containers/kube-apiServer-amd64:v1.8.0gcr.io/google_containers/kube-controller-manager-amd64:v1.8.0gcr.io/google_containers/kube-proxy-amd64:v1.8.0gcr.io/google_containers/k8s-dns-Kube-dns-amd64:1.14.5gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.5gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.5
不同版本對(duì)應(yīng)相關(guān)鏡像不一樣,具體可以參照生成的相關(guān)Manifests或者打印出的日志以及初始化時(shí)的日志或通過(guò)Kubectl logs查看對(duì)應(yīng)的pod日志。
另外,為了使Flannel正常工作,Kubernetes官方文檔指出,在Kubeadm init 時(shí)候必須要追加--pod-network-cidr=10.244.0.0/16參數(shù)[10]。因?yàn)樯厦嬖谝胪獠扛呖捎肊tcd集群時(shí)已經(jīng)采用了Kubeadm的配置文件方式,且Flannel的CIDR配置參數(shù)不能用--config同時(shí)存在,所以需要在Kube-config.yaml文件中增加如下兩行配置:
networking: podSubnet: 10.244.0.0/16
Kubeadm初始化成功后,可以用命令檢查組件狀態(tài)
kubectl get componentstatuses,執(zhí)行結(jié)果如圖2-7所示。
圖2-7 Kubernetes集群初始化后組件健康信息
3.3安裝Flannel
因?yàn)橐呀?jīng)安裝了Kubectl,F(xiàn)lannel可以直接用Kubernetes的形式安裝,命令如下:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.0/Documentation/kube-flannel.yml
需要注意的是跟如上鏡像一樣,到https://hub.docker.com的Configure Automated Builds中轉(zhuǎn)存一下quay.io/coreos/flannel:v0.9.0-amd64。
3.4 加入Nodes
Kubeadm初始化后會(huì)生成一個(gè)token,用此token通過(guò)命令:kubeadm join --token 86d22a.123582ce916b31fc 10.0.30.104:6443加入節(jié)點(diǎn),分別在Master之外的兩臺(tái)機(jī)器執(zhí)行上述命令后,Kubelet會(huì)分別在兩臺(tái)Node上啟動(dòng)Flannel和Kube-proxy,如圖2-8所示。
圖2-8 Kuberntes集群搭建完成pod示例圖
4. 密碼評(píng)測(cè)微服務(wù)搭建部署
4.1 構(gòu)建服務(wù)鏡像
因?yàn)閮蓚€(gè)基于機(jī)器學(xué)習(xí)的密碼強(qiáng)度評(píng)測(cè)算法都是用Python實(shí)現(xiàn)的,而其中因?yàn)樯婕暗胶芏鄶?shù)組或矩陣的運(yùn)算,所以需要Python的NumPy(Numerical Python)庫(kù)的支持,NumPy是Python 的一個(gè)擴(kuò)展程序庫(kù),支持高維數(shù)組和矩陣運(yùn)算,除此外也對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫(kù)。安裝Numpy的方式有很多,可以用Pip或Apt-get 等進(jìn)行安裝,因?yàn)槌诉@個(gè)庫(kù)還有一些依賴(lài)庫(kù),比如Matplotlib等,這里我們使用數(shù)據(jù)分析較常用的Anaconda這個(gè)支持 Linux, Windows 和 Mac 系統(tǒng),用于大規(guī)模數(shù)據(jù)處理,預(yù)測(cè)分析和科學(xué)計(jì)算并致力于簡(jiǎn)化包的管理和部署的Python免費(fèi)發(fā)行版。
Anaconda的安裝比較簡(jiǎn)單,這里就不做贅述,為了方便直接使用Dockerhub上比較受歡迎的continuumio/anaconda鏡像作為基礎(chǔ)鏡像構(gòu)建我們的微服務(wù)鏡像,Dockerfile如圖2-9和圖2-10所示。
圖2-9基于K最近鄰密碼強(qiáng)度評(píng)測(cè)Dockerfile
構(gòu)建鏡像:docker build -t localtest.registry..com:9000/knnpassord:v1 .
運(yùn)行測(cè)試:docker run -d -p 6666:6666 raysail/knnpassord:v1
提交倉(cāng)庫(kù):docker push localtest.registry.com:9000/knnpassord:v1
圖2-10基于決策樹(shù)密碼強(qiáng)度評(píng)測(cè)Dockerfile
構(gòu)建鏡像:docker build -t localtest.registry..com:9000/dtpassord:v1 .
運(yùn)行測(cè)試:docker run -d -p8888:6666 raysail/dtpassord:v1
提交倉(cāng)庫(kù):docker push localtest.registry.com:9000/dtpassord:v1
4.2 Kubnerntes中運(yùn)行為服務(wù)
分別創(chuàng)建副本數(shù)為3的knn-password Deployment ,descisiontree-password Depoyment ,如圖2-11和圖2-12,并分別創(chuàng)建兩個(gè)service如圖2-13和圖2-14:
圖2-11基于KNN的密碼強(qiáng)度評(píng)測(cè)微服務(wù)Deployment
圖2-12基于決策樹(shù)的密碼強(qiáng)度評(píng)測(cè)微服務(wù)Deployment
圖2-13基于KNN的密碼強(qiáng)度評(píng)測(cè)微服務(wù)Service
圖2-14基于決策樹(shù)的密碼強(qiáng)度評(píng)測(cè)微服務(wù)Service
kubnerntes資源查看如圖2-15。
圖2-15密碼評(píng)測(cè)微服務(wù)創(chuàng)建后kubnertes pod和service視圖
用kubectl describe 命令查看服務(wù)可以看到每個(gè)服務(wù)后端掛載有三個(gè)pod,以實(shí)現(xiàn)容災(zāi)和負(fù)載均衡,具體如圖2-16所示。
圖2-16 kubectl describe命令查看服務(wù)視圖
4.3 驗(yàn)證服務(wù)可用性及準(zhǔn)確性
兩個(gè)密碼強(qiáng)度評(píng)測(cè)微服務(wù)的protobuf定義如圖2-17和圖2-18所示。
圖2-17 K最近鄰密碼強(qiáng)度評(píng)測(cè)Protobuf定義
圖2-18決策樹(shù)密碼強(qiáng)度評(píng)測(cè)Protobuf定義
分別用golang和php的客戶(hù)端測(cè)試基于Knn的密碼強(qiáng)度評(píng)測(cè)微服務(wù)和基于決策樹(shù)的密碼強(qiáng)度評(píng)測(cè)微服務(wù)可以正常返回。用如下命令分別生成golang客戶(hù)端樁函數(shù)和php客戶(hù)端樁函數(shù):
protoc --go_out=plugins=grpc:./ ./password.protoprotoc --php_out=./ --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin ./password.proto
5. 持續(xù)集成和滾動(dòng)更新實(shí)現(xiàn)
5.1 基于Gitolite的Hook技術(shù)
主要算法思想是利用Git的服務(wù)端Hook——post-receive來(lái)觸發(fā)Push代碼后的操作,也就是提交代碼后可以根據(jù)分支以及具體的Log中的關(guān)鍵字來(lái)相應(yīng)的執(zhí)行包括但不限于單元測(cè)試,構(gòu)建鏡像,自動(dòng)部署等操作。
具體可參加如下Shell腳本(處理階段的自動(dòng)化腳本處理和Jenkins觸發(fā)處理注釋了,可選擇其中一種或別的方式)
#!/bin/bashbranch=""services=("KNNPasswordService" "DTPasswordService")while read oldrev newrev refdo branch=`echo $ref | cut -d/ -f3` if [ $branch != "master" ]; then echo "-----not master, exit post receive shell------" exit; fi echo "-----shell start------" gitLog=`git log --name-status -1` for var in ${services[@]}; do if [[ -n `echo $gitLog |grep $var` ]]; then sh /home/raysail/Kubeauto/autopublish.sh $var & #curl -X POST http://10.0.30.202:8900/job/PasswdService/build fi donedone
5.2 基于Kubeapi的滾動(dòng)升級(jí)
具體主要Shell Code如圖2-19所示。
圖2-19 Kubeapi主要Shell code
總結(jié)與展望
本文歷經(jīng)近半年,拋開(kāi)公司內(nèi)已有組件,盡可能從源頭出發(fā),經(jīng)過(guò)閱讀相關(guān)文獻(xiàn),專(zhuān)著,開(kāi)源網(wǎng)站及相關(guān)技術(shù)源碼,以及平時(shí)工作中的實(shí)踐演練和相關(guān)同學(xué)的討論,理論聯(lián)系實(shí)踐,經(jīng)過(guò)業(yè)務(wù)抽象,最終實(shí)現(xiàn)以K近鄰算法和決策樹(shù)算法為算法依據(jù)的基于機(jī)器學(xué)習(xí)的密碼評(píng)測(cè)微服務(wù),并把微服務(wù)部署到Kubenrnetes集群上及進(jìn)行了可行性和正確性驗(yàn)證。從微服務(wù)的單一職責(zé),自治性,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)等設(shè)計(jì)原則開(kāi)始,研究了其相關(guān)技術(shù)棧,包括但不限于容器虛擬化技術(shù),服務(wù)發(fā)現(xiàn)注冊(cè)技術(shù),異構(gòu)系統(tǒng)通信機(jī)制,持續(xù)集成交付部署等,文中很多組件的原理圖都是在基于理論和實(shí)踐后的原創(chuàng)繪制,對(duì)于很多大型的系統(tǒng)架構(gòu)設(shè)計(jì)及軟件基礎(chǔ)架構(gòu)設(shè)計(jì)這些都是可以借鑒的資料。
在以上研究基礎(chǔ)上,經(jīng)過(guò)學(xué)習(xí)考試,通過(guò)了Google和CNCF(Cloud Native Computing Foundation)聯(lián)合推出的CKA(Certified Kubernetes Administrator)認(rèn)證,通過(guò)備考的大量實(shí)踐演練,進(jìn)一步加深了自動(dòng)部署、擴(kuò)展和管理容器化的開(kāi)源框架Kubernetes原理的認(rèn)知,也更加相信未來(lái)此系統(tǒng)會(huì)被大規(guī)模采納并應(yīng)用到更多的企業(yè)和技術(shù)領(lǐng)域。此外在云計(jì)算和大數(shù)據(jù)迅猛發(fā)展的今天,機(jī)器學(xué)習(xí)被越來(lái)越多的應(yīng)用到各行各業(yè)中,而機(jī)器學(xué)習(xí)應(yīng)用的工程化,自動(dòng)化和平臺(tái)化亟需普及和建設(shè),這也是依托Kubernetes集群進(jìn)行基于機(jī)器學(xué)習(xí)的微服務(wù)實(shí)踐的原因,當(dāng)然密碼作為一直都很重要的安全行業(yè)的重要組成部分,作為本文技術(shù)架構(gòu)下的核心業(yè)務(wù)部分也是本文的重點(diǎn)工作。
當(dāng)然本文還有很多優(yōu)化和后續(xù)工作需要做,主要是如下幾點(diǎn)。性能方面:借助Golang語(yǔ)言特性重構(gòu)訓(xùn)練模型,進(jìn)行計(jì)算性能優(yōu)化;應(yīng)用Traefik Ingress等K8S負(fù)載均衡技術(shù),對(duì)外提供服務(wù)的同時(shí)并提升優(yōu)化負(fù)載能力。業(yè)務(wù)方面:采用機(jī)器學(xué)習(xí)Tensorflow等庫(kù)或框架,讓平臺(tái)的機(jī)器學(xué)習(xí)應(yīng)用多樣化,標(biāo)準(zhǔn)化;引入單元測(cè)試、集成測(cè)試、功能測(cè)試、性能測(cè)試等多維度測(cè)試保證服務(wù)可靠性。部署方面:應(yīng)用支持眾多組件及自定義腳本的Jinkens使持續(xù)集成可視化;Kubernetes高可用部署,多Master集群,進(jìn)一步提高容災(zāi)能力。監(jiān)控方面:應(yīng)用Prometheus相關(guān)技術(shù)對(duì)集群進(jìn)行進(jìn)一步日志及狀態(tài)監(jiān)控;應(yīng)用Alertmanger等技術(shù)對(duì)集群異常進(jìn)行微信,短信郵件等告警;架構(gòu)方面:Service Mesh(istio)技術(shù)應(yīng)用,解耦服務(wù)的重試、監(jiān)控、追蹤,發(fā)現(xiàn)等。除了上述優(yōu)化和后續(xù)工作,對(duì)于多服務(wù)下的分布式事物和服務(wù)治理相關(guān)以及熔斷、限流、降級(jí)等相關(guān)問(wèn)題的應(yīng)用會(huì)在下一期講述,敬請(qǐng)期待。
-
人工智能
+關(guān)注
關(guān)注
1791文章
46671瀏覽量
237114 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8353瀏覽量
132315 -
tensorflow
+關(guān)注
關(guān)注
13文章
328瀏覽量
60474
原文標(biāo)題:微服務(wù)架構(gòu)系列二:密碼強(qiáng)度評(píng)測(cè)的實(shí)現(xiàn)與實(shí)驗(yàn)
文章出處:【微信號(hào):Tencent_TEG,微信公眾號(hào):騰訊技術(shù)工程官方號(hào)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論