1.1 咱們先來了解一下paas究竟是什麼?html
PaaS是Platform-as-a-Service的縮寫,意思是平臺即服務,
首先,在瞭解Paas以前須要知道什麼是雲計算,雲計算是指基於互聯網網絡,經過虛擬化(xen OpenStack)統一管理和調度計算,國內廠商如:阿里雲/aws/ucloud/等等
目前雲計算三大類:node
1.基礎設施即服務(IaaS)
2.平臺即服務(PaaS)
3.軟件即服務(SaaS)mysql
1.2企業爲何須要一個PaaS?linux
平臺即服務(PaaS)
PaaS提供應用服務引擎,將軟件研發測試和運維的平臺做爲一種服務提供,應用程序接口,開發人員基於這些服務構建業務應用。從運維和開發角度來講,這意味着無需運維搭建環境,開發也不會由於不一樣平臺兼容性方面遇到困擾。算法
2.1 平臺簡介sql
2.2 Dashboarddocker
2.3 應用服務shell
2.4 定時任務centos
2.5 配置中心api
2.6 CI/CD
2.7 資源審計監控
2.8 高級功能

咱們在生產環境下運維kubernetes 已經有一段時間了,咱們7*24 全天候 爲每個業務保駕護航ofo容器雲 (簡稱Ruly)咱們底層基於某雲容器基礎服務,以及自建機房IDC、經過調用雲平臺API以及RO模板快速建立管理docker實例。

咱們team在高併發業務場景下作了哪些優化
 3.1 優化:基礎篇性能測試
選擇比較適合的實例規格或機器型號. 雲服務器需支持多隊列網卡
3.2 系統層面優化
操做系統優化:支持大併發,單集羣2000節點
K8s&容器層面優化:支持大併發,基礎鏡像製做優化等等
Principle:最小權限,優先跑滿容器資源限制
docker宿主目錄直接跑在默認/var/lib/docker下 長期跑下來會致使系統盤異常。致使down機等。所以咱們作了一下調整,自定義鏡像(lvm) 增長可擴展性
3.3 內核參優化
docker進程異常Dead狀態 at centos 7.4
* 增長fs.may_detach_mounts

