本文是繼《微服務架構系列一:關鍵技術與原理研究》的后續,系列一中論述了微服務研究的背景和意義,主要調研了傳統架構的發展以及存在的問題和微服務架構的由來,然后針對微服務架構的設計原則、容器技術、服務發現、通信機制、持續集成等方面進行了分析與研究,并簡單講述了谷歌Kubernetes的相關組件和原理。系列二依據系列一中講述的相關技術,進行了業務原理分析和建模,然后一步步實現了基于機器學習的密碼強度評測服務,搭建相關環境并部署編排服務和進行了相關驗證,最后對微服務架構設計進行了總結和展望,并簡單概述了后續系列的工作。
基于機器學習的密碼強度評測微服務實現
隨著互聯網技術的迅猛發展和廣泛應用,在數據信息日益敏感的當下,網絡安全問題也變得日益嚴峻。加上數字化和網絡化在生活中的普及,防止數據遭到未經授權訪問變得越來越重要,由于便于理解,使用簡單和部署成本低,自從互聯網誕生以來,文本密碼幾乎應用于需要保護我們的數據的每一個地方,盡管它們有許多已知的缺陷[1][2][3]。評測密碼強度的方式有很多,除了常規的基于字符種類規則,也有借助猜測熵和最小熵對密碼強度進行估計的研究[4],基于模糊概率上下文無關語法的密碼強度估計[5]。
機器學習是人工智能領域中最能體現智能的分支,從歷史看,機器學習也是人工智能領域發展最快的分支之一[6]。本章節會通過機器學習方法去對密碼強弱進行分類,并通過Python把對應算法即K最近鄰算法,決策樹算法實現成微服務,供上游調用,以組成整體微服務架構中核心業務部分。另外因為機器學習相關算法研究及實現不是本文重點,同時鑒于時間和篇幅,對于樸素貝葉斯、多層感知器、支持向量機等其它適用于密碼強度評測的機器學習算法,在本文就不做討論和相關具體實現了,而且已經有相關研究對其它幾種算法進行了可行性論述[7][8],后續可能會通過發起Github上的開源項目去繼續研究和探討。
1. K-最近鄰算法
K 最近鄰算法(k-Nearest Neighbor),簡稱KNN,是一個在理論上比較成熟的算法,也是目前最簡單的機器學習算法之一,它是一種惰性學習算法(分類器不需使用訓練數據集進行訓練,訓練的時間復雜度為0,有利有弊,與其它惰性學習算法一樣,KNN的計算復雜度會隨著訓練集的空間大小增大而增大,也就是說分類復雜度為O(n)),是在1968年由 Cover 和Hart 提出的。該算法的思想是:如果一個樣本它的特征空間中,有K個最相似也就是最鄰近的樣本的大多數都屬于一個分類,那么這個樣本也屬于這個分類。當然算法的前提是,所選的K個樣本都是經過正確分類過的,一般K是不大于20的整數。一句話概括就是找到離自己最近的K個點中的大多數同一分類的類別作為自己的類別。
距離計算數學描述:
對于任意的特征向量x:
ar(x)表示實例x的第r個屬性值,兩個實例xi和xj之間的距離定義為d(xi xj)
根據歐式距離公式:
訓練算法:
對于每個訓練實例
分類算法:
給定一個要分類的查詢實例xq,在訓練實例列表中選出最鄰近xq的k個實例,并用x1…xk來表示,定義離散目標函數
V是有限集合{v1,v2... vs},則
其中如果a=b那么
否則
對前面的K最近鄰算法做一下簡單修改,使其能被用于逼近連續值的目標函數,為了達到此目標,我們只需要讓算法計算K個最臨近實例的平均值,而不再是計算其中的最普遍的值,定義實值目標函數
則
2. 決策樹
決策樹(Decision Tree),顧名思義,是一種樹——依托策略抉擇而建立的樹。在機器學習里面,它是一個預測模型,它所代表的是一個對象的屬性和值之間的映射關系。決策樹是應用最廣的歸納推理算法之一,屬于監督學習中的一種,所謂監督學習,就是給定一定數量的都有屬于自己的一些屬性以及類別的樣本。其中類別是根據數據本身屬性確定的,然后,通過對樣本數據進行訓練學習得到一個分類器,得到的分類器可以對新出現的實例進行分類,這種機器學習方式就被稱為監督學習。
我們可以用下面的箭線圖1-1來形象的表示決策的過程的各個階段之間的聯系。
圖1-1決策樹決策過程關系圖
選擇分割的方法可以有很多,但最終目的一致:也就是對目標類嘗試進行最佳分割,由于從根到葉子有多條路徑,一條規則對應一條路徑,很明顯,決策樹是一顆二叉樹或多叉樹。
決策樹有四種構成要素,決策結點、狀態節點、方案枝、概率枝。決策結點也叫方塊結點;狀態結點又叫圓形結點;決策結點引出若干條分支每條分支代表一個方案,故稱方案枝;狀態結點又會引出很多分支,代表不同的狀態,由于上面會反映客觀狀態和出現的頻率,每個分支又被稱為概率枝,在概率枝的末端會有該狀態下所達到結果也就是權重值。如圖1-2所示。
圖1-2決策樹圖標示例
決策樹分類的思想跟大學報志愿類似,我們會考慮,學校層次是名校、985還是211等,然后地域是南方還是北方、專業是否熱門等因素,不同的因素不同的人會有不同的側重,所謂因人而異,那么就需要具體情況具體分析和決策。如果把每一個未知的選項都歸類到已有的分類類別中就形成了一顆決策樹。
3. 訓練數據準備
訓練數據是利用了2014年俄羅斯黑客在網上公布的近500萬Gmail郵箱及對應密碼,再加上密碼強度分類——把這部分密碼重新請求谷歌密碼強度驗證服務https://accounts.google.com/RatePassword得到的與相應密碼對應的密碼強度數據。技術上是通過PHP來抓取的,因為模擬請求比較簡單,主要是用Curl偽造User-Agent等相關Header,借助于multi_exec,并發100,速度還是比較快的,不到一天就抓完了。需要注意的是谷歌服務器對IP訪問有一定的限制,所以這部分操作是事先在網絡上尋找免費的代理IP,集合到共享內存,然后用另外一個腳本去取IP并用此IP訪問百度,如果HTTP請求在一秒鐘返回200,在給當前IP權值加1,一秒鐘未返回或返回非200,則減1,加1最大到7,減1最小到-3,一段時間后,就會有一個相對活躍的IP池,供抓取腳本隨機選取利用。
之所以抓取谷歌密碼強度數據,是因為在調研了包括12306注冊,百度賬號注冊,騰訊QQ注冊,阿里的淘寶注冊,Microsoft Bing,Facebook賬號注冊,Google Gmail注冊等相對較大的網站后發現,除了Facebook對于非法或簡單密碼是通過服務端返回比較有意思的"請選擇更安全的密碼。密碼必須多于 6 個字符,并且對你意義獨特,使其他人難以猜出。"信息,Google是通過前端返回最短長度提示以及服務端返回弱,一般,較強,強的密碼強度提示外,其它網站及應用都是通過純前端的規則來進行限制和提示,比如字符的長短,數字,大小寫,特殊字符的種類多少等。
4. 數據預處理
密碼按長度和字符類型劃分為五個維度,分別是密碼長度,是否含有數字,是否含有大寫字母,是否含有小寫字母,是否含有特殊字符。程序簡單實現如圖1-3所示。
圖1-3數據預處理python主要代碼
5. 算法實現
5.1 K最近鄰算法密碼評測
對未知密碼強度密碼實施KNN分類算法偽代碼如下:
1)計算已知密碼強度數據計算密碼強度向量與當前密碼向量之間的距離
2)對上一步計算結果按照距離遞減排序
3)選出與當前密碼向量距離最小的Top K個密碼向量,K為20
4)確定Top K個向量所在類別占數據集或抽樣數據集密碼強度的比例
5)返回Top K個向量比例最高的密碼強度為當前密碼向量密碼強度
經過數據打散,抽樣,并按等同比例獲取四種密碼強度數據,用Matplotlib畫散點圖如圖1-4所示,從圖中密碼強度分布中,大致可以看出符號種類越多越強,密碼位數越多越強的規律。
圖1-4 KNN數據建模呈現圖
5.2 決策樹算法密碼強度評測
對未知密碼強度密碼實施決策樹分類算法偽代碼如下:
1)創建唯一的影響密碼強度分類的因素列表
2)計算每種劃分方式下密碼強度數據的香農熵
3)找出最好的信息增益計算方式
4)因為特征值有多個,一次劃分后可以再次劃分數據,需要遞歸劃分數據
5)存儲訓練數據得到的樹,并能夠解析決策樹,以供新密碼向量遍歷
6)比較當前密碼向量的與樹節點的值,如果到達葉子節點,返回這個葉子節點的密碼強度分類。
經過數據打散,抽樣,并按等同比例獲取四種密碼強度數據,通過上述算法實現后得到如下決策樹:
{'密碼字符種類': {1: {'密碼長度': {8:弱, 9:一般, :一般, 11:一般, 12:弱, 13:弱, 14:一般, 15:弱, 16:一般}}, 2: {'密碼長度': {8:弱 , 9:弱, :一般, 11:較強, 12:一般, 13:一般, 14:一般, 15:強, 16:一般}}, 3: {'密碼長度': {8:一般, 9:較強, :較強, 11:強, 12:較強, 13:強, 14:強, 15:強, 16:強}}, 4: {'密碼長度': {8:強, 9:較強, :強, 11:較強, 12:強, 13:強, 14:強, 15:強, 16:強}}}
用Matplotlib展示如圖1-5所示(其中葉結點的阿拉伯數字1,2,3,4分別代表密碼強度弱,一般,較強強)。通過決策樹我們更能清晰地觀察到,密碼強度與密碼種類強相關,密碼種類越多,相同密碼位數的密碼強度越強。
圖1-5密碼強度決策樹
環境搭建,測試實驗
搭建Kubernetes的方式有很多,在研究過程中,經過從最初的在本地虛擬機原生搭建1.6,在阿里云服務器上用Kubeadm搭建1.8,本地虛擬機Kubeadm搭建1.10,本地Vagrant搭建1.11,谷歌云服務器Kubernets Engine直接搭建1.12等實驗。發現本地原生搭建是最麻煩的,因為集群搭建過程中需要通過自創建各種證書,一步步的安裝各個組件和啟動各個節點,較繁瑣。谷歌云直接用Kubnernets引擎搭建是最迅捷的,只需要選擇需要版本就可以。綜合考慮研究部分步驟的必要性及通用性價值,最終選擇在阿里云服務器采用Kubeadm搭建,Kubeadm是官方提供的自動化安裝工具,自動配置了必要的服務和安全的認證,主要組件都變成Pod而非操作系統進程,這樣可以不斷檢測其狀態并且進行相應的容錯處理,本章主要內容就是借助Kubeadm搭建高可用Kuberntes集群,并講述了在部分核心資源不可獲取時如何應對[10]。
1. Docker及Docker-Registry搭建
1.1 安裝Docker
Docker安裝相對Etcd比較簡單,可以選擇如下三種方式之一:
1)通過配置軟件源安裝:
官方源:
為了確認所下載軟件包的合法性,需要添加軟件源的 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"
國內源:
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"
然后執行更新安裝
apt-get updateapt-get install docker-ce
2)腳本安裝:
Docker官方為了簡化安裝流程,提供了一套便捷的安裝腳本
curl -fsSL get.docker.com -o get-docker.sh sh get-docker.sh --mirror Aliyun
執行此命令后,腳本就會自動將一切準備工作做好,并把 Docker CE 的 Edge 版本安裝在系統中。
3)二進制安裝:
下載,解壓,復制相關文件到指定目錄:
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
啟動:
systemctl enable dockersystemctl start docker
1.2 Docker-Registry搭建
有了Docker,搭建Docker-Registry就更簡單了,借助于Registry鏡像,可以用如下命令一鍵搭建:
docker run -d -p 5000:5000 -v /opt/registry/data:/var/lib/registry --restart=always --name registry registry
除此外可以利用Nginx作為反向代理打造私有registry,還可以順帶定制化域名訪問,比如localtest.registry..com:9000,如下就是nginx反向代理做的簡單登錄認證相關命令及配置:
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; }}
當然除此外如果需要外網訪問并對安全有更高要求,依然可以通過Nginx添加SSL證書,開啟相關配置使用HTTPS方式請求。
這里需要注意的是,搭建好Kubernetes后需要添加本地指定的Docker-registry,使用如下命令,不然默認是連接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集群搭建
前面已經提到了Etcd的原理和用途,在這里Ectd作為Kubernetes集群中非常重要的組件,用以存儲集群中所有的網絡配置及相關對象的狀態信息。
2.1二進制模式安裝
下載二進制文件,解壓,然后拷貝到指定目錄,命令參考如圖2-1。
圖2-1 Etcd二進制下載相關命令
分別在三個服務器節點按圖2-2所示命令進行配置。
圖2-2 Etcd二進制安裝命令
上述配置,name是節點名稱,initial-advertise-peer-urls是集群其他節點地址,listen-peer-urls是用于與其他節點通訊的監聽地址,advertise-client-urls是知客戶端地址,initial-cluster-token 是集群的ID,initial-cluster是集群中所有節點,initial-cluster-state是集群狀態是初始化還是已存在。除此外還有很多參數,比較重要的比如data-dir 指定節點的數據存儲目錄,這些數據包括節點ID,集群ID,集群初始化配置,Snapshot文件等。再就是可以通過安全相關參數即ca-file,cert-file,key-file配置TLS模式,實現更安全的模式。
集群建立后,可以通過curl http://10.0.30.101:2379/v2/members或etcdctl命令查看集群信息,具體如圖2-3所示。
圖2-3 Etcd集群狀態信息
2.2 Docker模式搭建
Docker方式跟二進制方式大同小異,只是每個ectd節點運行在一個docker容器中,具體命令如圖2-4所示。
圖2-4 Docker搭建Etcd命令(1)
圖2-4 Docker搭建Etcd命令(2)
3. Kubernetes集群搭建
3.1 安裝Kubeadm、Kubelet、Kubectl
網絡正常及有正常可用apt源的時候很簡單,就是簡單的如下更新安裝:apt-get update&&apt-get install Kubeadm Kubelet Kubectl,這里額外介紹一種在研究初期無安裝源及無可用命令行翻墻配置時的方式。
1)翻墻下載packages索引
https://packages.cloud.google.com/apt/dists/Kubernetes-xenial/main/binary-amd64/Packages
這里選擇1.8版本,具體索引如下:
2)根據Filename下載對應的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)構建本地軟件源并更新安裝
dpkg-scanpackages ./| gzip - > ./Packages.gzapt-get updateapt-get install Kubeadmapt-get install Kubeletapt-get install Kubectl
4)配置kubeadm init的配置文件
由于在新版本中,kubeadm init已經廢棄了--external-etcd-endpoints參數,所以要引用外部高可用Etcd集群,我們需要手動為Kubeadm創建yaml配置文件kube-config.yaml,然后執行kubeadm init --config=kube-config.yaml,Ectd相關配置如圖2-5所示:
圖2-5 Kubeadm初始化時Kube-config.yaml配置文件
3.2 Kubeadm初始化
1)準備相關鏡像
因為Kubeadm在初始化集群時候拉取gcr.io中的鏡像也要求能夠科學上網,雖然目前已經有一些網站提供相關鏡像,但為了更快速尤其是用到指定版本或最新版本,這里借助于dockerhub的Configure Automated Builds,依據Github的Dockerfile轉存谷歌容器倉庫(gcr.io)的鏡像,轉存命令很簡單,以調度器為例:
FROM gcr.io/google_containers/kube-scheduler-amd64:v1.6.0,具體Dockerhub配置如圖2-6所示。
圖2-6 Dockerhub配置Github自動構建圖
之后通過命令拉取下來重新打一下標簽就行:
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
需要轉存的鏡像鏡像列表如下:
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
不同版本對應相關鏡像不一樣,具體可以參照生成的相關Manifests或者打印出的日志以及初始化時的日志或通過Kubectl logs查看對應的pod日志。
另外,為了使Flannel正常工作,Kubernetes官方文檔指出,在Kubeadm init 時候必須要追加--pod-network-cidr=10.244.0.0/16參數[10]。因為上面在引入外部高可用Etcd集群時已經采用了Kubeadm的配置文件方式,且Flannel的CIDR配置參數不能用--config同時存在,所以需要在Kube-config.yaml文件中增加如下兩行配置:
networking: podSubnet: 10.244.0.0/16
Kubeadm初始化成功后,可以用命令檢查組件狀態
kubectl get componentstatuses,執行結果如圖2-7所示。
圖2-7 Kubernetes集群初始化后組件健康信息
3.3安裝Flannel
因為已經安裝了Kubectl,Flannel可以直接用Kubernetes的形式安裝,命令如下:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.0/Documentation/kube-flannel.yml
需要注意的是跟如上鏡像一樣,到https://hub.docker.com的Configure Automated Builds中轉存一下quay.io/coreos/flannel:v0.9.0-amd64。
3.4 加入Nodes
Kubeadm初始化后會生成一個token,用此token通過命令:kubeadm join --token 86d22a.123582ce916b31fc 10.0.30.104:6443加入節點,分別在Master之外的兩臺機器執行上述命令后,Kubelet會分別在兩臺Node上啟動Flannel和Kube-proxy,如圖2-8所示。
圖2-8 Kuberntes集群搭建完成pod示例圖
4. 密碼評測微服務搭建部署
4.1 構建服務鏡像
因為兩個基于機器學習的密碼強度評測算法都是用Python實現的,而其中因為涉及到很多數組或矩陣的運算,所以需要Python的NumPy(Numerical Python)庫的支持,NumPy是Python 的一個擴展程序庫,支持高維數組和矩陣運算,除此外也對數組運算提供大量的數學函數庫。安裝Numpy的方式有很多,可以用Pip或Apt-get 等進行安裝,因為除了這個庫還有一些依賴庫,比如Matplotlib等,這里我們使用數據分析較常用的Anaconda這個支持 Linux, Windows 和 Mac 系統,用于大規模數據處理,預測分析和科學計算并致力于簡化包的管理和部署的Python免費發行版。
Anaconda的安裝比較簡單,這里就不做贅述,為了方便直接使用Dockerhub上比較受歡迎的continuumio/anaconda鏡像作為基礎鏡像構建我們的微服務鏡像,Dockerfile如圖2-9和圖2-10所示。
圖2-9基于K最近鄰密碼強度評測Dockerfile
構建鏡像:docker build -t localtest.registry..com:9000/knnpassord:v1 .
運行測試:docker run -d -p 6666:6666 raysail/knnpassord:v1
提交倉庫:docker push localtest.registry.com:9000/knnpassord:v1
圖2-10基于決策樹密碼強度評測Dockerfile
構建鏡像:docker build -t localtest.registry..com:9000/dtpassord:v1 .
運行測試:docker run -d -p8888:6666 raysail/dtpassord:v1
提交倉庫:docker push localtest.registry.com:9000/dtpassord:v1
4.2 Kubnerntes中運行為服務
分別創建副本數為3的knn-password Deployment ,descisiontree-password Depoyment ,如圖2-11和圖2-12,并分別創建兩個service如圖2-13和圖2-14:
圖2-11基于KNN的密碼強度評測微服務Deployment
圖2-12基于決策樹的密碼強度評測微服務Deployment
圖2-13基于KNN的密碼強度評測微服務Service
圖2-14基于決策樹的密碼強度評測微服務Service
kubnerntes資源查看如圖2-15。
圖2-15密碼評測微服務創建后kubnertes pod和service視圖
用kubectl describe 命令查看服務可以看到每個服務后端掛載有三個pod,以實現容災和負載均衡,具體如圖2-16所示。
圖2-16 kubectl describe命令查看服務視圖
4.3 驗證服務可用性及準確性
兩個密碼強度評測微服務的protobuf定義如圖2-17和圖2-18所示。
圖2-17 K最近鄰密碼強度評測Protobuf定義
圖2-18決策樹密碼強度評測Protobuf定義
分別用golang和php的客戶端測試基于Knn的密碼強度評測微服務和基于決策樹的密碼強度評測微服務可以正常返回。用如下命令分別生成golang客戶端樁函數和php客戶端樁函數:
protoc --go_out=plugins=grpc:./ ./password.protoprotoc --php_out=./ --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin ./password.proto
5. 持續集成和滾動更新實現
5.1 基于Gitolite的Hook技術
主要算法思想是利用Git的服務端Hook——post-receive來觸發Push代碼后的操作,也就是提交代碼后可以根據分支以及具體的Log中的關鍵字來相應的執行包括但不限于單元測試,構建鏡像,自動部署等操作。
具體可參加如下Shell腳本(處理階段的自動化腳本處理和Jenkins觸發處理注釋了,可選擇其中一種或別的方式)
#!/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的滾動升級
具體主要Shell Code如圖2-19所示。
圖2-19 Kubeapi主要Shell code
總結與展望
本文歷經近半年,拋開公司內已有組件,盡可能從源頭出發,經過閱讀相關文獻,專著,開源網站及相關技術源碼,以及平時工作中的實踐演練和相關同學的討論,理論聯系實踐,經過業務抽象,最終實現以K近鄰算法和決策樹算法為算法依據的基于機器學習的密碼評測微服務,并把微服務部署到Kubenrnetes集群上及進行了可行性和正確性驗證。從微服務的單一職責,自治性,領域驅動設計等設計原則開始,研究了其相關技術棧,包括但不限于容器虛擬化技術,服務發現注冊技術,異構系統通信機制,持續集成交付部署等,文中很多組件的原理圖都是在基于理論和實踐后的原創繪制,對于很多大型的系統架構設計及軟件基礎架構設計這些都是可以借鑒的資料。
在以上研究基礎上,經過學習考試,通過了Google和CNCF(Cloud Native Computing Foundation)聯合推出的CKA(Certified Kubernetes Administrator)認證,通過備考的大量實踐演練,進一步加深了自動部署、擴展和管理容器化的開源框架Kubernetes原理的認知,也更加相信未來此系統會被大規模采納并應用到更多的企業和技術領域。此外在云計算和大數據迅猛發展的今天,機器學習被越來越多的應用到各行各業中,而機器學習應用的工程化,自動化和平臺化亟需普及和建設,這也是依托Kubernetes集群進行基于機器學習的微服務實踐的原因,當然密碼作為一直都很重要的安全行業的重要組成部分,作為本文技術架構下的核心業務部分也是本文的重點工作。
當然本文還有很多優化和后續工作需要做,主要是如下幾點。性能方面:借助Golang語言特性重構訓練模型,進行計算性能優化;應用Traefik Ingress等K8S負載均衡技術,對外提供服務的同時并提升優化負載能力。業務方面:采用機器學習Tensorflow等庫或框架,讓平臺的機器學習應用多樣化,標準化;引入單元測試、集成測試、功能測試、性能測試等多維度測試保證服務可靠性。部署方面:應用支持眾多組件及自定義腳本的Jinkens使持續集成可視化;Kubernetes高可用部署,多Master集群,進一步提高容災能力。監控方面:應用Prometheus相關技術對集群進行進一步日志及狀態監控;應用Alertmanger等技術對集群異常進行微信,短信郵件等告警;架構方面:Service Mesh(istio)技術應用,解耦服務的重試、監控、追蹤,發現等。除了上述優化和后續工作,對于多服務下的分布式事物和服務治理相關以及熔斷、限流、降級等相關問題的應用會在下一期講述,敬請期待。
-
人工智能
+關注
關注
1792文章
47442瀏覽量
239009 -
機器學習
+關注
關注
66文章
8425瀏覽量
132775 -
tensorflow
+關注
關注
13文章
329瀏覽量
60545
原文標題:微服務架構系列二:密碼強度評測的實現與實驗
文章出處:【微信號:Tencent_TEG,微信公眾號:騰訊技術工程官方號】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論