开发和运维对K8S中的应用都做了什么?

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
日志服务 SLS,月写入数据量 50GB 1个月
简介: 开发和运维对K8S中的应用都做了什么?

在应用的整个生命周期里,开发和运维都和它密不可分。一个塑造它,一个保养它。

如果应用需要部署到K8S中,开发和运维在其中都做了什么呢?


开发侧


从开发侧来说,我们的应用应该具备以下能力:


  • 具有健康检测接口
  • 具有优雅退出能力
  • 具有metrics接口
  • 能够接入链路追踪系统
  • 日志输出标准统一


定义健康检测接口


健康检测接口用于检测应用的健康状态,在K8S中,使用Readiness和Liveness分别来探测应用是否就绪和是否存活,如果未就绪或者未存活,K8S会采取相应的措施来确保应用可用。


如果我们应用未定义好相应的健康检测接口,K8S就无法判断应用是否正常可用,整个应用对我们来说就是黑匣子,也就谈不上应用稳定性了。


定义一个简单的健康检测接口如下:


package router
import (
 "github.com/gin-gonic/gin"
 v1 "go-hello-world/app/http/controllers/v1"
)
func SetupRouter(router *gin.Engine) {
 ruc := new(v1.RootController)
 router.GET("/", ruc.Root)
 huc := new(v1.HealthController)
 router.GET("/health", huc.HealthCheck)
}


package v1
import (
 "github.com/gin-gonic/gin"
 "go-hello-world/app/http/controllers"
 "go-hello-world/pkg/response"
 "net/http"
)
type HealthController struct {
 controllers.BaseController
}
func (h *HealthController) HealthCheck(c *gin.Context) {
 response.WriteResponse(c, http.StatusOK, nil, gin.H{
  "result": "健康检测页面",
  "status": "OK",
 })
}


如上我们定义了health接口,当应用启动后,只需要探测这个接口,如果返回OK,表示应用是正常的。


当然,上面的接口是非常简单的,在实际情况下,应用本身也许还依赖起来应用,比如redis,mysql,mq等,如果它们异常,应用是不是异常的呢?那我们的应用健康检测需不需要检测其他应用的健康状态呢?


既然我们定义好了健康检测接口,那我们的YAML模板就可以增加健康检测功能,如下:


readinessProbe:
  httpGet:
    path: /health
    port: http
  timeoutSeconds: 3
  initialDelaySeconds: 20
livenessProbe:
  httpGet:
    path: /health
    port: http
  timeoutSeconds: 3
  initialDelaySeconds: 30


定义优雅下线功能


应用发版是常规不能再常规的操作,通常情况下都是滚动更新的方式上线,也就是先起一个新应用,再删一个老应用。


如果这时候老应用有部分的流量,突然把老应用的进程杀了,这部分流量就无法得到正确的处理,部分用户也会因此受到影响。


怎么才会不受影响呢?


假如我们在停止应用之前先告诉网关或者注册中心,等对方把我们应用摘除后再下线,这样就不会有任何流量受到影响了。


在K8S中,当我们要删除Pod的时候,Pod会变成Terminating状态,kubelet看到Pod的状态如果为Terminating,就会开始执行关闭Pod的流程,给Pod发SIGTERM信号,如果达到宽限期Pod还未结束就给Pod发SIGKILL信号,从Endpoints中摘除Pod等。


从上面可知,Pod在停止之前会收到SIG信号,如果应用本身没有处理这些信号的能力,那应用如果知道什么时候该结束呢?


下面简单定义一个处理SIG信号的功能。


package shutdown
import (
 "context"
 "fmt"
 "net/http"
 "os"
 "os/signal"
 "time"
)
// 优雅退出
type Shutdown struct {
 ch      chan os.Signal
 timeout time.Duration
}
func New(t time.Duration) *Shutdown {
 return &Shutdown{
  ch:      make(chan os.Signal),
  timeout: t,
 }
}
func (s *Shutdown) Add(signals ...os.Signal) {
 signal.Notify(s.ch, signals...)
}
func (s *Shutdown) Start(server *http.Server) {
 <-s.ch
 fmt.Println("start exist......")
 ctx, cannel := context.WithTimeout(context.Background(), s.timeout*time.Second)
 defer cannel()
 if err := server.Shutdown(ctx); err != nil {
  fmt.Println("Graceful exit failed. err: ", err)
 }
 fmt.Println("Graceful exit success.")
}


