[cloud-running-a-container]:在默认名称空间中找不到资源

时间:2020-06-12 02:54:39

标签: kubernetes google-kubernetes-engine kubernetes-pod

我使用Docker映像在K8中进行了一次小型部署,但未在部署中显示,而仅在pod中显示。 原因:它没有在部署中创建任何默认名称空间。

请建议:

以下是我使用的命令。

$ kubectl run hello-node --image=gcr.io/$DEVSHELL_PROJECT_ID/hello-node:1.0 --port=8080 --namespace=default
pod/hello-node created

$ kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
hello-node   1/1     Running   0          12s

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                                       READY   STATUS    RESTARTS   AGE
default       hello-node                                                 1/1     Running   0          9m9s
kube-system   event-exporter-v0.2.5-599d65f456-4dnqw                     2/2     Running   0          23m
kube-system   kube-proxy-gke-hello-world-default-pool-c09f603f-3hq6      1/1     Running   0          23m

$ kubectl get deployments
**No resources found in default namespace.**

$ kubectl get deployments --all-namespaces
NAMESPACE     NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   event-exporter-v0.2.5                      1/1     1            1           170m
kube-system   fluentd-gcp-scaler                         1/1     1            1           170m
kube-system   heapster-gke                               1/1     1            1           170m
kube-system   kube-dns                                   2/2     2            2           170m
kube-system   kube-dns-autoscaler                        1/1     1            1           170m
kube-system   l7-default-backend                         1/1     1            1           170m
kube-system   metrics-server-v0.3.1                      1/1     1            1           170m

2 个答案:

答案 0 :(得分:2)

Arghya Sadhu的回答是正确的。过去的kubectl run命令实际上是默认创建的Deployment而不是Pod。实际上,过去您可以将其与所谓的generators一起使用,并且可以通过提供--generator标志和相应的值来确切指定要创建的资源类型。当前--generator标志已弃用,并且无效。

请注意,在运行kubectl run命令后,您得到的信息很清楚:

$ kubectl run hello-node --image=gcr.io/$DEVSHELL_PROJECT_ID/hello-node:1.0 --port=8080 --namespace=default
pod/hello-node created

它清楚地表明Pod hello-node已创建。它在任何地方都没有提到Deployment

除了使用命令式命令创建DeploymentsPods之外,还可以使用声明式方法

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-node
  namespace: default
  labels:
    app: hello-node
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-node
  template:
    metadata:
      labels:
        app: hello-node
    spec:
      containers:
      - name: hello-node-container
        image: gcr.io/$DEVSHELL_PROJECT_ID/hello-node:1.0
        ports:
        - containerPort: 8080

在这种情况下,可以省略对namespace的声明,因为默认情况下,所有资源都已部署到default命名空间中。

保存文件后,例如与nginx-deployment.yaml一样,您只需要运行:

kubectl apply -f nginx-deployment.yaml

更新:

在yaml清单中扩展环境变量实际上不起作用,因此无法使用上述部署示例中的以下行:

image: gcr.io/$DEVSHELL_PROJECT_ID/hello-node:1.0

最简单的解决方法是一个相当简单的sed“技巧”。

首先,我们需要在部署定义yaml中更改项目ID的占位符。可能看起来像这样:

image: gcr.io/{{DEVSHELL_PROJECT_ID}}/hello-node:1.0

然后在应用部署定义而不是简单的kubectl apply -f deployment.yaml时运行此单行代码:

sed "s/{{DEVSHELL_PROJECT_ID}}/$DEVSHELL_PROJECT_ID/g" deployment.yaml | kubectl apply -f -

上面的命令告诉seddeployment.yaml文档中搜索{{DEVSHELL_PROJECT_ID}}字符串,并且每次出现此字符串时,用$DEVSHELL_PROJECT_ID环境变量的实际值替换它

答案 1 :(得分:1)

使用kubectl version

检查kubectl的版本

从kubectl 1.18版本kubectl run起,仅创建pod,没有其他内容。要创建部署,请使用kubectl create deployment或使用旧版本的kubectl

相关问题