【问题标题】:presto - moving worker from docker to kubernetespresto - 将工人从 docker 转移到 kubernetes
【发布时间】:2018-07-30 21:58:51
【问题描述】:

我有一个想要扩展的最小(工作)presto 安装(一个协调器和一个工作器在同一台主机上)。我创建了一个带有工作节点的容器,它在通过 docker 部署时工作(IE 显示在 presto CLI 中)。

从 system.runtime.nodes 中选择 *;

当我移动我的 k8 集群并创建一些 pod 时,这些 pod 似乎可以联系协调器,但它们从未出现在 CLI 中。 pod 的日志显示他们已经发现了协调器,并且协调器日志中没有任何错误消息,所以我不知道断开连接在哪里。

deployment.yaml

apiVersion: apps/v1 
kind: Deployment
metadata:
  name: presto-worker
spec:
  type: NodePort
  selector:
    matchLabels:
      app: presto-worker
  replicas: 2 
  template:
    metadata:
      labels:
        app: presto-worker
    spec:
      containers:
      - name: presto-image
        image: docker.io/mystuff/presto-image:latest
        ports:
        - containerPort: 8080

【问题讨论】:

  • 你的配置不清楚: 1、你创建了服务吗?如果是 - 您能否提供 yaml 文件来查看您的服务配置? 2. 能否请您提供您拥有的日志。 3.阅读您的问题后,我了解到您的协调器主机位于您创建工作节点的集群之外,并且您尚未创建服务/入口以将工作节点暴露给协调器。这就是为什么它在集群中不可见。
  • 我对服务的理解是它一次暴露一个工作人员。这是不正确的吗?各种负载均衡器。
  • 最好分享更多日志或在log.properties 中使用com.facebook.presto=DEBUG 以获得更多反馈来判断哪里出了问题(目前我不知道是你的presto 配置还是presto集群设置)
  • 您是否从这个 repo 中看到了 presto 集群的 k8s 模板? github.com/helm/charts/tree/master/stable/presto/templates

标签: docker kubernetes presto


【解决方案1】:

看起来您已经将部署和服务的部分组合在一起了;它们是两个不同的对象。你可以把它分解:

---
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: presto-worker
spec:
  selector:
    matchLabels:
      app: presto-worker
  replicas: 2 
  template:
    metadata:
      labels:
        app: presto-worker
    spec:
      containers:
      - name: presto-image
        image: docker.io/mystuff/presto-image:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1 
kind: Service
metadata:
  name: presto-worker
spec:
  type: NodePort
  selector:
    matchLabels:
      app: presto-worker
  ports:
  - name: http
    port: 8080

Service 选择器指向特定的 pod;它需要匹配部署规范的 pod 模板标签。 Deployment 选择器命名 Deployment 管理的 pod。在这两种情况下,它们都指向 pod,但它们的用途不同。

【讨论】:

  • 这是否允许同时访问所有 pod?我对服务(在这种情况下)的理解是它提供了负载平衡(某种)。这些 pod 应该是集群的一部分。
  • 您是否尝试过使用@david-maze 方法重新配置?共享您当前的配置和日志。在您的情况下,您需要 NodePort 服务。阅读 NodePort here。 NodePort:在每个节点的 IP 上的静态端口(NodePort)上公开服务。将自动创建 NodePort 服务将路由到的 ClusterIP 服务。您可以通过请求 :. 从集群外部联系 NodePort 服务
  • 我也试过了,但它会禁用胶水目录,然后运行崩溃
【解决方案2】:

这是 presto 的工作 Helm 图表(即 k8s 资源的模板包):https://github.com/helm/charts/tree/master/stable/presto

上图是 k8s 中 presto 集群的基本设计:

  1. 单一协调员。通过 http://:8080 可发现(由工作人员) - 这是您需要为协调器公开的 k8s 服务,以便所有工作人员都可以针对此协调器执行发现(实际上是协调器公开的发现服务)。
  2. 通过 k8s 部署的一些无状态工作者。您不需要公开任何端口或 k8s 服务,因为根本没有外部进程可以访问工作进程。
  3. 使用 k8s configMap 注入自定义的 presto 配置。 presto 集群最重要的配置是您的 presto 协调器的<presto-home>/etc/config.properties 中的discovery-server.enabled=true,或者您的协调器根本无法发现。 (又名,不能通过网络拥有外部工作进程)。

根据这个问题,您需要确保工作进程可以通过 DNS 名称(如 http://my-presto-coordinator:8080)访问 presto 协调器。


这是我通过运行helm template . 从图表stable/presto 得到的(在标准输出中渲染所有模板)。您需要将 RELEASE-NAME 替换为小写字符串才能使用它:

---
# Source: charts/presto/templates/deployment-worker.yaml

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: RELEASE-NAME-presto-worker
  labels:
    app: presto
    chart: presto-0.1
    release: RELEASE-NAME
    heritage: Tiller
    component: worker
spec:
  replicas: 2
  selector:
    matchLabels:
      app: presto
      release: RELEASE-NAME
      component: worker
  template:
    metadata:
      labels:
        app: presto
        release: RELEASE-NAME
        component: worker
    spec:
      volumes:
        - name: config-volume
          configMap:
            name: RELEASE-NAME-presto-worker
      containers:
        - name: presto-worker
          image: "bivas/presto:0.196"
          imagePullPolicy: IfNotPresent
          command: ["/bin/bash"]
          args:
            - /etc/presto/docker-presto.sh
          volumeMounts:
            - mountPath: /etc/presto
              name: config-volume
          livenessProbe:
            exec:
              command:
                - /bin/bash
                - /etc/presto/health_check.sh
            initialDelaySeconds: 10
            periodSeconds: 25
          readinessProbe:
            exec:
              command:
                - /bin/bash
                - /etc/presto/health_check.sh
            initialDelaySeconds: 5
            periodSeconds: 10
          resources:
            {}

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多