1. 服务在更新期间或运行期间,如何判断服务是否出现异常
2. 什么是init容器,有什么主要作用,有哪些使用场景
在 Kubernetes 中,Init 容器(Init Container) 是一种特殊的容器,它在 Pod 中的主应用容器启动之前运行,并且必须成功完成执行后才会启动主容器。Init 容器通常用于初始化工作环境或准备资源,确保主容器可以顺利运行。
3. 一个Pod中可以存在多个容器吗?默认情况下,Pod必然包含哪些容器
一个 Pod 中可以存在多个容器。这是 Kubernetes 的核心设计之一,允许将紧密相关的多个容器组合在一起,共享资源和网络。
4. pause容器是什么,其主要作用是什么
在 Kubernetes 中,pause 容器 是一个非常轻量级的容器,它的主要作用是作为每个 Pod 的“基础设施容器”(Infrastructure Container)来管理 Pod 的生命周期和共享资源。
pause容器是一个几乎不消耗资源的容器,通常使用k8s.gcr.io/pause镜像。它在每个 Pod 启动时第一个被创建,并且在整个 Pod 生命周期中一直保持运行状态。
其名称来源于它所使用的命令:该容器的主要功能是“暂停”并等待信号,不会执行任何实际业务逻辑。
主要作用:
5. 一个Pod中的多个容器,它们之间有哪些内容是共享的
在 Kubernetes 中,一个 Pod 中的多个容器(主容器、Init 容器、Sidecar 容器)共享一些底层资源和命名空间,但也有各自独立的部分。以下是它们之间共享的内容以及不共享的内容。
共享内容:
不共享的内容:
6. 什么是探针?有几种,分别有什么作用
在 Kubernetes 中,探针(Probe) 是用于检测容器健康状态的机制。Kubernetes 通过探针来判断容器是否正常运行,并据此决定是否将流量转发给该容器,或者是否需要重启容器。
一、Kubernetes 探针的种类
二、每种探针的详细说明
1. 存活探针(Liveness Probe)
作用:判断容器是否处于运行状态。
失败行为:如果探针失败,Kubernetes 会认为容器异常,触发容器重启。
适用场景:
容器进入死循环或崩溃;
应用卡住无法响应但进程仍在运行;
需要强制重启恢复服务时使用。
示例配置:
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 102. 就绪探针(Readiness Probe)
作用:判断容器是否已经准备好处理请求。
失败行为:如果探针失败,该容器将从 Service 的负载均衡中移除,直到再次变为“就绪”。
适用场景:
应用正在加载数据或连接数据库中;
容器已启动但尚未准备好提供服务;
避免将请求路由到尚未准备好的 Pod。
示例配置:
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 103. 启动探针(Startup Probe)
作用:判断容器是否已经成功启动。
失败行为:如果探针失败,Kubernetes 会认为容器未启动成功,不会触发其他探针(如 liveness 和 readiness),并根据重启策略决定是否重启容器。
适用场景:
启动时间较长的应用(如 Java 应用);
在应用完全启动前禁用其他探针,避免误判。
示例配置:
startupProbe:
exec:
command:
- cat
- /tmp/ready
failureThreshold: 30
periodSeconds: 10三、探针的执行方式(支持三种探测方式)
四、探针的关键参数说明
总结:
探针是 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重新创建
11. 如何在yaml配置文件中,配置Pod所需的环境变量
Kubernetes 支持多种方式配置环境变量;
可以直接使用
env.name/value设置;也可以通过
ConfigMap或Secret实现更灵活的配置管理;推荐将敏感信息放入 Secret,非敏感信息放入 ConfigMap,便于维护与复用。
12. 如果需要在Pod启动时,挂载配置文件,应该使用什么资源
13. ConfigMap与Secret有什么区别,分别在什么场景下使用
在 Kubernetes 中,如果你希望在 Pod 启动时挂载配置文件(如 application.properties、config.json 等),你应该使用 ConfigMap 或 Secret 资源,并通过 Volume 挂载的方式将配置文件注入到容器中。
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中查看对应的文件/变量,内容是密文还是明文
以环境变量和密文挂载都是明文。