首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从集群外部访问Cassandra/Kubernetes集群?

如何从集群外部访问Cassandra/Kubernetes集群?
EN

Stack Overflow用户
提问于 2020-06-30 06:19:16
回答 2查看 1.8K关注 0票数 1

我已经开始使用Cass-操作员和设置工作像一个魅力!https://github.com/datastax/cass-operator

不过我有个问题。我的集群在GCP上启动并运行。但是如何从我的笔记本电脑(基本上是从外部)访问它呢?对不起,我对Kubernetes并不熟悉,所以我不知道如何从外部访问集群?

我可以看到节点在GCP仪表板上。我可以从我的笔记本电脑中平掉节点的外部IP,但是当我运行cqlsh external_ip 9042时,连接就失败了。

如何将K8s/Cassandra集群连接到外部工作,以便我的web应用程序能够访问它?

我想:

  1. 有一个url,以便我的web应用程序使用该URL连接到cassandra/K8s集群,而不是IP地址。因此,我需要一个dns。默认情况下,它是在K8S中出现的吗?会是那个网址吗?在某些节点中为我管理dns映射的K8s会重新启动吗?
  2. 我的网络应用程序应该能够在9042到达Cassandra。似乎负载平衡是为http/https完成的。Cassandra应用程序不是http/https请求。所以我不需要端口80或443

我读过一些关于服务、负载平衡器和进题的教程。但我无法开始。

我创建了这样一个服务

代码语言:javascript
复制
kind: Service
apiVersion: v1
metadata:
  name: cass-operator-service
spec:
  type: LoadBalancer
  ports:
    - port: 9042
  selector:
    name: cass-operator

然后创建了服务- kubectl apply -f ./cass-operator-service.yaml

我检查了服务是否使用kubectl get svc创建并得到了输出。

代码语言:javascript
复制
NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE 
cass-operator-service   LoadBalancer   10.51.249.224   34.91.214.233   9042:30136/TCP   4m17s 
kubernetes              ClusterIP      10.51.240.1     <none>          443/TCP          10h. 

但是当我运行cqlsh 34.91.214.233 9042时,连接就失败了

似乎向9042端口提出的请求将转交给30136。但是,它们应该被转发到9042,因为这就是荚中的Cassandra图像正在监听传入请求的地方。

更新

试过targetPort,但还是没有运气

代码语言:javascript
复制
manuchadha25@cloudshell:~ (copper-frame-262317)$ cat cass-operator-service.yaml
kind: Service
apiVersion: v1
metadata:
  name: cass-operator-service
spec:
  type: LoadBalancer
  ports:
    - port: 9042
      targetPort: 9042
  selector:
    name: cass-operator
manuchadha25@cloudshell:~ (copper-frame-262317)$ kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.51.240.1   <none>        443/TCP   11h
manuchadha25@cloudshell:~ (copper-frame-262317)$ kubectl apply -f ./cass-operator-service.yaml
service/cass-operator-service created
manuchadha25@cloudshell:~ (copper-frame-262317)$ kubectl get service
NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
cass-operator-service   LoadBalancer   10.51.255.184   <pending>     9042:30024/TCP   12s
kubernetes              ClusterIP      10.51.240.1     <none>        443/TCP          11h
manuchadha25@cloudshell:~ (copper-frame-262317)$ kubectl get service
NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
cass-operator-service   LoadBalancer   10.51.255.184   <pending>     9042:30024/TCP   37s
kubernetes              ClusterIP      10.51.240.1     <none>        443/TCP          11h
manuchadha25@cloudshell:~ (copper-frame-262317)$ kubectl get service
NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
cass-operator-service   LoadBalancer   10.51.255.184   34.91.214.233   9042:30024/TCP   67s
kubernetes              ClusterIP      10.51.240.1     <none>          443/TCP          11h
manuchadha25@cloudshell:~ (copper-frame-262317)$ ping 34.91.214.233
PING 34.91.214.233 (34.91.214.233) 56(84) bytes of data.
64 bytes from 34.91.214.233: icmp_seq=1 ttl=109 time=7.89 ms

查询所有名称空格将显示以下内容

但是,使用命名空间cass-运算符查询荚会返回空结果。

代码语言:javascript
复制
manuchadha25@cloudshell:~ (copper-frame-262317)$ kubectl get pods -l name=cass-operator
No resources found in default namespace.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-30 14:04:09

  • 因为你是库伯内特斯的新手,所以你可能不熟悉StatefulSets

StatefulSet是用于管理有状态应用程序的workload对象。 管理一组豆荚的部署和扩展,并为这些Pods的排序和唯一性提供保证。 与部署类似,StatefulSet管理基于相同容器规范的Pods。与部署不同,StatefulSet为每个Pods维护一个粘性标识。这些吊舱是根据相同的规范创建的,但不能互换:每个豆荚都有一个持久性标识符,它可以在任何重新安排的过程中维护这些标识符。

如何将K8s/Cassandra集群连接到外部工作,以便我的web应用程序能够访问它?

  • 我发现datastax/cass-operator仍然在开发他们的文档,我发现本文件还没有被合并到master,但是它很好地解释了如何连接到Cassandra,我强烈推荐阅读。
  • 有几个未决问题用于记录从集群外部连接的方法。

我遵循了https://github.com/datastax/cass-operator中的指南来部署cass操作符+ Cassandra示例,因为从您的图像中,我相信您也遵循了:

代码语言:javascript
复制
$ kubectl create -f https://raw.githubusercontent.com/datastax/cass-operator/v1.2.0/docs/user/cass-operator-manifests-v1.15.yaml
namespace/cass-operator created
serviceaccount/cass-operator created
secret/cass-operator-webhook-config created
customresourcedefinition.apiextensions.k8s.io/cassandradatacenters.cassandra.datastax.com created
clusterrole.rbac.authorization.k8s.io/cass-operator-cluster-role created
clusterrolebinding.rbac.authorization.k8s.io/cass-operator created
role.rbac.authorization.k8s.io/cass-operator created
rolebinding.rbac.authorization.k8s.io/cass-operator created
service/cassandradatacenter-webhook-service created
deployment.apps/cass-operator created
validatingwebhookconfiguration.admissionregistration.k8s.io/cassandradatacenter-webhook-registration created

$ kubectl create -f https://raw.githubusercontent.com/datastax/cass-operator/v1.2.0/operator/k8s-flavors/gke/storage.yaml
storageclass.storage.k8s.io/server-storage created

$ kubectl -n cass-operator create -f https://raw.githubusercontent.com/datastax/cass-operator/v1.2.0/operator/example-cassdc-yaml/cassandra-3.11.6/example-cassdc-minimal.yaml
cassandradatacenter.cassandra.datastax.com/dc1 created

$ kubectl get all -n cass-operator
NAME                                READY   STATUS    RESTARTS   AGE
pod/cass-operator-78c6469c6-6qhsb   1/1     Running   0          139m
pod/cluster1-dc1-default-sts-0      2/2     Running   0          138m
pod/cluster1-dc1-default-sts-1      2/2     Running   0          138m
pod/cluster1-dc1-default-sts-2      2/2     Running   0          138m

NAME                                          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)             AGE
service/cass-operator-metrics                 ClusterIP      10.21.5.65    <none>         8383/TCP,8686/TCP   138m
service/cassandradatacenter-webhook-service   ClusterIP      10.21.0.89    <none>         443/TCP             139m
service/cluster1-dc1-all-pods-service         ClusterIP      None          <none>         <none>              138m
service/cluster1-dc1-service                  ClusterIP      None          <none>         9042/TCP,8080/TCP   138m
service/cluster1-seed-service                 ClusterIP      None          <none>         <none>              138m

NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/cass-operator   1/1     1            1           139m

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/cass-operator-78c6469c6   1         1         1       139m

NAME                                        READY   AGE
statefulset.apps/cluster1-dc1-default-sts   3/3     138m

$ CASS_USER=$(kubectl -n cass-operator get secret cluster1-superuser -o json | jq -r '.data.username' | base64 --decode)
$ CASS_PASS=$(kubectl -n cass-operator get secret cluster1-superuser -o json | jq -r '.data.password' | base64 --decode)

$ echo $CASS_USER
cluster1-superuser

$ echo $CASS_PASS
_5ROwp851l0E_2CGuN_n753E-zvEmo5oy31i6C0DBcyIwH5vFjB8_g
  • 从上面的kubectl get all命令中我们可以看到,有一个名为statefulset.apps/cluster1-dc1-default-sts的状态集,它控制着cassandra。
  • 为了创建一个LoadBalancer服务,使statefulset管理的所有豆荚可用,我们需要使用分配给它们的相同标签:
代码语言:javascript
复制
$ kubectl describe statefulset cluster1-dc1-default-sts -n cass-operator
Name:               cluster1-dc1-default-sts
Namespace:          cass-operator
CreationTimestamp:  Tue, 30 Jun 2020 12:24:34 +0200
Selector:           cassandra.datastax.com/cluster=cluster1,cassandra.datastax.com/datacenter=dc1,cassandra.datastax.com/rack=default
Labels:             app.kubernetes.io/managed-by=cass-operator
                    cassandra.datastax.com/cluster=cluster1
                    cassandra.datastax.com/datacenter=dc1
                    cassandra.datastax.com/rack=default
  • 现在,让我们创建LoadBalancer服务yaml,并将标签用作服务的selectors
代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: cassandra-loadbalancer
  namespace: cass-operator
  labels:
    cassandra.datastax.com/cluster: cluster1
    cassandra.datastax.com/datacenter: dc1
    cassandra.datastax.com/rack: default
spec:
  type: LoadBalancer
  ports:
  - port: 9042
    protocol: TCP
  selector:
    cassandra.datastax.com/cluster: cluster1
    cassandra.datastax.com/datacenter: dc1
    cassandra.datastax.com/rack: default

