共计 5502 个字符,预计需要花费 14 分钟才能阅读完成。
近在准备研究生论文开题,提前搭一下要用到的 Kubernetes 集群练练手感。半个月前,Kubernetes 1.5正式发布,最大的亮点是支持了在 Windows 下运行容器,同时也简化了使用 kubeadm 安装集群的步骤。为了紧跟最时尚的潮流,我想试试用 kubeadm 搭一个 1.5 版本的集群出来。不过由于最近又过圣诞又要跨年,所以拖拖拉拉搭了一个星期多才搭好。也碰到了很多坑,尤其是翻墙问题真的神烦 (:зゝ∠) 所以在这里把 Ubuntu 16.04 上搭集群的过程写下来,造福社会!
一、环境准备
我准备了三台 Ubuntu 16.04 虚拟机,各项参数如下:
节点 | IP 地址 | CPU | 内存 |
---|---|---|---|
master | 192.168.0.158 | 4 核 | 4GB |
node1 | 192.168.0.159 | 1 核 | 2GB |
node2 | 192.168.0.160 | 1 核 | 2GB |
Kubernetes 官网上提到每台机器至少要有 1GB 内存,不然集群起来之后,留给运行在容器内的应用的内存就很少了。同时要保证所有机器之前的网络是互相连通的。
这里再说一下,一开始我只给 master 分配了 2 个核,但是等我把 kubeadm 跑起来后,docker 在 pull 一些必需的镜像时会出现 OutOfCPU
的情况,大概是因为 kubeadm 把第一台机器做 master 以及第一个 node,所以初始化的服务都跑在这台机器上?所以后来我把 master 加到了 4 核。
二、搭建步骤
(1/4)安装 docker、kubelet、kubeadm 和 kubectl
以 root 用户 ssh 到每台机器上,运行:
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 docker.io | |
apt-get install -y kubelet kubeadm kubectl kubernetes-cni |
(2/4)初始化 master
装好 kubelet 和 kubectl 后,在 master 上以 root 用户运行:
kubeadm init --token=yiqian.123456
注意: 官方文档上 kubeadm init
的时候是不带 token 的,但我这样运行之后,console 也没给我一个默认的 token(exo me???)。但其他节点在加入集群的时候是需要指定 master 的 token 的,所以我在 kubeadm 初始化的时候手动给 master 指定了一个 token。
这里还有一个坑就是,如果初始化失败了,比如像 Issue#33544,那么你停掉再重新 init 会出错,这是因为 kubeadm 在安装了相关包之后会生成 /etc/kubernetes
、/var/lib/kubelet
等目录,所以我们先需要手动清理一下再重新初始化:
systemctl stop kubelet; | |
docker rm -f $(docker ps -q); mount | grep "/var/lib/kubelet/*" | awk '{print $3}' | xargs umount 1>/dev/null 2>/dev/null; | |
rm -rf /var/lib/kubelet /etc/kubernetes /var/lib/etcd /etc/cni; | |
systemctl start kubelet; | |
kubeadm init --token=<token> |
最后,init 成功的运行输出如下:
root@xyq-k8s-master:/home/administrator | |
[is in alpha, please do not use it for production clusters. | ] WARNING: kubeadm|
[ | ] Running pre-flight checks|
[.5.1 | ] Using Kubernetes version: v1|
[ | ] Validating provided token|
[ | ] Accepted provided token|
[and certificate. | ] Generated Certificate Authority key|
[and certificate | ] Generated API Server key|
[ | ] Generated Service Account signing keys|
[and certificates in "/etc/kubernetes/pki" | ] Created keys|
["/etc/kubernetes/kubelet.conf" | ] Wrote KubeConfig file to disk:|
["/etc/kubernetes/admin.conf" | ] Wrote KubeConfig file to disk:|
[for the control plane to become ready | ] Created API client, waiting|
[14.534854 seconds | ] All control plane components are healthy after|
[for at least one node to register and become ready | ] Waiting|
[is ready after 0.506558 seconds | ] First node|
[ | ] Creating a test deployment|
[ | ] Test deployment succeeded|
[for it to become ready | ] Created the kube-discovery deployment, waiting|
[is ready after 2.005108 seconds | ] kube-discovery|
[ | ] Created essential addon: kube-proxy|
[ | ] Created essential addon: kube-dns|
Your Kubernetes master has initialized successfully! | |
You should now deploy a pod network to the cluster. | |
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: | |
http://kubernetes.io/docs/admin/addons/ | |
You can now join any number of machines by running the following on each node: | |
kubeadm join --token=yiqian.123456 192.168.0.158 |
这个时候呢,我们可以通过 kubectl
看看集群当前的状态:
root@xyq-k8s-master:/home/administrator# kubectl get nodes | |
NAME STATUS AGE | |
xyq-k8s-master Ready,master 1m | |
root@xyq-k8s-master:/home/administrator# kubectl get pods --all-namespaces | |
NAMESPACE NAME READY STATUS RESTARTS AGE | |
kube-system dummy-2088944543-gjmv4 1/1 Running 0 1m | |
kube-system etcd-xyq-k8s-master 0/1 Pending 0 2s | |
kube-system kube-apiserver-xyq-k8s-master 1/1 Running 0 20s | |
kube-system kube-controller-manager-xyq-k8s-master 1/1 Running 0 22s | |
kube-system kube-discovery-1769846148-9dpvt 1/1 Running 0 1m | |
kube-system kube-dns-2924299975-lc4rr 0/4 ContainerCreating 0 1m | |
kube-system kube-proxy-w5v9m 1/1 Running 0 1m | |
kube-system kube-scheduler-xyq-k8s-master 0/1 Pending 0 4s |
可以看出来,除了 kube-dns
之外,其他 pods 都跑起来了。是因为在没有部署集群网络时,dns
是起不来的。So 我们进入下一步!
(3/4)初始化 master
官方一共给出了五种网络 addon,我选了 Weave Net(因为它的安装步骤最方便诶嘿嘿 =。=),直接运行:
kubectl apply -f https://git.io/weave-kube
等 weave 跑起来后,kube-dns 自然就跑起来啦。
root@xyq-k8s-master:/home/administrator# kubectl apply -f https://git.io/weave-kube | |
daemonset "weave-net" created | |
root@xyq-k8s-master:/home/administrator# kubectl get pods --all-namespaces | |
NAMESPACE NAME READY STATUS RESTARTS AGE | |
kube-system dummy-2088944543-gjmv4 1/1 Running 0 3m | |
kube-system etcd-xyq-k8s-master 1/1 Running 3 1m | |
kube-system kube-apiserver-xyq-k8s-master 1/1 Running 0 2m | |
kube-system kube-controller-manager-xyq-k8s-master 1/1 Running 0 2m | |
kube-system kube-discovery-1769846148-9dpvt 1/1 Running 0 3m | |
kube-system kube-dns-2924299975-lc4rr 4/4 Running 0 3m | |
kube-system kube-proxy-w5v9m 1/1 Running 0 3m | |
kube-system kube-scheduler-xyq-k8s-master 1/1 Running 0 1m | |
kube-system weave-net-8j1zg 2/2 Running 0 1m |
(4/4)将其他节点加入集群
分别 ssh 到 node1 和 node2 上去,以 root 用户运行:
kubeadm join --token=yiqian.123456 192.168.0.158
再回到我们的 master 节点查看 nodes,就会发现集群已经搭好了。
root@xyq-k8s-master:/home/administrator# kubectl get nodes | |
NAME STATUS AGE | |
xyq-k8s-master Ready,master 10m | |
xyq-k8s-s1 Ready 5m | |
xyq-k8s-s2 Ready 5m |
关于翻墙
由于我是在远程服务器上搭建虚拟机然后 ssh 上去操作,所以不能设置全局代理,只能把 http proxy 加到 docker 的配置文件 /etc/default/docker
中:
export http_proxy=<这个不能告诉你> | |
export https_proxy=<这个也不能告诉你> |
重启一下机器,这样 docker 在 pull 镜像的时候以及 kubeadm init 的时候就会通过这个代理了。
但是在加了这个代理之后,我仍然会碰到有的镜像 pull 不下来的情况,网上查了一下,借鉴了一下这里 http://www.linuxidc.com/Linux/2017-07/145505.htm 的方法,利用 Docker Hub 把这个镜像自动构建好,再 pull 到本地,这样就不用去谷歌的 gcr.io 上在线下载镜像了。具体做法如下。
先去 kubernetes 源码中找 1.5 版本中各个组件的版本:
镜像名称 | 版本号 |
---|---|
gcr.io/google_containers/kubedns-amd64 | 1.7 |
gcr.io/google_containers/kube-dnsmasq-amd64 | 1.3 |
gcr.io/google_containers/exechealthz-amd64 | 1.1 |
然后创建一个 github 项目,可以 fork 我的 repo 或者原作者的 repo。
最后在 Docker Hub 上分别创建以上三个镜像的自动构建项目。以 kube-dns 为例:




创建好之后要手动 Trigger 一下编译


等待编译成功之后就可以在本地直接 pull 了。
docker pull yiqianx/kubedns-amd64
以上。
有问题欢迎大家评论指正~
引用
- kubeadm 搭建 kubernetes 集群
- Kubernetes issue#33544
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-07/145504.htm
