$ ./kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:39:24Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
$ ./kubectl get pod
No resources found in default namespace.
问题
但如果你再深入一点,就会发现有些地方出了问题:
$ ./kubectl get pod -n kube-system
No resources found in kube-system namespace.
我们创建的静态 Pod 消失了! 事实上,我们的 kubelet 节点根本没有被发现:
$ ./kubectl get nodes
No resources found in default namespace.
怎么了? 如果您还记得前几段,我们使用一组极其简单的命令行参数启动了 kubelet,因此 kubelet 不知道如何联系 API 服务器并通知其状态。 经过研究文档,我们找到了对应的flag:
--kubeconfig string
文件的路径 kubeconfig,它指定如何连接到 API 服务器。 可用性 --kubeconfig 启用 API 服务器模式,否 --kubeconfig 启用离线模式。
$ ./kubectl apply -f nginx.yaml
Error from server (Forbidden): error when creating "nginx.yaml": pods "nginx" is
forbidden: error looking up service account default/default: serviceaccount
"default" not found
$ ./kubectl get serviceaccounts
No resources found in default namespace.
$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: default
EOS
serviceaccount/default created
$ ./kubectl apply -f nginx.yaml
Error from server (ServerTimeout): error when creating "nginx.yaml": No API
token found for service account "default", retry after the token is
automatically created and added to the service account
即使我们手动创建服务帐户,也不会生成身份验证令牌。 当我们继续尝试我们的简约“集群”时,我们会发现通常自动发生的大多数有用的事情都会丢失。 Kubernetes API 服务器非常简约,大部分繁重的工作和自动配置都发生在尚未运行的各种控制器和后台作业中。
$ ./kubectl delete pod nginx
pod "nginx" deleted
$ ./kubectl apply -f nginx.yaml
pod/nginx created
$ ./kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 30s 172.17.0.2 mink8s <none> <none>
$ curl -s 172.17.0.2 | head -4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
为了确保 Pod 之间的网络正常工作,我们可以从另一个 Pod 运行curl:
$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: curl
spec:
containers:
- image: curlimages/curl
name: curl
command: ["curl", "172.17.0.2"]
nodeName: mink8s
EOS
pod/curl created
$ ./kubectl logs curl | head -6
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
深入研究这个环境并看看什么有效、什么无效是非常有趣的。 我发现 ConfigMap 和 Secret 按预期工作,但 Service 和 Deployment 没有。