“我的web应用程序应该能够在9042到达Cassandra。似乎是为http/https实现了负载平衡。Cassandra应用程序不是http/https请求。所以我不需要端口80或443。”

  • 创建LoadBalancer类型的服务时,Google控制器会唤醒并配置项目中的网络负载平衡器。负载均衡器有一个稳定的IP地址,可以从项目外部访问。
  • 网络负载均衡器支持任意和所有端口。您可以使用网络负载平衡来负载平衡TCP和UDP流量。因为负载均衡器是一个传递负载均衡器,所以后端终止负载平衡TCP连接或UDP数据包本身。
  • 现在,让我们应用yaml并注意所列出的豆荚的端点IP:
代码语言:javascript
复制
$ kubectl apply -f cassandra-loadbalancer.yaml 
service/cassandra-loadbalancer created

$ kubectl get service cassandra-loadbalancer -n cass-operator 
NAME                     TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)          AGE
cassandra-loadbalancer   LoadBalancer   10.21.4.253   146.148.89.7   9042:30786/TCP   5m13s

$ kubectl describe svc cassandra-loadbalancer -n cass-operator
Name:                     cassandra-loadbalancer
Namespace:                cass-operator
Labels:                   cassandra.datastax.com/cluster=cluster1
                          cassandra.datastax.com/datacenter=dc1
                          cassandra.datastax.com/rack=default
Annotations:              Selector:  cassandra.datastax.com/cluster=cluster1,cassandra.datastax.com/datacenter=dc1,cassandra.datastax.com/rack=default
Type:                     LoadBalancer
IP:                       10.21.4.253
LoadBalancer Ingress:     146.148.89.7
Port:                     <unset>  9042/TCP
TargetPort:               9042/TCP
NodePort:                 <unset>  30786/TCP
Endpoints:                10.24.0.7:9042,10.24.2.7:9042,10.24.3.9:9042
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
  • 为了测试它,我将使用带cassandra容器的云外壳来模拟您的笔记本,使用上面提供的LoadBalancer IP:
代码语言:javascript
复制
$ docker run -it cassandra /bin/sh

# cqlsh -u cluster1-superuser -p _5ROwp851l0E_2CGuN_n753E-zvEmo5oy31i6C0DBcyIwH5vFjB8_g 146.148.89.7 9042                

Connected to cluster1 at 146.148.89.7:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cluster1-superuser@cqlsh> select * from system.peers;

 peer      | data_center | host_id                              | preferred_ip | rack    | release_version | rpc_address | schema_version                       | tokens
-----------+-------------+--------------------------------------+--------------+---------+-----------------+-------------+--------------------------------------+--------------------------
 10.24.3.9 |         dc1 | bcec6c12-49a1-41d5-be58-5150e99f5dfb |         null | default |          3.11.6 |   10.24.3.9 | e84b6a60-24cf-30ca-9b58-452d92911703 |  {'2248175870989649036'}
 10.24.0.7 |         dc1 | 68409f08-9d6e-4e40-91ff-f43581c8b6f3 |         null | default |          3.11.6 |   10.24.0.7 | e84b6a60-24cf-30ca-9b58-452d92911703 | {'-1105923522927946373'}

(2 rows)

“有一个url,以便我的web应用程序使用该url连接到cassandra/K8s集群,而不是IP地址。因此我需要一个dns。它在K8S中默认出现吗?会是URL吗?在某些节点中为我管理dns映射的K8s会重新启动吗?”

  • 关于cassandra的文档也有一个关于入口的部分,我也推荐阅读。
  • Kubernetes没有默认的DNS名称。
  • 您必须注册一个域,将DNS指向负载均衡器的IP,这样它将解析网络LoadBalancer的IP。
  • 网络LoadBalancer绑定到静态公共IP,库伯奈特节点中的任何更改都不会导致服务不可用。

如果你有任何问题,请在评论中告诉我。

票数 6
EN

Stack Overflow用户

发布于 2020-06-30 06:42:51

要在loadBalancer:ingress下输出稳定的外部IP地址,请使用以下命令:

代码语言:javascript
复制
$ kubectl get service cass-operator-service -o yaml
... ...
... ...
status:
  loadBalancer:
    ingress:
    - ip: 203.0.113.10

现在你应该可以在<load-balancer-ingress-ip>:9042访问卡桑德拉了

注:有时GKE需要几分钟来配置负载均衡器。

更新:

向服务YAML添加目标端口并更正labelSelector,如下所示:

代码语言:javascript
复制
kind: Service
apiVersion: v1
metadata:
  name: cass-operator-service
spec:
  type: LoadBalancer
  ports:
    - port: 9042
      targetPort: 9042
  selector:
    # add labels which are specified in the Cassandra pods
    # not the operator.

适用更改:

代码语言:javascript
复制
$ kubectl apply -f service.yaml
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62651374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档