应用常见问题

我可以在 Istio mesh 中运行 Casandra 吗?

默认情况下,Cassandra 广播用于绑定(接受连接)到其他 Cassandra 节点的地址作为其地址。这通常是 Pod IP 地址,无需服务网格即可正常工作。但是,对于服务网格,此配置不起作用。Istio 需要(0.0.0.0)作为绑定地址。

有两个配置参数要注意: listen_addressbroadcast_address 。为了在 Istio 网格中运行 Cassandra,应该将 listen_address 参数设置为 0.0.0.0,将 broadcast_address 参数设置为 Pod IP 地址。

这些配置参数在 Cassandra 配置目录(例如 /etc/cassandra)的 cassandra.yaml 中定义。有多种用于启动 Cassandra 的脚本(和 yaml 文件),应注意这些脚本如何设置这些参数。例如,一些用于配置和启动 Cassandra 的脚本使用环境变量 CASSANDRA_LISTEN_ADDRESS 的值来设置 listen_address

我可以在 Istio 内部运行 Zookeeper 吗?

默认情况下,Zookeeper 通过监听 pod 的 IP 地址用来在服务间通信。而 Istio 和其他的服务网格需要监听在 0.0.0.0 地址上。

有一个配置参数可以来修改这个默认行为: quorumListenOnAllIPs。 这个选项可以让 Zookeeper 监听所有地址。 通过下面的命令将 Zookeeper 中的 $ZK_CONFIG_FILE 参数设置为 true

$ echo "quorumListenOnAllIPs=true" >> $ZK_CONFIG_FILE
我可以在 Istio 网格中运行 Elasticsearch 吗?

在 Istio 中运行 Elasticsearch,有两个 Elasticsearch 配置参数需要被正确设置:network.bind_hostnetwork.publish_host。默认情况下,这些参数值被设置成 network.host 参数。如果 network.host 被设置成 0.0.0.0,Elasticsearch 很可能选择 pod IP 作为发布地址并且不需要更进一步的配置。

如果默认配置没有生效,你可以将 network.bind_host 设置为 0.0.0.0 并将 network.publish_host 设置为 pod IP,例如:

...
containers:
- name: elasticsearch
  image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
  env:
    - name: network.bind_host
      value: 127.0.0.1
    - name: network.publish_host
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
   ...

了解更多信息请查看 Elasticsearch 网络设置

我可以在 Istio 网格内运行 Apache NiFi 吗?

在 Istio 上运行 Apache NiFi 是有一些挑战的。这些挑战来自集群运行的需求。 例如,要求群集组件必须在整个群集范围内都可以唯一寻址的主机名。该要求与 Istio 的要求(即工作负载在容器组中绑定并侦听“0.0.0.0”)相冲突。

根据您 NiFi 配置和部署情况,有不同的方法来绕开这些问题。 在 NiFi 中,至少有以下三种方法来指定群集网络应使用的主机名:

  • nifi.remote.input.host- 将提供给客户端以连接到该NiFi实例进行站点到站点通信的主机名。默认情况下使用 InetAddress.getLocalHost().getHostName() 来获取本机的主机名。 在类似 UNIX 的操作系统上,这通常是来自 hostname 命令。

  • nifi.web.https.host-HTTPS主机。 默认情况下为空白。jetty 服务器将在该主机名上运行,并且需要在整个群集中可寻址,以便与其他节点进行复制。

  • nifi.cluster.node.address- 节点的标准地址。默认情况下为空白。这也用于集群协调,并且需要在集群内唯一地寻址。

一些注意事项:

  • 由于对上述唯一寻址的联网要求, 对 nifi.web.https.host 使用空白或 localhost 的设置在这种情况下将不起作用。
  • 除非您对所有在 NiFi 部署中具有所有访问角色的用户都表示满意,否则 HTTP 并不是可行的解决方案,因为 NiFi 不会通过 HTTP 执行用户身份验证
  • 明确指定 NiFi 应该使用的网络接口可以帮助解决问题并允许NiFi工作: 修改 nifi.properties,其中 xxx 是与工作IP对应的网络接口(因环境/云提供商而异),yyy 是容器/容器组的环回接口(即 lo ):
nifi.web.https.network.interface.default = xxx
nifi.web.https.network.interface.lo = yyy

真实示例(适用于 IBM Cloud,也许适用于其他示例)如下所示:

nifi.web.https.network.interface.default = eth0
nifi.web.https.network.interface.lo = lo
我可以在 Istio 网格内运行 Redis 吗?

与在 Istio 服务网格中部署的其他服务类似,Redis 实例需要监听 0.0.0.0。每个 Redis 从属实例都应声明一个地址,主服务器可以使用该地址来访问它,但是,该地址不能是 0.0.0.0

使用 Redis 配置参数 replica-announce-ip 来公布正确的地址。例如,使用以下步骤将 replica-announce-ip 设置为每个 Redis 从属实例的 IP 地址:

通过从属 StatefulSetenv 小节中定义的环境变量传递 Pod IP 地址:

- name: "POD_IP"
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

另外,在 command 小节下添加以下内容:

echo "" >> /opt/bitnami/redis/etc/replica.conf
echo "replica-announce-ip $POD_IP" >> /opt/bitnami/redis/etc/replica.conf