介绍
在本实验中,你将学习如何使用 Ingress 将外部流量路由到 Kubernetes 集群中运行的服务。
Kubernetes Ingress 是管理 Kubernetes 集群中服务外部访问的强大工具。Ingress 充当第 7 层负载均衡器,允许你根据传入的 URL 路径或主机名将流量路由到不同的服务。
在本实验中,我们将创建一个示例应用程序,并使用 Ingress 将其暴露给外部世界。我们将使用 nginx-ingress 作为 Ingress 控制器,这是 Kubernetes Ingress 中流行且广泛使用的解决方案。
启动 Minikube 集群
在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。
导航到工作目录:
打开终端并导航到默认的项目文件夹:
cd /home/labex/project启动 Minikube:
启动 Minikube 以初始化一个 Kubernetes 集群:
minikube start- 此命令将在你的本地机器上设置一个单节点的 Kubernetes 集群。
- 根据系统性能,Minikube 可能需要几分钟才能启动。
验证 Minikube 是否正在运行:
检查 Minikube 集群的状态:
minikube status- 查找
kubelet和apiserver等组件是否显示为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 网络功能的开始,我们鼓励你进一步探索。


