運維工作新時代:自主編碼實現(xiàn)運維自動化的轉(zhuǎn)型之旅
引言
隨著業(yè)務系統(tǒng)和底層中間件服務的復雜度不斷增加,傳統(tǒng)手工運維方式面臨著諸多挑戰(zhàn)和限制。人工編寫運維腳本顯得非常低效,同時手動執(zhí)行運維操作存在著巨大風險。在此情況下,推動運維自動化成為運維人員必須落地實施的工作。運維同學如果可以有地方自主通過編碼的方式,實現(xiàn)各種自動化任務和運維功能。不僅可以提高效率,降低風險,還能為運維工作帶來新的突破。
然而,要邁向這條運維自動化之路并不容易。我們需要克服傳統(tǒng)運維的局限性,同時要掌握編碼技能和提供適應的平臺。
本文將介紹如何衡量運維自動化率的概念,并提供一個支持運維同學通過編碼實現(xiàn)自動化的平臺。通過編碼實現(xiàn)運維自動化的轉(zhuǎn)型之旅,讓運維工作邁入新的時代。希望也能給大家提供一個全新的視角。
運維工作面臨的挑戰(zhàn)和限制
復雜的腳本管理和手動操作
過于依賴手動操作和編寫復雜的手工腳本,容易引發(fā)故障,增加了運維工作量和風險:
人為失誤和依賴個人技能
運維過程中的人為失誤會導致系統(tǒng)故障和數(shù)據(jù)丟失,過度依賴個人技能的情況也會使得團隊合作和知識傳承困難:
個人成長和發(fā)展的局限
日常工作中,大家更容易關(guān)注到業(yè)務研發(fā),而對于業(yè)務運維的工作容易忽視。這種情況給運維同學的個人成長和發(fā)展帶來了一些局限性:

運維自動化的重要性
成本
運維人員管著公司的服務器資源,每年公司需要為IT資源支付數(shù)十億的成本,隨著資源規(guī)模的不斷增長,成本控制和策略變的至關(guān)重要。在這種情況下,完善的資源成本管理工具和自動化分攤機制變得尤為重要,否則成本管理將面臨巨大的負擔和壓力。
效率
在運維工作當中,例如資源分配和管理、擴容縮容、日常巡檢、版本更新、服務重啟、集群管理等,這些都是運維最基礎的日常工作,目前這些工作上大多都是偏日常和重復的,手工操作將浪費掉大部分的時間,如果通過自動化解決掉這些問題,將解放運維的生產(chǎn)力,提升運維效率,讓運維的同學可以有更多的精力去做更有價值的事情。
穩(wěn)定性
通過自動化提升運維效率的同時,也可以大幅降低人為失誤,最大程度保障系統(tǒng)的穩(wěn)定性運行,即使出現(xiàn)問題,也能夠通過自動化快速發(fā)現(xiàn)響應和自動恢復。

編碼實現(xiàn)的運維自動化
上面提到了運維自動化的重要性。自從今年4月份加入技術(shù)保障部門以來,我一直在思考如何提升運維的自動化水平,并希望能找到一種衡量該提升的方法。因此,在4月份就提出了一個運維自動化率這樣的一個衡量指標。
運維自動化率的定義
運維自動化率的定義范圍是技術(shù)保障部門的所有運維人員。該指標可以通過以下公式計算:
運維自動化率 = 自動化操作次數(shù)(通過泰山麒麟) / 手工操作次數(shù)(通過堡壘機登錄) + 自動化操作次數(shù)
其中,分子表示通過泰山麒麟進行的自動化操作次數(shù)。這些操作可以是自動化運維命令、運維功能或自動化編排任務。分母表示通過堡壘機登錄之后進行的手工操作的次數(shù),再加上分子的數(shù)量。

通過這個指標,可以衡量在給定時間內(nèi)運維人員使用自動化工具相對于手工操作的比例,從而評估運維的自動化水平。較高的自動化率意味著更多的任務可以通過自動化完成,減少了手工操作的工作量,提高了效率和穩(wěn)定性,從 4月份衡量開始,技術(shù)保障部的運維同學運維自動化率從 Q2 的 3% 提升到 目前為 63%。

為什么要運維自主編碼實現(xiàn)
最初的原因是發(fā)現(xiàn)各個運維小團隊都使用自己獨立的運維工具。經(jīng)過分析,這是因為不同的運維團隊有不同的需求,為了滿足各自的需求,每個團隊都會開發(fā)自己的運維工具。隨著時間的推移,就出現(xiàn)了許多不同的運維工具平臺。因此開始思考是否可以提供一個平臺來滿足所有運維人員的需求。
然而,問題又來了,這些需求應該由誰來開發(fā)呢?最合理的解決方案是由運維人員自己來開發(fā)。因為只有運維人員最了解自己的需求。
通過讓所有運維同學都參與其中,可以為運維同學提供更廣闊的學習和成長機會,可以發(fā)揮出更大的價值。這樣做不僅可以提升運維團隊的整體能力,還能助力個體運維人員的個人成長和職業(yè)發(fā)展。
案例分析:ChubaoFS的運維自動化
接入步驟和示例
1、申請運維系統(tǒng)菜單
聯(lián)系泰山麒麟平臺管理員創(chuàng)建運維系統(tǒng)菜單。在這個過程中,平臺管理員將創(chuàng)建對應運維系統(tǒng)的菜單名稱,并根據(jù)菜單分配用戶私有的鑒權(quán)文件。這個鑒權(quán)文件將在后續(xù)的 Controller 開發(fā)中被使用。
apiVersion2、創(chuàng)建運維功能
在泰山麒麟平臺中創(chuàng)建運維功能時,支持兩種實現(xiàn)方式。一種是基于運維同學提供的 HTTP 接口服務,另一種是基于運維自己編碼實現(xiàn)的自定義(基于 Kubernetes CRD)模式的 Controller。本文重點將介紹基于自定義模式的 Controller 實現(xiàn)方式。
創(chuàng)建運維功能步驟:
① 進入開發(fā)者模式,點擊"新建"按鈕,在窗口中可以選擇原子類型為自定義,后續(xù)需要運維同學開發(fā)相應的 Controller 代碼

②上面步驟"確認"后,會在列表頁出現(xiàn)對應名稱的運維原子記錄,點擊操作欄里的“字段維護”按鈕開始配置描述該運維功能的具體數(shù)據(jù)結(jié)構(gòu)。

經(jīng)過以上兩步,得到了一個描述運維功能的參數(shù)
{
"apiVersion"根據(jù)以上參數(shù),接下來是編寫執(zhí)行該運維功能的代碼邏輯了。
3、編寫運維功能代碼
泰山麒麟平臺提供了代碼模版,建議下載提供的模版進行編寫具體的 Controller 部分,并加入平臺分配的鑒權(quán)文件,這樣可以確保 Controller 運行時可以 Watch 到麒麟平臺的操作消息。
代碼模版包含兩個例子,一個是 Controller 實現(xiàn)單一功能樣例,另一個是 Controller 實現(xiàn)多功能樣例,主要包含以下2個核心文件:
package main
import (
"controllers/example/api/web/service"
"flag"
"os"
examplev1 "controllers/example/api/v1"
"controllers/example/controllers"
"k8s.io/apimachinery/pkg/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
// +kubebuilder:scaffold:imports
)
var (
scheme , "metrics-addr", ":8090", "The address the metric endpoint binds to.")
flag.BoolVar(, "enable-leader-election", false,
"Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.")
flag.Parse()
//配置日志打印參數(shù)
ctrl.SetLogger(zap.New(func(o .ExampleKindReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("ExampleKind"),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}
package controllers
import (
"context"
"strconv"
"github.com/go-logr/logr"
"k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
examplev1 "controllers/example/api/v1"
)
// ExampleKindReconciler reconciles a ExampleKind object
type ExampleKindReconciler struct {
client.Client
Log logr.Logger
Scheme *runtime.Scheme
}
var num = 0
// +kubebuilder:rbac:groups=example.sreplat.com,resources=examplekinds,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=example.sreplat.com,resources=examplekinds/status,verbs=get;update;patch
//當麒麟平臺上執(zhí)行一個運維過能時,controller就會watch參數(shù),并攜帶參數(shù)信息進入到這個函數(shù)。
func (r .ExampleKind{}
// your logic here
//下面都是樣例代碼,用戶直接實現(xiàn)自己的業(yè)務邏輯即可
if err != nil {
r.Log.V(1).Info("couldn't find module:" .ExampleKind{}).
Complete(r)
}
4、部署運維功能代碼
當完成代碼后,可以將其部署在行云部署的容器中。為了方便統(tǒng)一管理,建議在“泰山麒麟(SOPS)”系統(tǒng)下自行申請應用。如果 Controller 對于運行環(huán)境有特殊要求,也可以選擇自行部署。
5、運維功能發(fā)布
當完成運維功能開發(fā)和部署后,可以在泰山麒麟平臺點擊“發(fā)布”按鈕,發(fā)布之后,可以通過“授權(quán)”功能,將這個功能提供給其他運維人員使用。

6、執(zhí)行運維功能
支持兩種執(zhí)行模式,可以在運維功能下面直接針對運維功能進行執(zhí)行,也可以通過運維編排功能,將運維功能編排成自動化的運維場景執(zhí)行。
單個運維功能執(zhí)行

運維編排功能執(zhí)行

7、查看執(zhí)行記錄
在泰山麒麟平臺中執(zhí)行后,支持查看運維功能執(zhí)行中的參數(shù)、過程、結(jié)果以及運行日志。

相關(guān)問題和方案


成果和收獲
截至目前,ChubaoFS已通過上述方式實現(xiàn)了43個運維功能原子,并設計了18個運維編排的自動化任務。每周平均執(zhí)行自動化任務的次數(shù)約為500次。
泰山-麒麟平臺
平臺簡介
麒麟平臺通過擴展 Kubernetes 的自定義資源定義(Custom Resource Definitions, CRD)功能,為運維工程師提供可編程的統(tǒng)一運維平臺。用戶專注于運維功能開發(fā),平臺處理通用屬性和集成工作。實現(xiàn)基礎設施即代碼(IaC)理念,并支持聲明式 API。
通過 CRD 擴展 Kubernetes API,引入自定義資源類型,滿足特定運維需求。工程師定義資源類型,編碼實現(xiàn)運維功能,平臺處理創(chuàng)建、更新、刪除等通用操作和資源集成。采用聲明式方式描述所需運維狀態(tài),無需關(guān)注底層實現(xiàn)細節(jié)。編寫資源定義文件,提交給麒麟平臺處理,自動完成操作,確保系統(tǒng)達到期望狀態(tài)。

麒麟平臺簡化了運維工程師的開發(fā)工作,提高了可維護性和可擴展性,實現(xiàn)了基礎設施即代碼的理念,平臺支持以下功能:
平臺現(xiàn)狀
截至目前,技術(shù)保障部內(nèi)的運維團隊已經(jīng)將相關(guān)產(chǎn)品,包括JMQ、JIMDB、LogBook、ChubaoFS、數(shù)據(jù)庫、對象存儲、圖片服務和應用運維接入了麒麟平臺。
作者:京東零售 井亮亮
來源:京東云開發(fā)者社區(qū) 轉(zhuǎn)載請注明來源
浙公網(wǎng)安備 33010602011771號