繁体   English   中英

将 kube.netes pod 暴露给 inte.net

[英]expose kubernetes pod to internet

我使用 yml 文件在 kube.neters 中创建了一个带有 api 和 web docker 容器的 pod(见下文)。

apiVersion: v1
kind: Pod
metadata: 
  name: test
  labels:
    purpose: test
spec:
  containers:
  - name: api
    image: gcr.io/test-1/api:latest
    ports:
      - containerPort: 8085
        name: http
        protocol: TCP
  - name: web
    image: gcr.io/test-1/web:latest
    ports:
      - containerPort: 5000
        name: http
        protocol: TCP

它显示我的 pod 已启动并正在运行

NAME       READY     STATUS    RESTARTS   AGE
test   2/2       Running   0          5m

但我不知道如何从这里公开它。

看起来很奇怪我必须再次运行 kubectl run.... 因为 pod 已经在运行了。 它没有显示部署。

如果我尝试类似的东西

kubectl expose deployment test --type="NodePort"--port 80 --target-port 5000

它抱怨 deployments.extensions“未找到测试”。从这里部署的最干净的方法是什么?

要将部署公开到公共Internet,您将需要使用服务。 服务类型LoadBalancer可以很好地处理此问题,因为您可以仅在yaml文件中使用pod选择器。

因此,如果我的deployment.yaml看起来像这样:

kind: Deployment
apiVersion: apps/v1beta2
metadata:
  name: test-dply
spec:
  selector:
    # Defines the selector that can be matched by a service for this 
deployment
    matchLabels:
       app: test_pod
  template:
    metadata:
      labels:
        # Puts the label on the pod, this must match the matchLabels 
selector
        app: test_pod
    spec:
      # Our containers for training each model
      containers:
      - name: mycontainer
        image: myimage
        imagePullPolicy: Always
        command: ["/bin/bash"]
        ports:
        - name: containerport
          containerPort: 8085

然后,链接到它的服务是:

kind: Service
apiVersion: v1
metadata:
  # Name of our service
  name: prodigy-service
spec:
  # LoadBalancer type to allow external access to multiple ports
  type: LoadBalancer
  selector:
    # Will deliver external traffic to the pod holding each of our containers
    app: test_pod
  ports:
    - name: sentiment
      protocol: TCP
      port: 80
      targetPort: containerport

您可以通过使用kubectl create -f /path/to/dply.yamlkubectl create -f /path/to/svc.yaml来部署这两项。 快速说明:该服务将分配一个公共IP地址,您可以使用kubectl get services找到以下地址:

NAME                    TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
carbon-relay            ClusterIP      *.*.*.*    <none>           2003/TCP                     78d
comparison-api          LoadBalancer   *.*.*.*    *.*.*.*     80:30920/TCP                 15d

分配IP可能需要几分钟,这只是一个警告。 但是LoadBalancer的IP是固定的,您可以删除它指向的Pod,然后重新旋转它而不会产生任何后果。 因此,如果要编辑test.dply,可以不必担心服务受到影响。 您很少需要缩减服务

您已创建一个Pod,而不是一个部署。 然后,您公开了一个部署(而不是您的Pod)。 尝试:

kubectl公开pod测试--type = NodePort --port = 80 --target-port = 5000

kubectl expose pod test --type=LoadBalancer --port=XX --target-port=XXXX

如果你已经有 pod 和服务在运行,你可以为你想暴露给 inte.net 的服务创建一个入口。

如果您想通过控制台创建它,谷歌云提供了从现有服务创建入口的非常简单的方法。 Go到Services and Ingress选项卡,select服务,点击create ingress,填写name等必填项。

或者您可以使用 yaml 文件创建

apiVersion: "networking.k8s.io/v1"
kind: "Ingress"
metadata:
  name: "example-ingress"
  namespace: "default"
spec:
  defaultBackend:
    service:
      name: "example-service"
      port:
        number: 8123
status:
  loadBalancer: {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM