$ ./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 沒有。