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


    前述

    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开发 是属于当下及未来一个时期的所需。

    凡是过往、皆为序章。

    过手如登山,一步一重天
  • 相关阅读:
    VMware虚拟机安装运行MacOS系统
    第1关:Hadoop集群的部署,安装和管理
    CTFHUB web-hate_php
    VSCode好用插件
    基于Springboot+redis+Springsecruity的网上商城 改改就可以做毕业设计
    释放固态继电器的力量:主要优势和应用
    PMP 证书
    Maven
    ScanNet数据集和YFCC100m数据集下载
    基于transformer的心脑血管心脏病疾病预测
  • 原文地址:https://www.cnblogs.com/123456zhang/p/16830032.html