V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kevinwan
V2EX  ›  推广

最简单的 K8S 部署文件编写姿势,没有之一!

  •  5
     
  •   kevinwan · 2020-12-14 09:00:29 +08:00 · 4990 次点击
    这是一个创建于 1441 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1. 头疼编写 K8S 部署文件?

    • K8S yaml 参数很多,需要边写边查?
    • 保留回滚版本数怎么设?
    • 如何探测启动成功,如何探活?
    • 如何分配和限制资源?
    • 如何设置时区?否则打印日志是 GMT 标准时间
    • 如何暴露服务供其它服务调用?
    • 如何根据 CPU 和内存使用率来配置水平伸缩?

    首先,你需要知道有这些知识点,其次要把这些知识点都搞明白也不容易,再次,每次编写依然容易出错!

    2. 创建服务镜像

    前一篇文章 讲解了如何快速创建自己的服务镜像,不过为了演示,这篇文章我们以 redis:6-alpine 镜像为例。

    3. 完整 K8S 部署文件编写过程

    • 首先安装 goctl 工具

      GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/go-zero/tools/goctl

    • 一键生成 K8S 部署文件

      goctl kube deploy -name redis -namespace adhoc -image redis:6-alpine -o redis.yaml -port 6379

      生成的 yaml 文件如下:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: redis
        namespace: adhoc
        labels:
          app: redis
      spec:
        replicas: 3
        revisionHistoryLimit: 5
        selector:
          matchLabels:
            app: redis
        template:
          metadata:
            labels:
              app: redis
          spec:
            containers:
            - name: redis
              image: redis:6-alpine
              lifecycle:
                preStop:
                  exec:
                    command: ["sh","-c","sleep 5"]
              ports:
              - containerPort: 6379
              readinessProbe:
                tcpSocket:
                  port: 6379
                initialDelaySeconds: 5
                periodSeconds: 10
              livenessProbe:
                tcpSocket:
                  port: 6379
                initialDelaySeconds: 15
                periodSeconds: 20
              resources:
                requests:
                  cpu: 500m
                  memory: 512Mi
                limits:
                  cpu: 1000m
                  memory: 1024Mi
              volumeMounts:
              - name: timezone
                mountPath: /etc/localtime
            volumes:
              - name: timezone
                hostPath:
                  path: /usr/share/zoneinfo/Asia/Shanghai
      
      ---
      
      apiVersion: v1
      kind: Service
      metadata:
        name: redis-svc
        namespace: adhoc
      spec:
        ports:
          - port: 6379
        selector:
          app: redis
      
      ---
      
      apiVersion: autoscaling/v2beta1
      kind: HorizontalPodAutoscaler
      metadata:
        name: redis-hpa-c
        namespace: adhoc
        labels:
          app: redis-hpa-c
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: redis
        minReplicas: 3
        maxReplicas: 10
        metrics:
        - type: Resource
          resource:
            name: cpu
            targetAverageUtilization: 80
      
      ---
      
      apiVersion: autoscaling/v2beta1
      kind: HorizontalPodAutoscaler
      metadata:
        name: redis-hpa-m
        namespace: adhoc
        labels:
          app: redis-hpa-m
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: redis
        minReplicas: 3
        maxReplicas: 10
        metrics:
        - type: Resource
          resource:
            name: memory
            targetAverageUtilization: 80
      
    • 部署服务,如果 adhoc namespace 不存在的话,请先通过 kubectl create namespace adhoc 创建

      $ kubectl apply -f redis.yaml
      deployment.apps/redis created
      service/redis-svc created
      horizontalpodautoscaler.autoscaling/redis-hpa-c created
      horizontalpodautoscaler.autoscaling/redis-hpa-m created
      
    • 查看服务允许状态

      $ kubectl get all -n adhoc
      NAME                         READY   STATUS    RESTARTS   AGE
      pod/redis-585bc66876-5ph26   1/1     Running   0          6m5s
      pod/redis-585bc66876-bfqxz   1/1     Running   0          6m5s
      pod/redis-585bc66876-vvfc9   1/1     Running   0          6m5s
      
      NAME                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
      service/redis-svc   ClusterIP   172.24.15.8   <none>        6379/TCP   6m5s
      
      NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
      deployment.apps/redis   3/3     3            3           6m6s
      
      NAME                               DESIRED   CURRENT   READY   AGE
      replicaset.apps/redis-585bc66876   3         3         3       6m6s
      
      NAME                                              REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
      horizontalpodautoscaler.autoscaling/redis-hpa-c   Deployment/redis   0%/80%    3         10        3          6m6s
      horizontalpodautoscaler.autoscaling/redis-hpa-m   Deployment/redis   0%/80%    3         10        3          6m6s
      
    • 测试服务

      $ kubectl run -i --tty --rm cli --image=redis:6-alpine -n adhoc -- sh
      /data # redis-cli -h redis-svc
      redis-svc:6379> set go-zero great
      OK
      redis-svc:6379> get go-zero
      "great"
      

    4. 总结

    goctl 工具极大简化了 K8S yaml 文件的编写,提供了开箱即用的最佳实践,并且支持了模板自定义。

    如果觉得文章有帮助,欢迎 star 🤝

    5. 项目地址

    https://github.com/tal-tech/go-zero

    24 条回复    2020-12-17 20:49:57 +08:00
    dany813
        1
    dany813  
       2020-12-14 09:13:47 +08:00   ❤️ 1
    标题霸气啊
    vhus
        2
    vhus  
       2020-12-14 09:15:49 +08:00 via Android
    学习了,mark 一下。
    kevinwan
        3
    kevinwan  
    OP
       2020-12-14 09:20:02 +08:00
    @dany813 还有没有更简单的了呢?哈哈
    Yano
        4
    Yano  
       2020-12-14 10:04:49 +08:00
    这个文章,我在掘金、博客园、v2ex 至少看到 5 遍了,囧
    lonelygo
        5
    lonelygo  
       2020-12-14 10:07:32 +08:00
    @Yano 那么问题来了:有没有背下来咩 (手动狗头🐶)
    XiLingHost
        6
    XiLingHost  
       2020-12-14 10:09:36 +08:00
    感觉还不如直接用 helm 上一堆写好的 chart
    kevinwan
        7
    kevinwan  
    OP
       2020-12-14 10:30:47 +08:00
    @Yano 那是你看的站点太多了,哈哈
    kevinwan
        8
    kevinwan  
    OP
       2020-12-14 10:32:10 +08:00
    @XiLingHost redis:6-alpine 只是个举例哈,你自己写的服务写 chart 是不是就复杂点了?
    w292614191
        9
    w292614191  
       2020-12-14 10:37:49 +08:00
    简单不是字少代码多。
    而是字多代码多。

    csdn 的感觉。
    loveyu
        10
    loveyu  
       2020-12-14 10:41:33 +08:00
    现实情况是,要是生产环境的配置都像文中这么简单就好了。目前一个 yaml 接近 200 行,还有不断增加的趋势
    prondtoo
        11
    prondtoo  
       2020-12-14 10:46:56 +08:00
    @loveyu 我一个 helm 的配置文件接近 2000 行。
    julyclyde
        12
    julyclyde  
       2020-12-14 10:57:18 +08:00
    @Yano 掘金不是都前端吗?
    kevinwan
        13
    kevinwan  
    OP
       2020-12-14 12:10:03 +08:00 via iPhone
    @julyclyde 掘金也有后端的,周末北京有个掘金的微服务专场,我本来要去讲的,可惜跟另一个分享冲突了
    joesonw
        14
    joesonw  
       2020-12-14 14:01:37 +08:00
    grafana tanka
    kevinwan
        15
    kevinwan  
    OP
       2020-12-14 14:38:35 +08:00
    @joesonw 这两个咋了?
    kingxt
        16
    kingxt  
       2020-12-14 20:05:38 +08:00
    看起来挺屌样子,去试试
    dayeye2006199
        17
    dayeye2006199  
       2020-12-15 01:16:29 +08:00 via Android
    你这个可以做成 kubectl 的 plugin,可能有更多的受众
    kevinwan
        18
    kevinwan  
    OP
       2020-12-15 05:48:45 +08:00 via iPhone
    @dayeye2006199 好主意👍
    datafeng
        19
    datafeng  
       2020-12-15 09:27:31 +08:00
    违反广告法了。。。
    kevinwan
        20
    kevinwan  
    OP
       2020-12-15 09:58:42 +08:00 via iPhone
    @datafeng 用了最字?😝
    eudore
        21
    eudore  
       2020-12-16 09:20:12 +08:00
    不应该 helm 吗,直接 helm 生成或一键上服务,命令行和 helm 差不多的。
    hantsy
        22
    hantsy  
       2020-12-16 16:34:25 +08:00
    现在不是都是用 Operater,我不大懂。感觉 DevOps 都是走 MarketPlace 路线,和 Github Actions 类似,很多东西通过市场发布复用。
    dreamusername
        23
    dreamusername  
       2020-12-17 20:31:36 +08:00
    伪需求,如果需要生成,必然要了解各种配置的定义,这样前方有 kustomize 与 helm 在等着你,再然后就看到了 argocd,然后发现 kubectl 都可以不用。
    kevinwan
        24
    kevinwan  
    OP
       2020-12-17 20:49:57 +08:00 via iPhone
    @dreamusername 不同公司,不同场景有不同用法嘛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3174 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 00:46 · PVG 08:46 · LAX 16:46 · JFK 19:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.