如何为 devops 管道验证和访问 Kubernetes 集群?
How to authenticate and access Kubernetes cluster for devops pipeline?
通常你会做 ibmcloud login
⇒ ibmcloud ks cluster-config mycluster
⇒ 复制并粘贴 export KUBECONFIG=
然后你可以 运行 你的 kubectl
命令。
但是,如果这是为 IBM Cloud 之外的一些自动化 DevOps 管道完成的,那么获得身份验证和访问集群的方法是什么?
KUBECONFIG 环境变量是 Kubernetes 配置文件的路径列表,这些文件为 kubectl (https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) 定义了一个或多个(可切换的)上下文。
将您的 Kubernetes 配置文件复制到您的管道代理(默认为 ~/.kube/config),并可选择设置 KUBECONFIG 环境变量。如果您的配置文件中有不同的上下文,您可能希望在复制之前删除管道中不需要的上下文,或者使用 kubectl config use-context
.
切换上下文
连接到 kube api 服务器所需的一切都在该配置、证书、令牌等中。
您不应将 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
如果您不想将令牌复制到文件中或想使用 API 自动检索令牌,您也可以执行一些 POST 命令以便以编程方式检索您的用户令牌。
这里有完整的文档:https://cloud.ibm.com/docs/containers?topic=containers-cs_cli_install#kube_api
关键是通过 POST https://iam.bluemix.net/identity/token
调用检索您的 ID 令牌。
主体将 return 一个 id_token
,您可以在 Kubernetes API 调用中使用它。
通常你会做 ibmcloud login
⇒ ibmcloud ks cluster-config mycluster
⇒ 复制并粘贴 export KUBECONFIG=
然后你可以 运行 你的 kubectl
命令。
但是,如果这是为 IBM Cloud 之外的一些自动化 DevOps 管道完成的,那么获得身份验证和访问集群的方法是什么?
KUBECONFIG 环境变量是 Kubernetes 配置文件的路径列表,这些文件为 kubectl (https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) 定义了一个或多个(可切换的)上下文。
将您的 Kubernetes 配置文件复制到您的管道代理(默认为 ~/.kube/config),并可选择设置 KUBECONFIG 环境变量。如果您的配置文件中有不同的上下文,您可能希望在复制之前删除管道中不需要的上下文,或者使用 kubectl config use-context
.
连接到 kube api 服务器所需的一切都在该配置、证书、令牌等中。
您不应将 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
如果您不想将令牌复制到文件中或想使用 API 自动检索令牌,您也可以执行一些 POST 命令以便以编程方式检索您的用户令牌。
这里有完整的文档:https://cloud.ibm.com/docs/containers?topic=containers-cs_cli_install#kube_api
关键是通过 POST https://iam.bluemix.net/identity/token
调用检索您的 ID 令牌。
主体将 return 一个 id_token
,您可以在 Kubernetes API 调用中使用它。