7

做微服务研发工程师的一年来的总结 - 压力山大-减肥30斤

 1 year ago
source link: https://www.cnblogs.com/123456zhang/p/16830032.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

做微服务研发工程师的一年来的总结

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、面向错误的开发、等)。期间思考了下图

1464583-20220706164438043-774329557.png
  • 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的特性。实际构思图如下:

1464583-20220706170545935-763688939.png
  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有较深度的掌握,理解涉及到的核心资源的运用。

1464583-20220706164544366-707610164.png
  • 架构图及源码涉密。
  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开发 是属于当下及未来一个时期的所需。

凡是过往、皆为序章。

过手如登山,一步一重天

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK