Kubernetes 本地快速启动(基于 Docker)

Kubernetes 在容器编排大战结束后已经在云原生中占据了明确的一席,最近几年越来越火热,目前搜索趋势:

image

Kubernetes 的热度很明显是不断地在上涨,因此学习和使用 Kubernetes 是一件相对正确的事,同时公司大多都在往容器化上接近,在拥抱 Kubernetes,所以我们所开发的应用也总是跑在容器环境中。更甚的是,需要对接 Kubernetes API 来做一些功能的开发。

这个时候,我们就需要一个 Kubernetes 环境来进行开发和调试,但你准备开始时,又遇到了一个问题,虽然在 2020 年的现在,Kubernetes 的安装已经有了极大的简化,教程也满地跑,但 Kubernetes 的安装和运行依然有一定的要求,像我,就遇到了如下问题:

image

显然,我的小水管 Mac 承受不起,但是又需要对 Kubernetes 进行学习和使用,除了买云服务器,又或是再在台式机上搭虚拟机,还有没有什么办法呢。

非运维开发的情况下,入门级中最简单的方式就是采用 Docker 所提供的 Kubernetes 支持。

Docker for Mac/Windows with Kubernetes

Docker 在 17.12.ce 起就提供了 Mac 版本的 Kubernetes Beta 支持,在初始使用上来说非常的方便。首先我们检查 Docker 的版本,点击 Docker -> Check for Updates 确保你的 Docker 在最新版本。

快速安装 Kubernetes

在升级完成后,我们可以点击 Docker -> Preferences -> Kubernetes,如下图:

image

你会发现存在三个选项,分别是:Enable Kubernete、Deploy Docker Stacks to Kubernetes by default、Show system containers (advanced)。

一般我们只勾选 “Enable Kubernetes” 选项,如果你还想通过 docker ps 查看到 Kubernetes 的相关容器信息,那么还可以勾选 “Show system containers” 选项,在勾选完毕后点击右下角的 “Apply” 按钮就可以了。

这个时候 Docker Preferences 界面上的 Kubernetes 选项将会进入 kubernetes is starting... 状态,也就是在拉取各类镜像,需要一定的时间。

这一步有一点需要注意,Kubernetes 大多数的镜像都在国外,如果不翻墙你是无法正常下载的,就会导致一直阻塞在 kubernetes is starting...,等半天也没有响应,这种情况下你可以把镜像源改为国内,又或是参考 k8s-docker-desktop-for-mac 项目来安装。

最后在安装完毕后,你可以检查 Docker Preferences 界面左下角的 Kubernetes 状态是否正常就可以了,如下图:

image

安装 Dashboard

在完成 Kubernetes 的安装后,我们需要安装 Dashboard,执行如下命令:

  1. $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

该 Dashboard 对应 kubernetes/dashboard 项目,而所选择的版本号(兼容性问题),大家可以根据 Releases 中的 Compatibility 来进行选择,但一般不需要太在意,因为 Kubernetes 在 Dashboard 上的建设重心已经逐渐偏向 Promethues 体系了,因此在这一块是比较滞后的,如果想特别依赖 Dashboard 来进行分析,也可以自行选择一些成熟的开源产品。

在完成 apply 后,进行代理,执行如下命令:

  1. // 默认 8001 端口,若有需要可通过 --port=8080 进行指定
  2. $ kubectl proxy

执行完毕完毕后,我们可以直接在通过浏览器访问 http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login 地址,如下图:

image

创建 ServiceAccount

我们在本地创建一个 k8s-admin.yaml 文件,创建一个 ServiceAccount 和角色绑定关系,写入如下文件内容:

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: dashboard-admin
  5. namespace: kube-system
  6. ---
  7. kind: ClusterRoleBinding
  8. apiVersion: rbac.authorization.k8s.io/v1beta1
  9. metadata:
  10. name: dashboard-admin
  11. subjects:
  12. - kind: ServiceAccount
  13. name: dashboard-admin
  14. namespace: kube-system
  15. roleRef:
  16. kind: ClusterRole
  17. name: cluster-admin
  18. apiGroup: rbac.authorization.k8s.io

获取管理员角色的 secret 名称:

  1. $ kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}'
  2. dashboard-admin-token-dknqx

获取对应的管理员的 token 值:

  1. $ kubectl describe secret dashboard-admin-token-dknqx -n kube-system
  2. Name: dashboard-admin-token-dknqx
  3. Namespace: kube-system
  4. Labels: <none>
  5. Annotations: kubernetes.io/service-account.name: dashboard-admin
  6. kubernetes.io/service-account.uid: 2f817ddd-5802-4e8b-8c38-f4affc16a6fe
  7. Type: kubernetes.io/service-account-token
  8. Data
  9. ====
  10. ca.crt: 1025 bytes
  11. namespace: 11 bytes
  12. token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tZGtucXgiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMmY4MTdkZGQtNTgwMi00ZThiLThjMzgtZjRhZmZjMTZhNmZlIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.NKa8OESUsvrolyxezo8w_auKr7jC94gmCm2ZyvQda5X1wOImYYqnH482sDPsQ5Y_V-RH2UD-4eBIuZP6gh0p50nxz-gPqEEPdRln_7osbRMCgcGzqajVo3bx7UOLTJC9ka9S-0rv5HYbn3yeVi6Pt4sVW5GF6KInDcbyyYgse5B_nySIpw4AjdWXNG0npLjneBCQWrVKAQSYYw2mLPZAPPjw6yjXnBvqZmtH1wyvCsKAXbZqBtTp7ddIVvtmveeBuELsX5yIzWqD7qhcpZz4v07FrsfqK0_QJ18BBDBGYMJaaoaK0h2pl_E9sIlAXoBCJ6ol_wwUzfuOshPo9adqww

如果已经熟悉了,可以直接通过组合命令直接获取 token 值:

  1. $ kubectl describe secret dashboard-admin-token-dknqx -n kube-system | grep -E '^token' | awk '{print $2}'

登陆 Dashboard

最后我们将 token 保存并复制到 Kubernetes Dashboard 的仪表盘并登陆,我们就可以看到如下界面:

image

小结

我们又回到最初的问题,要学习和使用 Kubernetes,最快最正确的方式,那就是尽快的进行实践,因为本质上我们不是运维开发人员,部署环境的 Kubernetes 也大多不是由你亲自搭建,因为中小微会直接用某云厂商的 Kubernetes,大厂有专职的人员,也不愁这个问题。

因此尽快行动,完成迭代中的需求是我们的目的,等完成后,再回过头来一步步手动搭建 Kubernetes 也未尝不可,所以我认为 Docker for Mac/Windows with Kubernetes 在初级入门阶段是一个很好的安装和使用方法。