Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

change-default-service-type-to-nodeport #2723

Merged
merged 4 commits into from
Apr 18, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
163 changes: 102 additions & 61 deletions docs-2.0/nebula-operator/4.connect-to-nebula-graph-service.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,65 +6,17 @@

使用 NebulaGraph Operator 创建 NebulaGraph 集群。具体步骤参考[使用 Kubectl 部署 NebulaGraph 集群](3.deploy-nebula-graph-cluster/3.1create-cluster-with-kubectl.md) 或者[使用 Helm 部署 NebulaGraph 集群](3.deploy-nebula-graph-cluster/3.2create-cluster-with-helm.md)。

## 在 NebulaGraph 集群内连接 NebulaGraph 数据库

当使用 NebulaGraph Operator 创建 NebulaGraph 集群后,NebulaGraph Operator 会自动在同一命名空间下,创建名为`<cluster-name>-graphd-svc`、类型为`ClusterIP`的 Service。通过该 Service 的 IP 和数据库的端口号,用户可连接 NebulaGraph 数据库。

1. 查看 Service,命令如下:

```bash
$ kubectl get service -l app.kubernetes.io/cluster=<nebula> #<nebula>为变量值,请用实际集群名称替换。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nebula-graphd-svc ClusterIP 10.98.213.34 <none> 9669/TCP,19669/TCP,19670/TCP 23h
nebula-metad-headless ClusterIP None <none> 9559/TCP,19559/TCP,19560/TCP 23h
nebula-storaged-headless ClusterIP None <none> 9779/TCP,19779/TCP,19780/TCP,9778/TCP 23h
```

`ClusterIP`类型的 Service 只允许在集群内部访问容器应用。更多信息,请参考 [ClusterIP](https://kubernetes.io/docs/concepts/services-networking/service/)。

2. 使用上述`<cluster-name>-graphd-svc` Service 的 IP 连接 NebulaGraph 数据库:

```bash
kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never -- <nebula_console_name> -addr <cluster_ip> -port <service_port> -u <username> -p <password>
```

示例:

```bash
kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never -- nebula-console -addr 10.98.213.34 -port 9669 -u root -p vesoft
```

- `--image`:为连接 NebulaGraph 的工具 NebulaGraph Console 的镜像。
- `<nebula-console>`:自定义的 Pod 名称。
- `-addr`:连接 Graphd 服务的 IP 地址,即`ClusterIP`类型的 Service IP 地址。
- `-port`:连接 Graphd 服务的端口。默认端口为 9669。
- `-u`:NebulaGraph 账号的用户名。未启用身份认证时,可以使用任意已存在的用户名(默认为 root)。
- `-p`:用户名对应的密码。未启用身份认证时,密码可以填写任意字符。

如果返回以下内容,说明成功连接数据库:

```bash
If you don't see a command prompt, try pressing enter.

(root@nebula) [(none)]>
```

用户还可以使用**完全限定域名(FQDN)**连接数据库,域名格式为`<cluster-name>-graphd.<cluster-namespace>.svc.<CLUSTER_DOMAIN>`:

```bash
kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never -- <nebula_console_name> -addr <cluster_name>-graphd-svc.default.svc.cluster.local -port <service_port> -u <username> -p <password>
```
`CLUSTER_DOMAIN`的默认值为`cluster.local`。

## 通过`NodePort`在 NebulaGraph 集群外部连接 NebulaGraph 数据库

用户可创建`NodePort`类型的 Service,通过节点 IP 和暴露的节点端口,从集群外部访问集群内部的服务。用户也可以使用云厂商(例如 Azure、AWS 等)提供的负载均衡服务,设置 Service 的类型为`LoadBalancer`。
用户可创建`NodePort`类型的 Service,通过集群任一节点 IP 和暴露的节点端口,从集群外部访问集群内部的服务。用户也可以使用云厂商(例如 Azure、AWS 等)提供的负载均衡服务,设置 Service 的类型为`LoadBalancer`,通过云厂商提供的负载均衡器的公网 IP 和端口,从集群外部访问集群内部的服务

`NodePort`类型的 Service 通过标签选择器`spec.selector`将前端的请求转发到带有标签`app.kubernetes.io/cluster: <cluster-name>`、`app.kubernetes.io/component: graphd`的 Graphd pod 中。

当根据集群[示例模板](https://github.com/vesoft-inc/nebula-operator/blob/v{{operator.release}}/config/samples/apps_v1alpha1_nebulacluster.yaml),其中`spec.graphd.service.type=NodePort`,创建 NebulaGraph 集群后,NebulaGraph Operator 会自动在同一命名空间下,创建名为`<cluster-name>-graphd-svc`、类型为`NodePort`的 Service。通过任一节点 IP 和暴露的节点端口,可直接连接 NebulaGraph 数据库(参见下文第 4 步)。用户也可以根据自己的需求,创建自定义的 Service。

操作步骤如下:

1. 创建名为`graphd-nodeport-service.yaml`的文件。YAML 文件内容如下
1. 创建名为`graphd-nodeport-service.yaml`的文件。示例内容如下

```yaml
apiVersion: v1
Expand Down Expand Up @@ -93,10 +45,10 @@ kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never --
app.kubernetes.io/component: graphd
app.kubernetes.io/managed-by: nebula-operator
app.kubernetes.io/name: nebula-graph
type: NodePort
type: NodePort # 设置 Service 类型为 NodePort。
```

- NebulaGraph 默认使用`9669`端口为客户端提供服务。`19669`为 Graph 服务端口号
- NebulaGraph 默认使用`9669`端口为客户端提供服务。`19669`为 Graph 服务的 HTTP 端口号
- `targetPort`的值为映射至 Pod 的端口,可自定义。

2. 执行以下命令使 Service 服务在集群中生效。
Expand All @@ -108,20 +60,18 @@ kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never --
3. 查看 Service 中 NebulaGraph 映射至集群节点的端口。

```bash
kubectl get services
kubectl get services -l app.kubernetes.io/cluster=<nebula> #<nebula>为变量值,请用实际集群名称替换。
```

返回:

```bash
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nebula-graphd-svc ClusterIP 10.98.213.34 <none> 9669/TCP,19669/TCP,19670/TCP 23h
nebula-graphd-svc-nodeport NodePort 10.107.153.129 <none> 9669:32236/TCP,19669:31674/TCP,19670:31057/TCP 24h
nebula-metad-headless ClusterIP None <none> 9559/TCP,19559/TCP,19560/TCP 23h
nebula-storaged-headless ClusterIP None <none> 9779/TCP,19779/TCP,19780/TCP,9778/TCP 23h
...
```

NodePort 类型的 Service 中,映射至集群节点的端口为`32236`。
`NodePort`类型的 Service 中,映射至集群节点的端口为`32236`。

4. 使用节点 IP 和上述映射的节点端口连接 NebulaGraph。

Expand All @@ -132,21 +82,112 @@ kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never --
示例如下:

```bash
kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never -- nebula-console2 -addr 192.168.8.24 -port 32236 -u root -p vesoft
kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never -- nebula-console -addr 192.168.8.24 -port 32236 -u root -p vesoft
If you don't see a command prompt, try pressing enter.

(root@nebula) [(none)]>
```

- `--image`:为连接 NebulaGraph 的工具 NebulaGraph Console 的镜像。
- `<nebula-console>`:自定义的 Pod 名称。本示例为`nebula-console2`。
- `<nebula-console>`:自定义的 Pod 名称。本示例为`nebula-console`。
- `-addr`:NebulaGraph 集群中任一节点 IP 地址。本示例为`192.168.8.24`。
- `-port`:NebulaGraph 映射至节点的端口。本示例为`32236`。
- `-u`:NebulaGraph 账号的用户名。未启用身份认证时,可以使用任意已存在的用户名(默认为 root)。
- `-p`:用户名对应的密码。未启用身份认证时,密码可以填写任意字符。

## 在 NebulaGraph 集群内连接 NebulaGraph 数据库

用户也可以创建`ClusterIP`类型的 Service,为集群内的其他 Pod 提供访问 NebulaGraph 数据库的入口。通过该 Service 的 IP 和数据库 Graph 服务的端口号(`9669`),可连接 NebulaGraph 数据库。更多信息,请参考 [ClusterIP](https://kubernetes.io/docs/concepts/services-networking/service/)。

1. 创建名为`graphd-clusterip-service.yaml`的文件。示例内容如下:

```yaml
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/cluster: nebula
app.kubernetes.io/component: graphd
app.kubernetes.io/managed-by: nebula-operator
app.kubernetes.io/name: nebula-graph
name: nebula-graphd-svc
namespace: default
spec:
externalTrafficPolicy: Local
ports:
- name: thrift
port: 9669
protocol: TCP
targetPort: 9669
- name: http
port: 19669
protocol: TCP
targetPort: 19669
selector:
app.kubernetes.io/cluster: nebula
app.kubernetes.io/component: graphd
app.kubernetes.io/managed-by: nebula-operator
app.kubernetes.io/name: nebula-graph
type: ClusterIP # 设置 Service 类型为 ClusterIP。
```

- NebulaGraph 默认使用`9669`端口为客户端提供服务。`19669`为 Graph 服务的 HTTP 端口号。
- `targetPort`的值为映射至 Pod 的端口,可自定义。

2. 执行以下命令使 Service 服务在集群中生效。

```bash
kubectl create -f graphd-clusterip-service.yaml
```

3. 查看 Service,命令如下:

```bash
$ kubectl get service -l app.kubernetes.io/cluster=<nebula> #<nebula>为变量值,请用实际集群名称替换。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nebula-graphd-svc ClusterIP 10.98.213.34 <none> 9669/TCP,19669/TCP,19670/TCP 23h
...
```

4. 使用上述`<cluster-name>-graphd-svc`Service 的 IP 连接 NebulaGraph 数据库:

```bash
kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never -- <nebula_console_name> -addr <cluster_ip> -port <service_port> -u <username> -p <password>
```

示例:

```bash
kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never -- nebula-console -addr 10.98.213.34 -port 9669 -u root -p vesoft
```

- `--image`:为连接 NebulaGraph 的工具 NebulaGraph Console 的镜像。
- `<nebula-console>`:自定义的 Pod 名称。
- `-addr`:连接 Graphd 服务的 IP 地址,即`ClusterIP`类型的 Service IP 地址。
- `-port`:连接 Graphd 服务的端口。默认端口为`9669`。
- `-u`:NebulaGraph 账号的用户名。未启用身份认证时,可以使用任意已存在的用户名(默认为`root`)。
- `-p`:用户名对应的密码。未启用身份认证时,密码可以填写任意字符。

如果返回以下内容,说明成功连接数据库:

```bash
If you don't see a command prompt, try pressing enter.

(root@nebula) [(none)]>
```

用户还可以使用**完全限定域名(FQDN)**连接数据库,域名格式为`<cluster-name>-graphd.<cluster-namespace>.svc.<CLUSTER_DOMAIN>`:

```bash
kubectl run -ti --image vesoft/nebula-console:{{console.tag}} --restart=Never -- <nebula_console_name> -addr <cluster_name>-graphd-svc.default.svc.cluster.local -port <service_port> -u <username> -p <password>
```
- `CLUSTER_DOMAIN`的默认值为`cluster.local`。
- `<service_port>`为 Graph 服务默认的端口`9669`。

## 通过`Ingress`在 NebulaGraph 集群外部连接 NebulaGraph 数据库

当集群中有多个 Pod 时,为每个 Pod 分别提供服务会变得非常困难和繁琐,而使用 Ingress 可以轻松解决这个问题。Ingress 可以将流量路由到集群内部的多个 Pod。

Nginx Ingress 是 Kubernetes Ingress 的一个实现。Nginx Ingress 通过 Watch 机制感知 Kubernetes 集群的 Ingress 资源,将 Ingress 规则生成 Nginx 配置,使 Nginx 能够转发 7 层流量。

用户可以通过 HostNetwork 和 DaemonSet 组合的模式使用 Nginx Ingress 从集群外部连接 NebulaGraph 集群。
Expand Down