如何为 DevOps 管道验证和访问 Kubernetes 集群?

问题描述 投票:0回答:4

通常您会执行

ibmcloud login
ibmcloud ks cluster-config mycluster
⇒ 复制并粘贴
export KUBECONFIG=
,然后就可以运行
kubectl
命令。

但是,如果这是针对 IBM Cloud 之外的某些自动化 DevOps 管道完成的,那么进行身份验证和访问集群的方法是什么?

kubernetes gitlab ibm-cloud gitlab-ci
4个回答
8
投票

您不应将 kubeconfig 复制到管道中。相反,您可以创建一个具有特定命名空间权限的服务帐户,然后使用其凭据访问集群。

我所做的是创建一个服务帐户和角色绑定,如下所示:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: gitlab-tez-dev # account name
  namespace: tez-dev #namespace

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: tez-dev-full-access #role
  namespace: tez-dev
rules:
  - apiGroups: ["", "extensions", "apps"]
    resources: ["deployments", "replicasets", "pods", "services"] #resources to which permissions are granted
    verbs: ["*"] # what actions are allowed
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: tez-dev-view
  namespace: tez-dev
subjects:
  - kind: ServiceAccount
    name: gitlab-tez-dev
    namespace: tez-dev
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: tez-dev-full-access

然后您可以使用以下方式获取服务帐户的令牌:

kubectl describe secrets -n <namespace> gitlab-tez-dev-token-<value>

输出:

Name:         gitlab-tez-dev-token-lmlwj
Namespace:    tez-dev
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: gitlab-tez-dev
              kubernetes.io/service-account.uid: 5f0dae02-7b9c-11e9-a222-0a92bd3a916a

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1042 bytes
namespace:  7 bytes
token: <TOKEN>

在上面的命令中,

namespace
是您在其中创建帐户的命名空间,
value
是您在执行操作时将看到的唯一值

kubectl get secret -n <namespace>

将令牌复制到您的管道环境变量或配置中,然后您可以在管道中访问它。例如,在 gitlab 中我这样做(仅与此处相关的部分):

k8s-deploy-stage:
  stage: deploy
  image: lwolf/kubectl_deployer:latest
  services:
    - docker:dind
  only:
    refs:
      - dev
  script:
     ######## CREATE THE KUBECFG ##########
    - kubectl config set-cluster ${K8S_CLUSTER_NAME} --server=${K8S_URL}
    - kubectl config set-credentials gitlab-tez-dev --token=${TOKEN}
    - kubectl config set-context tez-dev-context --cluster=${K8S_CLUSTER_NAME} --user=gitlab-tez-dev --namespace=tez-dev
    - kubectl config use-context tez-dev-context
    ####### NOW COMMANDS WILL BE EXECUTED AS THE SERVICE ACCOUNT #########
    - kubectl apply -f deployment.yml
    - kubectl apply -f service.yml
    - kubectl rollout status -f deployment.yml

0
投票

KUBECONFIG 环境变量是 Kubernetes 配置文件的路径列表,这些文件为 kubectl 定义一个或多个(可切换)上下文(https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple -簇/)。

将 Kubernetes 配置文件复制到管道代理(默认为 ~/.kube/config),并可选择设置 KUBECONFIG 环境变量。如果您的配置文件中有不同的上下文,您可能需要在复制之前删除管道中不需要的上下文或使用

kubectl config use-context
切换上下文。

连接到 kube api 服务器所需的一切都在配置、证书、令牌等中。


0
投票

如果您不想将令牌复制到文件中或想要使用 API 自动检索令牌,您还可以执行一些 POST 命令,以便以编程方式检索用户令牌。

完整文档位于:https://cloud.ibm.com/docs/containers?topic=containers-cs_cli_install#kube_api

关键部分是通过

POST https://iam.bluemix.net/identity/token
调用检索您的 id 令牌。

主体将返回一个

id_token
,您可以在 Kubernetes API 调用中使用它。


0
投票

GitLab 16.4(2023 年 9 月)添加了一个新选项:

使用您的 GitLab 用户身份在本地访问集群

允许开发者访问 Kubernetes 集群需要开发者云账号或第三方认证工具。这增加了云身份和访问管理的复杂性。

现在,您可以仅使用开发人员的 GitLab 身份和 Kubernetes 代理来授予开发人员访问 Kubernetes 集群的权限。使用传统的 Kubernetes RBAC 来管理集群内的授权。

与 GitLab 管道中提供的 OIDC 云身份验证一起,这些功能允许 GitLab 用户无需专用云帐户即可访问云资源,而不会危及安全性和合规性。

在集群访问的第一次迭代中,您必须手动管理 Kubernetes 配置Epic 11455 建议通过使用相关命令扩展 GitLab CLI 来简化设置。

请参阅文档史诗

© www.soinside.com 2019 - 2024. All rights reserved.