V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
如果想在 V2EX 获得更好的推广效果,欢迎了解 PRO 会员机制:
https://www.v2ex.com/pro/about
kevinwan
V2EX  ›  推广

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

  •  5
     
  •   kevinwan · Dec 14, 2020 · 5806 views
    This topic created in 1974 days ago, the information mentioned may be changed or developed.

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

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