使用 kubeadm 创建 kubernetes 1.9 集群

2023年 7月 9日 29.5k 0

简介

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,CentOS 7的操作系统(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

    91C23F22-58A4-4F03-842F-97018D78F9D8

    把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

    首先,我们需要在所有机器上都安装dockerkubeadmkubeletkubectl

    切记:kubeadm不会自动去安装和管理 kubeletkubectl,所以需要自己去确保安装的版本和你想要安装的kubernetes版本相同。

    安装docker

    $ sudo yum install -y docker
    $ sudo systemctl enable docker && sudo systemctl start docker

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

    $ sudo -i
    $ cat  ~/.bash_profile

    接下来要注意,我们必须自己来安装一个network addon。

    network addon必须在任何app部署之前安装好。同样的,kube-dns也会在network addon安装好之后才启动。kubeadm只支持CNI-based networks(不支持kubenet)。

    比较常见的network addon有:CalicoCanalFlannelKube-routerRomanaWeave Net等。这里我们使用Flannel

    $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

    安装完network之后,你可以通过kubectl get pods --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

    输出差不多如下图:

    1E93FFDE-F0FE-4C7B-9207-6B8DF3EE7787

    这时候,我们去master上输入kubectl get nodes查看一下:

    [root@i-071abd86ed304dc84 ~]# kubectl get nodes
    NAME                  STATUS    ROLES     AGE       VERSION
    i-071abd86ed304dc84   Ready     master    12m       v1.9.0
    i-0c559ad3c0b16fd36   Ready         1m        v1.9.0
    i-0f3f7462b0a004b5e   Ready         47s       v1.9.0

    成功!

    总结

    我们可以看到,用kubeadm部署可以让我们比手动部署方便得多,虽然比不上kops这样的一键部署生产Kubernetes集群的工具,但是kubeadm最初的设计也并非是傻瓜式使用。

    kubeadm给了用户很多的灵活性,让用户可以完全自定义地去配置自己的集群。

    不过目前(截止博客发布为止),kubeadm还只是在测试,官方还不建议在生产环境中使用,不过预计会在2018年春季可以投入生产使用。

    最后,我们总结一下kubeadm最核心的几个概念:

    • 官方认为的 最佳实践(best-practice)
    • 合理的安全(reasonably secure)
    • 可扩展(extensible)
    • 最小可用(minimum viable)

    个人博客:https://purewhite.io

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论