> For the complete documentation index, see [llms.txt](https://atomoh.gitbook.io/kubernetes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://atomoh.gitbook.io/kubernetes/cn/ce-yan-ji-he/quizzes/03-services-networking-quiz.md).

# 服务和网络测验

本测验测试你对 Kubernetes 网络概念的理解，包括 Service 类型、Ingress、NetworkPolicy 和 Service discovery。

## 选择题

1. Kubernetes 中默认的 Service 类型是什么？
   * A) NodePort
   * B) LoadBalancer
   * C) ClusterIP
   * D) ExternalName

<details>

<summary>显示答案</summary>

**答案: C) ClusterIP**

**解析:** ClusterIP 是 Kubernetes 中默认的 Service 类型，它提供一个只能在集群内部访问的 IP 地址。该 Service 允许集群内的其他应用访问此 Service，但无法从集群外部访问。

</details>

2. 哪个 API 对象会将集群外部的 HTTP 和 HTTPS 路由暴露给集群内的 Service？
   * A) Service
   * B) Ingress
   * C) Endpoint
   * D) NetworkPolicy

<details>

<summary>显示答案</summary>

**答案: B) Ingress**

**解析:** Ingress 是一个 API 对象，它会将集群外部的 HTTP 和 HTTPS 路由暴露给集群内的 Service。Ingress 提供负载均衡、SSL 终止以及基于名称的虚拟主机。

</details>

3. 以下哪一项不是 Kubernetes 提供的 Service discovery 方法？
   * A) 环境变量
   * B) DNS
   * C) Service Mesh
   * D) ConfigMap

<details>

<summary>显示答案</summary>

**答案: D) ConfigMap**

**解析:** Kubernetes 提供两种主要的 Service discovery 方法：环境变量和 DNS。ConfigMap 用于存储配置数据，并不是 Service discovery 机制。

</details>

4. Kubernetes 中哪种 Service 类型使 Service 可以通过所有节点上的特定端口访问？
   * A) ClusterIP
   * B) NodePort
   * C) LoadBalancer
   * D) ExternalName

<details>

<summary>显示答案</summary>

**答案: B) NodePort**

**解析:** NodePort Service 使 Service 可以通过所有节点上的特定端口访问。此 Service 类型允许通过每个节点的 IP 地址和 NodePort 值（默认分配范围为 30000-32767）访问该 Service。

</details>

5. 哪种 Service 没有集群 IP，并为每个 Pod 创建 DNS 记录？
   * A) NodePort Service
   * B) LoadBalancer Service
   * C) Headless Service
   * D) ExternalName Service

<details>

<summary>显示答案</summary>

**答案: C) Headless Service**

**解析:** Headless Service 是配置了 `clusterIP: None` 的 Service，它不会分配集群 IP，并会为每个 Pod 创建 DNS 记录。当客户端需要直接访问该 Service 后面的特定 Pod 时，这非常有用。

</details>

6. 哪种资源提供了在 Kubernetes 中控制 Pod 之间通信的方式？
   * A) Service
   * B) Ingress
   * C) NetworkPolicy
   * D) EndpointSlice

<details>

<summary>显示答案</summary>

**答案: C) NetworkPolicy**

**解析:** NetworkPolicy 提供了控制 Pod 之间通信的方式。使用 NetworkPolicy，你可以限制 Pod 之间的入站和出站流量。

</details>

7. Kubernetes 集群使用什么作为 DNS 服务器？
   * A) kube-dns
   * B) CoreDNS
   * C) NodeDNS
   * D) ClusterDNS

<details>

<summary>显示答案</summary>

**答案: B) CoreDNS**

**解析:** CoreDNS 是一个灵活且可扩展的 DNS 服务器，用作 Kubernetes 集群的 DNS 服务器。自 Kubernetes 1.11 起，CoreDNS 一直作为默认 DNS 服务器使用。

</details>

8. Cilium 利用了哪种 Linux 内核技术？
   * A) iptables
   * B) netfilter
   * C) eBPF
   * D) nftables

<details>

<summary>显示答案</summary>

**答案: C) eBPF**