package main
import (
 "github.com/gin-gonic/gin"
 "go-hello-world/pkg/shutdown"
 "go-hello-world/router"
 "log"
 "net/http"
 "syscall"
 "time"
)
func main() {
 r := gin.New()
 // 注册路由
 router.SetupRouter(r)
 server := &http.Server{
  Addr:    ":8080",
  Handler: r,
 }
 // 运行服务
 go func() {
  err := server.ListenAndServe()
  if err != nil && err != http.ErrServerClosed {
   log.Fatalf("server.ListenAndServe err: %v", err)
  }
 }()
 // 优雅退出
 quit := shutdown.New(10)
 quit.Add(syscall.SIGINT, syscall.SIGTERM)
 quit.Start(server)
}


当接收到SIG信号的时候,就会调用Shutdown方法做应用退出处理。

除此,还要结合K8S的PreStop Hook来定义结束前的钩子,如下:


lifecycle:
  preStop:
    exec:
      command:
        - /bin/sh
        - '-c'
        - sleep 30


如果使用注册中心,比如nacos,我们可以在PreStop Hook中先告诉nacos要下线,如下:


lifecycle:
  preStop:
    exec:
      command:
        - /bin/sh
        - -c
        - "curl -X DELETE your_nacos_ip:8848/nacos/v1/ns/instance?serviceName=nacos.test.1&ip=${POD_IP}&port=8880&clusterName=DEFAULT" && sleep 30


定义Metrics接口


Metrics主要用来暴露应用指标,可以根据实际情况自定义指标,以便于监控工具Prometheus进行数据收集展示。


有些语言有现成的exporter,比如java的jmx_exporter,没有的就需要自己在应用中集成。


比如:


package main
import (
 "github.com/SkyAPM/go2sky"
 v3 "github.com/SkyAPM/go2sky-plugins/gin/v3"
 "github.com/SkyAPM/go2sky/reporter"
 "github.com/gin-gonic/gin"
 "github.com/prometheus/client_golang/prometheus/promhttp"
 "go-hello-world/pkg/shutdown"
 "go-hello-world/router"
 "log"
 "net/http"
 "syscall"
 "time"
)
var SKYWALKING_ENABLED = false
func main() {
 r := gin.New()
 // 注册路由
 router.SetupRouter(r)
 server := &http.Server{
  Addr:    ":8080",
  Handler: r,
 }
 // 启动metrics服务
 go func() {
  http.Handle("/metrics", promhttp.Handler())
  if err := http.ListenAndServe(":9527", nil); err != nil {
   log.Printf("metrics port listen failed. err: %s", err)
  }
 }()
 // 运行服务
 go func() {
  err := server.ListenAndServe()
  if err != nil && err != http.ErrServerClosed {
   log.Fatalf("server.ListenAndServe err: %v", err)
  }
 }()
 // 优雅退出
 quit := shutdown.New(10)
 quit.Add(syscall.SIGINT, syscall.SIGTERM)
 quit.Start(server)
}


这种会暴露默认的Http指标,可以通过curl 127.0.0.1:9527/metrics获取指标。


......
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 0
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0


如果需要自定义指标的话,只需按规则定义即可,如下:


package metrics
import (
 "github.com/prometheus/client_golang/prometheus"
 "net/http"
 "time"
)
var (
 // HttpserverRequestTotal 表示接收http请求总数
 HttpserverRequestTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
  Name: "httpserver_request_total",
  Help: "The Total number of httpserver requests",
 },
  // 设置标签:请求方法和路径
  []string{"method", "endpoint"})
 HttpserverRequestDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
  Name:    "httpserver_request_duration_seconds",
  Help:    "httpserver request duration distribution",
  Buckets: []float64{0.1, 0.3, 0.5, 0.7, 0.9, 1},
 },
  []string{"method", "endpoint"})
)
// 注册监控指标
func init() {
 prometheus.MustRegister(HttpserverRequestTotal)
 prometheus.MustRegister(HttpserverRequestDuration)
}
func NewMetrics(router http.HandlerFunc) http.HandlerFunc {
 return func(w http.ResponseWriter, r *http.Request) {
  start := time.Now()
  router(w, r)
  duration := time.Since(start)
  // httpserverRequestTotal 记录
  HttpserverRequestTotal.With(prometheus.Labels{"method": r.Method, "endpoint": r.URL.Path}).Inc()
  // httpserverRequestDuration 记录
  HttpserverRequestDuration.With(prometheus.Labels{"method": r.Method, "endpoint": r.URL.Path}).Observe(duration.Seconds())
 }
}


