前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >几个你或许并不知道 kubernetes 技巧

几个你或许并不知道 kubernetes 技巧

作者头像
crossoverJie
发布2024-06-04 15:43:45
560
发布2024-06-04 15:43:45
举报
文章被收录于专栏:crossoverJiecrossoverJie
原文链接: https://overcast.blog/13-kubernetes-tricks-you-didnt-know-647de6364472

使用 PreStop 优雅关闭 Pod

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: graceful-shutdown-example
spec:
  containers:
  - name: sample-container
    image: nginx
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "sleep 30 && nginx -s quit"]

PreStop 允许 Pod 在终止前执行一个命令或者是脚本,使用它就可以在应用退出前释放一些资源,确保应用可以优雅退出。

比如可以在 Nginx 的 Pod 退出前将当前的请求执行完毕。

使用临时容器调试 Pod

临时容器可以不修改一个运行的容器的前提下调试容器,可以很方便的调试一些生产环境的 bug,可以避免重启应用。

代码语言:javascript
复制
kubectl alpha debug -it podname --image=busybox --target=containername

生产环境谨慎使用,只有在当前环境下无法排查问题的时候才使用。

基于自定义的 Metrics 自动扩容Pod

kubernetes 是提供了 HPA 机制可以跟进 CPU 内存等标准数据进行自动扩缩容,但有时我们需要根据自定义的数据进行扩缩容。

比如某个接口的延迟、队列大小等。

代码语言:javascript
复制
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: custom-metric-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: your-application
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: your_custom_metric
      target:
        type: AverageValue
        averageValue: 10

用 Init Containers 配置启动脚本

初始化容器可以在应用容器启动前运行,我们可以使用它来初始化应用需要的配置、等待依赖的服务启动完成等工作:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: myapp-container
    image: myapp
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']

比如这个初始化容器会等待 myservice 可用后才会启动应用。

需要注意的是如果初始化容器会阻塞应用启动,所以要避免在初始化容器里执行耗时操作。

Node 亲和性调度

当我们需要将某些应用部署到硬件配置较高的节点时(比如需要 SSD 硬盘),就可以使用节点亲和性来部署应用:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  containers:
  - name: with-node-affinity
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd

这个 Pod 会被部署到有这个 disktype=ssd 标签的 节点上。

动态配置:ConfigMap 和 Secrets

ConfigMap 和 Secrets可以动态注入到 Pod 中,避免对这些配置硬编码。

ConfigMap 适合非敏感的数据,Secrets 适合敏感的数据。

代码语言:javascript
复制
# ConfigMap Example
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  config.json: |
    {
      "key": "value",
      "databaseURL": "http://mydatabase.example.com"
    }

# Pod Spec using ConfigMap
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
    - name: myapp-container
      image: myapp
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: app-config

这样在应用中就可以通过这路径 /etc/config/config.json 读取数据了。

当然也可以把这些数据写入到环境变量中。

以上这些个人技巧用的最多的是:

1. 临时容器调试 Pod,特别是业务容器缺少一些命令时。

2. Init Container 等待依赖的服务启动完成。

3. Node 亲和性调度。

4. ConfigMap 是基础操作了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 crossoverJie 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用 PreStop 优雅关闭 Pod
  • 使用临时容器调试 Pod
  • 基于自定义的 Metrics 自动扩容Pod
  • 用 Init Containers 配置启动脚本
  • Node 亲和性调度
  • 动态配置:ConfigMap 和 Secrets
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档