如何在容器内运行kubectl命令?

问题描述 投票:27回答:3

在pod中的容器中,如何使用kubectl运行命令?例如,如果我需要在容器内执行类似的操作:

kubectl获得pods

我试过这个:在我的dockerfile中,我有这些命令:

RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN sudo mv ./kubectl /usr/local/bin/kubectl

编辑:我正在尝试OSX文件,我已将其更正为Linux二进制文件。 (由@svenwltr更正

在创建docker文件时,这很成功,但是当我在容器内运行kubectl get pods时,

kubectl get pods

我收到此错误:

与服务器的连接:被拒绝 - 您是否指定了正确的主机或端口?

当我在本地部署时,如果我的docker-machine没有运行,我遇到了这个错误,但是在容器内部如何运行docker-machine?

在本地,我通过运行以下命令来解决此错误:(dev是docker-machine的名称)

docker-machine env dev
eval $(docker-machine env dev)

有人可以告诉我,我需要做什么?

docker kubernetes dockerfile
3个回答
20
投票

我会使用kubernetes api,你只需要安装curl,而不是kubectl,其余的都很安静。

curl http://localhost:8080/api/v1/namespaces/default/pods

我在我的一个apiservers上运行命令。将localhost更改为apiserver ip address / dns名称。

根据您的配置,您可能需要使用ssl或提供客户端证书。

为了找到api端点,你可以使用--v=8kubectl

例:

kubectl get pods --v=8

资源:

Kubernetes API documentation

RBAC更新:

我假设您已经配置了rbac,为您的pod创建了一个服务帐户并使用它运行。此服务帐户应具有所需命名空间中的pod的列表权限。为此,您需要为该服务帐户创建角色和角色绑定。

群集中的每个容器都填充有可用于向API服务器进行身份验证的令牌。要验证,在容器内运行:

cat /var/run/secrets/kubernetes.io/serviceaccount/token

要向apiserver发出请求,请在容器内运行:

curl -ik \
     -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
     https://kubernetes.default.svc.cluster.local/api/v1/namespaces/default/pods

14
投票

在这里聚会迟到了,但这是我的两分钱:

我发现在容器中使用kubectl要比调用集群的api容易得多

(为什么?自动验证!)

假设您正在部署需要使用kubectl的Node.js项目。

  1. 在容器内下载并构建kubectl
  2. 构建您的应用程序,将kubectl复制到您的容器中
  3. 瞧! kubectl为管理您的kubernetes集群提供了丰富的cli

Helpful documentation

---编辑---

在我的群集窗格中使用kubectl之后,我找到了一种更有效的方法来验证pod,以便能够进行k8s API调用。此方法提供更严格的身份验证。

  1. 为您的pod创建一个ServiceAccount,并配置您的pod以使用该帐户。 k8s Service Account docs
  2. 配置RoleBindingClusterRoleBinding以允许服务具有与k8s API通信的授权。 k8s Role Binding docs
  3. 直接调用API,或使用k8s-client为您管理API调用。我强烈建议使用客户端,它具有pod的自动配置,删除正常请求所需的身份验证令牌步骤。

当你完成后,你将拥有以下内容:ServiceAccountClusterRoleBindingDeployment(你的豆荚)

如果你需要一些更明确的方向,请随意发表评论,我会尽力帮助:)

All-in-on example

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: k8s-101
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: k8s-101
    spec:
      serviceAccountName: k8s-101-role
      containers:
      - name: k8s-101
        imagePullPolicy: Always
        image: salathielgenese/k8s-101
        ports:
        - name: app
          containerPort: 3000
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: k8s-101-role
subjects:
- kind: ServiceAccount
  name: k8s-101-role
  namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: k8s-101-role

salathielgenese/k8s-101图像包含kubectl。所以你可以登录一个pod容器并执行kubectl,就像他在k8s主机上运行它一样:kubectl exec -it pod-container-id -- kubectl get pods


12
投票

First Question

/usr/local/bin/kubectl: cannot execute binary file

看起来你下载了kubectl的OSX二进制文件。在Docker中运行时,您可能需要Linux:

https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

Second Question

如果在正确配置的Kubernetes集群中运行kubectl,它应该能够连接到apiserver。

kubectl基本上使用此代码来查找apiserver并进行身份验证:github.com/kubernetes/client-go/rest.InClusterConfig

这意味着:

  • apiserver的主机和端口存储在环境变量KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT中。
  • 访问令牌已安装到var/run/secrets/kubernetes.io/serviceaccount/token
  • 服务器证书已安装到/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

这是kubectl连接到apiserver需要知道的所有数据。

一些想法为什么这可能不起作用:

  • 容器不在Kubernetes中运行。 使用相同的Docker主机是不够的;容器需要作为pod定义的一部分运行。
  • 使用authorization plugin(这不是默认值)限制访问。
  • 服务帐户凭据被pod definitionspec.serviceAccountName)覆盖。
© www.soinside.com 2019 - 2024. All rights reserved.