Sealos运维问答记录
1. 概念理解
1.1 Kubernetes架构相关
问题:一个Pod可以包含一个或多个紧密相关的容器,什么意思?例如我一个docker compose说明了服务依赖postgresql等等服务,这一组服务一个pod?
回答: 不是的,您对Pod的理解有些偏差。Pod是Kubernetes中最小的部署单元,它包含一个或多个"紧密相关"的容器。这里的"紧密相关"是指这些容器需要共享存储和网络,共同完成一个任务。
在Docker Compose中的多个服务(如Java应用+PostgreSQL)在Kubernetes中应该对应多个Pod + Service,而不是一个Pod。Pod中多个容器的"紧密相关"是指它们协同完成一个单一任务,而不是运行不同的服务组件。
问题:服务和实际的运行的服务我还是搞不清楚
回答: Kubernetes中的Service(服务)和实际运行的服务(应用程序)有以下区别:
- Service:是Kubernetes的一个API对象,是一个网络抽象,为一组Pod提供稳定的网络端点(IP地址和DNS名称)
- 实际运行的服务:是运行在Pod中的实际应用程序
它们的关系是:用户请求 → Service IP/域名 → Service → 标签选择器 → 实际运行的Pod。Service就像一个门面,为实际运行在Pod中的应用程序提供稳定的访问入口。
1.2 概念映射
问题:假如有一个为java服务,这个服务一个实例就是一个pod,多个pod指向同一个service,service负责做负载均衡,容器是就是一个pod实例,每一个pod都是不是再某一个命名空间下的,集群通过控制pod部署在哪个node去控制资源做容灾
回答:
- 一个Pod通常运行一个服务实例,多个Pod通过Service提供负载均衡
- Pod包含一个或多个紧密相关的容器
- 所有Pod都在命名空间下运行(默认为default)
- 控制器通过调度策略控制Pod部署在哪个Node上以实现容灾
2. 集群操作
2.1 查看集群状态
问题:假如我们有一个三个主机构建的k8s集群,查看集群状态
回答:
# 查看所有节点状态 |
问题:这个nodes是主机的意思吗
回答: 是的,Node是指集群中的主机,可以是物理服务器或虚拟机。每个Node都安装了kubelet和容器运行时,是Kubernetes集群的工作机器。
问题:查看某命名空间下有多少服务
回答:
# 查看指定命名空间下的服务数量 |
2.2 日志查看
问题:查看某服务的日志
回答: Service本身不产生日志。要查看与服务相关的日志,需要查看该服务后端Pod的日志:
# 查看服务后端Pod的日志 |
问题:如果这个pod不是的是多个呢,例如一个java服务,部署了3个实例
回答: 如果一个服务有3个Pod实例,可以这样查看日志:
# 查看所有3个Pod的日志 |
3. 运维实践
3.1 故障排查
问题:当您在生产环境中遇到Pod频繁重启时,您会按照什么顺序排查问题?
回答:
kubectl get pods -l app=xxx -n <命名空间># 查看Pod状态kubectl describe pod <pod名称> -n <命名空间># 查看详细事件kubectl logs <pod名称> -n <命名空间># 查看当前容器日志kubectl logs <pod名称> -n <命名空间> --previous# 查看上一个容器的日志
3.2 高可用配置
问题:在一个三节点的K8s集群中,如果要实现高可用,您会如何分配Master和Worker节点的角色?
回答: 在三节点集群中:
- 选项1:三台都同时承担Master和Worker角色(混合节点配置)
- 选项2:一台Master,两台Worker(分离角色配置)
对于etcd高可用,需要在三个节点上都部署etcd实例。
Clusterfile配置示例:
apiVersion: apps.sealos.io/v1beta1 |
3.3 配置管理
问题:您如何处理应用配置在不同环境(开发、测试、生产)之间的差异?
回答:
- 使用命名空间隔离不同环境
- 使用ConfigMap管理非敏感配置
- 使用Secret管理敏感配置
- 使用Helm或Kustomize进行模板化配置管理
- 通过CI/CD管道自动化部署到不同环境
4. 概念解释
4.1 etcd
问题:etcd是什么意思
回答: etcd是Kubernetes的核心组件,是一个高可用的分布式键值存储系统,是Kubernetes的"大脑",负责存储集群的所有状态信息,包括节点信息、Pod配置、服务定义、配置数据等。为了实现高可用,etcd通常需要在多个节点上部署实例,形成etcd集群。