【问题标题】:Kubernetes - connect to cassandra from job to different podKubernetes - 从工作连接到 cassandra 到不同的 pod
【发布时间】:2020-11-20 00:09:24
【问题描述】:

当我尝试执行以下命令时

["/bin/sh", "-c", "cqlsh cassandra.my-namespace.svc.cluster.local -f /path/to/schema.cql"]

在我的工作中,我收到以下错误:

Traceback (most recent call last):
  File "/usr/bin/cqlsh.py", line 2443, in <module>
    main(*read_options(sys.argv[1:], os.environ))
  File "/usr/bin/cqlsh.py", line 2421, in main
    encoding=options.encoding)
  File "/usr/bin/cqlsh.py", line 485, in __init__
    load_balancing_policy=WhiteListRoundRobinPolicy([self.hostname]),
  File "/usr/share/cassandra/lib/cassandra-driver-internal-only-3.11.0-bb96859b.zip/cassandra-driver-3.11.0-bb96859b/cassandra/policies.py", line 417, in __init__
socket.gaierror: [Errno -2] Name or service not known

我的 Job 被定义为带有 post-install 注释的 Helm Hook。我的 Cassandra Pod 是使用 StatefulSet 定义的。

kind: StatefulSet
metadata:
  name: cassandra
spec:
  serviceName: cassandra
  replicas: 1
  template:
    metadata:
      labels:
        app: cassandra
    spec:
      containers:
        - name: cassandra
          image: cassandra:3
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 7000
              name: intra-node
            - containerPort: 7001
              name: tls-intra-node
            - containerPort: 7199
              name: jmx
            - containerPort: 9042
              name: cql
          env:
            - name: CASSANDRA_SEEDS
              value: cassandra-0.cassandra.default.svc.cluster.local
            - name: MAX_HEAP_SIZE
              value: 256M
            - name: HEAP_NEWSIZE
              value: 100M
            - name: CASSANDRA_CLUSTER_NAME
              value: "Cassandra"
            - name: CASSANDRA_DC
              value: "DC1"
            - name: CASSANDRA_RACK
              value: "Rack1"
            - name: CASSANDRA_ENDPOINT_SNITCH
              value: GossipingPropertyFileSnitch
          volumeMounts:
            - name: cassandra-data
              mountPath: /var/lib/cassandra/data
  volumeClaimTemplates:
    - metadata:
        name: cassandra-data
        annotations:  # comment line if you want to use a StorageClass
          # or specify which StorageClass
          volume.beta.kubernetes.io/storage-class: ""   # comment line if you
          # want to use a StorageClass or specify which StorageClass
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

这是我的服务:

kind: Service
metadata:
  labels:
    app: cassandra
  name: cassandra
spec:
  clusterIP: None
  ports:
    - port: 9042
  selector
    app: cassandra

当我从容器手动运行cqlsh 命令时,一切正常。不幸的是,自动化解决方案引发了上述错误。

我是否在服务配置中遗漏了什么?我认为自从我从 Job 创建的 Pod 连接到服务后,它应该可以工作。

编辑: 工作看起来像这样:

apiVersion: batch/v1
kind: Job
metadata:
  name: init-db
spec:
  template:
    metadata: 
      name: init-db
      annotations: 
        "helm.sh/hooks": postn-install
    spec:
      containers:
      - name: cqlsh
        image: <cassandra-image>
        command: ["/bin/sh", "-c", "cqlsh cassandra.my-namespace.svc.cluster.local -f /path/to/schema.cql"]
        volumeMounts:
        - name: cass-init
          mountPath: /etc/config
    volumes:
      ...

这是etc/resolv.conf的输出:

nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndtos:5

【问题讨论】:

  • 你能分享一下job pod中/etc/resolv.conf的内容吗?
  • 我不能进入容器,因为它已经压碎了
  • 你可以直接执行 cat /etc/resolv.conf 命令来查看内容
  • 您的安装后工作如何,请分享sn-p。
  • @ArghyaSadhu 我已经添加了 resolv.conf 和 job yaml

标签: kubernetes cassandra cqlsh


【解决方案1】:

您发布的错误表明无论您在何处运行 cqlsh 命令,它都无法解析服务名称。

根据您的 k8s 集群的配置方式和作业运行的位置(在同一个 k8s 集群内或外部),您需要使用 IngressNodePort 公开对 pod 的访问权限。

