一、资源介绍
### Kubernetes Namespace 详细介绍
#### 1. 什么是 Namespace?
Namespace 是 Kubernetes 中用于将集群资源划分为多个虚拟集群的机制。它允许在同一物理集群中创建多个逻辑分区,每个分区可以包含独立的资源(如 Pod、Service、Deployment 等),且这些资源在命名上是隔离的。
#### 2. Namespace 的作用
- **资源隔离**:不同 Namespace 中的资源相互隔离,避免命名冲突。
- **权限控制**:通过 RBAC(基于角色的访问控制)限制用户或组对特定 Namespace 的访问权限。
- **资源配额**:可以为每个 Namespace 设置资源配额,限制其资源使用量(如 CPU、内存等)。
- **环境隔离**:将开发、测试、生产环境部署在不同的 Namespace 中,便于管理。
#### 3. 默认 Namespace
Kubernetes 集群默认包含以下 Namespace:
- **default**:未指定 Namespace 时,资源默认创建在此。
- **kube-system**:存放 Kubernetes 系统组件(如 kube-proxy、CoreDNS 等)。
- **kube-public**:存放公共资源,通常对所有用户可见。
- **kube-node-lease**:存放节点租约信息,用于节点心跳检测。
#### 4. 创建和管理 Namespace
- **创建 Namespace**:
```yaml
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
```
使用 `kubectl apply -f namespace.yaml` 创建。
- **查看 Namespace**:
```bash
kubectl get namespaces
```
- **删除 Namespace**:
```bash
kubectl delete namespace my-namespace
```
- **在特定 Namespace 中创建资源**:
在资源定义中指定 `namespace` 字段,或使用 `kubectl` 命令时添加 `-n` 参数:
```bash
kubectl apply -f my-resource.yaml -n my-namespace
```
#### 5. Namespace 的优点
- **资源隔离**:避免不同团队或环境的资源冲突。
- **权限管理**:通过 RBAC 实现细粒度的权限控制。
- **资源配额**:防止单个 Namespace 占用过多资源,影响其他 Namespace。
- **环境管理**:便于区分和管理开发、测试、生产环境。
- **简化资源管理**:通过 Namespace 对资源进行逻辑分组,提升管理效率。
#### 6. 使用场景
- **多团队协作**:每个团队使用独立的 Namespace,避免资源冲突。
- **多环境部署**:为开发、测试、生产环境创建不同的 Namespace。
- **资源配额管理**:为不同项目或团队设置资源配额,防止资源滥用。
- **权限控制**:限制用户或组对特定 Namespace 的访问和操作权限。
#### 7. 注意事项
- **资源隔离不完全**:Namespace 主要提供逻辑隔离,物理资源(如节点)仍可能被多个 Namespace 共享。
- **跨 Namespace 访问**:Service 可以通过 `<service-name>.<namespace-name>.svc.cluster.local` 的形式跨 Namespace 访问。
- **删除 Namespace**:删除 Namespace 会同时删除其中的所有资源,需谨慎操作。
### 总结
Namespace 是 Kubernetes 中实现资源隔离和管理的重要工具,适用于多团队协作、多环境部署等场景。通过合理使用 Namespace,可以提高集群的资源利用率和安全性。
二、实战部署(企业资源限制)
[root@master ns]# cat ns-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-quota
namespace: test
spec:
hard:
requests.cpu: 2
requests.memory: 2Gi
limits.cpu: 4
limits.memory: 4Gi
[root@master ns]# kubectl apply -f ns-quota.yaml
resourcequota/mem-cpu-quota created
[root@master ns]# kubectl get resourcequota -n test
NAME AGE REQUEST LIMIT
mem-cpu-quota 9s requests.cpu: 0/2, requests.memory: 0/2Gi limits.cpu: 0/4, limits.memory: 0/4Gi
[root@master ns]# kubectl apply -f pod-test.yaml
pod/pod-test created
[root@master ns]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
pod-test 1/1 Running 0 4s
[root@master ns]# cat pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test
namespace: test
labels:
app: tomcat-pod-test
spec:
containers:
- name: tomcat-test
image: docker.io/xianchao/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
resources:
limits:
memory: "2Gi"
cpu: "2"
requests:
memory: "100Mi"
cpu: "500m
以下是对你提供的代码和操作的详细解释:
---
### 1. **创建 ResourceQuota**
#### 代码:
```yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-quota
namespace: test
spec:
hard:
requests.cpu: 2
requests.memory: 2Gi
limits.cpu: 4
limits.memory: 4Gi
```
#### 解释:
- **ResourceQuota** 是 Kubernetes 中用于限制 Namespace 资源使用的对象。
- 这个 ResourceQuota 的名称为 `mem-cpu-quota`,作用于 `test` Namespace。
- **`hard`** 字段定义了资源配额的限制:
- `requests.cpu: 2`:Namespace 中所有 Pod 的 CPU 请求总量不能超过 2 个 CPU 核心。
- `requests.memory: 2Gi`:Namespace 中所有 Pod 的内存请求总量不能超过 2 GiB。
- `limits.cpu: 4`:Namespace 中所有 Pod 的 CPU 限制总量不能超过 4 个 CPU 核心。
- `limits.memory: 4Gi`:Namespace 中所有 Pod 的内存限制总量不能超过 4 GiB。
#### 操作:
```bash
kubectl apply -f ns-quota.yaml
```
- 使用 `kubectl apply` 命令创建 ResourceQuota。
#### 查看 ResourceQuota:
```bash
kubectl get resourcequota -n test
```
- 输出:
```
NAME AGE REQUEST LIMIT
mem-cpu-quota 9s requests.cpu: 0/2, requests.memory: 0/2Gi limits.cpu: 0/4, limits.memory: 0/4Gi
```
- `REQUEST` 列显示当前 Namespace 中已使用的资源请求量(`0/2` 表示当前没有 Pod 使用 CPU 和内存请求)。
- `LIMIT` 列显示当前 Namespace 中已使用的资源限制量(`0/4` 表示当前没有 Pod 使用 CPU 和内存限制)。
---
### 2. **创建 Pod**
#### 代码:
```yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test
namespace: test
labels:
app: tomcat-pod-test
spec:
containers:
- name: tomcat-test
image: docker.io/xianchao/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
resources:
limits:
memory: "2Gi"
cpu: "2"
requests:
memory: "100Mi"
cpu: "500m"
```
#### 解释:
- 这是一个 Pod 的定义文件,Pod 的名称为 `pod-test`,部署在 `test` Namespace 中。
- 容器名称为 `tomcat-test`,使用镜像 `docker.io/xianchao/tomcat-8.5-jre8:v1`。
- **`resources`** 字段定义了容器的资源请求和限制:
- `requests`:
- `cpu: "500m"`:容器请求 0.5 个 CPU 核心。
- `memory: "100Mi"`:容器请求 100 MiB 内存。
- `limits`:
- `cpu: "2"`:容器最多可以使用 2 个 CPU 核心。
- `memory: "2Gi"`:容器最多可以使用 2 GiB 内存。
#### 操作:
```bash
kubectl apply -f pod-test.yaml
```
- 使用 `kubectl apply` 命令创建 Pod。
#### 查看 Pod:
```bash
kubectl get pod -n test
```
- 输出:
```
NAME READY STATUS RESTARTS AGE
pod-test 1/1 Running 0 4s
```
- Pod 状态为 `Running`,表示已成功创建并运行。
---
### 3. **ResourceQuota 的影响**
- 创建 Pod 后,ResourceQuota 的 `REQUEST` 和 `LIMIT` 会更新:
- `requests.cpu`:增加 0.5(Pod 的 CPU 请求)。
- `requests.memory`:增加 100Mi(Pod 的内存请求)。
- `limits.cpu`:增加 2(Pod 的 CPU 限制)。
- `limits.memory`:增加 2Gi(Pod 的内存限制)。
- 如果后续创建的 Pod 导致资源使用量超过 ResourceQuota 的限制,Kubernetes 会拒绝创建 Pod,并返回错误。
---
### 4. **总结**
- **ResourceQuota** 用于限制 Namespace 中资源的使用总量。
- **Pod 的 `resources` 字段** 定义了容器的资源请求和限制。
- Kubernetes 会根据 ResourceQuota 和 Pod 的资源需求进行调度和限制。
- 通过合理设置 ResourceQuota 和 Pod 的资源请求/限制,可以避免资源浪费和争用,提高集群的稳定性和资源利用率。
---
如果你有其他问题,欢迎继续提问!