如何在各种部署的应用程序的kubernetes上下文之间切换?

时间:2016-08-26 15:08:39

标签: amazon-web-services kubernetes

当我使用kubernetes / cluster / kube-up.sh在aws上部署每个应用程序时,我使用以下方式设置上下文:

CONTEXT=$(kubectl config view | grep current-context | awk '{print $2}')

kubectl config set-context $CONTEXT --namespace=${PROJECT_ID}

我为多个应用程序执行此操作,每个部署都很好。然而,我需要能够在kubernetes上下文之间切换以与任意部署的应用程序进行交互(查看日志/执行kubectl exec)

以下是如何显示我的所有背景

kubectl config view --output=json

{
    "kind": "Config",
    "apiVersion": "v1",
    "preferences": {},
    "clusters": [
        {
            "name": "aws_kubernetes",
            "cluster": {
                "server": "https://52.87.88.888",
                "certificate-authority-data": "REDACTED"
            }
        },
        {
            "name": "gke_primacyofdirectexperience_us-east1-b_loudhttpscluster",
            "cluster": {
                "server": "https://104.196.888.888",
                "certificate-authority-data": "REDACTED"
            }
        }
    ],
    "users": [
        {
            "name": "aws_kubernetes",
            "user": {
                "client-certificate-data": "REDACTED",
                "client-key-data": "REDACTED",
                "token": "taklamakan"
            }
        },
        {
            "name": "aws_kubernetes-basic-auth",
            "user": {
                "username": "admin",
                "password": "retrogradewaif"
            }
        },
        {
            "name": "gke_primacyofdirectexperience_us-east1-b_loudhttpscluster",
            "user": {
                "client-certificate-data": "REDACTED",
                "client-key-data": "REDACTED",
                "username": "admin",
                "password": "emptyadjacentpossible"
            }
        }
    ],
    "contexts": [
        {
            "name": "aws_kubernetes",
            "context": {
                "cluster": "aws_kubernetes",
                "user": "aws_kubernetes",
                "namespace": "ruptureofthemundaneplane"
            }
        },
        {
            "name": "gke_primacyofdirectexperience_us-east1-b_loudhttpscluster",
            "context": {
                "cluster": "gke_primacyofdirectexperience_us-east1-b_loudhttpscluster",
                "user": "gke_primacyofdirectexperience_us-east1-b_loudhttpscluster",
                "namespace": "primacyofdirectexperience"
            }
        }
    ],
    "current-context": "aws_kubernetes"
}

你可以在上面看到我已经部署了两个应用程序...当我尝试明显选择我的kubernetes上下文时

kubectl config set-context  gke_primacyofdirectexperience_us-east1-b_loudhttpscluster  --namespace=${PROJECT_ID}

... outputs
context "gke_primacyofdirectexperience_us-east1-b_loudhttpscluster" set.


kubectl config set-cluster "gke_primacyofdirectexperience_us-east1-b_loudhttpscluster"

... outputs
cluster "gke_primacyofdirectexperience_us-east1-b_loudhttpscluster" set.

然后当我发出像

这样的命令时它就会挂起
kubectl describe pods --namespace=primacyofdirectexperience 

也许我错过了设置用户的命令,因为在上面的json中,每个部署的应用程序都有自己的用户名???

更新

kubectl config use-context gke_primacyofdirectexperience_us-east1-b_loudhttpscluster

... outputs
switched to context "gke_primacyofdirectexperience_us-east1-b_loudhttpscluster".

然而现在当我发出任何kubectl命令时......例如

kubectl get pods 

.... outputs
Unable to connect to the server: x509: certificate signed by unknown authority

这是我以前从未见过的错误......毫无疑问是由于切换问题

即使出现上述错误消息/kubernetes/cluster/kube-down.sh也可以拆除群集,因此希望切换工作正常!

2 个答案:

答案 0 :(得分:4)

要在上下文之间切换,请使用use-context

kubectl config use-context gke_primacyofdirectexperience_us-east1-b_loudhttpscluster

现在应用的任何kubectl命令都将应用于该群集(使用primacyofdirectexperience命名空间,因为您将其设置为群集的默认值)。

kubectl get pods

现在将获取gke_primacyofdirectexperience_us-east1-b_loudhttpscluster命名空间中的所有pod primacyofdirectexperience。要使用不同的命名空间,可以应用namspace标志:

kubectl get pods --namespace=someothernamespace

要再次切换上下文,只需再次运行use-context

kubectl config use-context aws_kubernetes

现在,

kubectl get pods

将使用aws_kubernetes命名空间在default群集上运行。

您可以通过运行以下内容始终查看当前使用的上下文kubectl

kubectl config current-context

答案 1 :(得分:0)

为扩展答案(由@Pixel Elephant提供),它解释了如何“使用上下文”来实现多个配置之间的切换,值得一提的是,有时在两个仅相差仅两个的上下文之间切换很方便命名空间。您可以通过编辑~/.kube/config来复制上下文并仅更改名称空间来实现。

或者,您可以编写一个简短的脚本,该脚本将使用kubectl set-context $(kubectl config current-context) --namespace <nsname>编辑名称空间。

这些答案应完全回答您的问题。但是,如果您正在寻找方便的工具来简化这些命令的日常使用,则用户通常会尝试使用一些cli脚本来自动执行此类上下文切换。

我受到kubectxkswitch脚本的启发,我可以在大多数情况下推荐它们。他们正在帮助解决切换任务,但在~/.kube/config的某些更大或更小的标准配置上给我带来了困扰。因此,我创建了一个sys-exec调用包装器和一个kubectl的缩写。

如果在不使用参数的情况下调用k,则会看到截获的提示以切换上下文。

Switch kubectl to a different context/cluster/namespace.
Found following options to select from:
 >>> context: [1] franz
 >>> context: [2] gke_foo_us-central1-a_live-v1
 >>> context: [3] minikube
 --> new num [?/q]:

此外,k继续充当简写。以下是等效的:

kubectl get pods --all-namespaces
k get pods -A
k p -A