当我使用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也可以拆除群集,因此希望切换工作正常!
答案 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脚本来自动执行此类上下文切换。
我受到kubectx
和kswitch
脚本的启发,我可以在大多数情况下推荐它们。他们正在帮助解决切换任务,但在~/.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