构建Kubernetes集群:综合指南
立即解锁
发布时间: 2025-08-25 00:40:38 阅读量: 1 订阅数: 3 

# 构建 Kubernetes 集群:综合指南
## 1. 负载均衡器考量
节点需要与 API 服务器通信,若有多个主节点,则需要负载均衡器。负载均衡节点到主节点的请求时,可根据集群运行环境选择:
- **公有云**:使用云提供商的负载均衡器,通常具有弹性,能按需自动扩展,且功能丰富。
- **本地环境**:可配置运行 HAProxy 或 NGINX 的 Linux 服务器来满足负载均衡需求,二者均可满足基本需求。
## 2. 存储考量
### 2.1 存储分层
Kubernetes 节点和 Pod 的存储需求多样,在 Linux 环境下,可借助逻辑卷管理器(LVM)或不同挂载点轻松实现存储分层。
- **基础二进制文件存储**:如 kubelet 和 kube - proxy 等基础 Kubernetes 二进制文件,可与操作系统文件存于普通存储,普通 SSD 即可满足需求。
- **容器镜像存储**:容器由只读层组成,单节点运行大量容器时,磁盘读请求压力大,需低延迟的存储后端。同时,要考虑存储性能和空间:
- **存储性能**:优先选择读性能优于写性能的磁盘。
- **存储空间**:计算所需空间需考虑运行的镜像大小和数量,建议为 /var/lib/docker 或 /var/lib/containerd 设置单独挂载点。Kubernetes 的 kubelet 内置垃圾回收策略,可通过 `--eviction - hard=imagefs.available` 或 `--eviction - soft=imagefs.available` 调整阈值,默认在可用存储低于 15% 时进行垃圾回收。
### 2.2 持久数据存储
部分容器需要读写卷存储持久数据,Kubernetes 提供多种存储供应器,如 Ceph、GlusterFS、OpenStack Cinder、Network File System (NFS) 等,各有优缺点。
## 3. 网络需求
### 3.1 容器网络问题
容器网络存在三个核心问题:
1. 容器间(同一主机和不同主机)如何通信?
2. 容器与外部世界如何通信,外部世界如何与容器通信?
3. 谁为每个容器分配和配置唯一 IP 地址?
### 3.2 Docker 网络模型
同一主机上的容器通过 Docker 引擎创建的虚拟网桥(如 docker0)通信,容器通过 veth 虚拟接口连接到网桥并分配私有子网 IP。但不同主机上的容器或外部服务与容器通信时,Docker 通过主机端口暴露容器,此方法存在局限性。
### 3.3 Kubernetes 网络模型
Kubernetes 实现了自己的网络模型,需遵循以下规则:
1. 所有 Pod 无需网络地址转换(NAT)即可相互通信。
2. 所有节点无需 NAT 即可与所有 Pod 通信。
3. Pod 自身看到的 IP 与其他 Pod 看到的 IP 相同。
可借助一些开源项目实现,如 Project Calico、Weave Net、Flannel、Kube - router 等。
### 3.4 Kubernetes DNS 服务发现
Kubernetes 在 kube - system 命名空间有一个部署,包含一组容器组成的 DNS 服务器,负责创建集群中的所有 DNS 记录并处理服务发现的 DNS 请求。同时,Kubernetes 创建指向该部署的服务,并让 kubelet 配置每个 Pod 的容器默认使用该服务的 IP 作为 DNS 解析器。可通过设置 Pod 规范中的 DNS 策略覆盖默认行为,有以下两种策略可选:
- **Default**:Pod 继承运行该 Pod 的节点的名称解析配置。
- **ClusterFirst**:默认策略,Pod 的 resolv.conf 配置为 kube - dns 服务的 IP,非本地集群的请求将转发到节点配置的 DNS 服务器。
### 3.5 DNS 记录类型
只有服务和特定情况下的 Pod 有 DNS 记录,DNS 服务器中有两种记录:
- **A 记录**:根据服务类型创建,服务分为普通服务和无头服务。
- **普通服务**:为每个普通服务创建指向其集群 IP 地址的 A 记录,格式为 `<service - name>.<namespace>.svc.cluster.local`。同一命名空间的 Pod 可通过短名称解析服务。
- **无头服务**:无集群 IP 的服务,Kubernetes 根据其端点创建 A 记录。Pod 需要 `hostname` 和 `subdomain` 两个新规范字段,A 记录格式为 `<pod hostname>.<subdomian/headless service name>.<namespace>.svc.cluster.local`,还会创建 `<headless service>.<namespace>.svc.cluster.local` 记录返回服务背后所有 Pod 的 IP 地址。
## 4. 自定义 Kubernetes 对象
### 4.1 命名空间
Kubernetes 提供命名空间将集群划分为多个虚拟集群,实现资源和对象的逻辑隔离。Kubernetes 自带一些预定义命名空间:
- **Default**:未定义命名空间的对象默认放置在此。
- **kube - system**:Kubernetes 集群创建和使用的对象放置在此,如 kube - dns、kubernetes - dashboard 等。
- **kube - public**:供任何人(包括未认证用户)可见的对象使用。
创建命名空间的命令为:
```bash
kubectl create namespace <name>
```
将对象放入命名空间,可在元数据字段添加命名空间键值对,示例如下:
```yaml
apiVersion: v1
kind: Pod
metadata:
namespace: mynamespace
name: pod1
```
0
0
复制全文
相关推荐










