K8s 相关问题集锦(一)
1. 基础概念类
- Kubernetes 是什么?它的主要功能有哪些?
- 说明 Kubernetes 是一个用于容器编排的开源平台,支持自动化容器化应用的部署、扩展和管理。
- 解释 Pod 是什么?
- Pod 是 Kubernetes 中最小的可部署单元,通常包含一个或多个容器,它们共享网络命名空间和存储卷。
- 什么是 Namespace?它的作用是什么?
- Namespace 用于逻辑上划分 Kubernetes 集群中的资源,可以用于实现资源隔离和管理不同环境(如开发、测试、生产)。
- 什么是 Deployment?它有什么作用?
- Deployment 用于管理无状态应用的部署,支持自动扩展、滚动更新和版本回滚。
转发一个快速入门视频
2. 架构与组件类
- Kubernetes 的主要组件有哪些?
- 描述 Master 节点组件(如 API Server、Controller Manager、Scheduler、etcd)和 Worker 节点组件(如 kubelet、kube-proxy)。
- 解释 API Server 的作用是什么?
- API Server 是 Kubernetes 的前端,负责处理来自用户和内部组件的所有 RESTful 请求,是集群的核心入口。
- 什么是 etcd?在 Kubernetes 中起什么作用?
- etcd 是一个分布式键值存储系统,用于存储 Kubernetes 的集群数据,如配置信息、状态数据等,是 Kubernetes 高可用的重要组成部分。
3. 配置与操作类
好的,以下是基于 Debian 操作系统的具体 Kubernetes 操作命令示例,涵盖创建 Pod、查看日志、排查
CrashLoopBackOff状态、以及创建和使用ConfigMap和Secret的操作:1. 如何创建一个 Pod?
在 Kubernetes 中,我们可以使用两种方式创建 Pod:
kubectl run命令和kubectl apply -f命令。方式一:使用
kubectl run命令
bash kubectl run nginx-pod --image=nginx:latest --restart=Never
nginx-pod是 Pod 的名称。--image=nginx:latest指定使用的镜像。--restart=Never表示仅创建一个 Pod,而不是创建 Deployment 或 ReplicaSet。方式二:使用 YAML 文件创建 Pod
创建一个名为
nginx-pod.yaml的文件,内容如下:
yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80然后使用以下命令应用这个配置文件来创建 Pod:
bash kubectl apply -f nginx-pod.yaml2. 如何查看 Pod 的日志?
假设我们要查看名为
nginx-pod的 Pod 的日志,可以使用以下命令:
bash kubectl logs nginx-pod
- 如果 Pod 中有多个容器,可以使用以下命令指定容器名:
bash kubectl logs nginx-pod -c <container_name>3. 如何排查 Pod 处于
CrashLoopBackOff状态的问题?当 Pod 进入
CrashLoopBackOff状态时,排查步骤包括查看事件、描述 Pod 详细信息和查看容器日志。步骤 1:查看 Pod 的描述
bash kubectl describe pod nginx-pod
- 这个命令会输出 Pod 的详细信息,包括事件历史和错误原因。检查
Events部分,可以帮助理解为什么 Pod 会频繁重启。步骤 2:查看 Pod 日志
bash kubectl logs nginx-pod
- 如果 Pod 中有多个容器,可以使用以下命令指定容器名:
bash kubectl logs nginx-pod -c <container_name>
- 日志可以帮助查看应用程序启动失败的原因。
步骤 3:检查 Pod 的配置文件或镜像
- 确认 YAML 文件中的配置是否正确,如环境变量、镜像名称、启动命令等。
- 确保镜像没有问题,可以通过在本地或其他环境中测试镜像。
4. 如何创建和使用
ConfigMap和Secret?创建
ConfigMap假设我们要创建一个包含应用配置的
ConfigMap:
bash kubectl create configmap my-config --from-literal=app_name=myapp --from-literal=app_env=production
--from-literal用于从命令行直接指定键值对。- 可以使用
--from-file参数从文件加载配置。查看
ConfigMap的内容:
bash kubectl get configmap my-config -o yaml创建
Secret假设我们要创建一个包含数据库密码的
Secret:
bash kubectl create secret generic db-secret --from-literal=username=myuser --from-literal=password=mypassword
generic表示创建的是一个通用类型的 Secret。--from-literal用于从命令行直接指定键值对。查看
Secret的内容(注意,Secret的内容是 base64 编码的):
bash kubectl get secret db-secret -o yaml将
ConfigMap和Secret挂载到 Pod 中可以将
ConfigMap和Secret挂载为环境变量或文件。创建一个名为
nginx-pod-with-config.yaml的文件:
yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod-with-config spec: containers: - name: nginx image: nginx:latest env: - name: APP_NAME valueFrom: configMapKeyRef: name: my-config key: app_name - name: APP_ENV valueFrom: configMapKeyRef: name: my-config key: app_env - name: DB_USERNAME valueFrom: secretKeyRef: name: db-secret key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password应用这个 YAML 文件:
bash kubectl apply -f nginx-pod-with-config.yaml
- 这样创建的 Pod 将可以从
ConfigMap和Secret中读取环境变量。- 可以在容器中通过
echo $APP_NAME等命令查看这些环境变量的值。
4. 网络与存储类
- Kubernetes 中的 Service 是什么?有哪几种类型?
- Service 用于暴露应用,类型包括 ClusterIP、NodePort、LoadBalancer、ExternalName。
- 解释 Ingress 是什么?如何配置 Ingress?
- Ingress 是一个 API 对象,用于管理外部访问到集群服务的 HTTP 和 HTTPS 路由。
- Kubernetes 中如何实现持久存储?
- 使用 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC),以及 StorageClass 管理持久存储。
- ClusterIP 和 NodePort 有什么区别?
- ClusterIP 只在集群内部暴露服务,而 NodePort 则通过每个节点的端口将服务暴露给集群外部。