1. 服务在更新期间或运行期间,如何判断服务是否出现异常

检查类别

检查内容与方法

相关工具/命令示例

系统资源监控

检查 CPU、内存、磁盘、网络使用情况

top, htop, iostat, netstat, nmon

进程状态检查

确保服务关键进程运行正常

ps aux | grep <service_name>, systemctl status <service_name>

日志分析

查看服务日志是否有错误信息或异常堆栈

/var/log/<service_name>/, journalctl -u <service_name>

健康检查接口

通过 HTTP 接口(如 /healthz)或 TCP 端口检查服务是否存活

curl http://localhost:8080/healthz, telnet localhost 8080

依赖服务检查

验证数据库、外部 API、消息队列等依赖服务是否可用

mysql -h <host> -u <user> -p, curl https://api.example.com/v1/resource

性能指标监控

观察请求延迟、吞吐量、错误率等指标

Prometheus + Grafana, New Relic, Datadog

自动化监控告警

设置监控告警规则,如 CPU 使用率过高、请求延迟增加、错误率上升等

Prometheus, Zabbix, Nagios

手动测试

模拟用户操作,验证关键功能是否正常

手动执行下单流程、登录、注册等

版本一致性检查

确认服务版本是否为预期版本,配置文件是否正确

<service_name> --version, 检查 application.yaml, .env 文件

常见异常排查

根据具体异常现象定位问题,如服务启动失败、崩溃、响应缓慢、返回错误等

查看日志、核心转储文件,优化代码逻辑,检查网络和 DNS


2. 什么是init容器,有什么主要作用,有哪些使用场景

在 Kubernetes 中,Init 容器(Init Container) 是一种特殊的容器,它在 Pod 中的主应用容器启动之前运行,并且必须成功完成执行后才会启动主容器。Init 容器通常用于初始化工作环境或准备资源,确保主容器可以顺利运行。


3. 一个Pod中可以存在多个容器吗?默认情况下,Pod必然包含哪些容器

一个 Pod 中可以存在多个容器。这是 Kubernetes 的核心设计之一,允许将紧密相关的多个容器组合在一起,共享资源和网络。

类型

是否必须

描述

主容器(Main Container)

每个 Pod 至少包含一个主容器,用于运行应用程序的核心逻辑。它是 Pod 的主要功能载体。

Init 容器(Init Container)

可选,用于在主容器启动前执行初始化任务(如等待依赖服务就绪)。

Sidecar 容器

可选,通常用于辅助主容器完成任务,如日志收集、监控、代理等。

Admission 控制器注入的容器

如 Istio 的 istio-proxy,由服务网格自动注入,用于流量管理。


4. pause容器是什么,其主要作用是什么

在 Kubernetes 中,pause 容器 是一个非常轻量级的容器,它的主要作用是作为每个 Pod 的“基础设施容器”(Infrastructure Container)来管理 Pod 的生命周期和共享资源。

  • pause 容器是一个几乎不消耗资源的容器,通常使用 k8s.gcr.io/pause 镜像。

  • 它在每个 Pod 启动时第一个被创建,并且在整个 Pod 生命周期中一直保持运行状态。

  • 其名称来源于它所使用的命令:该容器的主要功能是“暂停”并等待信号,不会执行任何实际业务逻辑。

主要作用:

作用

描述

Pod 的网络命名空间持有者

所有 Pod 中的容器共享同一个网络命名空间(Network Namespace),这个命名空间由 pause 容器创建并持有。即使其他容器重启或崩溃,网络配置仍然保持不变。

PID 命名空间管理

在默认情况下,Kubernetes 使用 pause 容器作为 Pod 的 PID 命名空间的持有者,确保所有容器共享相同的进程树。

生命周期管理

pause 容器的生命周期决定了整个 Pod 的生命周期。当 pause 容器退出时,Kubernetes 认为该 Pod 已终止,会触发重建机制(如果由控制器管理)。

资源隔离的基础

每个 Pod 的资源隔离(如 CPU、内存限制)都基于 pause 容器的 cgroup 设置,其他容器共享这些资源限制。


5. 一个Pod中的多个容器,它们之间有哪些内容是共享的

在 Kubernetes 中,一个 Pod 中的多个容器(主容器、Init 容器、Sidecar 容器)共享一些底层资源和命名空间,但也有各自独立的部分。以下是它们之间共享的内容以及不共享的内容。

共享内容:

共享内容

描述

网络命名空间(Network Namespace)

所有容器共享同一个 IP 和端口空间,可以通过 localhost 直接通信。例如:一个容器监听 localhost:8080,另一个容器可通过 localhost:8080 访问它。

IPC 命名空间(Inter-Process Communication)

支持容器间通过信号量、消息队列等方式进行进程间通信(默认开启)。

UTS 命名空间(Hostname & Domainname)

所有容器共享主机名(hostname),即 hostname 命令返回相同值。

共享存储卷(Volumes)

可以挂载相同的 Volume,实现数据共享和持久化。例如:主容器写入日志文件,Sidecar 容器读取并上传到远程服务器。

PID 命名空间(可选)

如果启用 shareProcessNamespace: true,所有容器将共享 PID 命名空间,可以互相看到对方的进程。

Cgroup 资源限制

整个 Pod 的 CPU、内存等资源限制是统一的,容器不能单独设置 cgroup 限制(除非使用 CRI-O 或 containerd 的高级特性)。

不共享的内容:

不共享内容

描述

文件系统

每个容器拥有独立的文件系统,除非显式挂载共享 Volume,否则无法访问彼此的文件。

环境变量

每个容器有自己的环境变量配置,不会自动继承其他容器的环境变量。

进程列表(默认)

默认情况下每个容器只能看到自己的进程,除非启用 shareProcessNamespace

容器生命周期

各自独立运行,一个容器崩溃不会影响其他容器,但 Pod 整体状态可能变为异常。

容器镜像与启动命令

每个容器使用不同的镜像和启动命令,互不影响。


6. 什么是探针?有几种,分别有什么作用

在 Kubernetes 中,探针(Probe) 是用于检测容器健康状态的机制。Kubernetes 通过探针来判断容器是否正常运行,并据此决定是否将流量转发给该容器,或者是否需要重启容器。

一、Kubernetes 探针的种类

探针类型

名称

英文名

主要作用

存活探针

Liveness Probe

livenessProbe

判断容器是否“活着”,如果失败,Kubernetes 会重启该容器。

就绪探针

Readiness Probe

readinessProbe

判断容器是否“就绪”接收请求,如果失败,该容器不会被加入 Service 的 Endpoints。

启动探针

Startup Probe

startupProbe

判断容器是否已经“启动完成”,适用于启动时间较长的应用。


二、每种探针的详细说明

1. 存活探针(Liveness Probe)

  • 作用:判断容器是否处于运行状态。

  • 失败行为:如果探针失败,Kubernetes 会认为容器异常,触发容器重启。

  • 适用场景

    • 容器进入死循环或崩溃;

    • 应用卡住无法响应但进程仍在运行;

    • 需要强制重启恢复服务时使用。

示例配置:
livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10

2. 就绪探针(Readiness Probe)

  • 作用:判断容器是否已经准备好处理请求。

  • 失败行为:如果探针失败,该容器将从 Service 的负载均衡中移除,直到再次变为“就绪”。

  • 适用场景

    • 应用正在加载数据或连接数据库中;

    • 容器已启动但尚未准备好提供服务;

    • 避免将请求路由到尚未准备好的 Pod。

示例配置:
readinessProbe:
  tcpSocket:
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 10

3. 启动探针(Startup Probe)

  • 作用:判断容器是否已经成功启动。

  • 失败行为:如果探针失败,Kubernetes 会认为容器未启动成功,不会触发其他探针(如 liveness 和 readiness),并根据重启策略决定是否重启容器。

  • 适用场景

    • 启动时间较长的应用(如 Java 应用);

    • 在应用完全启动前禁用其他探针,避免误判。

示例配置:
startupProbe:
  exec:
    command:
      - cat
      - /tmp/ready
  failureThreshold: 30
  periodSeconds: 10

三、探针的执行方式(支持三种探测方式)

方式

描述

示例

HTTP GET

发送 HTTP 请求,返回 200-399 表示成功

httpGet 字段指定路径和端口

TCP Socket

尝试建立 TCP 连接,连接成功即为就绪

tcpSocket 字段指定端口

Exec Command

在容器内执行命令,退出码为 0 表示成功

exec 字段指定命令


四、探针的关键参数说明

参数

描述

initialDelaySeconds

容器启动后等待多少秒才开始探测

periodSeconds

每隔多少秒探测一次

timeoutSeconds

探测超时时间(默认 1 秒)

successThreshold

成功判定阈值(对于 liveness/readiness 总是为 1)

failureThreshold

失败多少次后判定为失败(liveness 默认为 3,readiness 默认也为 3)

总结:

  • 探针是 Kubernetes 实现自愈能力的核心机制之一;

  • Liveness Probe 用于保证容器健康,Readiness Probe 用于控制流量分发,Startup Probe 用于解决启动慢的问题;

  • 合理配置探针可以提升系统的稳定性和可用性;


7. 制作一个Nginx镜像,让其随机sleep一段时间后才能成功启动,上传到Habor。

Dockfiles文件

# 使用官方 Nginx 镜像作为基础镜像
FROM nginx:latest

# 替换默认的启动命令,使用自定义脚本
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# 设置入口脚本
ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh文件

#!/bin/sh

# 生成 5~10 的随机整数
SLEEP_TIME=$(( (RANDOM % 6) + 5 ))

echo "Sleeping for $SLEEP_TIME seconds before starting Nginx..."
sleep $SLEEP_TIME

# 启动 Nginx
nginx -g 'daemon off;'

使用docker构建并在本地运行,查看是否延时:

docker build -t my-nginx-sleep:latest .
docker run --rm -d -p 8080:80 my-nginx-sleep:latest

打标签,推送镜像

docker tag my-nginx-sleep:latest 192.168.75.133:80/library/my-nginx-sleep:random-sleep
docker push 192.168.75.133:80/library/my-nginx-sleep:random-sleep


8. 制作一个Deployment,配置启动探针,判断Nginx启动成功后,才标识其状态为Ready

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-sleep-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-sleep
  template:
    metadata:
      labels:
        app: nginx-sleep
    spec:
      containers:
        - name: nginx
          image: 192.168.75.133:80/library/my-nginx-sleep:random-sleep
          ports:
            - containerPort: 80
          startupProbe:
            tcpSocket:
              port: 80
            failureThreshold: 30
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 5
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 15
            periodSeconds: 10


9. 制作一个Service,配置就绪探针,以某个目录下的文件是否存在作为判断依据,可以手动创建文件,来观察状态。

service-readiness.yaml

apiVersion: v1
kind: Pod
metadata:
  name: readiness-file-pod
spec:
  containers:
    - name: app-container
      image: nginx:latest
      ports:
        - containerPort: 80
      readinessProbe:
        exec:
          command:
            - sh
            - -c
            - '[ -f /tmp/ready ] && exit 0 || exit 1'
        initialDelaySeconds: 5
        periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
  name: readiness-file-service
spec:
  selector:
    name: readiness-file-pod
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80


10. 三个探针,检测失败后会执行什么操作。哪个探针失败后会删除pod重新创建

探针类型

是否重启容器

是否标记 NotReady

是否删除 Pod

主要作用

Startup Probe

