您的位置:首页 > 其它

使用 kubeadm 创建一个 kubernetes 集群

2018-01-11 00:00 1101 查看
【福利】赠书活动仍在继续中:《大话代码架构》


简介

kubeadm
是一个
kubernetes
官方提供的快速安装和初始化拥有最佳实践(best practice)
kubernetes
集群的工具,虽然目前还处于 beta 和 alpha 状态,还不能用在生产环境,但是我们可以通过学习这种部署方法来体会一些官方推荐的kubernetes最佳实践的设计和思想。
kubeadm
的目标是提供一个最小可用的可以通过
Kubernetes一致性测试
的集群,所以并不会安装任何除此之外的非必须的addon。
kubeadm
默认情况下并不会安装一个网络解决方案,所以用
kubeadm
安装完之后 需要自己来安装一个网络的插件。

使用

系统环境

kubeadm
支持多种系统,这里简单介绍一下需要的系统要求:Ubuntu16.04+ / Debian 9 / CentOS 7 / RHEL 7 / Fedora 25/26(best-effort) / HypriotOS v1.0.1+ / Other

2GB或者以上的RAM(否则将没有足够空间留给app)

2核以上CPU

集群的机器之间必须能通过网络互相通信

SWAP必须被关闭,否则kubelet会出错!

具体的详细信息可以在官方网站上看到。本篇内容基于aws的ap-northeast-1的ec2,
CentOS7
的操作系统(ami-4dd5522b),实例类型t2.medium 2核4GB,3台机器,1 master,2 nodes,kubernetes 1.9 版本。为了方便起见,在安全组里面打开了所有的端口和IP访问。机器配置:
[centos@ip-172-31-24-49 ~]$ uname -a


Linux ip-172-31-24-49.ap-northeast-1.compute.internal 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux


首先 ,我们关闭selinux:
$ sudo vim /etc/sysconfig/selinux



把SELINUX改成disabled,然后保存退出。在我用的ami中,swap是默认关闭的,所以不需要我手动关闭,大家需要确认 自己的环境中swap是否有关闭掉,否则会在之后的环节中出问题。为了方便我们安装,我们将sshd设置为keepalive:
$ sudo -i


$ echo "ClientAliveInterval 10" >> /etc/ssh/sshd_config


$ echo "TCPKeepAlive yes" >> /etc/ssh/sshd_config


$ systemctl restart sshd.service


接下来我们重启一下机器:
$ sudo sync


$ sudo reboot


至此,准备阶段结束。

安装kubeadm

首先,我们需要在所有机器上都安装
docker
,
kubeadm
,
kubelet
kubectl
。切记:kubeadm不会自动去安装和管理 kubelet和kubectl,所以需要自己去确保安装的版本和你想要安装的kubernetes版本相同。安装
docker
$ sudo yum install -y docker


$ sudo systemctl enable docker && sudo systemctl start docker


在RHEL/CentOS 7 系统上可能会路由失败,我们需要设置一下:
$ sudo -i


$ cat <<EOF >  /etc/sysctl.d/k8s.conf


net.bridge.bridge-nf-call-ip6tables = 1


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


EOF


$ sudo sysctl --system


接下来我们需要安装
kubeadm
,
kubelet
kubectl
了,我们需要先加一个repo:
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo


[kubernetes]


name=Kubernetes


baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64


enabled=1


gpgcheck=1


repo_gpgcheck=1


gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg[/code] 
EOF


然后安装:
$ sudo yum install -y kubelet kubeadm kubectl


$ sudo systemctl enable kubelet && sudo systemctl start kubelet


至此,在所有机器上安装所需的软件已经结束。

使用kubeadm初始化master

安装完所有的依赖之后,我们就可以用
kubeadm
初始化master了。最简单的初始化方法是:
$ kubeadm init


除此之外,
kubeadm
还支持多种方法来配置,具体可以查看一下官方文档。我们在初始化的时候指定一下kubernetes版本,并设置一下pod-network-cidr(后面的flannel会用到):
$ sudo -i


$ kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16


在这个过程中
kubeadm
执行了一系列的操作,包括一些pre-check,生成ca证书,安装etcd和其它控制组件等。界面差不多如下:

最下面的这行
kubeadm join
什么的,就是用来让别的node加入集群的,可以看出非常方便。我们要保存好这一行东西,这是我们之后让node加入集群的凭据,一会儿会用到。这个时候,我们还不能通过
kubectl
来控制集群,要让
kubectl
可用,我们需要做:
# 对于非root用户


$ mkdir -p $HOME/.kube


$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config


$ sudo chown $(id -u):$(id -g) $HOME/.kube/config




# 对于root用户


$ export KUBECONFIG=/etc/kubernetes/admin.conf


# 也可以直接放到~/.bash_profile


$ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile


接下来要注意,我们必须自己来安装一个network addon。network addon必须在任何app部署之前安装好。同样的,kube-dns也会在network addon安装好之后才启动。kubeadm只支持CNI-based networks(不支持kubenet)。比较常见的network addon有:
Calico
,
Canal
,
Flannel
,
Kube-router
,
Romana
,
WeaveNet
等。这里我们使用
Flannel
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml[/code] 
安装完network之后,你可以通过
kubectlgetpods--all-namespaces
来查看
kube-dns
是否在running来判断network是否安装成功。默认情况下,为了保证master的安全,master是不会被调度到app的。你可以取消这个限制通过输入:
$ kubectl taint nodes --all node-role.kubernetes.io/master-


加入nodes

终于部署完了我们的master!现在我们开始加入一些node到我们的集群里面吧!ssh到我们的node节点上,执行刚才下面给出的那个
kubeadm join
的命令(每个人不同):
$ sudo -i


$ kubeadm join --token 72a8a4.2ed9076cd668b8b7 172.31.31.60:6443 --discovery-token-ca-cert-hash sha256:f0894e55d475f882dd40d52c6d01f758017ec5729be632294049f687330f60d2


输出差不多如下图:

这时候,我们去master上输入
kubectlgetnodes
查看一下:
[root@i-071abd86ed304dc84 ~]# kubectl get nodes


NAME                  STATUS    ROLES     AGE       VERSION


i-071abd86ed304dc84   Ready     master    12m       v1.9.0


i-0c559ad3c0b16fd36   Ready     <none>    1m        v1.9.0


i-0f3f7462b0a004b5e   Ready     <none>    47s       v1.9.0


成功!

总结

我们可以看到,用
kubeadm
部署可以让我们比手动部署方便得多,虽然比不上
kops
这样的一键部署生产Kubernetes集群的工具,但是
kubeadm
最初的设计也并非是傻瓜式使用。
kubeadm
给了用户很多的灵活性,让用户可以完全自定义地去配置自己的集群。不过目前(截止博客发布为止),
kubeadm
还只是在测试,官方还不建议在生产环境中使用,不过预计会在2018年春季可以投入生产使用。最后,我们总结一下
kubeadm
最核心的几个概念:官方认为的 最佳实践(best-practice)

合理的安全(reasonably secure)

可扩展(extensible)

最小可用(minimum viable)

原文:https://purewhite.io/2017/12/17/use-kubeadm-setup-k8s/

推荐阅读

Spring Cloud微服务架构汇总浅谈微服务基建的逻辑
Service Mesh:下一代微服务
微服务(Microservices)【翻译】那些没说出口的研发之痛,做与不做微服务的几大理由
谷歌大神为你解释Kubernetes, 微服务和容器化
长按指纹一键关注



点击 “阅读原文” 看看本号其他精彩内容
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: