构建最小化的 Kubernetes 集群( 三 )

【构建最小化的 Kubernetes 集群】然后使用 kubectl 来创建上面的资源对象:
$ ./kubectl Apply -f nginx.yamlError from server (Forbidden): error when creating "nginx.yaml": pods "nginx" isforbidden: error looking up service account default/default: serviceaccount"default" not found$ ./kubectl get serviceaccountsNo resources found in default namespace.可以看到有错误信息,这是因为我们上面部署的最小级别的 Kubernetes 环境完整性还是不够,没有自动生成默认的 default 这个 ServiceAccount,我们来手动创建再来验证一次:
$ cat <<EOF | ./kubectl apply -f -apiVersion: v1kind: ServiceAccountmetadata:name: defaultnamespace: defaultEOFserviceaccount/default created$ ./kubectl apply -f nginx.yamlError from server (ServerTimeout): error when creating "nginx.yaml": No APItoken found for service account "default", retry after the token isautomatically created and added to the service account我们手动创建了 ServiceAccount,但是却并没有创建对应的身份验证的 Token,我们可以看到以前很多自动完成的操作现在都没有了 。
不过我们可以通过 automountServiceAccountToken 参数在 ServiceAccount 上来规避这个特定问题,因为实际上我们这里并不需要使用 ServiceAccount:
$ cat <<EOF | ./kubectl apply -f -apiVersion: v1kind: ServiceAccountmetadata:name: defaultnamespace: defaultautomountServiceAccountToken: falseEOFserviceaccount/default configured$ ./kubectl apply -f nginx.yamlpod/nginx created$ ./kubectl get podsNAMEREADYSTATUSRESTARTSAGEnginx0/1Pending013m现在我们可以看到 Pod 出现了,但是处于 pending 状态,这是因为我们并没有部署 kube-scheduler 这个负责调度的组件,自然是不能被调度的,当然我们也可以不需要调度程序,直接使用 nodeName 属性将 Pod 手动固定到节点上即可:
apiVersion: v1kind: Podmetadata:name: nginxspec:containers:- image: nginxname: nginxnodeName: mink8s现在将之前部署的 Pod 删除重新来部署,正常就可以运行了:
$ ./kubectl delete pod nginxpod "nginx" deleted$ ./kubectl apply -f nginx.yamlpod/nginx created$ ./kubectl get pods -owideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATESnginx1/1Running030s172.17.0.2mink8s<none><none>$ curl -s 172.17.0.2 | head -4<!DOCTYPE html><html><head><title>Welcome to nginx!</title>为了验证 Pod 与 Pod 之间是可以正常通信的,我们可以使用如下的 Pod 来验证:
$ cat <<EOF | ./kubectl apply -f -apiVersion: v1kind: Podmetadata:name: curlspec:containers:- image: curlimages/curlname: curlcommand: ["curl", "172.17.0.2"]nodeName: mink8sEOFpod/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>可以看到可以正常通信 。这样我们就完成了一个最小的 Kubernetes 集群部署 。当然这也仅仅是为了简化我们对 Kubernetes 的理解而已,在实际的生产环境是绝对不能这样去部署使用的 。
参考

  • https://eevans.co/blog/minimum-viable-kubernetes/
  • https://commons.wikimedia.org/w/index.php?curid=53571935
  • https://kubernetes.io/docs/concepts/overview/components/
  • https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/




推荐阅读