跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 最简单的 K8S 部署文件编写姿势,没有之一!
未分類
13 12 月 2020

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

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

資深大佬 : kevinwan 6

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

大佬有話說 (21)

  • 資深大佬 : dany813

    标题霸气啊

  • 資深大佬 : vhus

    学习了,mark 一下。

  • 主 資深大佬 : kevinwan

    @dany813 还有没有更简单的了呢?哈哈

  • 資深大佬 : Yano

    这个文章,我在掘金、博客园、v2ex 至少看到 5 遍了,囧

  • 資深大佬 : lonelygo

    @Yano 那么问题来了:有没有背下来咩 (手动狗头

  • 資深大佬 : XiLingHost

    感觉还不如直接用 helm 上一堆写好的 chart

  • 主 資深大佬 : kevinwan

    @Yano 那是你看的站点太多了,哈哈

  • 主 資深大佬 : kevinwan

    @XiLingHost redis:6-alpine 只是个举例哈,你自己写的服务写 chart 是不是就复杂点了?

  • 資深大佬 : w292614191

    简单不是字少代码多。
    而是字多代码多。

    csdn 的感觉。

  • 資深大佬 : loveyu

    现实情况是,要是生产环境的配置都像文中这么简单就好了。目前一个 yaml 接近 200 行,还有不断增加的趋势

  • 資深大佬 : prondtoo

    @loveyu 我一个 helm 的配置文件接近 2000 行。

  • 資深大佬 : julyclyde

    @Yano 掘金不是都前端吗?

  • 主 資深大佬 : kevinwan

    @julyclyde 掘金也有后端的,周末北京有个掘金的微服务专场,我本来要去讲的,可惜跟另一个分享冲突了

  • 資深大佬 : joesonw

    grafana tanka

  • 主 資深大佬 : kevinwan

    @joesonw 这两个咋了?

  • 資深大佬 : kingxt

    看起来挺屌样子,去试试

  • 資深大佬 : dayeye2006199

    你这个可以做成 kubectl 的 plugin,可能有更多的受众

  • 主 資深大佬 : kevinwan

    @dayeye2006199 好主意

  • 資深大佬 : datafeng

    违反广告法了。。。

  • 主 資深大佬 : kevinwan

    @datafeng 用了最字?

  • 資深大佬 : eudore

    不应该 helm 吗,直接 helm 生成或一键上服务,命令行和 helm 差不多的。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具