Skip to content

Latest commit

 

History

History
175 lines (111 loc) · 7.15 KB

install-k8s-by-kubeadm-in-vm.md

File metadata and controls

175 lines (111 loc) · 7.15 KB

使用 kubeadm 在虚拟机中搭建 kubernetes 集群

kubeadm 是一个用来方便搭建和初始化 kubernetes 集群的工具,让你只需要敲几行命令而省去大量繁琐的配置。但是现实并没有那么美好,kubernetes 本身的复杂,同时 kubeaadm 还不是稳定版本,导致了很多事情不会如想象中那么顺利,比如常见的网络问题等等,这时候还是得十分依靠经验。

本文介绍利用 kubeadm 搭建 kubernetes 集群并配置网络插件的过程,以及过程当中遇到的问题,主要参考了 kubernetes 的官方文档,结合自己的实际情况稍作修改。读者在搭建自己的 k8s 集群的时候可以参考本文。

准备工作和前提

  1. 用 virtual box 创建三台 Ubuntu 16.04 虚拟机。一台作为 master,两台作为 node。每个虚拟机都有两张网卡,一张网卡使用 NAT 模式,用来访问外部网络,另一张网卡使用 Host-only 网络,用来让虚拟机之间互相访问。假设 Host-only 网络中,它们的 ip 分别为 192.168.56.1``192.168.56.2``192.168.56.3192.168.56.1为 master 的 ip。

  2. 科学上网:如果有 http 代理,在终端中使用 export http_proxy=ip:port && export http_proxy=ip:port来连接 http 代理

  3. 网络插件使用 flannel,后面的命令都是基于此前提的。

  4. 关闭 swap:执行swapoff -a并将/etc/fstab中有swap的一行注释掉

安装 docker

apt-get update
apt-get install -y docker.io

三台机器都要安装。

安装 kubeadm, kubelet and kubectl

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

以上命令做了这些事情:安装了 curl 等用于下载的相关命令,获取并添加 apt-key,把官方下载源加入到 apt-get 的下载源中,下载安装 kubelet kubeadm kubectl 三个工具并禁止它们更新。

这里也是三台机器都要安装。

初始化 master

sudo kubeadm init --apiserver-advertise-address=192.168.56.1 --pod-network-cidr=10.244.0.0/16

--apiserver-advertise-address指定了通过哪个地址访问 apiserver。笔者一开始没有指定,导致该地址指向了 NAT 网卡的地址,使得网络插件安装失败。

输入此命令,kubeadm 将会做一系列事情,检查系统环境是否适合安装,然后生成 token,ca 证书,各个模块的配置文件,通过网络下载、安装并启动其他 k8s 的组件等等。

当命令执行完成,将输出一下信息:

...
Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run (as a regular user):

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the addon options listed at:
  http://kubernetes.io/docs/admin/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

如上述输出所指示的,接下来需要将 admin.conf 复制到 $HOME/.kube/config 下,里面存有证书信息:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>在初始化 node 的时候将会用到,需要记录下来

安装 pod 网络插件

sysctl net.bridge.bridge-nf-call-iptables=1

此命令将桥接的IPv4流量传递给iptables

这里因为我设置了双网卡,为了让 flannel 使用 Host-only 网卡,需要修改 kube-flannel.yml 文件:

curl -O https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

将 kube-flannel.yml 下载下来,使用 vim 在spec.template.containers[0].args添加多一个值 --iface=[本机host-only网卡的名字]

然后输入一下命令使网络插件生效:

kubectl apply -f kube-flannel.yml

当命令完成 master 就完成安装了,输入 kubectl get pods --all-namespaces可以看到已经安装的 k8s master 组件以 pod 形式运行起来,如下:

NAMESPACE     NAME                                     READY     STATUS              RESTARTS   AGE
kube-system   coredns-78fcdf6894-bspwh                 1/1       Running             1          5d
kube-system   etcd-ubuntu                              1/1       Running             2          5d
kube-system   kube-apiserver-ubuntu                    1/1       Running             1          5d
kube-system   kube-controller-manager-ubuntu           1/1       Running             1          5d
kube-system   kube-flannel-ds-5jxw8                    1/1       Running             1          5d
kube-system   kube-proxy-cmzhc                         1/1       Running             1          5d
kube-system   kube-scheduler-ubuntu                    1/1       Running             1          5d

初始化 node 并将 node 加入集群

在 node 机器上,运行前kubeadm init输出的命令:

kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

同样,这里会检查机器,并安装需要的容器,当看到一下输出时:

Node join complete:
* Certificate signing request sent to master and response
  received.
* Kubelet informed of new secure connection details.

Run 'kubectl get nodes' on the master to see this machine join.

说明加入集群成功。

此时再到 master 上执行 kubectl get nodes可以看到新加入的 node:

NAME         STATUS     ROLES     AGE       VERSION
ubuntu1   Ready      master    9d        v1.11.2
ubuntu2	  Ready      <none>    9d        v1.11.2

在另一台 node 机器也做同样的操作

测试运行

在 master 机器上,运行:

kubectl run my-nginx --image=nginx --replicas=2 --port=80

输出:

NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-nginx                 2         2         2            2           16s

查看 pod 分别运行在哪个节点上:

kubectl get pods -o wide

NAME                                     READY     STATUS              RESTARTS   AGE       IP             NODE      NOMINATED NODE
my-nginx-59497d7745-5v9qg                1/1       Running             0          3m        10.244.2.7     ubuntu3   <none>
my-nginx-59497d7745-7n9s4                1/1       Running             0          3m        10.244.2.141   ubuntu2   <none>

可以看到一个跑在 ubuntu2 一个在 ubuntu3 上面。

下一步

到此为止,搭建了一个基本的 1 master 2 nodes 的 kubernetes 集群,可以在开始这上面跑一些服务,学习一下 k8s 的使用,比如为 k8s 提供后端存储,如 nfs 服务器,自动给 k8s 对象挂载存储等等。