Aleš Nosek 在his blog post here 中很好地解释了如何访问 pod。干杯!

【讨论】:

  • 我认为它在同一个集群中运行。
【解决方案2】:

由于您是作为服务网格运行的,因此您的设置可能存在一些问题。

首先,我建议为两个 pod 启用特使日志记录:

kubectl exec -it &lt;pod-name&gt; -c istio-proxy -- curl -X POST http://localhost:15000/logging?level=trace

不,请关注 istio sidecar 日志

kubectl logs &lt;pod-name&gt; -c isiot-proxy -f

这可能已经为您提供了一些信息,说明连接失败的原因。

一些想法可能是什么问题:

  1. cassandra 的 pod 没有边车

如果 cassandra pod 没有 sidecar 并且您正在执行 mTLS,它将接收加密流量,但无法解密。这与文档相矛盾,似乎是一个错误。您可以使用 DestinationRule 为流向 cassandra 服务的流量禁用 mTLS:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: cassandra-disable-mtls
spec:
  host: "cassandra-host" #insert correct cassandra name here
  trafficPolicy:
    tls:
      mode: DISABLE
  1. 作业的 pod 没有边车

如果 cassandra pod 有 sidecar,但作业的 pod 没有并且您强制执行 mTLS,则 cassandras sidecar 将拒绝访问,因为流量未加密。您可以将 sidecar 注入作业的 pod(推荐)或为 cassandra 启用 PERMISSIVE 模式,这样 sidecar 将接受 ssl 加密和纯文本流量。

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: cassandra-allow-plain-traffic
spec:
  selector:
    matchLabels:
      app: cassandra
  mtls:
    mode: PERMISSIVE

如果您需要进一步的帮助,请告诉我。

【讨论】:

    【解决方案3】:

    statefulset 没有选择器,因此有问题的 YAML 不起作用。如果您使用下面的 YAML ,它也可以工作并连接到作业。一切都将部署在默认命名空间中。您需要使用适当的存储类(以下示例使用标准) 您可以从 here 关注 cassandra 部署

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cassandra
    spec:
      serviceName: cassandra
      replicas: 1
      selector:
        matchLabels:
          app: cassandra
      template:
        metadata:
          labels:
            app: cassandra
        spec:
          containers:
            - name: cassandra
              image: cassandra:3
              imagePullPolicy: IfNotPresent
              ports:
                - containerPort: 7000
                  name: intra-node
                - containerPort: 7001
                  name: tls-intra-node
                - containerPort: 7199
                  name: jmx
                - containerPort: 9042
                  name: cql
              env:
                - name: CASSANDRA_SEEDS
                  value: cassandra-0.cassandra.default.svc.cluster.local
                - name: MAX_HEAP_SIZE
                  value: 256M
                - name: HEAP_NEWSIZE
                  value: 100M
                - name: CASSANDRA_CLUSTER_NAME
                  value: "Cassandra"
                - name: CASSANDRA_DC
                  value: "DC1"
                - name: CASSANDRA_RACK
                  value: "Rack1"
                - name: CASSANDRA_ENDPOINT_SNITCH
                  value: GossipingPropertyFileSnitch
              volumeMounts:
                - name: cassandra-data
                  mountPath: /var/lib/cassandra/data
      volumeClaimTemplates:
        - metadata:
            name: cassandra-data
          spec:
            accessModes: ["ReadWriteOnce"]
            storageClassName: standard
            resources:
              requests:
                storage: 1Gi
    

    YAML 服务

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: cassandra
      name: cassandra
    spec:
      clusterIP: None
      ports:
      - port: 9042
      selector:
        app: cassandra
    

    Job YAML,该命令已修改为在连接时描述集群并打印所需的集群信息。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: init-db
    spec:
      template:
        metadata: 
          name: init-db
          annotations: 
            "helm.sh/hooks": postn-install
        spec:
          restartPolicy: Never
          containers:
          - name: cqlsh
            image: cassandra:3
            command: ["/bin/sh", "-c", "cqlsh cassandra.default.svc.cluster.local 9042 -e 'describe cluster'"]
    

    【讨论】:

    • 这个我加了,还是不行。
    • 你得到什么错误?因为它对我来说非常好。
    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2019-04-24
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多