使用者數從 0 到億,我的 K8s 踩坑血淚史
作者 | 平名 阿里服務端開發技術專家
導讀:容器服務 Kubernetes 是目前炙手可熱的雲原生基礎設施,作者過去一年上線了一個使用者數極速增長的應用:該應用一個月內日活使用者從零至四千萬,使用者數從零到一億的裂變式增長,充分享受了容器服務快速簡便的擴容操作和高可用特性。作者使用容器服務 Kubernetes 叢集將公司內系統完全上雲 1 年多,本篇文章記錄了其中的踩坑與優化記錄。
關注“阿里巴巴雲原生”公眾號,回覆關鍵詞“資料”,即可獲得 2019 全年meetup 活動 PPT 合集及 K8s 最全知識圖譜。
建立叢集
建立叢集時,做好規劃,選擇優化好的叢集配置,可以大大減少後期運維工作,其中部分叢集的配置在建立後再也沒法修改或者修改極其麻煩。
叢集規劃
- 網路規劃:
- 網路型別: Flannel、Terway
Terway 是阿里雲容器服務自研的網路外掛,功能上完全相容 Flannel,如果保守,還是使用 Flannel
- Pod 網路 CIDR
預設 16 的大網段,有效的網段或者其子網 10.0.0.0/8,172.16-31.0.0/12-16,192.168.0.0/16
- Service CIDR
- 預設 20 的網段,可選:10.0.0.0/16-24,172.16-31.0.0/16-24,192.168.0.0/16-24
- 網段不能衝突重複,建立後沒法修改;
- 多個區域的多個交換機。
- 公網訪問 ApiServer
- 對於線上等安全要求高的叢集,可以選擇不暴露 apiserver, 只有私網 SLB, 但是這樣沒法使用雲效釋出;
- 日常預發等叢集,可以暴露公網 SLB 到 apiserver, 叢集建立後立即為 slb 建立訪問控制,限制 slb 只能雲效訪問;
注: K8s 每次安全漏洞幾乎都與 ApiServer 有關,對於線上 K8s 叢集,要及時升級補丁,或者不開放公網 apiserver,使用嚴格的安全組和訪問控制。
- 安全組
- 設定安全組限定訪問範圍,為 master 與 worker 機器使用。
- Master 機器規劃
為了高可用,一般使用 3 節點,Master 選擇規則如下:
節點數 | master 規格 |
---|---|
1-5個 | 4C8G |
6-20個節點 | 4C16G |
21-100個節點 | 8C32G |
100-200個節點 | 16C64G |
master 機器的儲存建議高效能的 50-100G SSD,因為會執行 ETCD,作業系統佔用不超過 8G。
- Worker 機器規劃
- 阿里雲首推神龍機器,沒有神龍機器的區域,選用高配 ECS,配置規格根據部署的 POD 規格乘以一定倍數,比如 Java 應用 pod 一般選擇 4C8G,ECS 則購買 32C64G 或者 64C128G 為好,設定部署的時候為 pod 設定固定的 request/limit;
- 我們選用的機器配置:
- 32C64G ECS
- 儲存。系統盤:100G SSD, 資料盤:400G 高效雲盤
- 作業系統:centos 7.4 64 位
叢集建立與配置
建立叢集時設定:
- 通過控制檯建立叢集,阿里雲容器服務提供的非常簡易的一鍵部署叢集功能,通過嚮導完成 K8S 叢集的建立;
- 按照以上規劃設定 master,worker 節點,掛載 /var/lib/docker 到資料盤;
- 設定合理的 Pod 網路 CIDR, Service CIDR ip 網段;
- 設定合理的安全策略,是否暴露 apiserver(需要直接雲效釋出的,需要開放公網暴露,並做嚴格的訪問控制);
- ingress 選擇安全,可以使用內網,如果需要公網,可以在控制檯很方便建立,同時做好訪問控制;
- kube-proxy 模式,因為 iptables 模式在更新一條規則時把 iptables 鎖住引發的效能問題,建議使用 IPVS 模式;
- 節點 POD 數量,預設 128 太大,一個節點不可能部署這麼多,建議改為 64;
- 節點服務埠訪問 (NodePort,SLB),可以適當擴大,預設的也一般足夠用。
叢集配置修改:
- 叢集擴容,新增已有節點(節點配置參考上文,掛載資料盤使用 /var/lib/docker)
- Master 機器升配:
- worker 節點變配或者移除:
- kubectl drain --ignore-daemonsets {node.name}
- kubectl delete node {node.name}
- ECS 升配變配
- 新增已有節點到叢集
- 名稱空間:
- 按照應用分組建立 namespace,對於資源佔用厲害需要限制的應用分組,設定該 NameSpace 的資源配額與限制;
- 授權:
- 子賬號如何給其他子賬號進行 RBAC 授權
- 通過堡壘機按應用人員設定許可權
部署設定
無狀態部署
使用無狀態部署 Deployment,參考這篇文章實現分批發布。
優化設定模板:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: '34'
# 標籤,對映 service
labels:
app: {app_name}-aone
name: {app_name}-aone-1
namespace: {app_name}
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: {app_name}-aone
# 批量重啟更新策略
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: {app_name}-aone
spec:
containers:
# 環境變數增加時區
- env:
- name: TZ
value: Asia/Shanghai
- image: >-
registry-vpc.cn-north-2-gov-1.aliyuncs.com/{namespace}/{app_name}:20190820190005
imagePullPolicy: Always
# 啟動前執行優雅下線摘除 服務註冊
lifecycle:
preStop:
exec:
command:
- sudo
- '-u'
- admin
- /home/{user_name}/{app_name}/bin/appctl.sh
- {app_name}
- stop
# 存活檢查,強烈建議設定
livenessProbe:
failureThreshold: 10
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 5900
timeoutSeconds: 1
name: {app_name}-aone
# 就緒檢查,強烈建議設定
readinessProbe:
failureThreshold: 10
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 5900
timeoutSeconds: 1
# 資源限制,這個一定要合理設定
resources:
limits:
cpu: '4'
memory: 8Gi
requests:
cpu: '4'
memory: 8Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
# 日誌存放目錄,對映到節點的/var/lib/docker/logs 資料盤,應用日誌目錄設定到/home/{user_name}/logs 下
volumeMounts:
- mountPath: /home/{user_name}/logs
name: volume-1553755418538
dnsPolicy: ClusterFirst
## 私有映象倉庫的金鑰,從保密欄位獲取
imagePullSecrets:
- name: {app_name}-987
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
# 日誌存放目錄,對映到節點的/var/lib/docker/logs 資料盤
volumes:
- hostPath:
path: /var/lib/docker/logs/{app_name}
type: ''
name: volume-1553755418538
服務設定
因為容器服務的 Cloud Controller Manager 會同步刪除 service 建立關聯的 SLB,為了防止 service 配置修改誤刪除 slb 故障,並導致域名、安全等配置需要修改的坑,強烈建議 service 與 slb 解耦,service 採用 NodePort 的方式,slb 另外建立後端伺服器指向叢集節點,如果需要透傳真實 IP,並考慮負載均衡,需要遵守一定的配置規則和方法,參考這個文章。
NodePort:
apiVersion: v1
kind: Service
metadata:
name: {app_name}
namespace: {namespaces}
spec:
clusterIP: 10.1.50.65
## 策略關係到是否透傳真實 IP
externalTrafficPolicy: Cluster
ports:
- name: {app_name}-80-7001
nodePort: 32653
port: 80
protocol: TCP
targetPort: 7001
- name: {app_name}-5908-5908
nodePort: 30835
port: 5108
protocol: TCP
targetPort: 5108
selector:
app: {app_name}
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
然後在負載均衡管理頁面,選擇後端伺服器指向叢集的 worker 機器,設定埠為以上服務的埠:32653,完成配置,這樣在叢集 service 修改或者刪除重建的時候,slb 不會被叢集的 CCM 刪除,不會涉及到域名,安全等配置修改。同時,可以設定一些策略,需要升級修改服務配置時,分批切流等。
總結
阿里雲容器服務控制檯雖然是雲上新產品,提供了極其簡單的一鍵部署功能,以及簡便的控制檯管理。過去一年中,筆者一路見識阿里雲容器服務控制檯從簡陋向強大的轉變過程,雖然多次踩坑,但阿里雲容器服務同學認真負責和極好的服務態度讓人佩服。
容器服務管理控制檯還需要更多的考慮實際運維需求,並緊密結合已有的雲產品,比如雲效、EDAS、雲監控、日誌服務等,以應用為單位,提供更好服務。
掃描下方二維碼新增小助手,與 8000 位雲原生愛好者討論技術趨勢,實戰進階!
進群暗號:公司-崗位-城市
相關推薦
使用者數從 0 到億,我的 K8s 踩坑血淚史
作者 | 平名 阿里服務端開發技術專家 導讀:容器服務 Kubernetes 是目前炙手可熱的雲原生基礎設施,作者過去一年上線了一個使用者數極速增長的應用:該應用一個月內日活使用者從零至四千萬,使用者數從零到一億的裂變式增長,充分享受了容器服務快速簡便的擴容操作和高可用特性。作者使用容器服務
從0開始,快速完成Python數據分析工程師課程的經驗分享
最好 等等 一次 知識點 pat soup 班主任 核心 mysq Python學習的起源:先說說,我的工作跟運營和產品相關,對於技術不是剛需,甚至連使用場景都極少。最開始只是因為在一次內部數據平臺的搭建過程中,發現小夥伴們都忙不過來了,就想著自己也學學,能幫忙弄一點是一點
【面試被虐】如何只用2GB記憶體從20億,40億,80億個整數中找到出現次數最多的數?
這幾天小秋去面試了,不過最近小秋學習了不少和位演算法相關文章,例如 【面試現場】如何判斷一個數是否在40億個整數中? 【演算法技巧】位運算裝逼指南 對於演算法題還是有點信心的,,,,於是,發現瞭如下對話。 20億級別 面試官:如果我給你 2GB 的記憶體,並且給你 20 億個 int 型整數,讓你來找出次數出
比如說,你下午四點鐘來。那麽從三點鐘起,我就開始感到幸福。時間越臨近,我就越感到幸福。到了四點鐘的時候,我就會坐立不安:我就會發現幸福的代價。
pla 遍歷 身邊 失去 -c tar 什麽是 ble 們的 比如說,你下午四點鐘來。那麽從三點鐘起,我就開始感到幸福。時間越臨近,我就越感到幸福。到了四點鐘的時候,我就會坐立不安:我就會發現幸福的代價。 本質的東西是用眼睛看不見的,只能用心去看。正是因為你為你的玫瑰費的時
【一】從0開始,用flask+mongo打造分散式伺服器監控平臺
閱讀本文,代表你將和 奎因 一起,從 0 開始快速入門 flask 開發以及 mongodb 的使用,打造一個穩定、健壯的分散式多機伺服器資源監控平臺 在前面一篇文章《 Python 系統資源資訊獲取工具,你用過沒?》中,我們學習瞭如何使用 Python 中的第三方庫 psutil 來獲取系統的資
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。
題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39 /* 思路: 就是簡單的斐波那契數列,按照正常的思路求解即可 可以分為遞迴和非遞迴,這裡介紹非遞迴的方式 */ class Solution { pub
USB學習筆記,情深義重。親身實踐從0開始,STM32,MSP430的實現。
多年工作一直在使用MSP430微控制器,其實有些系列也支援全速通用序列匯流排(USB 2.0),比如MSP430F5504,MSP430F5510。近期在學習STM32,以後就在以STM32F103ZET6為基礎平臺展開對USB 2.0(USB3.0的區別就是高
分類任務中label取值的注意事項(caffe框架下),從0開始,連續整數,
最近在做一個分類任務的實驗的時候,對標籤的取值產生了一些疑惑,所以看了一點對應的原始碼,順利解決了疑惑,在這裡和大家分享,如果有什麼理解錯誤還請大家指出。 之前做分類任務的時候總有聽說,標籤(label)的取值需要從0開始,按照個人的習慣,我在
史上最詳細的Hadoop環境搭建,從0開始,圖解全部過程
Hadoop在大資料技術體系中的地位至關重要,Hadoop是大資料技術的基礎,對Hadoop基礎知識的掌握的紮實程度,決定在大資料技術道路上走多遠。 這是一篇入門文章,Hadoop的學習方法很多,網上也有很多學習路線圖。本文的思路是:以安裝部署Apache Hadoop2.x版本為主線,來介紹H
從0開始,第一步,搭建Python開發環境!
分享文章前,小編有話要說: 環境安裝按照小編寫的步驟一步一步來, 學程式設計,不要急,一步一個腳印,一口是吃不成胖子的,慢慢來! 正文 1、訪問網頁連結 ,點選下載 2、點選執行下載後的檔案 &nbs
從0開始,部署.NetCore並構建非阻塞高併發伺服器(2)
工具篇看我這篇部落格想搭建伺服器的朋友多半是想在Linux上使用,正所謂工欲善其事必先利其器,一個好用的SSH對我們的工作效率影響也很大,簡單的說下我在Win下常用的SSH軟體和使用教程,老手自動忽略即可推薦工具1--WinSCPWinSCP可以說是我最常用的遠端連線Linu
從0開始,在樹莓派上部署TensorFlow Object Detection API
如果你只想用樹莓派來識別,請移步https://blog.csdn.net/weixin_43599336/article/details/83713790 視訊演示地址: P1: https://www.bilibili.com/video/AV31697636 # 系統安裝
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(7.2) 模組管理,模組的新增、修改、刪除
索引 簡述 今天我們來做模組管理的 新增、修改、刪除 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(5.3) 登入功能的實現,豐富資料表、建立關聯
1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_CODE] Script Date: 2016/5/17 9:30:01 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案 (10)部門管理、崗位管理和員工管理
1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_POST_USER] Script Date: 2016/6/20 16:28:44 ******/ 4 SET ANSI_NULLS ON 5 GO
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案 (12)程式與資料備份
索引 簡述 程式檔案備份與資料備份 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。 專案開始
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(5.4) 登入功能的實現,建立與登入使用者相關的介面和實現類
索引 簡述 今天我們建立幾個與登入使用者相關的資料表的介面和實現類 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案 (14)附資料庫、釋出專案
索引 簡述 總結一 整個系列其實還包括專案管理、考勤簽到、郵件、內部聊天等等,這個東西是做不完的,如果繼續還有新聞系統、靜態生成等等等等.... 其中,靜態頁生成在我的部落格中可以找到,三種方式: 第一種 就是類似網上的很多CMS一樣 採用標籤替換,但這種方式是不推薦的,特別是在我們.Net中,
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案 (16)原始碼分享二:登入功能以及UI、資料庫、倉儲原始碼分享
1 using Common; 2 using Service.IService; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Web;
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(5.5) 登入功能的實現,完善登入功能
索引 簡述 今天我們來完善我們的登入功能 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。 專案開