如何在 Ignite XML 配置中为 Kubernetes IP Finder 设置 Master Url

Posted

技术标签:

【中文标题】如何在 Ignite XML 配置中为 Kubernetes IP Finder 设置 Master Url【英文标题】:How to setMasterUrl in Ignite XML config for Kubernetes IPFinder 【发布时间】:2018-08-29 22:22:41 【问题描述】:

在 Ignite 2.4 和 k8s 1.9 中使用测试配置:

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:util="http://www.springframework.org/schema/util"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/util
            http://www.springframework.org/schema/util/spring-util.xsd">

    <bean class="org.apache.ignite.configuration.IgniteConfiguration">
      <property name="discoverySpi">
        <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
          <property name="ipFinder">
            <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.kubernetes.TcpDiscoveryKubernetesIpFinder"/>
          </property>
        </bean>
      </property>
    </bean>
</beans>

无法在https://kubernetes.default.svc.cluster.local:443 找到 Kubernetes API 服务器 我可以在 XML 配置文件中设置 API Server URL 吗?怎么样?

【问题讨论】:

我能够在 XML 配置中提供 masterUrl,但仍然收到相同的 403 错误:原因:java.io.IOException:服务器返回 HTTP 响应代码:403 for URL:10.244.0.1:443/api/v1/namespaces/default/endpoints/ignite跨度> 【参考方案1】:

@Denis 是对的。

Kubernetes 使用 RBAC 访问控制系统,您需要授权您的 pod 访问 API。

为此,您需要将 Service Account 添加到您的 pod。

所以,你需要这样做:

    创建一个服务帐号并为其设置角色:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: ignite
      namespace: <Your namespace>
    

    我不确定仅访问 pod 的权限对于 Ignite 是否足够,但如果不是 - 您可以根据需要添加更多权限。 Here 是具有大量权限的不同类型角色的示例。所以,现在我们为您的应用创建集群角色:

    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: ignite
      namespace: <Your namespace>
    rules:
    - apiGroups:
      - ""
      resources:
      - pods # Here is resources you can access
      verbs: # That is what you can do with them
      - get
      - list
      - watch
    

    为该角色创建绑定:

    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: ignite
    roleRef:
      kind: ClusterRole
      name: ignite
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      name: ignite
      namespace: <Your namespace>
    

    现在,您需要将 ServiceAccount 与您的应用程序关联到 pod:

    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
      ....
    spec:
      template:
        spec:
          serviceAccountName: ignite
    

之后,您的应用程序将可以访问 K8s API。附言不要忘记将 &lt;Your namespace&gt; 更改为运行 Ignition 的命名空间。

【讨论】:

当我尝试运行第 4 步 kubectl create -f daemon.yaml 时,出现以下错误。 error: error validating "daemon.yaml": error validating data: ValidationError(DaemonSet.spec.template.spec): missing required field "containers" in io.k8s.api.core.v1.PodSpec; if you choose to ignore these errors, turn validation off with --validate=false【参考方案2】:

平台版本

Kubernetes:v1.8 点燃:v2.4

@Anton Kostenko 的设计基本上是正确的,但这里有一个精致的建议,它可以为 Ignite 授予最少访问权限

    如果您使用 Deployment 来管理 Ignite,那么您的所有 Pod 都将在单个命名空间中启动。因此,您确实应该使用 RoleRoleBinding 来授予对与您的部署关联的服务帐户的 API 访问权限。

    TcpDiscoveryKubernetesIpFinder 只需要访问用于选择 Ignite pod 的无头服务的端点。以下 2 个清单将授予该访问权限。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: ignite-endpoint-access
      namespace: <your-ns>
      labels:
        app: ignite
    rules:
      - apiGroups: [""]
        resources: ["endpoints"]
        resourceNames: ["<your-headless-svc>"]
        verbs: ["get"]
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: ignite-role-binding
      labels:
        app: ignite
    subjects:
      - kind: ServiceAccount
        name: <your-svc-account>
    roleRef:
      kind: Role
      name: ignite-endpoint-access
      apiGroup: rbac.authorization.k8s.io
    

【讨论】:

【参考方案3】:

看看这个帖子:http://apache-ignite-users.70518.x6.nabble.com/Unable-to-connect-ignite-pods-in-Kubernetes-using-Ip-finder-td18009.html

403错误的问题可以通过给服务账号授予更多权限来解决。

【讨论】:

谢谢。此链接导致正确答案。在使用 clusterrole=admin fir 服务帐户创建 RoleBinding 后,我能够找到 Ignite 节点:kubectl create rolebinding igniteRoleBinding \ --clusterrole=admin \ --serviceaccount=default:ignite \ --namespace=default 仍然不确定为什么需要 admin,但是对于 RBAC 和 k8s 中的权限是新的,所以我会进一步研究。【参考方案4】:

测试版:

Kubernetes:v1.8

点燃:v2.4

这会稍微宽松一点。

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: ignite-rbac
subjects:
  - kind: ServiceAccount
    name: default
    namespace: <namespace>
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

【讨论】:

【参考方案5】:

如果您获得 403 未经授权,则您的服务帐户可能没有足够的权限来获取您的资源。在确保命名空间和服务帐户以及部署/副本集完全符合您的要求后,您应该更新您的权限。

此链接对于设置服务帐户的权限非常有帮助: https://kubernetes.io/docs/reference/access-authn-authz/rbac/#service-account-permissions

【讨论】:

以上是关于如何在 Ignite XML 配置中为 Kubernetes IP Finder 设置 Master Url的主要内容,如果未能解决你的问题,请参考以下文章

如何在基于xml的spring配置中为hibernate.javax.cache.uri属性指定相对路径

Apache Spark + Ignite 集群瘦客户端

如何在 IntelliJ IDEA 14 中为当前项目工作配置注释处理?

ignite客户端找不到服务端的时候如何设置退出

apache ignite系列:ignite调优

ignite通过注解配置查询