这样就定义了httpserver_request_totalhttpserver_request_duration_seconds指标,引用过后就能在/metrics中看到对应的数据。


定义好了指标,下面就是收集了。既可以通过自定义收集规则收集,也可以通过自动发现的方式收集,为了方便,主要采用自动发现的方式。


我们只需要在deployment的templates中定义好annotation,prometheeus就会自动添加采集目标,如下:


apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: httpserver
  name: httpserver
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: httpserver
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "metrics"
      labels:
        app: httpserver
    spec:
      containers:
          image: baidjay/httpserver:ubuntu-v3-metrics
          imagePullPolicy: IfNotPresent
          lifecycle:
            preStop:
              exec:
                command:
                  - /bin/sh
                  - -c
                  - sleep 15
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: http
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 3
          name: httpserver
          ports:
            - containerPort: 8080
              name: http
              protocol: TCP
            - name: metrics
              protocol: TCP
              containerPort: 9527
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: http
              scheme: HTTP
            initialDelaySeconds: 20
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 3


定义Trace功能


Trace用于跟踪,每个请求都会生成一个TraceID,这个ID会伴随请求的整个生命周期,我们也可以根据这个ID查询请求的整个链路情况。


链路追踪,目前市面上有很多开源系统,比如Skywalking,Jeager,Zipkin等,它们各有各的特点,如下。



Pinpoint Zipkin Jaeger Skywalking
OpenTracing兼容
客户端支持语言 java\php java\go\php等 java\go\php等 java\nodejs\php等
存储 hbase es\mysql\内存等 es\kafka\内存等 es\mysql\h2等
传输协议支持 thrift http\mq udp\http grpc
UI丰富程度
实现方式 字节码注入 拦截请求 拦截请求 字节码注入
扩展性
Trace查询 不支持 支持 支持 支持
告警支持 支持 不支持 不支持 支持
JVM监控 支持 不支持 不支持 支持
性能损失


我比较推荐使用Jaeger,它是CNCF的毕业项目,成长空间和云原生的系统架构兼容性比较好。


不过,我这里采用的Skywalking。


Skywalking有许多现成的客户端,比如Java、Python等,可以直接使用,它们都会自动埋点,但是对于Go来说就只有自己手动埋点了,需要我们自己去写代码。


比如:


package main
import (
 "github.com/SkyAPM/go2sky"
 v3 "github.com/SkyAPM/go2sky-plugins/gin/v3"
 "github.com/SkyAPM/go2sky/reporter"
 "github.com/gin-gonic/gin"
 "github.com/prometheus/client_golang/prometheus/promhttp"
 "go-hello-world/pkg/shutdown"
 "go-hello-world/router"
 "log"
 "net/http"
 "syscall"
 "time"
)
var SKYWALKING_ENABLED = false
func main() {
 r := gin.New()
 // 配置skywalking
 if SKYWALKING_ENABLED {
  rp, err := reporter.NewGRPCReporter("skywalking-oap:11800", reporter.WithCheckInterval(time.Second))
  if err != nil {
   log.Printf("create gosky reporter failed. err: %s", err)
  }
  defer rp.Close()
  tracer, _ := go2sky.NewTracer("go-hello-world", go2sky.WithReporter(rp))
  r.Use(v3.Middleware(r, tracer))
 }
 // 注册路由
 router.SetupRouter(r)
 server := &http.Server{
  Addr:    ":8080",
  Handler: r,
 }
 // 启动metrics服务
 go func() {
  http.Handle("/metrics", promhttp.Handler())
  if err := http.ListenAndServe(":9527", nil); err != nil {
   log.Printf("metrics port listen failed. err: %s", err)
  }
 }()
 // 运行服务
 go func() {
  err := server.ListenAndServe()
  if err != nil && err != http.ErrServerClosed {
   log.Fatalf("server.ListenAndServe err: %v", err)
  }
 }()
 // 优雅退出
 quit := shutdown.New(10)
 quit.Add(syscall.SIGINT, syscall.SIGTERM)
 quit.Start(server)
}


定义reporter用于上报数据给Skywalking,这就是一个简单的集成Trace的例子。


定义标准的日志


应用的可观测性主要来源日志、监控、链路追踪,标准的日志有利于日志收集以及排查问题。


原则上,不论是什么类型的日志输出,什么格式的日志内容,都能收集。但是为了方便友好,建议把日志输出到标准输出,这样收集更方便。


我个人理解,在K8s中,完全没必要把日志输出到文件,浪费不说,没多大意义,因为所有的日志我们都会收集到日志系统,而输出到文件的日志也会随着应用发版而丢失,所以输出到文件的意义是什么呢?


运维侧


开发把系统开发完,就会交付给运维部署。为了保障应用的稳定性,运维在部署应用的时候应该考虑以下几点。


  • 应用尽可能保持无状态
  • 应用尽可能保持高可用
  • 应该具备优雅上线能力
  • 应该具备异常自愈能力
  • 可以使用HTTPS访问


应用尽可能保持无状态


K8S中可以部署有状态应用,也可以部署无状态应用。对于有状态应用,我其实很少部署到K8S中,大部分还是部署的无状态应用,至于为什么,用多了就晓得了。


对于业务应用,强烈建议使其保持无状态,就算有需要持久化的东西,要么保存到数据库,要么保存到对象存储或者其他单独的文件系统中,不要挂载到应用Pod上。


这样的好处是,应用和数据是分开的,应用可以随意启停、扩展、迁移等。


应用尽可能的保持高可用


保持高可用应该是每个运维人员的使命。


在K8S中,我们应该怎么配置呢?(1)应用Pod应该是多副本

(2)应用Pod之间做反亲和性,避免同一应用调度到同一台主机,如下。


......
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
            matchExpressions:
              - key: app
                operator: In
                values: [ "httpserver" ]
            topologyKey: kubernetes.io/hostname
......


(3) 为了避免应用因为节点维护等原因驱逐Pod,导致全部Pod被驱逐,特别配置了PodDisruptionBudget,保障应用至少有一个可用,如下。


apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: httpserver
spec:
  minAvailable: 1
  selector:
    matchLables:
      app: httpserver


(4)如果某个节点因为一些原因需要驱逐一些Pod,为了避免重要应用被驱逐,应该给应用配置较高的QoS,如下:


resources:
  limits:
    cpu: "1"
    memory: 2Gi
  requests:
    cpu: "1"
    memory: 2Gi


应用具备优雅上线能力


所谓优雅上线能力,就是要确保应用能够提供服务了,再接入外界流量,不能在还没完全启动的情况下就提供服务。


在K8S中,应用在启动后会加入endpoints中,然后通过service接入流量,那在什么情况下才算启动成功呢?主要是通过K8S的ReadinessProbe来进行检测。这时候开发的健康检测接口就派上用场了,如下:


...
readinessProbe:
  failureThreshold: 3
  httpGet:
    path: /health
    port: http
    scheme: HTTP
  initialDelaySeconds: 20
  periodSeconds: 10
  successThreshold: 1
  timeoutSeconds: 3
...


所以我们K8S的YAML文件应该加上如上的配置。


应该具备异常自愈能力


所谓异常自愈,就是应用本身在出现Crash,或者应用Pod所在节点出现异常的情况,应用能够自动重启或者迁移。这时候就需要通过K8S的LivenessProbe来进行检测了,如下。


......
livenessProbe:
  failureThreshold: 3
  httpGet:
    path: /health
    port: http
    scheme: HTTP
  initialDelaySeconds: 30
  periodSeconds: 10
  successThreshold: 1
  timeoutSeconds: 3
......


当K8S的YAML清单加上如上配置过后,就会定时去探测应用是否正常,如果异常,就会触发重启的动作。如果是节点异常,K8S会对Pod进行重新调度。


可以使用HTTPS进行访问


应用通过HTTPS访问是比较常见的,企业级应用建议自己购买相应的SSL证书,然后进行配置即可。


比如。


# 创建证书secret
kubectl create secret tls httpserver-tls-secret --cert=path/to/tls.cert --key=path/to/tls.key
# 在ingress中引用
......
spec:
  tls:
    hosts:
      - httpserver.coolops.cn
    secretName: httpserver-tls-secret
  rules:
    - host: httpserver.coolops.cn
......


总结


上面介绍了开发和运维对于应用上线应该做的工作,不全但够用


在不同的企业都有不同的尿性,但是作为运维,我们都要牢牢记住稳定永远是第一尿性。通过上面的梳理,我们的应用模板就整理如下:


apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: httpserver
  name: httpserver
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: httpserver
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "metrics"
      labels:
        app: httpserver
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values: [ "httpserver" ]
              topologyKey: kubernetes.io/hostname
      containers:
        - env:
            - name: TZ
              value: Asia/Shanghai
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
          image: baidjay/httpserver:ubuntu-v3-metrics
          imagePullPolicy: IfNotPresent
          lifecycle:
            preStop:
              exec:
                command:
                  - /bin/sh
                  - -c
                  - sleep 15
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: http
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 3
          name: httpserver
          ports:
            - containerPort: 8080
              name: http
              protocol: TCP
            - name: metrics
              protocol: TCP
              containerPort: 9527
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: http
              scheme: HTTP
            initialDelaySeconds: 20
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 3
          resources:
            limits:
              cpu: "1"
              memory: 2Gi
            requests:
              cpu: "1"
              memory: 2Gi
          securityContext: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
---
apiVersion: v1
kind: Service
metadata:
  name: httpserver
spec:
  ports:
    - name: http
      port: 8080
      protocol: TCP
      targetPort: http
    - name: metrics
      port: 9527
      protocol: TCP
      targetPort: metrics
  selector:
    app: httpserver
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 100m
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    nginx.ingress.kubernetes.io/service-weight: ""
    nginx.org/client-max-body-size: 100m
  name: httpserver-tls
spec:
  tls:
  - hosts:
      - httpserver.coolops.cn
    secretName: httpserver-tls-secret
  rules:
    - host: httpserver.coolops.cn
      http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: httpserver
                port:
                  number: 8080
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: httpserver
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: httpserver


为了凑字数,写了一大堆,大家凑合看,觉得有用就点个赞~~!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
打赏
0
0
0
0
175
分享
相关文章
AI大模型运维开发探索第四篇:智能体分阶段演进路线
本文探讨了智能体工程的演进历程,从最初的思维链(智能体1.0)到实例化智能体(智能体2.0),再到结构化智能体(智能体3.0),最终展望了自演进智能体(智能体4.0)。文章详细分析了各阶段遇到的问题及解决策略,如工具调用可靠性、推理能力提升等,并引入了大模型中间件的概念以优化业务平台与工具间的协调。此外,文中还提到了RunnableHub开源项目,为读者提供了实际落地的参考方案。通过不断迭代,智能体逐渐具备更强的适应性和解决问题的能力,展现了未来AI发展的潜力。
传统企业如何玩转平台工程?2 个运维靠它管 50 + 应用
做了五年运维,最深刻的感悟是:技术自负是效率的天敌。以前总觉得懂 Kubectl 命令才专业,直到被平台工程打脸,真正的专业不是炫技,而是让复杂技术为业务服务。现在我常跟新人说:能让开发和厂商爽的运维,才是好运维,而 Rainbond,就是那个让所有人都爽的神器。
传统企业如何玩转平台工程?2 个运维靠它管 50 + 应用
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
475 236
大模型也能当“运维警察”?——大模型技术在异常检测中的应用
大模型也能当“运维警察”?——大模型技术在异常检测中的应用
594 13
容器化浪潮下的AI赋能:智能化运维与创新应用
近年来,容器技术以其轻量、高效、可移植的特性成为云原生时代的基石,推动应用开发和部署方式革新。随着容器化应用规模扩大,传统运维手段逐渐力不从心。AI技术的引入为容器化生态带来新活力,实现智能监控、自动化故障诊断与修复及智能资源调度,提升运维效率和可靠性。同时,AI驱动容器化创新应用,如模型训练、边缘计算和Serverless AI服务,带来更多可能性。未来,AI与容器技术的融合将更加紧密,推动更智能、高效的运维平台和丰富的创新应用场景,助力数字化转型。
Websoft9 运维面板,全网真正的一键部署应用
Websoft9运维面板实现应用真·一键部署,通过智能环境适配、安全架构与容器化技术,将传统数小时部署缩短至分钟级,显著提升效率与安全性。
94 5
机器学习在网络流量预测中的应用:运维人员的智慧水晶球?
机器学习在网络流量预测中的应用:运维人员的智慧水晶球?
241 19
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
488 28
云栖实录 | 大模型在大数据智能运维的应用实践
云栖实录 | 大模型在大数据智能运维的应用实践
489 3

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问