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

时间:2017-03-07 07:02:19

标签: docker kubernetes dockerfile

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

  

kubectl get 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 pod时,

kubectl get pods

我收到此错误:

  

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

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

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

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

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

7 个答案:

答案 0 :(得分:18)

我会使用kubernetes api,你只需要安装curl,而不是WITH data_tab AS ( SELECT '1540_INPUTTER' user_name FROM dual UNION SELECT '1540_RAZZ25_UNKNOWN' FROM dual UNION SELECT '1540_RAKIB17_OS_WIN10' FROM dual ) SELECT case when INSTR(SUBSTR(user_name, INSTR(user_name, '_')+1, length(user_name)- INSTR(user_name, '_')+1 ),'_') =0 then SUBSTR(user_name, INSTR(user_name, '_')+1, length(user_name)- INSTR(user_name, '_')+1 ) else substr((SUBSTR(user_name, INSTR(user_name, '_')+1, length(user_name)- INSTR(user_name, '_')+1 )), 1, INSTR(SUBSTR(user_name, INSTR(user_name, '_')+1, length(user_name)- INSTR(user_name, '_')+1 ),'_') -1) end as user_name from data_tab ,其余的都是安静的。

kubectl

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

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

为了找到api端点,您可以将curl http://localhost:8080/api/v1/namespaces/default/pods --v=8一起使用。

示例:

kubectl

资源:

Kubernetes API documentation

RBAC更新:

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

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

kubectl get pods --v=8

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

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

答案 1 :(得分:11)

在这里参加聚会有点晚,但这是我的两分钱:

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

(为什么?自动身份验证!)

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

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

Helpful documentation

---编辑---

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

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

完成后,您将拥有以下内容: ServiceAccountClusterRoleBindingDeployment(您的广告连播)

如果您需要更明确的指导,请随时发表评论,我会尽力帮助您:)

综合示例

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

答案 2 :(得分:10)

第一个问题

  

/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

第二个问题

如果您在正确配置的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
  • 会覆盖服务帐户凭据

答案 3 :(得分:2)

我再次面对这个概念。绝对有可能,但是出于安全原因,我们不要在 ClusterRole 容器中授予“ cluster-admin ”特权。

假设我们要在集群中部署P​​od,使其只能在集群中的特定命名空间中访问 view create Pod。在这种情况下,ServiceAccount可能类似于:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: spinupcontainers
subjects:
- kind: ServiceAccount
  name: spinupcontainers
  namespace: <YOUR_NAMESPACE>
roleRef:
  kind: Role
  name: spinupcontainers
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
  name: spinupcontainers
  # "namespace" omitted if was ClusterRoles because are not namespaced
  namespace: <YOUR_NAMESPACE>
  labels:
    k8s-app: <YOUR_APP_LABEL>
rules:
#
# Give here only the privileges you need
#
- apiGroups: [""]
  resources:
  - pods
  verbs:
  - create
  - update
  - patch
  - delete
  - get
  - watch
  - list
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: spinupcontainers
  namespace: <MY_NAMESPACE>
  labels:
    k8s-app: <MY_APP_LABEL>
---

如果您在容器规范中使用serviceAccountName: spinupcontainers来在部署中应用服务帐户,则无需安装任何其他卷密钥或手动附加证书。 kubectl 客户端将从/var/run/secrets/kubernetes.io/serviceaccount获取所需的令牌。然后,您可以测试是否正在使用类似的东西:

$ kubectl exec -it <your-container-with-the-attached-privs> -- /kubectl get pods -n <YOUR_NAMESPACE>
NAME.        READY   STATUS    RESTARTS   AGE
pod1-0       1/1     Running   0          6d17h
pod2-0       1/1     Running   0          6d16h
pod3-0       1/1     Running   0          6d17h
pod3-2       1/1     Running   0          67s

或权限被拒绝

$ kubectl exec -it <your-container-with-the-attached-privs> -- /kubectl get pods -n kube-system
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:spinupcontainers" cannot list resource "pods" in API group "" in the namespace "kube-system"
command terminated with exit code 1

经过测试:

$ kubectl exec -it <your-container-with-the-attached-privs> -- /kubectl versionClient Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:20:10Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:12:17Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}

答案 4 :(得分:1)

综合以上所有内容。这对我有用。 从容器内检索所有 Pod。

curl --insecure -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"  https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT/api/v1/namespaces/default/pods

有关 REST API,请参阅 https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#-strong-read-operations-pod-v1-core-strong-

答案 5 :(得分:0)

  1. 要在具有单个容器的 pod 内运行命令,请使用以下命令

kubectl --exec -it --

  1. 要在具有多个容器的 pod 内运行命令,请使用以下命令

kubectl --exec -it -c --

答案 6 :(得分:0)

在容器内运行 kubectl 命令。 需要3个步骤

  1. 安装 kubectl
RUN printf '[kubernetes] \nname = Kubernetes\nbaseurl = https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64\nenabled = 1\ngpgcheck = 1\nrepo_gpgcheck=1\ngpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg' \
  | tee /etc/yum.repos.d/kubernetes.repo \
  && cat  /etc/yum.repos.d/kubernetes.repo \
  && yum install -y kubectl

  1. 为服务帐户创建 ClusterAdminRole 绑定角色
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mysa-admin-sa
  namespace: mysa
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: mysa-admin-sa
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: mysa-admin-sa
    namespace: mysa

3- cronjob 配置示例

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: scaleup
  namespace: myapp
spec:
  schedule: "00 5 * * 1-5"
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: mysa-admin-sa
          restartPolicy: OnFailure
          containers:
          - name: scale-up
            image: myimage:test
            imagePullPolicy: Always
            command: ["/bin/sh"]
            args: ["-c", "mykubcmd_script >>/mylog.log"]