sealos问答记录


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集群,查看集群状态

回答:

# 查看所有节点状态
kubectl get nodes

# 查看节点详细信息
kubectl describe node <node-name>

# 查看集群整体信息
kubectl cluster-info

# 查看所有命名空间中的资源
kubectl get all --all-namespaces

# 查看系统命名空间中的资源
kubectl get pods -n kube-system

# 查看集群资源使用情况
kubectl top nodes
kubectl top pods --all-namespaces

# 查看集群事件
kubectl get events --all-namespaces

问题:这个nodes是主机的意思吗

回答: 是的,Node是指集群中的主机,可以是物理服务器或虚拟机。每个Node都安装了kubelet和容器运行时,是Kubernetes集群的工作机器。

问题:查看某命名空间下有多少服务

回答:

# 查看指定命名空间下的服务数量
kubectl get services -n <命名空间名称> --no-headers | wc -l

# 查看指定命名空间下的所有服务
kubectl get services -n <命名空间名称>

2.2 日志查看

问题:查看某服务的日志

回答: Service本身不产生日志。要查看与服务相关的日志,需要查看该服务后端Pod的日志:

# 查看服务后端Pod的日志
kubectl logs -l <标签选择器> -n <命名空间>

# 查看特定Pod的日志
kubectl logs <Pod名称> -n <命名空间>

问题:如果这个pod不是的是多个呢,例如一个java服务,部署了3个实例

回答: 如果一个服务有3个Pod实例,可以这样查看日志:

# 查看所有3个Pod的日志
kubectl logs -l app=<标签值> -n <命名空间>

# 实时查看所有Pod的日志
# 需要使用第三方工具如stern
stern -n <命名空间> -l app=<标签值>

# 或使用脚本查看所有Pod日志
kubectl get pods -l app=<标签值> -n <命名空间> -o name | xargs -I {} kubectl logs {} -n <命名空间>

3. 运维实践

3.1 故障排查

问题:当您在生产环境中遇到Pod频繁重启时,您会按照什么顺序排查问题?

回答:

  1. kubectl get pods -l app=xxx -n <命名空间> # 查看Pod状态
  2. kubectl describe pod <pod名称> -n <命名空间> # 查看详细事件
  3. kubectl logs <pod名称> -n <命名空间> # 查看当前容器日志
  4. kubectl logs <pod名称> -n <命名空间> --previous # 查看上一个容器的日志

3.2 高可用配置

问题:在一个三节点的K8s集群中,如果要实现高可用,您会如何分配Master和Worker节点的角色?

回答: 在三节点集群中:

  • 选项1:三台都同时承担Master和Worker角色(混合节点配置)
  • 选项2:一台Master,两台Worker(分离角色配置)

对于etcd高可用,需要在三个节点上都部署etcd实例。

Clusterfile配置示例:

apiVersion: apps.sealos.io/v1beta1
kind: Cluster
metadata:
name: my-cluster
spec:
image:
- kubernetes:v1.25.0
- calico:v3.24.1
hosts:
- ips:
- "192.168.1.100"
- "192.168.1.101"
- "192.168.1.102"
roles: [ "master", "node", "etcd" ]

3.3 配置管理

问题:您如何处理应用配置在不同环境(开发、测试、生产)之间的差异?

回答:

  1. 使用命名空间隔离不同环境
  2. 使用ConfigMap管理非敏感配置
  3. 使用Secret管理敏感配置
  4. 使用Helm或Kustomize进行模板化配置管理
  5. 通过CI/CD管道自动化部署到不同环境

4. 概念解释

4.1 etcd

问题:etcd是什么意思

回答: etcd是Kubernetes的核心组件,是一个高可用的分布式键值存储系统,是Kubernetes的"大脑",负责存储集群的所有状态信息,包括节点信息、Pod配置、服务定义、配置数据等。为了实现高可用,etcd通常需要在多个节点上部署实例,形成etcd集群。


文章作者: huhuhuhr
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 huhuhuhr !
  目录