微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

部署 cockroachdb-client-secure 的问题 背景根本原因解决方案

如何解决部署 cockroachdb-client-secure 的问题 背景根本原因解决方案

我正在关注这个掌舵 + 安全 - 指南:

https://www.cockroachlabs.com/docs/stable/orchestrate-cockroachdb-with-kubernetes.html#helm

我使用以下命令部署了集群:$ helm install my-release --values my-values.yaml cockroachdb/cockroachdb --namespace=thesis-crdb

它是这样的:$ helm list --namespace=thesis-crdb

NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                                      APP VERSION
my-release      thesis-crdb     1               2021-01-31 17:38:52.8102378 +0100 CET   deployed        cockroachdb-5.0.4                          20.2.4

以下是它的外观:$ kubectl get all --namespace=thesis-crdb

NAME                                    READY   STATUS      RESTARTS   AGE
pod/my-release-cockroachdb-0            1/1     Running     0          7m35s
pod/my-release-cockroachdb-1            1/1     Running     0          7m35s
pod/my-release-cockroachdb-2            1/1     Running     0          7m35s
pod/my-release-cockroachdb-init-fhzdn   0/1     Completed   0          7m35s

NAME                                    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
service/my-release-cockroachdb          ClusterIP   None         <none>        26257/TCP,8080/TCP   7m35s
service/my-release-cockroachdb-public   ClusterIP   10.xx.xx.x   <none>        26257/TCP,8080/TCP   7m35s

NAME                                      READY   AGE
statefulset.apps/my-release-cockroachdb   3/3     7m35s

NAME                                    COMPLETIONS   DURATION   AGE
job.batch/my-release-cockroachdb-init   1/1           43s        7m36s

my-values.yaml 文件中,我只将 tls 从 false 更改为 true

tls:
  enabled: true

到目前为止一切顺利,但从这里开始,指南不再适合我。我尝试按照他们所说的获取 csr:kubectl get csr --namespace=thesis-crdb

No resources found

好吧,也许不需要。我继续部署 client-secure 我下载文件https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/client-secure.yaml

并将 serviceAccountName: cockroachdb 更改为 serviceAccountName: my-release-cockroachdb

我尝试使用 $ kubectl create -f client-secure.yaml --namespace=thesis-crdb 部署它,但它抛出此错误

Error from server (Forbidden): error when creating "client-secure.yaml": pods "cockroachdb-client-secure" is forbidden: error looking up service account thesis-crdb/my-release-cockroachdb: serviceaccount "my-release-cockroachdb" not found

有人知道如何解决这个问题吗?我很确定是命名空间搞砸了。

我试图将命名空间放在元数据部分

Metadata:
  namespace: thesis-crdb

然后尝试使用:kubectl create -f client-secure.yaml 进行部署,但无济于事:

Error from server (Forbidden): error when creating "client-secure.yaml": pods "cockroachdb-client-secure" is forbidden: error looking up service account thesis-crdb/my-release-cockroachdb: serviceaccount "my-release-cockroachdb" not found

解决方法

您提到您在 YAML 中更改了 serviceAccountName

并将 serviceAccountName: cockroachdb 更改为 serviceAccountName: my-release-cockroachdb

因此,您问题的根本原因与 ServiceAccount 配置错误有关。

背景

在您的集群中,您有一个名为 ServiceAccount 的东西。

当您(人类)访问集群时(例如,使用 kubectl),您将被 apiserver 验证为特定用户帐户(目前通常为 admin,除非您的集群管理员已自定义您的集群)。 Pod 内容器中的进程也可以联系 apiserver。当他们这样做时,他们被验证为特定的服务帐户(例如,默认)。

对于 ServiceAccount,您还应该配置 RBAC,授予您创建资源的权限。

基于角色的访问控制 (RBAC) 是一种根据组织内单个用户的角色来调节对计算机或网络资源的访问的方法。

RBAC 授权使用 rbac.authorization.k8s.io API 组来驱动授权决策,允许您通过 Kubernetes API 动态配置策略。

如果您没有适当的 RBAC 权限,您将无法创建资源。

在 Kubernetes 中,您可以找到 Role and ClusterRoleRole 设置特定命名空间内的权限,而 ClusterRole 设置整个集群中的权限。 除此之外,您还需要使用 RoleBinding and ClusterRoleBinding 绑定角色。

此外,如果您使用云环境,您还需要项目中的特殊权限。您的指南提供了操作说明here

根本原因

我检查了 cockroachdb chart,它为 ServiceAccount 创建了 RoleClusterRoleRoleBindingClusterRoleBindingcockroachdbprometheusmy-release-cockroachdb 没有配置。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cockroachdb
...
  verbs:
  - create
  - get
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cockroachdb
  labels:
    app: cockroachdb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cockroachdb
...

client-secure.yaml 中,您将 serviceAccountName 更改为 my-release-cockroachdb,Kubernetes 找不到该 ServiceAccount,因为它不是由 cluster administratorcockroachdb chart 创建的。

要在默认 ServiceAccounts 中列出 namespace,您可以使用命令 $ kubectl get ServiceAccount,但是如果您要检查集群中的所有 ServiceAccounts,您应该将 -A 添加到您的命令 - $ kubectl get ServiceAccount -A

解决方案

选项 1 是使用具有适当权限的现有 ServiceAccount,例如由 SA 创建的 cockroachdb chart,它是 cockroachdb,而不是 {{1} }.

选项 2 是为 my-release-cockroachdb 创建 ServiceAccountRole/ClusterRoleRoleBinding/ClusterRoleBinding

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?