否(除非配置了 restartPolicy)

控制容器启动阶段

Liveness Probe

自动重启异常容器

Readiness Probe

控制是否接收流量


11. 如何在yaml配置文件中,配置Pod所需的环境变量

  • Kubernetes 支持多种方式配置环境变量;

  • 可以直接使用 env.name/value 设置;

  • 也可以通过 ConfigMapSecret 实现更灵活的配置管理;

  • 推荐将敏感信息放入 Secret,非敏感信息放入 ConfigMap,便于维护与复用。


12. 如果需要在Pod启动时,挂载配置文件,应该使用什么资源


13. ConfigMap与Secret有什么区别,分别在什么场景下使用

在 Kubernetes 中,如果你希望在 Pod 启动时挂载配置文件(如 application.properties、config.json 等),你应该使用 ConfigMap 或 Secret 资源,并通过 Volume 挂载的方式将配置文件注入到容器中。

资源类型

用途

示例

ConfigMap

存储非敏感的配置数据,如 .properties, .yaml, .json 文件等

数据库连接地址、日志级别等

Secret

存储敏感信息,如密码、token、证书等

数据库密码、API Key、TLS 证书等


14. 创建一个ConfigMap,里面设置多个环境变量,再创建一个Pod挂载此ConfigMap中的所有环境变量

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  ENV1: "value1"
  ENV2: "value2"
  ENV3: "value3"

kubectl apply -f configmap.yaml

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: env-pod-from-configmap
spec:
  containers:
    - name: app-container
      image: nginx:latest
      envFrom:
        - configMapRef:
            name: app-config


15. 创建一个ConfigMap,内容为Nginx的配置文件,再启动一个Nginx的Pod,挂载此配置文件作为其默认配置。

ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    user  nginx;
    worker_processes  auto;

    error_log  /var/log/nginx/error.log notice;
    pid        /var/run/nginx.pid;

    events {
        worker_connections  1024;
    }

    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;

        sendfile        on;
        keepalive_timeout  65;

        gzip  on;

        server {
            listen       80;
            server_name  localhost;

            location / {
                root   /usr/share/nginx/html;
                index  index.html index.htm;
            }

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   /usr/share/nginx/html;
            }
        }
    }

Nginx的Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - containerPort: 80
      volumeMounts:
        - name: nginx-config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
  volumes:
    - name: nginx-config-volume
      configMap:
        name: nginx-config


16. 在Habor仓库中,设置一个非公开项目(上传下载都需要密码),并上传一个Nginx镜像。

现在harbor图形化界面中创建一个名为nginx-private的私有仓库

然后在任意客户端登录harbor

docker login http://<harbor-ip>:80

输入用户名和密码

随后拉取镜像

docker pull nginx:latest

打标签

docker tag nginx:latest <harbor-ip>:80/nginx-private/nginx:latest

推送镜像

docker push <harbor-ip>:80/nginx-private/nginx:latest

退出登录

docker logout http://<harbor-ip>:80

尝试拉取

docker pull http://<harbor-ip>:80/nginx-private/nginx:latest

没有权限


17. 创建一个secrets,里面保存Harbor仓库相关信息。

可以直接用命令创建

kubectl create secret docker-registry harbor-registry-secret \
  --docker-server=http://<harbor-ip>:80 \
  --docker-username=admin \
  --docker-password=Harbor12345 


18. 创建Pod使用之前上传的Nginx镜像,并配置secrets,使其能够成功拉取到镜像。

可以

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx
      image: <harbor-ip>:80/nginx-private/nginx:latest
  imagePullSecrets:
    - name: harbor-registry-secret

也可以绑定ServiceAccount,这样该命名空间就是默认使用此secrets拉取


19. Secret挂载到pod中后,在Pod中查看对应的文件/变量,内容是密文还是明文

以环境变量和密文挂载都是明文。

以他人的幸福为幸福,以他人的享乐为享乐。