如何在Kubernetes中使用NodePort服务在公共IP上公开nginx?

时间:2018-02-18 22:04:28

标签: kubernetes containers kubectl

我正在执行kubectl create -f nginx.yaml,这会成功创建广告连播。但PODS并未在我的实例的公共IP上公开。以下是使用YAML作为nodeport的服务类型:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30080
      name: http
    - port: 443
      nodePort: 30443
      name: https
  selector:
    name: nginx

在我的方法或YAML文件之上有什么可能是不正确的,以便在部署到公共IP时暴露pod?

PS:防火墙和ACL在所有TCP上对互联网开放

2 个答案:

答案 0 :(得分:1)

Jeel是对的。您的服务选择器与Pod标签不匹配。

如果你像杰尔已经在这个答案中添加的那样解决了这个问题

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30080
      name: http
  selector:
    name: nginx

您的服务将以节点IP地址公开。因为您的服务类型是NodePort。

如果您的节点IP是35.226.16.207,您可以使用此IP和NodePort连接到您的Pod

$ curl 35.226.16.207:30080

在这种情况下,您的节点必须具有公共IP。否则,您无法访问

第二个选项,您可以创建LoadBalancer类型服务

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  type: LoadBalancer
  ports:
    - port: 80
      name: http
  selector:
    name: nginx

这将为您提供公共IP。

有关详细信息,请check this

答案 1 :(得分:0)

端点没有被添加。在调试时,我发现部署和服务之间的标签不匹配。因此将标签类型从“app”更改为“name”并且它有效。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30080
      name: http
  selector:
    name: nginx