最简单的 K8S 部署文件编写姿势,没有之一! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kevinwan
V2EX    推广

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

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

    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 那么问题来了:有没有背下来咩 (手动狗头)
    KagurazakaNyaa
        6
    KagurazakaNyaa  
       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     Solana     993 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 19:19 PVG 03:19 LAX 11:19 JFK 14:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86