1. 程式人生 > >使用者數從 0 到億,我的 K8s 踩坑血淚史

使用者數從 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 位雲原生愛好者討論技術趨勢,實戰進階!
進群暗號:公司-崗位-城市

相關推薦

使用者數 0K8s 血淚史

作者 | 平名 阿里服務端開發技術專家 導讀:容器服務 Kubernetes 是目前炙手可熱的雲原生基礎設施,作者過去一年上線了一個使用者數極速增長的應用:該應用一個月內日活使用者從零至四千萬,使用者數從零到一億的裂變式增長,充分享受了容器服務快速簡便的擴容操作和高可用特性。作者使用容器服務

0開始快速完成Python據分析工程師課程的經驗分享

最好 等等 一次 知識點 pat soup 班主任 核心 mysq Python學習的起源:先說說,我的工作跟運營和產品相關,對於技術不是剛需,甚至連使用場景都極少。最開始只是因為在一次內部數據平臺的搭建過程中,發現小夥伴們都忙不過來了,就想著自己也學學,能幫忙弄一點是一點

【面試被虐】如何只用2GB記憶體204080個整數中找到出現次數最多的

這幾天小秋去面試了,不過最近小秋學習了不少和位演算法相關文章,例如 【面試現場】如何判斷一個數是否在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開始STM32MSP430的實現。

多年工作一直在使用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有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。 專案開