我是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超文本传输协议://NodeIP: NodePort返回:
curl:(7)无法连接到NodeIP端口NodePORT:连接被拒绝
正如@Ansil所建议的,如果您想在Service
定义中引用此端口,则应将您的nginx配置为侦听端口8080
。默认情况下,它侦听端口80
。
您不能仅仅通过在您的部署
定义中指定不同的容器端口
来使其侦听不同的端口,例如8080
,如您的示例所示:
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配置为侦听哪个端口。仅此而已。这真的很简单。您将容器端口
更改为8080
,但在您的容器内部实际上没有任何东西侦听这样的端口。
您仍然可以将其公开为Service
(无论声明性还是强制性),但它不会更改任何内容,因为最终它指向容器上的错误端口,在该端口上没有任何监听内容,您将看到类似于以下消息:
curl: (7) Failed to connect to 10.1.2.3 port 30080: Connection refused
在minikube中创建服务后,您可以使用以下命令将服务公开到minikubeVM(主机)的外部
Minikube服务SERVICE_NAME
参考:https://minikube.sigs.k8s.io/docs/reference/commands/service/