用 kubeadm 在 CentOS 7 上从零搭一套多节点 k8s 集群的完整记录,包含 cri-dockerd 适配器、容器运行时配置,以及节点 IP 变更后重新初始化集群的办法。IP、token、cert-hash 都用占位符,实际操作时换成自己的。
硬件和网络要求
- 每台机器 2GB 以上内存,CPU 2 核以上
- 所有机器网络互通(公网内网都行)
- 节点之间不能有重复的主机名、MAC 地址或 product_uuid(
ip a可看) - 必须禁用交换分区,否则 kubelet 工作不正常:
用 kubeadm 在 CentOS 7 上从零搭一套多节点 k8s 集群的完整记录,包含 cri-dockerd 适配器、容器运行时配置,以及节点 IP 变更后重新初始化集群的办法。IP、token、cert-hash 都用占位符,实际操作时换成自己的。
ip a 可看)蓝鲸 BK-CI(腾讯开源的持续集成系统)在 k8s 上部署时遇到的一些问题。分开源版和社区版两套,测试都用的 minikube 集群。
官方文档:bk-ci/docs/install/kubernetes.md。
kubeadm 那套手动流程步骤多、容易踩坑。Sealos 把整个集群封装成镜像,一条 sealos run 就把 control plane、worker 节点、CNI、helm 全装好,适合快速起一套能用的集群。参考官方文档。
下面操作都在主节点 root 用户下执行。
整理一下这三个工具各自干什么、为什么要一起用、一个真实项目里它们怎么衔接。
现代云原生项目的基础设施栈,从下到上大致四层,每一层只解决一类问题:
┌─────────────────────────────────────────┐
│ Terraform → 创建基础设施(云资源) │ Provision 建房
├─────────────────────────────────────────┤
│ Ansible → 配置服务器(装软件、改配置) │ Configure 装修(可选)
├─────────────────────────────────────────┤
│ Docker → 打包应用(镜像 + 运行时) │ Package 装家具
├─────────────────────────────────────────┤
│ Kubernetes → 编排容器(调度、伸缩、自愈) │ Orchestrate 物业管理
└─────────────────────────────────────────┘
k8s 的概念、集群搭建和运维记录。
sealos run 拉起 control plane + worker + CNI,再用 podman 跑 Kuboard想确认线上 Pod 里的 Java 进程到底跑了哪些 JVM 参数(堆大小、GC 策略等),不用翻部署 YAML 猜,直接进容器问 JVM 自己。前提是镜像里带了 jcmd 或 jinfo(JDK 一般有,精简的 JRE 镜像可能没有)。
kubectl exec -it <pod-name> -- /bin/bash
两块基础概念:Pod 是什么、怎么管;以及集群内的服务怎么暴露给集群外访问。
Pod 是 Kubernetes 里最小的部署单元。一个 Pod 包含一个或多个相对紧密耦合的容器,这些容器共同调度、跑在同一节点上,共享上下文、网络命名空间和卷。
在非云环境里,跑在同一物理机/虚拟机上的应用,类比成跑在同一个逻辑主机上的云应用——Pod 就是这个 "逻辑主机"。
Pod 被设计成短暂的、一次性的实体。它不会自愈:某个 Pod 因为缺资源被控制器终止后,不会自己恢复,而是由控制器按目标状态重新创建。所以一般很少直接创建单独的 Pod(即使是单例),而是用 workload 资源去管。
在 k8s 上跑 ELK 试过两条路:一是用 sebp/elk 一体化镜像跑 DaemonSet,简单但三个组件耦合在一个 Pod;二是 Elasticsearch / Logstash / Kibana 各自独立部署,ES 用 StatefulSet + PV 持久化,更接近生产。下面分别记。
镜像 sebp/elk:8.6.2。三个组件在同一 Pod 里,适合快速起一套。
ES 启动用户是 elasticsearch,直接挂载 elasticsearch.yml 会有权限问题,所以改配置得重新 build 镜像再推到私有仓库:
Ingress-Nginx 默认只转发 HTTP 和 HTTPS。要转发裸 TCP(比如把 Logstash 的 5044 beats 端口暴露出去),得额外配一个 ConfigMap 并改 controller。下面以把 elk namespace 下 elk service 的 5044 端口转发出去为例。
在 ingress-nginx namespace 下创建。key 是要对外暴露的端口,value 是后端服务,格式 namespace/service:port: