介绍
在 Kubernetes 中,Pod 是短暂的,可以随时被终止和重新创建。这在网络方面带来了挑战,因为直接连接到 Pod 是很困难的。为了解决这个问题,Kubernetes 提供了一个更高层次的抽象,称为 Service。Service 为一组 Pod 提供了一个稳定的 IP 地址和 DNS 名称,使得其他组件可以轻松地连接到它们。在本实验中,你将学习如何在 Kubernetes 中使用 Service 进行 Pod 的网络连接。
在 Kubernetes 中,Pod 是短暂的,可以随时被终止和重新创建。这在网络方面带来了挑战,因为直接连接到 Pod 是很困难的。为了解决这个问题,Kubernetes 提供了一个更高层次的抽象,称为 Service。Service 为一组 Pod 提供了一个稳定的 IP 地址和 DNS 名称,使得其他组件可以轻松地连接到它们。在本实验中,你将学习如何在 Kubernetes 中使用 Service 进行 Pod 的网络连接。
在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。
导航到工作目录:
打开终端并导航到默认的项目文件夹:
cd /home/labex/project
启动 Minikube:
启动 Minikube 以初始化一个 Kubernetes 集群:
minikube start
验证 Minikube 是否正在运行:
检查 Minikube 集群的状态:
minikube status
kubelet 和 apiserver 等组件是否显示为 Running。minikube start。如果启动 Minikube 时遇到问题,可以使用 minikube delete 来重置环境(如有需要)。
第一步是创建一个简单的 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:
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:
kubectl apply -f /home/labex/project/service.yaml
这将创建一个名为 my-service 的 Service,该 Service 会指向带有标签 app=nginx 的 Pod,并暴露端口 80。
第三步是通过从另一个 Pod 访问 Service 来测试其功能。创建一个名为 /home/labex/project/test-pod-1.yaml 的文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: test-pod-1
spec:
containers:
- name: my-container
image: nginx
command:
- sleep
- "3600"
保存文件后,运行以下命令来创建测试 Pod:
kubectl apply -f /home/labex/project/test-pod-1.yaml
这将创建一个名为 test-pod-1 的 Pod,其中包含一个运行 Busybox 镜像的容器。
接下来,你需要进入容器并使用 curl 访问 Service。运行以下命令以进入容器:
kubectl exec -it test-pod-1 -- sh
这将打开容器内的 shell。在 shell 中,运行以下命令以访问 Service:
curl http://my-service
这将返回默认的 Nginx 页面,表明 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: 8
保存文件后,运行以下命令以更新 Service:
kubectl apply -f service.yaml
这将更新 Service,使其指向带有标签 app=busybox 的 Pod。
第五步是从另一个 Pod 访问更新后的 Service,以对其进行测试。使用以下命令创建一个新的测试 Pod:
kubectl run my-pod-2 --image=busybox --restart=Never -- sleep 3600
这将创建一个名为 my-pod-2 的新 Pod,其中包含一个运行 Busybox 镜像的容器。
进入容器并使用 curl 访问 Service,就像你在步骤 3 中所做的那样。运行以下命令进入容器:
kubectl exec -it my-pod-2 -- sh
这一次,你应该会收到一个错误,表明连接被拒绝。
这是因为 Service 现在指向的是与测试 Pod 运行的 Pod 不同的 Pod 集。要解决这个问题,你可以更新 Pod 的标签,使其与 Service 中的新选择器匹配。
运行以下命令更新测试 Pod 的标签:
kubectl label pod my-pod-2 app=busybox
这将为测试 Pod 添加标签 app=busybox。
现在,如果你再次运行 curl 命令,你应该会得到默认的 Nginx 页面,这表明 Service 正在正常工作。
在本实验中,你学习了如何在 Kubernetes 中使用 Service 进行 Pod 的网络连接。你创建了一个运行 Nginx 镜像的简单 Pod,创建了一个 Service 以指向该 Pod,并通过从另一个 Pod 访问 Service 来测试其功能。你还学习了如何更新 Service 以指向另一组 Pod,以及如何更新 Pod 的标签以匹配 Service 中的新选择器。Service 是 Kubernetes 网络中的重要组件,它使你能够以可靠且可扩展的方式连接到 Pod。