0

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

从 system.runtime.nodes 中选择 *;

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

部署.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
4

2 回答 2

2

看起来您已经组合了部署和服务的部分;它们是两个不同的对象。你可以打破这个:

---
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

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

于 2018-07-09T22:28:53.000 回答
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 集群最重要的配置discovery-server.enabled=true<presto-home>/etc/config.properties您的 presto 协调器中,或者您的协调器根本无法发现。(又名,不能通过网络拥有外部工作进程)。

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


这是我stable/presto通过运行从图表中得到的helm template .(在标准输出中渲染所有模板)。您需要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:
            {}
于 2018-07-30T13:58:51.127 回答