Kubernetes 中使用 Ingress 进行网络配置

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习如何使用 Ingress 将外部流量路由到 Kubernetes 集群中运行的服务。

Kubernetes Ingress 是管理 Kubernetes 集群中服务外部访问的强大工具。Ingress 充当第 7 层负载均衡器,允许你根据传入的 URL 路径或主机名将流量路由到不同的服务。

在本实验中,我们将创建一个示例应用程序,并使用 Ingress 将其暴露给外部世界。我们将使用 nginx-ingress 作为 Ingress 控制器,这是 Kubernetes Ingress 中流行且广泛使用的解决方案。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["`Troubleshooting and Debugging Commands`"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("`Initialization`") kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/create("`Create`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("`Describe`") subgraph Lab Skills kubernetes/initialization -.-> lab-9681{{"`Kubernetes 中使用 Ingress 进行网络配置`"}} kubernetes/get -.-> lab-9681{{"`Kubernetes 中使用 Ingress 进行网络配置`"}} kubernetes/create -.-> lab-9681{{"`Kubernetes 中使用 Ingress 进行网络配置`"}} kubernetes/apply -.-> lab-9681{{"`Kubernetes 中使用 Ingress 进行网络配置`"}} kubernetes/describe -.-> lab-9681{{"`Kubernetes 中使用 Ingress 进行网络配置`"}} end

启动 Minikube 集群

在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。

  1. 导航到工作目录

    打开终端并导航到默认的项目文件夹:

    cd /home/labex/project
  2. 启动 Minikube

    启动 Minikube 以初始化一个 Kubernetes 集群:

    minikube start
    • 此命令将在你的本地机器上设置一个单节点的 Kubernetes 集群。
    • 根据系统性能,Minikube 可能需要几分钟才能启动。
  3. 验证 Minikube 是否正在运行

    检查 Minikube 集群的状态:

    minikube status
    • 查找 kubeletapiserver 等组件是否显示为 Running
    • 如果集群未运行,请重新运行 minikube start

如果启动 Minikube 时遇到问题,可以使用 minikube delete 重置环境(如有需要)。

安装 Nginx Ingress 控制器

首先,我们需要在集群中安装 nginx-ingress 控制器。我们可以通过创建一个 Deployment 和一个 Service 来实现,它们将负责运行 Ingress 控制器。

为 Ingress 控制器创建一个命名空间:

kubectl create namespace ingress-nginx

使用 kubectl 安装 ingress-nginx 的 Helm 图表:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/cloud/deploy.yaml

验证 ingress-nginx 控制器 Pod 是否正在运行:

kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS              RESTARTS   AGE
ingress-nginx-admission-create-zjfqx        0/1     ContainerCreating   0          2s
ingress-nginx-admission-patch-8rvzw         0/1     ContainerCreating   0          2s
ingress-nginx-controller-6bdb654777-qz8fb   0/1     ContainerCreating   0          2s

创建示例应用程序

接下来,我们将创建一个示例应用程序,并通过 Ingress 将其暴露出来。

为示例应用程序创建一个 Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - name: sample-app
        image: nginx
        ports:
        - containerPort: 80

将上述内容保存为名为 sample-app.yaml 的 YAML 文件。使用以下命令将 Deployment 应用到集群中:

kubectl apply -f sample-app.yaml

为示例应用程序创建一个 Service:

apiVersion: v1
kind: Service
metadata:
  name: sample-app
spec:
  selector:
    app: sample-app
  ports:
  - name: http
    port: 80
    targetPort: 80

将上述内容保存为名为 service-sample-app.yaml 的 YAML 文件。使用以下命令将 Service 应用到集群中:

kubectl apply -f service-sample-app.yaml

创建 Ingress 资源

现在我们已经设置了 Ingress 控制器并运行了一个后端服务,接下来可以为 Ingress 资源创建规则。

在本示例中,我们将创建一个简单的规则,将 test.local 域名的流量路由到我们的后端服务:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: test.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: sample-app
            port:
              name: http

将上述内容保存为名为 ingress.yaml 的 YAML 文件。使用以下命令将 Ingress 资源应用到集群中:

kubectl apply -f ingress.yaml

测试 Ingress 资源

最后,我们可以测试 Ingress 资源,以确保一切正常运行。

首先,确定节点的 IP 地址:

kubectl get node -o wide
NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
minikube   Ready    control-plane   93s   v1.26.1   192.168.49.2   <none>        Ubuntu 20.04.5 LTS   5.15.0-56-generic   docker://20.10.23

此命令将获取 Kubernetes 节点的地址,标记为 INTERNAL-IP 的 IP 地址。

接下来,在 /etc/hosts 文件中添加一个条目,将 test.local 域名映射到节点的 IP 地址:

echo "<IP_ADDRESS> test.local" | sudo tee -a /etc/hosts

<IP_ADDRESS> 替换为节点的内部 IP 地址。例如:

echo "192.168.49.2 test.local" | sudo tee -a /etc/hosts

然后,获取 ingress-nginx 的 Service NodePort。

kubectl get services -n ingress-nginx

此命令将显示 ingress-nginx 命名空间中的服务列表。找到 nginx-ingress-controller 服务并记下其 NodePort

NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.104.99.158   <pending>     80:32518/TCP,443:31620/TCP   2m45s
ingress-nginx-controller-admission   ClusterIP      10.100.46.109   <none>        443/TCP                      2m45s

最后,使用 curl 向 Ingress 端点发送 HTTP 请求:

curl test.local:NodePort

例如:

curl test.local:32518

<NodePort> 替换为 nginx-ingress-controller 服务的 NodePort

如果一切设置正确,你应该会看到 Nginx 的欢迎页面。

你还可以通过使用 Web 浏览器访问 test.local:<NodePort>/nginx 来测试 Ingress。

恭喜,你已成功在 Kubernetes 中设置了 Ingress 资源并进行了测试,确保其正常运行。

总结

在本实验中,我们逐步完成了在 Kubernetes 中设置和配置 Nginx Ingress 控制器的过程。我们还创建了一个示例应用程序,并使用 Ingress 将外部流量路由到我们的 Nginx 服务。这只是 Kubernetes 网络功能的开始,我们鼓励你进一步探索。

您可能感兴趣的其他 Kubernetes 教程