kubeadm 是一个用来方便搭建和初始化 kubernetes 集群的工具,让你只需要敲几行命令而省去大量繁琐的配置。但是现实并没有那么美好,kubernetes 本身的复杂,同时 kubeaadm 还不是稳定版本,导致了很多事情不会如想象中那么顺利,比如常见的网络问题等等,这时候还是得十分依靠经验。
本文介绍利用 kubeadm 搭建 kubernetes 集群并配置网络插件的过程,以及过程当中遇到的问题,主要参考了 kubernetes 的官方文档,结合自己的实际情况稍作修改。读者在搭建自己的 k8s 集群的时候可以参考本文。
-
用 virtual box 创建三台 Ubuntu 16.04 虚拟机。一台作为 master,两台作为 node。每个虚拟机都有两张网卡,一张网卡使用 NAT 模式,用来访问外部网络,另一张网卡使用 Host-only 网络,用来让虚拟机之间互相访问。假设 Host-only 网络中,它们的 ip 分别为
192.168.56.1``192.168.56.2``192.168.56.3
。192.168.56.1
为 master 的 ip。 -
科学上网:如果有 http 代理,在终端中使用
export http_proxy=ip:port && export http_proxy=ip:port
来连接 http 代理 -
网络插件使用 flannel,后面的命令都是基于此前提的。
-
关闭 swap:执行
swapoff -a
并将/etc/fstab
中有swap
的一行注释掉
apt-get update
apt-get install -y docker.io
三台机器都要安装。
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 三个工具并禁止它们更新。
这里也是三台机器都要安装。
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 的时候将会用到,需要记录下来
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 机器上,运行前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 对象挂载存储等等。