**解析:** Cilium 利用 Linux 内核的 eBPF（extended Berkeley Packet Filter）技术，为容器化应用提供网络连接、安全性和可观测性。

</details>

9. 以下哪一项不是 Service Mesh 的主要功能？
   * A) Service discovery
   * B) 负载均衡
   * C) 提供持久化存储
   * D) 加密通信

<details>

<summary>显示答案</summary>

**答案: C) 提供持久化存储**

**解析:** Service Mesh 是一个基础设施层，用于管理微服务之间的通信，提供 Service discovery、负载均衡、加密、身份认证、授权和可观测性等功能。提供持久化存储并不是 Service Mesh 的主要功能。

</details>

10. Kubernetes 中哪种 Service 类型为外部服务提供别名？
    * A) ClusterIP
    * B) NodePort
    * C) LoadBalancer
    * D) ExternalName

<details>

<summary>显示答案</summary>

**答案: D) ExternalName**

**解析:** ExternalName Service 为外部服务提供别名。此 Service 类型将一个 DNS 名称映射到外部服务的 DNS 名称。

</details>

## 简答题

1. Kubernetes 中用于存储 Service 指向的 Pod 的 IP 地址和端口的资源名称是什么？

<details>

<summary>显示答案</summary>

**答案: Endpoints**

**解析:** Endpoints 是一种资源，用于存储 Service 指向的 Pod 的 IP 地址和端口。当存在与 Service 的 selector 匹配的 Pod 时，Kubernetes 会自动创建和管理 Endpoint 对象。

</details>

2. 在 AWS EKS 中用于预置 Application Load Balancer 的 Ingress controller 名称是什么？

<details>

<summary>显示答案</summary>

**答案: AWS ALB Ingress Controller**

**解析:** AWS ALB Ingress Controller 是在 AWS EKS 中用于预置 Application Load Balancer 的 Ingress controller。该 controller 会将 Kubernetes Ingress 资源转换为 AWS ALB。

</details>

3. Kubernetes 中继承 Pod 运行所在节点 DNS 设置的 Pod DNS policy 名称是什么？

<details>

<summary>显示答案</summary>

**答案: Default**

**解析:** `Default` DNS policy 会继承 Pod 运行所在节点的 DNS 设置。这意味着 Pod 会原样使用节点的 `/etc/resolv.conf` 文件。

</details>

4. Cilium 使用 eBPF 监控网络流并排查问题的可观测性层名称是什么？

<details>

<summary>显示答案</summary>

**答案: Hubble**

**解析:** Hubble 是 Cilium 的可观测性层，它使用 eBPF 监控网络流并排查问题。Hubble 提供网络流监控、Service 依赖关系映射、安全观测、性能分析和故障排查等功能。

</details>

5. Kubernetes 中作为 Endpoints 的可扩展替代方案、在大型集群中提供更好性能的资源名称是什么？

<details>

<summary>显示答案</summary>

**答案: EndpointSlice**

**解析:** EndpointSlice 是 Endpoints 的可扩展替代方案，在大型集群中提供更好的性能。EndpointSlice 通过将 endpoint 拆分为多个 slice 进行管理，从而提升大型 Service 的性能。

</details>

## 进阶题

1. 说明 Service Mesh（例如 Istio）如何用于管理 Kubernetes 中微服务之间的通信及其优势。

<details>

<summary>显示答案</summary>

**答案:**

Service Mesh 是一个基础设施层，用于管理微服务之间的通信，通过以下方式实现：

1. **Sidecar pattern**：Proxy 容器（例如 Envoy）被注入到每个 Pod 中，以拦截并控制所有网络流量。
2. **Control plane**：集中式管理组件（例如 Istio 的 istiod）配置并管理所有 sidecar proxy。
3. **Traffic management**：

```yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
    - match:
      - headers:
          end-user:
            exact: jason
      route:
        - destination:
            host: reviews
            subset: v2
    - route:
      - destination:
          host: reviews
          subset: v1
```

4. **Security policies**：

```yaml
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  selector:
    matchLabels:
      app: httpbin
  action: ALLOW
  rules:
    - from:
      - source:
          principals: ["cluster.local/ns/default/sa/sleep"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["/info*"]
```

**优势**：

1. **Traffic management**：支持高级路由、负载均衡、流量拆分、金丝雀部署等。
2. **Security**：在服务之间提供 mutual TLS (mTLS) 加密、身份认证和授权。
3. **Observability**：通过分布式追踪、指标收集和日志记录监控服务之间的通信。
4. **Resilience**：通过熔断器、重试、超时和故障注入提高系统弹性。
5. **Policy enforcement**：可以应用速率限制、配额和访问控制等策略。
6. **Platform independence**：无需更改应用代码即可添加这些功能。

Service Mesh 抽象了复杂微服务架构中服务间通信的复杂性，使开发人员能够专注于业务逻辑。

</details>

2. 说明与传统网络方法（例如 iptables）相比，Cilium 的 eBPF 技术提供的优势，并提出在 AWS EKS 中优化 Cilium 的方法。

<details>

<summary>显示答案</summary>

**答案:**

**Cilium 的 eBPF 技术优势**：

1. **Performance**：eBPF 直接在内核中运行以优化数据包处理路径，相比 iptables 提供高得多的性能。尤其是当规则很多时，iptables 会执行线性搜索，而 eBPF 可以使用哈希表等高效数据结构。
2. **Scalability**：即使在大型集群中，eBPF 也能保持稳定性能。随着规则数量增加，iptables 性能会迅速下降。
3. **Programmability**：eBPF 可以用类 C 语言编程，从而实现复杂的网络逻辑。iptables 只支持有限的规则集。
4. **Observability**：eBPF 可以收集有关网络流的详细指标，有助于故障排查和性能优化。
5. **L7 awareness**：eBPF 可以识别到应用层（L7），从而允许针对 HTTP、gRPC 和 Kafka 等协议制定细粒度策略。

**在 AWS EKS 中优化 Cilium 的方法**：

1. **启用 AWS ENI mode**：

```bash
helm install cilium cilium/cilium \
   --namespace kube-system \
   --set eni.enabled=true \
   --set ipam.mode=eni \
   --set egressMasqueradeInterfaces=eth0 \
   --set tunnel=disabled
```

此配置利用 AWS Elastic Network Interfaces (ENI) 为 Pod 分配 VPC-native IP 地址，并在没有 overlay network 的情况下提供 VPC-native networking。

2. **Node group 优化**：

* 选择提供足够 ENI 和 IP 地址的 instance type（例如 m5.large 或更大）
* 配置适当的最大 Pod 数（因 instance type 而异）

3. **Performance 优化**：

```bash
helm install cilium cilium/cilium \
   --namespace kube-system \
   --set eni.enabled=true \
   --set ipam.mode=eni \
   --set tunnel=disabled \
   --set bpf.masquerade=true \
   --set kubeProxyReplacement=strict \
   --set loadBalancer.mode=dsr \
   --set loadBalancer.acceleration=native
```

此配置替换 kube-proxy，并启用 Direct Server Return (DSR) mode 和原生负载均衡加速。

4. **启用 Hubble**：

```bash
helm upgrade cilium cilium/cilium \
   --namespace kube-system \
   --reuse-values \
   --set hubble.enabled=true \
   --set hubble.relay.enabled=true \
   --set hubble.ui.enabled=true
```

启用 Hubble 以提供网络流监控和故障排查能力。

5. **Cross-cluster connectivity**： 配置 Cilium Cluster Mesh，在多个 EKS 集群之间提供无缝网络连接。
6. **Monitoring 集成**： 设置 Prometheus 和 Grafana 来收集并可视化 Cilium 指标。

这些优化可以在 AWS EKS 中最大化 Cilium 的性能、安全性和可观测性。

</details>

## 结论

通过本测验，你测试了自己对 Kubernetes Service 和 Networking 的理解。涵盖的概念包括 Service 类型、Ingress、NetworkPolicy、Service discovery、CoreDNS 和 Cilium。理解并运用这些概念，可以帮助你构建安全且可扩展的 Kubernetes 应用。
