Кубернаны - Подключитесь к Кассандре с работы на разные POD -- kubernetes поле с участием cassandra поле с участием cqlsh пол Связанный проблема

Kubernetes - connect to cassandra from job to different pod


2
vote

проблема

русский

Когда я пытаюсь выполнить следующую команду

 <код> properties4  

с моей работы, я получаю следующую ошибку:

 <код> properties5  

Моя работа определяется как HELM-крючок с <Код> properties6 Annotation. Моя кассандра POD определяется с помощью состояния.

 <код> properties7  

И это мой сервис:

 <код> properties8  

Когда я запускаю команду <код> properties9 вручную из контейнера, все работает. К сожалению, автоматизированное решение бросает упомянутую ошибку.

Я что-то упускаю в конфигурации услуг? Я думал, что я подключаюсь к услуге от POD, созданного работой, он должен работать.

Редактировать: Работа выглядит так:

 <код> CREATE TABLE things (   id SERIAL PRIMARY KEY );  CREATE TABLE properties (   thing_id INT,   key TEXT,   value TEXT ); 0  

А вот выход <код> CREATE TABLE things ( id SERIAL PRIMARY KEY ); CREATE TABLE properties ( thing_id INT, key TEXT, value TEXT ); 1 :

 <код> CREATE TABLE things (   id SERIAL PRIMARY KEY );  CREATE TABLE properties (   thing_id INT,   key TEXT,   value TEXT ); 2  
Английский оригинал

When I'm trying to execute the following command

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

from my Job, I am receiving the following error:

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 

My Job is defined as Helm Hook with post-install annotation. My Cassandra Pod is defined using 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 

And this is my Service:

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

When I run the cqlsh command manually from the container, everything works. Unfortunately, the automated solution throws the mentioned error.

Am I missing something in the Service configuration? I have thought since I am connecting to service from the Pod created by Job, it should work.

EDIT: Job looks like this:

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

And here is the output of etc/resolv.conf:

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

Список ответов

2
 
vote

Ошибка, которую вы опубликовали, указывает, что, где бы вы ни запускаете команду CQLSH, она не может разрешить имя обслуживания.

В зависимости от того, как настроен ваш кластер K8S и где работают задания (внутри того же кластера K8S или внешний), вам нужно выставить доступ к стручкам с <код> crosstab()7 или <код> crosstab()8 .

aleš noxk имеет хорошее объяснение того, как получить доступ к стручкам в его блог здесь здесь . Ура!

 

The error you posted indicates that wherever you're running the cqlsh command, it cannot resolve the service name.

Depending on how your k8s cluster is configured and where the job runs (inside the same k8s cluster or external), you'll need to expose access to the pods with Ingress or NodePort.

Aleš Nosek has a good explanation of how to access pods in his blog post here. Cheers!

</div
 
 
 
 
1
 
vote

Так как вы запустите inSto As Service Mesh, могут возникнуть некоторые проблемы с вашей настройкой.

Сначала я бы порекомендовал позволить посланнику вручную для обоих стручков:

<Код> kubectl exec -it <pod-name> -c istio-proxy -- curl -X POST http://localhost:15000/logging?level=trace

Нет, следуйте журналам Sidecar ISTIO BY

<Код> kubectl logs <pod-name> -c isiot-proxy -f

Это может уже дать вам некоторую информацию, почему соединение не удалось.

Некоторые идеи, что может быть проблемой:

  1. POD Cassandra не имеет SideCar

Если у Cassandra POD нет для SideCar, и вы применяете MTLS, он получит зашифрованный трафик, но не может его расшифровать. Это противоречит документации и, похоже, ошибка. Вы можете отключить MTL для трафика на службу Cassandra с Peritionrule:

 <код> 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 есть коляска, но POD SOCE нет, и вы соблюдаете MTLS, Sidecar Cassandras отрицает доступ, поскольку трафик не зашифрован. Вы можете либо ввести SideCar в POD (рекомендуется) или включить <код> PERMISSIVE MODE для Cassandra, поэтому SideCar примет оба SSL-зашифрованного, так и простого текстового трафика.

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

