---
title: Kubernetes 学习中的安装链路摩擦
date: '2019-06-08 21:30:59'
draft: false
summary: 很多人刚接触 Kubernetes 时，先撞上的并不是抽象难度，而是版本探测、镜像下载和依赖拉取这些安装层障碍。
slug: kubernetes-learning-blocked-by-the-wall
syndication:
- platform: Weibo
  url: https://weibo.com/1648815335/HxZLHkPCE
tags:
- kubernetes
- cloud-native
- network
- developer-experience
topics:
- software-engineering
type: post
---

很多人说 `Kubernetes` 难学，我当然同意它本身就有不少概念门槛。但如果把“新手为什么一开始就被劝退”这件事拆开看，真正先把人卡死的，往往还不是那些抽象概念，而是安装链路。

一个朋友之前就和我吐槽，光部署一套 `k8s` 就已经筋疲力尽了。

我自己的判断是，在国内环境里，部署复杂度里有相当大一部分其实是“墙”带来的额外成本。

比如早些年用 `kubeadm` 的时候，它自己先去访问外部接口探测版本，这一步就可能直接卡住。再往后，很多关键镜像要从 `gcr.io` 拉，镜像又经常拉不下来。

理论上当然有很多补救手段：

- 命令行开代理
- 提前把镜像手工拉下来
- 把镜像地址改成国内源
- 直接使用云厂商托管版 `k8s`

但问题在于，新手最缺的恰恰不是“解决方案列表”，而是判断力。

镜像那么多，配置项那么多，`kubelet`、`container runtime`、初始化脚本、网络插件又分散在不同环节里。你告诉一个刚接触的人“改一下配置就行”，其实等于没说。因为他根本不知道该从哪一层开始排查。

于是最后很多人形成的结论就变成：“`Kubernetes` 太复杂了。”

这句话当然不算错，但也不完全公平。因为这里面有不少痛苦，其实并不是 `Kubernetes` 架构设计本身带来的，而是外部网络环境把安装和学习路径扭曲了。

所以我对新手的建议一直比较实际：

- 如果条件允许，先在国外主机或者国外云环境里把流程跑通。
- 如果不方便，就直接先用国内云厂商托管好的 `Kubernetes` 服务。
- 先把组件关系、调度模型、控制面和数据面这些核心概念学明白，再回头自己从零搭环境。

否则一上来就和镜像仓库、代理、版本探测、初始化脚本死磕，很容易把“学习 `Kubernetes`”变成“学习怎么和被扭曲的网络环境搏斗”。

这两件事不能说完全无关，但显然也不是同一件事。
