介绍
在 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=nginx --restart=Never
这将创建一个名为 test-pod-2
的新 Pod,其中包含一个运行 Busybox 镜像的容器。
像第三步一样,进入容器并使用 curl
访问 Service。这一次,你应该会收到一个连接被拒绝的错误提示。
这是因为 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。