Пожалуйста, дайте мне знать, если вам нужна дополнительная помощь.

 

Since you are running insto as service mesh, there might be some problems with your setup.

First I would recommend enabling envoy logging for both pods:

kubectl exec -it <pod-name> -c istio-proxy -- curl -X POST http://localhost:15000/logging?level=trace

No, follow the istio sidecar logs by

kubectl logs <pod-name> -c isiot-proxy -f

This might already give you some information, why the connection is failing.

Some ideas what might be the problem:

  1. The cassandra's pod doesn't have a sidecar

If the cassandra pod doesn't have a sidecar and you are enforcing mTLS, it will receive encrypted traffic, but is unable to decrypt it. This contradicts the documentation and seems to be a bug. You can disable mTLS for traffic to the cassandra service with a DestinationRule:

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. The job's pod doesn't have a sidecar

If the cassandra pod has a sidecar, but the job's pod doesn't and you enforce mTLS, the cassandras sidecar will deny access, since traffic isn't encrypted. You can either inject a sidecar into the job's pod (recommended) or enable PERMISSIVE mode for cassandra, so the sidecar will accept both ssl encrypted and plain text traffic.

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

Please let me know if you need further assistance.

</div
 
 
0
 
vote

Уведомлево не имеет селектора, поэтому рассматриваемый YAML не работает. Если вы используете ниже yaml s, он работает и подключается к работе также. Все будет развернуто в пространстве имен по умолчанию. Вам необходимо использовать подходящий класс хранения (ниже пример использует стандарт) Вы можете следить за развертыванием 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   

Работа 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'"]   
 

The statefulset doesn't have a selector so the YAML in question doesn't work. If you use the below YAML s it works and connects to the job as well. Everything will be deployed in default namespace. You need to use appropriate storage class (below example uses standard) You can follow cassandra deployment from here

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 

The service YAML

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

The Job YAML , The command has been modified to describe cluster as it connects and prints the required cluster info.

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'"] 
</div
 
 
   
   

Связанный проблема

0  Шаблон POD для уточнения терпимости при запуске искры на Куберате  ( Pod template for specifying tolerations when running spark on kubernetes ) 
У меня есть некоторые проблемы при попытке запустить Spark Windows через планировщик Kubernetes. Я хочу, чтобы весь мой драйвер / исполнительник был порожде...

1  Почему не изменится в .SPEC.template.metadata.labels для ReplicaSet Hife Pods  ( Why doesnt change in spec template metadata labels for replicaset impact pods ) 
У меня есть <код> ReplicaSet , определенный в файле yaml, который использовался для создания 2 PODS (реплик). Я понимаю, что изменения в spec Раздел Replic...

42  Как я могу редактировать развертывание без изменения файла вручную?  ( How can i edit a deployment without modify the file manually ) 
Я определил развертывание для моего приложения: <код> apiVersion: extensions/v1beta1 kind: Deployment metadata: name: myapp-deployment spec: replicas: 2...

0  Как я могу прикрепить группу безопасности к LoadBalancer в кластере EKS?  ( How can i attach security group to a loadbalancer in eks cluster ) 
У нас есть кластер EKS 1.17 Kubernetes в AWS, и я пытаюсь создать балансировщик нагрузки с прилагаемой группой безопасности, которая позволила бы контролирова...

0  Runasuser Выпуск и нажатие на внешний IP балансировщик нагрузки -> Плохой запрос (400) при развертывании приложения Django на GKE (Kubernetes) и подключения DB Connection:  ( Runasuser issue clicking external ip of load balancer bad request 400 on ) 
protem: У меня есть 2 реплика для моего приложения, библиотеки. Я настроил услугу, чтобы поговорить с двумя двумя репликами. У меня есть Dockerfile, который н...

6  Класс не найден: io.kubernetes.client.OpenaPi.models.v1service  ( Class not found io kubernetes client openapi models v1service ) 
Я получаю следующую ошибку при попытке использовать файл YAML из моего GiTrepo для развертывания кластера Kube. Вот содержимое моего файла .yaml: <код> ...

