如何从 public CI 服务器在 GKE 中部署应用程序

How to deploy an application in GKE from a public CI server

我正在尝试在 GKE 1.6.2 集群中部署应用程序 运行 ContainerOS 但网站/k8s 上的说明不再准确。

我得到的错误是:

Error from server (Forbidden): User "circleci@gophers-slack-bot.iam.gserviceaccount.com"
cannot get deployments.extensions in the namespace "gopher-slack-bot".:
"No policy matched.\nRequired \"container.deployments.get\" permission." 
(get deployments.extensions gopher-slack-bot)

应用程序的存储库可在此处获得available here

谢谢。

在 Kubernetes 1.6 和 GKE 中,我们引入了基于角色的进程控制。您的作者需要让服务帐户能够为其帐户创建部署(可能还有很多其他部署)。

https://kubernetes.io/docs/admin/authorization/rbac/

我过去使用 gcloud 工具对集群的 kubectl 进行身份验证时进行了一些重大更改,所以我最终弄清楚了如何将 kubectl 授权到独立于 GKE 的特定命名空间。以下是对我有用的:

圈内CI:

setup_kubectl() {
echo "$KUBE_CA_PEM" | base64 --decode > kube_ca.pem
kubectl config set-cluster default-cluster --server=$KUBE_URL --certificate-authority="$(pwd)/kube_ca.pem"
kubectl config set-credentials default-admin --token=$KUBE_TOKEN
kubectl config set-context default-system --cluster=default-cluster --user=default-admin --namespace default
kubectl config use-context default-system
}

下面是我如何从 kubectl 获取每个环境变量。

kubectl get serviceaccounts $namespace -o json

服务帐户将包含其机密的名称。在我的例子中,使用默认命名空间,它是

"secrets": [
    {
        "name": "default-token-655ls"
    }
] 

根据名称,我得到了秘密的内容

kubectl get secrets $secret_name -o json

密钥将包含 ca.crttoken 字段,它们与上面 shell 脚本中的 $KUBE_CA_PEM$KUBE_TOKEN 相匹配。

最后用kubectl cluster-info得到$KUBE_URL值。

一旦您在 CI 上 运行 setup_kubectl,您的 kubectl 实用程序将通过您要部署到的名称空间的身份验证。