我有一个使用以下内容创建的正在运行的 Pod
pod-definition.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: microservice-one-pod-name
labels:
app: microservice-one-app-label
type: front-end
spec:
containers:
- name: microservice-one
image: vismarkjuarez1994/microserviceone
ports:
- containerPort: 2019
然后我使用以下
service-definition.yaml
创建了一个服务:
kind: Service
apiVersion: v1
metadata:
name: microserviceone-service
spec:
ports:
- port: 30008
targetPort: 2019
protocol: TCP
selector:
app: microservice-one-app-label
type: NodePort
然后我运行
kubectl describe node minikube
来查找我应该连接到的节点 IP——结果是:
Addresses:
InternalIP: 192.168.49.2
Hostname: minikube
但是当我运行以下curl命令时没有得到任何响应:
curl 192.168.49.2:30008
当我尝试从浏览器访问
192.168.49.2:30008
时,请求也会超时。
pod 日志显示容器已启动并正在运行。为什么我无法访问我的服务?
问题是您尝试通过
port
参数访问您的服务,该参数是暴露服务的内部端口,即使使用 NodePort
类型也是如此。
您要搜索的参数称为
nodePort
,可以选择与 port
和 targetPort
一起指定。引用文档:
默认情况下,为了方便起见,Kubernetes 控制平面将 从某个范围分配端口(默认:
)30000-32767
由于您没有指定
nodePort
,因此会自动选取该范围内的一个。您可以通过以下方式检查哪一个:
kubectl get svc -owide
然后在该端口从外部访问您的服务。
作为替代方案,您可以将服务定义更改为:
kind: Service
apiVersion: v1
metadata:
name: microserviceone-service
spec:
ports:
- port: 30008
targetPort: 2019
nodePort: 30008
protocol: TCP
selector:
app: microservice-one-app-label
type: NodePort
但请记住,您可能需要删除服务并重新创建它才能更改分配的
nodePort
。
我认为您错过了服务中的端口:
apiVersion: v1
kind: Pod
metadata:
name: microservice-one-pod-name
labels:
app: microservice-one-app-label
type: front-end
spec:
containers:
- name: microservice-one
image: vismarkjuarez1994/microserviceone
ports:
- containerPort: 2019
你的服务应该是这样的:
kind: Service
apiVersion: v1
metadata:
name: microserviceone-service
spec:
ports:
- port: 2019
targetPort: 2019
nodePort: 30008
protocol: TCP
selector:
app: microservice-one-app-label
type: NodePort
如果您想尝试使用 Minikube 进行 Ingress,您可以在启用 Minikube ingress 后访问您的应用程序。
minikube addons enable ingress
添加查看标签和添加标签的方式。 给豆荚贴标签是我解决这个问题的方法。
kubectl get pods --show-labels -n mynamespace
kubectl label pod nginx-66bccddb68-8tjpk -n mynamespace app=webserver