简介
在 Kubernetes 中,Pod 是短暂的,随时可能被终止并重新创建。这给网络连接带来了挑战,因为直接连接到某个特定的 Pod 非常困难。为了解决这个问题,Kubernetes 提供了一种更高级的抽象,称为 Service。Service 为一组 Pod 提供了一个稳定的 IP 地址和 DNS 名称,使得其他组件能够轻松地与它们建立连接。在本实验中,你将学习如何在 Kubernetes 中通过 Service 实现 Pod 的网络互联。
启动 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 来重置环境。
创建 Pod
第一步是创建一个简单的 Pod。创建一个名为 /home/labex/project/myapp-pod.yaml 的文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: my-pod-1
labels:
app: nginx
spec:
containers:
- name: my-container
image: nginx
保存文件并通过运行以下命令创建 Pod:
minikube kubectl -- apply -f /home/labex/project/myapp-pod.yaml
这将创建一个名为 my-pod-1 的 Pod,其中包含一个运行 Nginx 镜像的容器。
创建 Service
第二步是创建一个 Service,将其指向你在上一步中创建的 Pod。创建一个名为 /home/labex/project/service.yaml 的文件,内容如下:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
保存文件并通过运行以下命令创建 Service:
minikube kubectl -- apply -f /home/labex/project/service.yaml
这将创建一个名为 my-service 的 Service,它会定位标签为 app=nginx 的 Pod,并将 80 端口暴露出来。
测试 Service
第三步是通过从另一个 Pod 访问 Service 来进行测试。创建一个名为 /home/labex/project/test-pod-1.yaml 的文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: test-pod-1
spec:
containers:
- name: my-container
image: busybox
command:
- sleep
- "3600"
保存文件并通过运行以下命令创建测试 Pod:
minikube kubectl -- apply -f /home/labex/project/test-pod-1.yaml
这将创建一个名为 test-pod-1 的 Pod,其中包含一个运行 Busybox 镜像的容器。
接下来,使用 wget 从 Busybox Pod 访问该 Service:
minikube kubectl -- exec test-pod-1 -- wget -qO- http://my-service
该命令会返回默认的 Nginx 页面,表明 Service 工作正常。
更新 Service
第四步是更新 Service,使其指向另一组 Pod。将 /home/labex/project/service.yaml 文件中的 selector 字段更新为以下内容:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: busybox
ports:
- name: http
port: 80
targetPort: 80
保存文件并通过运行以下命令更新 Service:
minikube kubectl -- apply -f /home/labex/project/service.yaml
这将更新 Service,使其指向标签为 app=busybox 的 Pod。此时,该 Service 没有端点(endpoints),因为目前还没有任何 Pod 使用该标签。
测试更新后的 Service
第五步是通过从另一个 Pod 访问更新后的 Service 来进行测试。使用以下命令创建一个新的测试 Pod:
minikube kubectl -- run my-pod-2 --image=busybox --restart=Never -- sleep 3600
这将创建一个名为 my-pod-2 的新 Pod,其中包含一个运行 Busybox 镜像的容器。
在更改任何标签之前,确认 Service 没有匹配的端点:
minikube kubectl -- get endpoints my-service
输出应显示 <none>,因为目前没有任何 Pod 拥有 app=busybox 标签。
出现这种情况是因为 Service 选择器现在查找的是 app=busybox,但你的 Nginx 服务器 Pod 仍然标记为 app=nginx。要解决这个问题,请重新标记原始服务器 Pod,以便 Service 再次指向 Nginx 容器。
运行以下命令更新服务器 Pod 的标签:
minikube kubectl -- label pod my-pod-1 app=busybox --overwrite
这会更新 my-pod-1 上的标签,使其与 Service 选择器匹配。
现在从 my-pod-2 再次测试该 Service:
minikube kubectl -- exec my-pod-2 -- wget -qO- http://my-service
该命令应该会再次返回默认的 Nginx 页面,表明 Service 已恢复正常工作。
总结
在本实验中,你学习了如何在 Kubernetes 中通过 Service 实现 Pod 的网络互联。你创建了一个 Nginx Pod,通过 Service 将其暴露出来,并从 Busybox 客户端 Pod 对该 Service 进行了测试。你还更新了 Service 选择器并重新标记了原始的 Nginx Pod,使 Service 能够再次指向正常工作的 Web 服务器。Service 是 Kubernetes 网络中的核心组件,它使你能够以可靠且可扩展的方式连接到 Pod。


