无法查询kubernetes(未授权):禁止端点:用户无法在命名空间中列出端点

时间:2018-04-16 13:02:53

标签: erlang kubernetes elixir google-kubernetes-engine

我在kubernetes 1.9.4群集

上运行gke

我有两个正在尝试连接到gate的{​​{1}},其中都是coolapp

我正在使用libcluster来连接我的节点 我收到以下错误:

elixir

这是[libcluster:app_name] cannot query kubernetes (unauthorized): endpoints is forbidden: User "system:serviceaccount:staging:default" cannot list endpoints in the namespace "staging": Unknown user "system:serviceaccount:staging:default"中的配置:

config/prod

这是我的配置:

VM-ARGS

 config :libcluster,
 topologies: [
   app_name: [
     strategy: Cluster.Strategy.Kubernetes,
     config: [
       kubernetes_selector: "tier=backend",
       kubernetes_node_basename: System.get_env("MY_POD_NAMESPACE") || "${MY_POD_NAMESPACE}"]]]

创造秘密:

## Name of the node
-name ${MY_POD_NAMESPACE}@${MY_POD_IP}
## Cookie for distributed erlang
-setcookie ${ERLANG_COOKIE}
# Enable SMP automatically based on availability
-smp auto

栅/ deployment.yaml

kubectl create secret generic erlang-config --namespace staging --from-literal=erlang-cookie=xxxxxx
kubectl create configmap vm-config --namespace staging --from-file=vm.args

coolapp / deployment.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: gate
  namespace: staging
spec:
  replicas: 1
  revisionHistoryLimit: 1
  strategy:
      type: RollingUpdate
  template:
    metadata:
      labels:
        app: gate
        tier: backend
    spec:
      securityContext:
        runAsUser: 0
        runAsNonRoot: false
      containers:
      - name: gate
        image: gcr.io/development/gate:0.1.7
        args:
          - foreground
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /beamconfig
        env:
        - name: MY_POD_NAMESPACE
          value: staging
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: RELEASE_CONFIG_DIR
          value: /beamconfig
        - name: ERLANG_COOKIE
          valueFrom:
            secretKeyRef:
              name: erlang-config
              key: erlang-cookie
      volumes:
      - name: config-volume
        configMap:
          name: vm-config

2 个答案:

答案 0 :(得分:4)

staging命名空间的默认service account(显然您的使用libcluster的Pod正在运行)缺少{em>获取端点的RBAC权限那个名称空间。

可能您的应用程序需要许多其他权限(上述错误消息中未提及)才能正常工作;识别所有这些权限超出了SO的范围。

解决此问题的方法是授予超级用户权限该服务帐户。这不是一个安全的解决方案,而是一个止损修复。

$ kubectl create clusterrolebinding make-staging-sa-cluster-admin \
    --serviceaccount=staging:default \
    --clusterrole=cluster-admin

clusterrolebinding "make-staging-sa-cluster-admin" created

要仅授予特定权限(在暂存命名空间中获取端点),您需要先创建Role

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: some-permissions
  namespace: staging
rules:
- apiGroups: [""]
  resources: ["endpoints"]
  verbs: ["get", "list", "watch"]

在暂存命名空间中为默认服务帐户创建RoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: give-default-sa-some-permissions
  namespace: staging
subjects:
- kind: ServiceAccount
  name: default
  namespace: staging
roleRef:
  kind: Role
  name: some-permissions
  apiGroup: rbac.authorization.k8s.io

答案 1 :(得分:1)

不是erlang / elixir或libcluster用户,但它似乎正在尝试使用命名空间的默认服务帐户来尝试查询master以获取群集中可用的端点列表。

libcluster的自述文件说:

  

如果设置为Cluster.Strategy.Kubernetes,它将使用Kubernetes API   使用。来查询基于basename和label选择器的端点   注入每个pod的令牌和命名空间;一旦它有一个列表   端点,它使用该列表形成一个集群,并保持它   日期。

阅读code for the kubernetes.ex in libcluster并确认错误。

您需要在暂存命名空间中为服务帐户设置ClusterRole和RoleBinding。这将允许libcluster动态查询master以发现cluster / namespace中的其他erlang节点。

以下是一些便于后续阅读的资源: