# kubeadm 安装 Kubernetes 1.6.2

因为一些莫可名状的原因，国内网络使用 Kubeadm 颇有难度，这里大概说一下过程中的一些坑。

主体流程遵循官网指南：**https://kubernetes.io/docs/getting-started-guides/kubeadm/**

### 1/4 准备工作

这里用包管理的方式安装 kubeadm、Docker 等组件。需要注意一点点的是，如果用的非 Root 用户，要注意 sudo 的时候的环境代理设置问题。或者干脆在 apt/yum 的配置文件中写入代理服务器。

另外这里安装 Docker 之后，注意给 Docker 配置代理。或者可以直接想法子搞到下面列表中的镜像，并导入 Docker 之中：

### 镜像准备

下面提到的镜像基于目前的 1.6.2 版本，每次更新都会有不同。

|Image|Ver|Component|
|---|---|---|
|gcr.io/google_containers/kube-proxy-amd64|v1.6.2|Kubernetes|
|gcr.io/google_containers/kube-controller-manager-amd64|v1.6.2|Kubernetes|
|gcr.io/google_containers/kube-apiserver-amd64|v1.6.2|Kubernetes|
|gcr.io/google_containers/kube-scheduler-amd64|v1.6.2|Kubernetes|
|gcr.io/google_containers/etcd-amd64|3.0.17|Kubernetes|
|gcr.io/google_containers/pause-amd64|3.0|Kubernetes|
|gcr.io/google_containers/k8s-dns-sidecar-amd64|1.14.1|DNS|
|gcr.io/google_containers/k8s-dns-kube-dns-amd64|1.14.1|DNS|
|gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64|1.14.1|DNS|
|gcr.io/google_containers/etcd|2.2.1|Calico|
|quay.io/calico/node|v1.1.3|Calico|
|quay.io/calico/cni|v1.8.0|Calico|
|quay.io/calico/kube-policy-controller|v0.5.4|Calico|

## 2/4 Master 初始化

`kubeadm init` 

这里的几个问题：

- 如果准备采用 flannel 插件，需要 `-pod-network-cidr 10.244.0.0/16` 参数
- Ubuntu 下可能会出现无限等待 Node 加入的情况，可能的原因是 /etc/resolv.conf 中有关于 localhost 的 search 记录，删掉这行就能解决。
- 如果准备采用 Calico 插件，那么要注意 Calico 的 YAML 中的 ip pool 跟集群设置一致。
- 如果不是预先准备好的备份，过程会比较长，耐心。。

Init 成功之后会出一堆文本信息，其中包含几点内容，最好保存下来：

- 自动生成的 kubectl config 文件，可以复制到 ~/.kube/config 中作为缺省 kubectl 使用。
- 把新节点加入集群的方法。

另外这里还有个提示——没有安装 Pod Network。

## 3/4 安装 Pod Network

这一步很重要，所有的应用包括 Kube DNS 在内，都依赖于此。

如上文所示，准备使用的是 Calico，这里值得注意的一坑是，不同版本的 Kubernetes 会有不同的 Calico 安装，1.6 版本应该使用的是：`kubectl apply -f http://docs.projectcalico.org/v2.1/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml`

`http://docs.projectcalico.org/v2.1/getting-started/kubernetes/installation/hosted/kubeadm/` 还有一些其他的安装方式可以参考。

### Calico 的注意事项

- 他的 ETCD 服务器要求装在 Master 所在的 Node 上，使用的是 nodeSelector 的方式，选择标签：`node-role.kubernetes.io/master: ""`。
- 上文提到的 pod network cidr 和 ip pool 的一致性问题
- `--service-cidr` 和 IP Pool 不能重叠

### 4/4 加入节点

在其他 Node 上做好准备工作之后，用`kubeadm init`命令中提到的`kubeadmin join`方法加入集群。
