做微服务研发工程师的一年来的总结 - 压力山大-减肥30斤
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.
做微服务研发工程师的一年来的总结
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开发 是属于当下及未来一个时期的所需。
凡是过往、皆为序章。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK