我在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
答案 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节点。
以下是一些便于后续阅读的资源: