做微服務研發工程師的一年來的總結

2022-10-27 06:01:15

前述

18年的那個留校夏天,極其偶然接觸到了《Docker+Kubernetes》,由純運維的發展方向轉到了雲原生運維的發展方向。19年5月以《linux helmsman platform》獲得IT創新大賽二等獎,其實質是圍繞雲原生的邊側服務整合部署。20年5月以《基於Kubernetes的舵手叢集系統的設計與實現》獲得河南省優秀畢業論文,其實質是在《linux helmsman platform》的基礎上進行修補程式而成。20年6月初在創業型公司做唯一的雲原生運維,那是段足以影響一生的經歷:https://www.cnblogs.com/zisefeizhu/p/14601287.html 。
21年6月底極其偶然的機會(面的kubernetes運維崗,入職了微服務研發工程師崗)來到這家公司以微服務研發工程師的角色實質開啟純研發歷程,至今已一年有餘。在專案空閒期回憶這一年的路程,承上啟下。

一年來做的專案

這一年來重點圍繞以下專案展開:

1)、 獨立開發xxx專案的混合雲容器模組:運用go+gin+gorm+mysql+client-go+kubernetes技術棧,實現對kubernetes叢集的建立/匯入、節點的管理、名稱空間的管理、工作負載的管理、設定中心的管理、...、憑證的管理、映象倉庫的適配(harbor/acr/ccr/aws)、叢集的適配(tke/ack/aws/自建叢集)、等功能。總的來說此專案主要是api的對接,並不具備複雜的技術棧,在實際開發中最大的收穫是:1、根據需求實現業務的開發考量 2、對各廠商的欄位封裝 3、開發中遇到問題的實際處理(1、返回錯誤資訊 2、列表類介面的錯誤處理 3、資料庫欄位的設計 4、api介面的設計 5、適配層的轉換 6、面向錯誤的開發、等)。期間思考了下圖

  • ps:上圖只是個人對容器平臺的構想,實際專案中並沒有用此構思,所以談不上涉密問題。
 1 func Init(g *gin.Engine) {
 2     // 跨域
 3     g.Use(Cors())
 4     // 定義輸出紀錄檔格式
 5     g.Use(middleware.LoggerToFile())
 6     g.Any("/", v1.Hello)
 7     g.GET("/health", v1.Health)
 8     api := g.Group("/container/api")
 9     clusterRouters(api)
10     nodeRouters(api)
11     nsRouters(api)
12     workloadRouters(api)
13     podRouters(api)
14     pluginRouters(api)
15     registryRouters(api)
16     credentialRouters(api)
17     configRouters(api)
18     csiRouters(api)
19     g.GET("/swagger/*any", gs.WrapHandler(swaggerFiles.Handler))
20 }

 

2)、根據開發devops同事的需求,獨自設計與實現(運用helm+kubernetes技術棧)jenkins叢集+外掛的一鍵部署。總體來說此專案並不複雜,更多的是考驗helm的書寫與合理的利用kubernetes的特性。實際構思圖如下:

  1 # Default values for jenkins.
  2 # This is a YAML-formatted file.
  3 # Declare variables to be passed into your templates.
  4 # By zisefeizhu
  5 # Time 2021年 8月26日 星期四 10時45分56秒 CST
  6 
  7 # namespaceOverride jenkins部署到的名稱空間
  8 namespaceOverride: devops
  9 
 10 securityContext:
 11   enabled: true
 12   privileged: true
 13   runAsUser: 0
 14 # replicaCount 副本數
 15 replicaCount: 1
 16 
 17 # image 映象資訊
 18 image:
 19   repository: registry.cn-shenzhen.aliyuncs.com/zisefeizhu/annet
 20   pullPolicy: IfNotPresent
 21   # Overrides the image tag whose default is the chart appVersion.
 22   tag: "jenkinsci-blueocean-v0.1.1"
 23   baseImageTag: "jenkins-plugins-v0.1.4"
 24 
 25 # dockerRegistry Concentrated verification of consciousness
 26 dockerRegistry:
 27   enabled: true
 28   secretName: jenkins
 29   user: xxxx
 30   password: xxxxxx
 31 
 32 
 33 # containerPorts jenkins pod 埠
 34 containers:
 35   ports:
 36   - containerPort: 8080
 37     name: web
 38     protocol: TCP
 39   - containerPort: 50000
 40     name: agent
 41     protocol: TCP
 42 
 43 nameOverride: ""
 44 fullnameOverride: ""
 45 
 46 serviceAccount:
 47   # Specifies whether a service account should be created
 48   create: true
 49   # Annotations to add to the service account
 50   annotations: {}
 51   # The name of the service account to use.
 52   # If not set and create is true, a name is generated using the fullname template
 53   name: ""
 54 
 55 # service 型別和埠資訊
 56 service:
 57   ports:
 58   - name: web
 59     port: 8080
 60     targetPort: web
 61     nodePort: 31031
 62   - name: agent
 63     port: 50000
 64     targetPort: agent
 65   type: NodePort
 66 #  port: 31031   #埠
 67 
 68 # pvc的access型別
 69 pvc:
 70   enabled: true
 71   scName: xxxx
 72   accessModes: ReadWriteMany
 73   storage: xxx
 74 
 75 ingress:
 76   enabled: false
 77   className: ""
 78   annotations: {}
 79     # kubernetes.io/ingress.class: nginx
 80     # kubernetes.io/tls-acme: "true"
 81   hosts:
 82     - host: chart-example.local
 83       paths:
 84         - path: /
 85           pathType: ImplementationSpecific
 86   tls: []
 87   #  - secretName: chart-example-tls
 88   #    hosts:
 89   #      - chart-example.local
 90 
 91 # resources limit range obtained from pressure measurement
 92 resources:
 93   enabled: falase
 94   limits:
 95     cpu: 1
 96     memory: 1Gi
 97   requests:
 98     cpu: 200m
 99     memory: 512Mi
100 
101 # startupProbe 存活性探針
102 startupProbe:
103   enabled: false
104   probe:
105     failureThreshold: 3
106     httpGet:
107       path: /login
108       port: 8080
109       scheme: HTTP
110     initialDelaySeconds: 30
111     periodSeconds: 10
112     successThreshold: 1
113     timeoutSeconds: 1
114 
115 # livenessProbe 存活性探針
116 livenessProbe:
117   enabled: false
118   probe:
119     failureThreshold: 3
120     httpGet:
121       path: /login
122       port: 8080
123       scheme: HTTP
124     initialDelaySeconds: 30
125     periodSeconds: 10
126     successThreshold: 1
127     timeoutSeconds: 5
128 
129 # readinessProbe 就緒性探針
130 readinessProbe:
131   enabled: false
132   probe:
133     failureThreshold: 3
134     httpGet:
135       path: /login
136       port: 8080
137       scheme: HTTP
138     initialDelaySeconds: 30
139     periodSeconds: 10
140     successThreshold: 1
141     timeoutSeconds: 5
142 
143 autoscaling:
144   enabled: true
145   minReplicas: 1
146   maxReplicas: 10
147   targetCPUUtilizationPercentage: 80
148   targetMemoryUtilizationPercentage: 80

 

3)、根據架構師構思(16年工作經驗),獨自驗證/輸出檔案,運用:logstash+ceph+operator技術棧。實現es叢集之間的全量/增量/全量+增量同步遷移、持久化佇列/死信等功能。此專案具有一定複雜度。在實際開發中需要1、對logstash有一定程度的運用(需要對涉及到的功能點進行一一驗證實踐)、2、對operator有一定的掌握(特別是對spec和status的深度理解)。3、對k8s有較深度的掌握,理解涉及到的核心資源的運用。

  • 架構圖及原始碼涉密。
  1 # Default values for jenkins.
  2 # This is a YAML-formatted file.
  3 # Declare variables to be passed into your templates.
  4 # By zisefeizhu
  5 # Time 2021年 8月26日 星期四 10時45分56秒 CST
  6 
  7 # namespaceOverride jenkins部署到的名稱空間
  8 namespaceOverride: devops
  9 
 10 securityContext:
 11   enabled: true
 12   privileged: true
 13   runAsUser: 0
 14 # replicaCount 副本數
 15 replicaCount: 1
 16 
 17 # image 映象資訊
 18 image:
 19   repository: registry.cn-shenzhen.aliyuncs.com/zisefeizhu/annet
 20   pullPolicy: IfNotPresent
 21   # Overrides the image tag whose default is the chart appVersion.
 22   tag: "jenkinsci-blueocean-v0.1.1"
 23   baseImageTag: "jenkins-plugins-v0.1.4"
 24 
 25 # dockerRegistry Concentrated verification of consciousness
 26 dockerRegistry:
 27   enabled: true
 28   secretName: jenkins
 29   user: xxxx
 30   password: xxxxxx
 31 
 32 
 33 # containerPorts jenkins pod 埠
 34 containers:
 35   ports:
 36   - containerPort: 8080
 37     name: web
 38     protocol: TCP
 39   - containerPort: 50000
 40     name: agent
 41     protocol: TCP
 42 
 43 nameOverride: ""
 44 fullnameOverride: ""
 45 
 46 serviceAccount:
 47   # Specifies whether a service account should be created
 48   create: true
 49   # Annotations to add to the service account
 50   annotations: {}
 51   # The name of the service account to use.
 52   # If not set and create is true, a name is generated using the fullname template
 53   name: ""
 54 
 55 # service 型別和埠資訊
 56 service:
 57   ports:
 58   - name: web
 59     port: 8080
 60     targetPort: web
 61     nodePort: 31031
 62   - name: agent
 63     port: 50000
 64     targetPort: agent
 65   type: NodePort
 66 #  port: 31031   #埠
 67 
 68 # pvc的access型別
 69 pvc:
 70   enabled: true
 71   scName: xxxx
 72   accessModes: ReadWriteMany
 73   storage: xxx
 74 
 75 ingress:
 76   enabled: false
 77   className: ""
 78   annotations: {}
 79     # kubernetes.io/ingress.class: nginx
 80     # kubernetes.io/tls-acme: "true"
 81   hosts:
 82     - host: chart-example.local
 83       paths:
 84         - path: /
 85           pathType: ImplementationSpecific
 86   tls: []
 87   #  - secretName: chart-example-tls
 88   #    hosts:
 89   #      - chart-example.local
 90 
 91 # resources limit range obtained from pressure measurement
 92 resources:
 93   enabled: falase
 94   limits:
 95     cpu: 1
 96     memory: 1Gi
 97   requests:
 98     cpu: 200m
 99     memory: 512Mi
100 
101 # startupProbe 存活性探針
102 startupProbe:
103   enabled: false
104   probe:
105     failureThreshold: 3
106     httpGet:
107       path: /login
108       port: 8080
109       scheme: HTTP
110     initialDelaySeconds: 30
111     periodSeconds: 10
112     successThreshold: 1
113     timeoutSeconds: 1
114 
115 # livenessProbe 存活性探針
116 livenessProbe:
117   enabled: false
118   probe:
119     failureThreshold: 3
120     httpGet:
121       path: /login
122       port: 8080
123       scheme: HTTP
124     initialDelaySeconds: 30
125     periodSeconds: 10
126     successThreshold: 1
127     timeoutSeconds: 5
128 
129 # readinessProbe 就緒性探針
130 readinessProbe:
131   enabled: false
132   probe:
133     failureThreshold: 3
134     httpGet:
135       path: /login
136       port: 8080
137       scheme: HTTP
138     initialDelaySeconds: 30
139     periodSeconds: 10
140     successThreshold: 1
141     timeoutSeconds: 5
142 
143 autoscaling:
144   enabled: true
145   minReplicas: 1
146   maxReplicas: 10
147   targetCPUUtilizationPercentage: 80
148   targetMemoryUtilizationPercentage: 80

  

4)、近期為了加深operator的理解,寫了workload-operator,實現對deployments/statefulsets/daemonsets/cronjobs/jobs/services 功能的封裝。本專案為個人專案,難點在對控制器的理解與status的處理。

operator 的書寫邏輯 圍繞以下四點即可:

觀察:通過監控Kubernetes資源物件變化的事件來獲取當前物件狀態,只需要注入EventHandler讓client-go 將變化的事件物件資訊放入WorkQueue中

分析:確定當前狀態和期望狀態的不同,由Worker完成.

執行:執行能夠驅動物件當前狀態變化的操作,由Worker完成.

更新:更新物件的當前狀態,由Worker完成.

5)、最近在看同事的xxx專案的devops模組,有所感悟:1、開發對需求的實現能力外,其實也應該對要實現的功能有一定的理解。2、對於中介軟體的掌握(比如Jenkins 的pipeline的書寫)。

6)、這一年還幫助同事處理運維問題,幫助同學處理運維問題,也接過外快處理運維相關的問題,也基本每週都抽時間看看雲原生相關的知識。偏向開發是必然要的,運維也是規劃的重點,需要有意多接觸。

綜上,其實在過去的一年開發嚴格意義還是圍繞雲原生在進行,也符合對職業生涯的規劃:運維 --> 雲原生運維 --> 容器開發(運維開發) --> sre(偏向開發的運維崗) -->

一年來的收穫

這一年來收穫很多,依如20年的雲原生運維工作一樣,對職業產生深遠影響:

1、查詢資料由csdn/部落格園 --> github/官網

2、研發能力由面向百度 --> 面向google/pkg

3、由遇到問題就請教同事 --> 和同事探討/自我處理

4、由在一家初創企業 --> 一家還算適中的公司

展望下一年

在接下來的一年,重點實現以下幾點:

1、鞏固已掌握的

2、具備獨立解決問題的能力

3、不斷降低bug率 ,做到需求即理解、理解即實現、實現即交付。

4、對服務治理、微服務、資料庫中介軟體、serverless 、演演算法 展開攻關

5、跳槽 ,再入江湖,出道下山、世界這麼大

特別感謝

依如20年的貴人,阿里雲MVP 如今入職位元組的石老大一樣,在過去的一年,遇到了我飛飛哥哥,不斷騷擾與學習他的長處,嘿嘿嘿。

未來一年,依然堅信,懂雲原生的go開發 是屬於當下及未來一個時期的所需。

凡是過往、皆為序章。

過手如登山,一步一重天