總結:咱們作了大量業務壓測,以及雲平臺slb 、ecs idc 機器作了大量的性能調優,對業務的優化,配合開發同窗作了大量的debug 才使得咱們業務能在容器穩定的運行
3.4 容器化後比以前性能要好,同配置下延遲更低、故障恢復時間更快,服務成本下降
容器vs傳統部署模式 (最後兩個0.98ms 和0.96ms 爲容器

3.5 分享個線上case
在某某天一個凌晨4點,忽然接到短信報警,此時你們都在深睡,早上八點起牀後發現收到了兩條報警,一條是磁盤80%的告警,一條是磁盤恢復的報警,咱們能夠想象一下哈,若是你業務部署到了服務器,將會發生什麼,4-8點徹底能夠吧機器磁盤空間寫滿,致使業務異常。機器oom 爲何容器會自動恢復呢。緣由和簡單,kubernetes自帶有異常的pod自動驅逐,當磁盤空間大於百分之80 他會斷定這個pod是有問題的。
解釋:
本地磁盤是一個 BestEffort 資源,kubelet 會在 DiskPressure 的狀況下,kubelet 會按照 QoS 進行評估。若是 Kubelet 斷定缺少 inode 資源,就會經過驅逐最低 QoS 的 Pod 的方式來回收 inodes。若是 kubelet 斷定缺少磁盤空間,就會經過在相同 QoS 的 Pods 中,選擇消耗最多磁盤空間的 Pod 進行驅逐。
4.1 要說到kubernetes,就必定要聊聊etcd ,他存儲了於整個kubernetes的信息
etcd是一個高可用的鍵值存儲系統,主要用於共享配置和服務發現。etcd是由CoreOS開發並維護的,靈感來自於 ZooKeeper 和 Doozer,它使用Go語言編寫,並經過Raft一致性算法處理日誌複製以保證強一致性。
etcd能夠用於配置共享和服務發現。

4.2 etcd主要分爲四個部分:
HTTP Server:用於處理用戶發送的API請求以及其餘etcd節點的同步與心跳信息請求
Store:存儲,用於處理etcd支持的各種功能的事務,包括數據索引,節點狀態變動,事件處理與執行等。它是etcd對用於提供的大多數API功能的具體實現
Raft: Raft強一致算法的具體實現,是etcd的核心
WAL: Write Ahead Log(日誌先行),WAL是一種實現事務日誌的標準方法。etcd經過WAL進行持久化存儲,全部的數據在提交以前都會事先記錄日誌 a. Snapshot: 防止數據過多而進行的狀態快照 b. Entry: 存儲的具體的日誌內容

4.3 etcd中的術語:
4.4 Raft 狀態機
Raft集羣中的每一個節點都處於一種基於角色的狀態機中。具體來講,Raft定義了節點的三種角色: Follower、Candidate和Leader。
這三種角色狀態之間的轉換,以下圖:

一個 Raft 集羣包含若干個服務器節點;一般是 5 個,這容許整個系統容忍 2 個節點的失效。在任什麼時候刻,每個服務器節點都處於這三個狀態之一:領導人、跟隨者或者候選人。在一般狀況下,系統中只有一個領導人而且其餘的節點所有都是跟隨者。跟隨者都是被動的:他們不會發送任何請求,只是簡單的響應來自領導者或者候選人的請求。領導人處理全部的客戶端請求(若是一個客戶端和跟隨者聯繫,那麼跟隨者會把請求重定向給領導人)
每次成功選舉,新的Leader的Term(任屆)值都會比以前的Leader增長1。當集羣中因爲網絡或者其餘緣由出現分裂後又從新合併的時候,集羣中可能會出現多於一個的Leader節點。此時,Term值更高的節點纔會成爲真正的Leader。
4.5 etcd client
主要包含如下幾個功能:
4.6.etcd 運維、與備份
1、查看集羣中的節點
ETCDCTL_API=3 etcdctl --endpoints=https://xxx.xx.xx.xx --cacert=ca.pem --cert=etcd-client.pem --key=etcd-client-key.pem --write-out=table member list
2、添加節點
使用etcdctl member add node-name --peer-urls="https://xxx:2380"添加節點,生成變量。
1.準備新機器, 將上一步生成的配置文件變量,寫到新節點,尤爲是集羣狀態爲existing。(目標節點的數據目錄要清空)
2.生成用於集羣節點通訊的SSL證書
3.生成用於客戶端和節點通訊的證書
4.啓動並檢查
3、生產環境建議
建議採起多臺etcd集羣至5臺,保證多個節點掛掉不會影響使用
4、etcd 備份

配合 cronjob nfs 或 雲共享儲存 建議分鐘級別保留
4.7. etcd 監控
推薦promtheus + grafana 可自定義promtheus etcd 報警規則,或grafana alert 插件報警 等等


參考 https://coreos.com/etcd/docs/latest/op-guide/monitoring.html
監控是整個運維環節,乃⾄至整個產品⽣生命週期中最重要的⼀環、事前及時預警發現故障、過後提供數據追查定位問題,分析業務指標等等堅持業務指標採集是代碼的⼀部分原則不不動搖,提⾼高指標覆蓋率監控⽅方式和指標要標準化。
5.1. 定製容器基礎監控規則、規範。好比cpu閥值、內存閥值、磁盤閥值等等、高峯期 robot自動巡檢 報告
5.2. 監控選型:promtheus 、zabbix 等等
5.3.報警規則,怎麼才能讓避免垃圾報警。避免狼來了的故事
全部報警規則promtheus 或 zabbix 需根據kubernetes Kubelet 監控資源消耗規則匹配,特別注意要和kubernetes一些自動恢復規則最好匹配,儘可能低於kubernetes規則,要比kubernetes早發現,自研告警信息管理平臺,
在一個平臺中接收全部監控系統的告警,讓運維人員集中處理系統異常事件,避免多平臺切換,提高運維效率。 promtheus、Zabbix等主流監控平臺的告警自動整合進來 ,使用時間序列規則,將大量重複的告警事件壓縮爲一條有真正意義的告警。然後經過屬性關聯、 機器學習等算法把相關的告警合併起來,安排一線運維負責7x24小時應急值守, 快速接收告警進行初步預判,二線研發團隊負責告警升級的分析和根源定位,建議使用釘釘,短信報警
一個kubernetes 集羣的 dashborad 基本信息

指定pod cpu mem 監控

5.4 pod自動擴容提醒 和異常pod(crashloopbackoff)報警(釘釘報警)

5.5 業務監控 、pod cpu 內存 監控 高峯期自動釘釘發送 無人值守

6.1 案例一
異常:
authentication.k8s.io:0xc820374f50] is already registered
kubectl throwing group is already registered error
緣由:
kubectl版本與Kubernetes版本不一致致使的
解決:
選擇相應的kubectl版本從新安裝
6.2 案例二
異常:
kubelet: E0529 17:40:11.741095 14358 fs.go:418] Stat fs failed. Error: no such file or directory
緣由:因爲安裝docker時宿主目錄被軟鏈 overlayfs清理container不完整致使的
解決:
安裝kubernetes集羣時 docker須要配置好宿主目錄 不要軟鏈
6.3案例三
異常:svc ip 變化 致使沒法訪問,1.9.4以前的驚天大BUG
緣由:一個或者多個 Kubernetes service 對應的 Kubernetes endpoints 消失幾分鐘或者更長時間,kubectl get ep --all-namespaces」 不斷查詢,能夠觀察到一些 AGE 在分鐘級別的 endpoints 老是突然消失,endpoints不穩定,致使service沒法變化
解決:升級kubernetes至1.9.3或更高 1.9.2的bug
6.4 案例四
異常:作線上cordon節點的時候 服務不能夠用,致使某雲slb 沒法轉發到節點的容器業務服務
緣由:通常設置cordon的以後就會drain作排水調度,在ServiceController裏面確實會將unschedulable的節點從service上移除,這個是目前kubernetes的機制
解決:作cordon操做時選擇在業務低峯期,好比凌晨操做,分批操做不要一會兒所有cordon
經常使用技巧
• 經過系統級別的方法先查看總體系統負載狀況,再快速定位具體模塊問題
• top / iotop / iftop等查看CPU負載,io負載,網卡負載整體狀況
• ps / lsof查看(鏈接句柄)進程當前關聯的句柄(進程)
• strace抓一段時間可疑進程的系統調用狀況
lsof
• 枚舉進程打開的句柄(文件、sockets)
• 查看某一文件或鏈接(TCP/UDP端口)所關聯的進程
• 查看flock文件鎖&線程鎖交叉致使的死鎖(W)
• lsof
• lsof -nPp
• lsof -nPI@192.168.xx.x:22
• lsof /var/lib/mysql/mysql.sock
ss
• 查看TCP/UDP sockets狀態• ss -an | grep LISTEN• netstat -s• EST, CLOSE-WAIT, TIME-WAIT, SYN_RECV• 發送TCP RST能夠避免進入TIME-WAIT狀態Tcpdump• 網絡抓包,網絡故障分析• tcpdump -vv -i eth0 port xx -X -s 0• tcpdump -vv -s 0 -i eth0 port xx -w /tmp/xx.pcap