如何成功启动 Docker 自带的 Kubernetes?

由于 Docker Desktop 新的授权许可对大中型企业不再允许免费使用,本文也不再更新。推荐使用 Rancher Desktop 替代,并可选择切换至 nerd 来完全抛弃 Docker CLI。感谢大家一直关注本文。

(2022年5月,基于 kubernetes 1.24.0 全新修订,包括 Docker Desktop 4.8.0 ~ )
因为要启动 Docker Desktop 自带的 Kubernetes 需要一些无法访问的镜像,所以撰写这篇技术笔记。希望能帮大家节省一点点时间,知道坑在哪里,以便更好的玩转 Kubernetes。具体步骤的话,大概分以下几步:

  • 步骤1:安装 Docker Desktop
  • 步骤2:下载 Kubernetes 镜像并启动运行
  • 步骤3:下载 kubectl 工具
  • 步骤4:启用 Dashboard(可选)
About Docker Desktop

步骤1:安装 Docker Desktop

从 Docker 官网导航菜单,可以找到 Docker Desktop 产品页面,选择指定平台的版本下载。
备注:懒人可以参见本文末尾附件,以进行快速下载。

也可以访问 Docker Hub,找到社区版 Docker CE,并根据自己的操作系统选择对应的产品。

Docker Desktop for

对于我这种新手来说,选择稳定版本即可:

不同的版本内置的 kubernetes 版本不一样,请在安装完 Docker Desktop 后到关于对话框查看具体的版本号。

  • Docker Version 4.8.0~ 》kubernetes 1.24.0
  • Docker Version 4.4.2~ 》kubernetes 1.22.5
  • Docker Version 4.3.0~ 》kubernetes 1.22.4
  • Docker Version 4.1.0~ 》kubernetes 1.21.5
    如果要下载指定版本,可查看版本发布历史。
  • macOS release notes
  • Windows release notes
  • Linux release notes (从 4.8.0 版本开始支持)

步骤2:下载 Kubernetes 镜像并启动运行

要想把 Kubernetes 启动起来,需要先下载 Kubernetes 组件的镜像。因为在阿里云上,有同步镜像的组件,我们就不需要翻到官网下载了。借鉴网上找到脚本 k8s-deploy,进行改良一下,加入了 Dashboard 组件进去。大家如果只使用 kubectl 来控制 Kubernetes 的话,可以自己将这部分去掉。对于新手来说,可能有个网页界面,看着舒服些。

另外,为了更顺畅的运行,可进入状态栏图标的下拉菜单项 “Preferences”,打开首选项对话框,选择“Resources > ADVANCED”,稍微调大一点运行资源:


Resources > ADVANCED 配置

再在 Docker Engine 的配置脚本中,添加国内的 Docker Hub、GCR、Quay 镜像加速器地址(比如七牛云、中科大、Azure、网易云、阿里云、Docker-cn等),从而提升获取 Docker 官方镜像的速度。你可以配置一个或多个地址。

{
  "debug": true,
  "experimental": false,
  "registry-mirrors": [
    "https://********.mirror.aliyuncs.com",
    "https://mirror.ccs.tencentyun.com",
    "https://reg-mirror.qiniu.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://dockerhub.azk8s.cn",
    "https://hub-mirror.c.163.com",
    "https://registry.docker-cn.com"
  ],
  "insecure-registries": [
    "try-registry.example.com"
  ]
}

备注:

  1. 阿里云的镜像加速器地址,参见 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors ,然后将 ******** 变更为你获取到的地址。
  2. 如果有自己搭建的、未配置 TLS 的镜像仓库,可以 insecure-registries 中添加。

现在,创建一个拉取 Kubernetes 镜像的脚本文件。
macOS 和 Linux 平台:docker-images-k8s.sh

#!/bin/bash

set -e
KUBE_VERSION=v1.24.0
KUBE_PAUSE_VERSION=3.7
ETCD_VERSION=3.5.3-0
COREDNS_VERSION=v1.8.6
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers

# get images
images=(kube-proxy:$KUBE_VERSION
    kube-scheduler:$KUBE_VERSION
    kube-controller-manager:$KUBE_VERSION
    kube-apiserver:$KUBE_VERSION
    pause:$KUBE_PAUSE_VERSION
    etcd:$ETCD_VERSION)

for imageName in ${images[@]} ; do
    docker pull $ALIYUN_URL/$imageName
    docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName
    docker rmi $ALIYUN_URL/$imageName
done

# get images - coredns
docker pull $ALIYUN_URL/coredns:$COREDNS_VERSION
docker tag $ALIYUN_URL/coredns:$COREDNS_VERSION $GCR_URL/coredns/coredns:$COREDNS_VERSION
docker rmi $ALIYUN_URL/coredns:$COREDNS_VERSION

# show images
docker images

各个旧版本对应组件:

# kubernetes 1.22.5
KUBE_VERSION=v1.22.5
KUBE_PAUSE_VERSION=3.5
ETCD_VERSION=3.5.0-0
COREDNS_VERSION=v1.8.4

# kubernetes 1.22.4
KUBE_VERSION=v1.22.4
KUBE_PAUSE_VERSION=3.5
ETCD_VERSION=3.5.0-0
COREDNS_VERSION=v1.8.4

# kubernetes 1.21.5:
KUBE_VERSION=v1.21.5
KUBE_PAUSE_VERSION=3.4.1
ETCD_VERSION=3.4.13-0
COREDNS_VERSION=v1.8.0

接下来,我们增加文件的执行权限,并运行一下这个脚本:

$ chmod +x docker-images-k8s.sh
$ ./docker-images-k8s.sh

看到最终的运行结果:

REPOSITORY                                                TAG                                                                          IMAGE ID       CREATED         SIZE
hubproxy.docker.internal:5000/docker/desktop-kubernetes   kubernetes-v1.24.0-cni-v0.8.5-critools-v1.17.0-cri-dockerd-v0.2.0-1-debian   c3114e97d326   3 days ago      348MB
k8s.gcr.io/kube-apiserver                                 v1.24.0                                                                      529072250ccc   4 days ago      130MB
k8s.gcr.io/kube-proxy                                     v1.24.0                                                                      77b49675beae   4 days ago      110MB
k8s.gcr.io/kube-scheduler                                 v1.24.0                                                                      e3ed7dee73e9   4 days ago      51MB
k8s.gcr.io/kube-controller-manager                        v1.24.0                                                                      88784fb4ac2f   4 days ago      119MB
k8s.gcr.io/etcd                                           3.5.3-0                                                                      aebe758cef4c   3 weeks ago     299MB
k8s.gcr.io/pause                                          3.7                                                                          221177c6082a   8 weeks ago     711kB
k8s.gcr.io/coredns/coredns                                v1.8.6                                                                       a4ca41631cc7   7 months ago    46.8MB
docker/desktop-vpnkit-controller                          v2.0                                                                         8c2c38aa676e   12 months ago   21MB
docker/desktop-storage-provisioner                        v2.0                                                                         99f89471f470   12 months ago   41.9MB

这时候稍等片刻,就可以看到 Kubernetes 已正常运行了。

Windows 平台:docker-images-k8s.ps1

$KUBE_VERSION="v1.24.0"
$KUBE_PAUSE_VERSION="3.7"
$ETCD_VERSION="3.5.3-0"
$COREDNS_VERSION="v1.8.6"
$GCR_URL="k8s.gcr.io"
$ALIYUN_URL="registry.cn-hangzhou.aliyuncs.com/google_containers"

# get images
docker pull $ALIYUN_URL/pause:$KUBE_PAUSE_VERSION
docker tag $ALIYUN_URL/pause:$KUBE_PAUSE_VERSION $GCR_URL/pause:$KUBE_PAUSE_VERSION
docker rmi $ALIYUN_URL/pause:$KUBE_PAUSE_VERSION

docker pull $ALIYUN_URL/kube-controller-manager:$KUBE_VERSION
docker tag $ALIYUN_URL/kube-controller-manager:$KUBE_VERSION $GCR_URL/kube-controller-manager:$KUBE_VERSION
docker rmi $ALIYUN_URL/kube-controller-manager:$KUBE_VERSION

docker pull $ALIYUN_URL/kube-scheduler:$KUBE_VERSION
docker tag $ALIYUN_URL/kube-scheduler:$KUBE_VERSION $GCR_URL/kube-scheduler:$KUBE_VERSION
docker rmi $ALIYUN_URL/kube-scheduler:$KUBE_VERSION

docker pull $ALIYUN_URL/kube-proxy:$KUBE_VERSION
docker tag $ALIYUN_URL/kube-proxy:$KUBE_VERSION $GCR_URL/kube-proxy:$KUBE_VERSION
docker rmi $ALIYUN_URL/kube-proxy:$KUBE_VERSION

docker pull $ALIYUN_URL/kube-apiserver:$KUBE_VERSION
docker tag $ALIYUN_URL/kube-apiserver:$KUBE_VERSION $GCR_URL/kube-apiserver:$KUBE_VERSION
docker rmi $ALIYUN_URL/kube-apiserver:$KUBE_VERSION

docker pull $ALIYUN_URL/etcd:$ETCD_VERSION
docker tag $ALIYUN_URL/etcd:$ETCD_VERSION $GCR_URL/etcd:$ETCD_VERSION
docker rmi $ALIYUN_URL/etcd:$ETCD_VERSION

docker pull $ALIYUN_URL/coredns:$COREDNS_VERSION
docker tag $ALIYUN_URL/coredns:$COREDNS_VERSION $GCR_URL/coredns/coredns:$COREDNS_VERSION
docker rmi $ALIYUN_URL/coredns:$COREDNS_VERSION

# show images
docker images

使用 PowerShell 来执行脚本:

.\docker-images-k8s.ps1

备注:如果因为安全策略而无法执行 PowerShell 脚本,请在 “以管理员身份运行” 的 PowerShell 中执行 Set-ExecutionPolicy RemoteSigned 命令。

步骤3:下载 kubectl 工具

根据你电脑的操作系统,从 github 上直接下载指定平台版本的 kubectl。
kubernetes 1.24.0

下载后解压 kubectl 到某个目录下。然后打开终端命令行,进入这个目录,执行以下脚本,将其变更为可执行命令,同时移动到系统特定目录下。
对于 macOS 和 Linux 版本,下载后解压 kubectl 文件到 /usr/local/bin 目录下(以 amd64 版本为例)。

# macOS
tar zxvf kubernetes-client-darwin-amd64.tar.gz
# Linux
tar zxvf kubernetes-client-linux-amd64.tar.gz
# 移至 bin 目录
cd ./kubernetes/client/bin
chmod +x kubectl && mv kubectl /usr/local/bin/
chmod +x kubectl-convert && mv kubectl-convert /usr/local/bin/

对于 Windows 版本,下载后解压 kubectl.exe 文件到 C:\Windows\System32 目录下。

我们可以看下 kubectl 的版本号:

Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.0", GitCommit:"4ce5a8954017644c5420bae81d72b09b735c21f0", GitTreeState:"clean", BuildDate:"2022-05-03T13:46:05Z", GoVersion:"go1.18.1", Compiler:"gc", Platform:"darwin/amd64"}
Kustomize Version: v4.5.4
Server Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.0", GitCommit:"4ce5a8954017644c5420bae81d72b09b735c21f0", GitTreeState:"clean", BuildDate:"2022-05-03T13:38:19Z", GoVersion:"go1.18.1", Compiler:"gc", Platform:"linux/amd64"}

步骤4:启用 Dashboard(可选)

需要注意的是,因为 Dashboard 的版本是单独演进的,参见 https://github.com/kubernetes/dashboard ,现使用的 v2.5.1 可以在 recommended.yaml 文件中查看到使用的容器镜像版本。

建议提前下载这两个镜像:

docker pull kubernetesui/dashboard:v2.5.1
docker pull kubernetesui/metrics-scraper:v1.0.7

接下来,我们要想启动 Kubernetes Dashboard,还得在集群中部署一下 recommended.yaml。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

如果执行此命令有问题,可从之前网页上看到的 recommended.yaml 另存为本地来执行,或者使用文末附件网盘里已经帮你保存好的文件。

kubectl apply -f dashboard-recommended.yaml

部署成功后,启动 Kubernetes API Server 访问代理。

kubectl proxy
Starting to serve on 127.0.0.1:8001

这时候,打开浏览器,通过如下 URL 访问 Kubernetes Dashboard:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

Kubernetes Dashboard 登录

通过以下脚本,配置访问控制台所需的令牌。
macOS 平台:

TOKEN=$(kubectl -n kube-system describe secret default| awk '$1=="token:"{print $2}')
kubectl config set-credentials docker-desktop --token="${TOKEN}"
echo $TOKEN

Windows 平台:

$TOKEN=((kubectl -n kube-system describe secret default | Select-String "token:") -split " +")[1]
kubectl config set-credentials docker-desktop --token="${TOKEN}"
echo $TOKEN

复制生成的令牌字符串,并在登录对话框中选择“令牌”方式登录后,粘贴到输入框中,登录即可。


Kubernetes Dashboard 集群

要想重新找到令牌字符串,可以查看 kubeconfig 文件。
macOS 平台:

$HOME/.kube/config

可以使用 “shift + command + .” 命令查看隐藏目录,并找到文件 ~/.kube/config 。

  • Windows 平台:
%UserProfile%\.kube\config

找到 kubeconfig 文档后,在文档末尾就可以发现刚生成的令牌。

    token: eyJh....UIUT-GFkv....WDtO-XesQ....5Kwh-ONGgbgAQFIVf0MdA

好的,那就介绍到这里。
如果在使用 Docker 中还是出现各种异常,可以考虑使用状态栏图标的下拉菜单项 “Troubleshoot”,打开故障排除对话框,以解决各种疑难杂症。


Troubleshoot

如果是从旧版本升级,出现始终无法正常启动时,建议 Clear / Purge Data 一下,完全从头执行一遍。

如果要检查 Pod 是否正常运行,可以考虑使用状态栏图标的下拉菜单项 “Dashboard”,就可以查看当前运行的 Pod 情况。如果有问题可以手动将相关的镜像删除,并重新拉取后,再重启 Docker 试下。


查看容器和 Pod 运行情况

恭喜您,成功启动 Kubernetes 的学习之路了。

附件

对于文章中提到的安装文件或脚本,下载仍有困难的,也可以使用我百度网盘中的备份。

参考文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容