0  Как я могу пройти ввод в приложение Java внутри контейнера Kubernetes?  ( How can i pass input to java application inside the kubernetes container ) 
Я настроил службу Kubernetes (типа LoadBalancer ), размещенные на AWS EKS. Стручки службы работают в интерактивном режиме (который необходим для запуска конт...

1  Автоматическое развертывание приложений приложения на одной машине  ( Automated deployment of a dockerized application on a single machine ) 
У меня есть веб-приложение, состоящее из нескольких услуг - Web, DB и очереди работы / рабочего. Я принимаю все на одном Google VM, и мой процесс развертывани...

2  Развернуть Perometues в новом кластере CRD  ( Deploy peromethues in new cluster crd issue ) 
Я пытаюсь создать прометеус с оператором в свежем новом кластере K8S Я использую следующие файлы, Первый шаг Я создаю мониторинг пространства имен Примен...

0  Проблема обмена объемом NFS между POD WordPress и MySQL POD  ( Nfs volume sharing issue between wordpress pod and mysql pod ) 
Этот репозиторий Kubernetes-WordPress-S-NFS-NFS -ON-GKE пытается реализовать приложение WordPress, которое разделяет объем NFS между MySQL и WordPress. Идея...

0  Пример приложения для Kubernetes 1.2.0  ( Sample app for kubernetes 1 2 0 ) 
Есть ли пример приложения, который можно развернуть на кластере Kubernetes, работающих v1.2.0? Официальные документы Kubernetes предоставляют пример гостевой ...

6  Нам действительно нужен порт для службы без головы?  ( Do we really need port for a headless service ) 
Это может быть вопрос, основанный на любопытстве, который не мог найти помощь в Google. Рассмотрим эту часть YAML для службы без головы: <код> ports: - p...

0  Каково лучшее решение для связи между коллекцией сервиса GRPC, написанной в Go и JavaScript Clients? [закрыто]  ( What is the best solution for communication between a collection of grpc service ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос находится на основе мнения . В настоящее вре...

5  Контроллер входа Kubernetes с частным IP  ( Kubernetes ingress controller with private ip ) 
Можно ли развернуть контроллер входа (Nginx) без публичного IP-адреса? Спасибо! ...

0  Google Cloud SQL с использованием неправильного SSL CERT для установления соединения сокета из Kubernetes  ( Google cloud sql using wrong ssl cert to to establish socket connection from kub ) 
У нас есть 2 кластера на ГК, кластере постановки и производства. Мы устанавливаем наш производственный кластер для использования Cloud-SQL-прокси в качестве P...

Связанный проблема

0  Шаблон POD для уточнения терпимости при запуске искры на Куберате 
1  Почему не изменится в .SPEC.template.metadata.labels для ReplicaSet Hife Pods 
42  Как я могу редактировать развертывание без изменения файла вручную? 
0  Как я могу прикрепить группу безопасности к LoadBalancer в кластере EKS? 
0  Runasuser Выпуск и нажатие на внешний IP балансировщик нагрузки -> Плохой запрос (400) при развертывании приложения Django на GKE (Kubernetes) и подключения DB Connection: 
6  Класс не найден: io.kubernetes.client.OpenaPi.models.v1service 
0  Как я могу пройти ввод в приложение Java внутри контейнера Kubernetes? 
1  Автоматическое развертывание приложений приложения на одной машине 
2  Развернуть Perometues в новом кластере CRD 
0  Проблема обмена объемом NFS между POD WordPress и MySQL POD 
0  Пример приложения для Kubernetes 1.2.0 
6  Нам действительно нужен порт для службы без головы? 
0  Каково лучшее решение для связи между коллекцией сервиса GRPC, написанной в Go и JavaScript Clients? [закрыто] 
5  Контроллер входа Kubernetes с частным IP 
0  Google Cloud SQL с использованием неправильного SSL CERT для установления соединения сокета из Kubernetes