使用 minikube 访问 kubernetes 集群外的应用程序
Accessing app outside kubernetes cluster with minikube
我是 kubernetes 的新手,我正在尝试使用 minikube 学习它,但我在访问集群外的应用程序时遇到了问题。我创建了一个部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 8080
要访问它,我需要装饰性地或强制性地公开它。它以命令式的方式工作:
kubectl expose deployment nginx-deployment --port 80 --type NodePort
当我以声明方式创建服务时,我总是以 连接被拒绝错误结束 :
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
type : NodePort
ports:
- port : 8080
nodePort : 30018
protocol : TCP
selector:
app: nginx
curl -k http://NodeIP:NodePort returns :
curl: (7) Failed to connect to Node IP port NodePORT: Connection
refused
在 minikube 中创建服务后,您可以使用命令
将服务公开到 minikube VM(主机)的外部
minikube service SERVICE_NAME
参考:https://minikube.sigs.k8s.io/docs/reference/commands/service/
正如@Ansil 所建议的,如果您想在 Service
定义中引用此端口,则应将 nginx 配置为侦听端口 8080
.默认情况下,它在端口 80
上侦听。
您不能像 8080
那样简单地通过在您的 Deployment
定义中指定不同的 containerPort
来使其在不同的端口上侦听,如您的示例所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 8080
您可以通过附加到这样的 Pod
:
轻松自行验证
kubectl exec -ti <nginx-pod-name> -- /bin/bash
到达那里后,运行:
ss -ntlp
并且您应该看到您的 nginx 实际侦听的端口。
此外,您还可以:
cat /etc/nginx/conf.d/default.conf
它还会告诉您 nginx 配置为监听哪个端口。就这样。这真的很简单。您将 containerPort
更改为 8080
但在您的容器中实际上没有任何内容在该端口上侦听。
您仍然可以将其公开为 Service
(无论是声明式还是命令式),但它不会改变任何内容,因为它最终会指向您容器上的错误端口,在该端口上没有任何监听并且您'您会看到与此类似的消息:
curl: (7) Failed to connect to 10.1.2.3 port 30080: Connection refused
我是 kubernetes 的新手,我正在尝试使用 minikube 学习它,但我在访问集群外的应用程序时遇到了问题。我创建了一个部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 8080
要访问它,我需要装饰性地或强制性地公开它。它以命令式的方式工作:
kubectl expose deployment nginx-deployment --port 80 --type NodePort
当我以声明方式创建服务时,我总是以 连接被拒绝错误结束 :
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
type : NodePort
ports:
- port : 8080
nodePort : 30018
protocol : TCP
selector:
app: nginx
curl -k http://NodeIP:NodePort returns :
curl: (7) Failed to connect to Node IP port NodePORT: Connection refused
在 minikube 中创建服务后,您可以使用命令
将服务公开到 minikube VM(主机)的外部minikube service SERVICE_NAME
参考:https://minikube.sigs.k8s.io/docs/reference/commands/service/
正如@Ansil 所建议的,如果您想在 Service
定义中引用此端口,则应将 nginx 配置为侦听端口 8080
.默认情况下,它在端口 80
上侦听。
您不能像 8080
那样简单地通过在您的 Deployment
定义中指定不同的 containerPort
来使其在不同的端口上侦听,如您的示例所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 8080
您可以通过附加到这样的 Pod
:
kubectl exec -ti <nginx-pod-name> -- /bin/bash
到达那里后,运行:
ss -ntlp
并且您应该看到您的 nginx 实际侦听的端口。
此外,您还可以:
cat /etc/nginx/conf.d/default.conf
它还会告诉您 nginx 配置为监听哪个端口。就这样。这真的很简单。您将 containerPort
更改为 8080
但在您的容器中实际上没有任何内容在该端口上侦听。
您仍然可以将其公开为 Service
(无论是声明式还是命令式),但它不会改变任何内容,因为它最终会指向您容器上的错误端口,在该端口上没有任何监听并且您'您会看到与此类似的消息:
curl: (7) Failed to connect to 10.1.2.3 port 30080: Connection refused