使用 kubeadm 创建一个 kubernetes 集群 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
PureWhite
V2EX    云计算

使用 kubeadm 创建一个 kubernetes 集群

  •  
  •   PureWhite 2018-01-24 01:10:39 +08:00 3043 次点击
    这是一个创建于 2818 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

    kubeadm是一个kubernetes官方提供的快速安装和初始化拥有最佳实践( best practice )kubernetes集群的工具,虽然目前还处于 beta 和 alpha 状态,还不能用在生产环境,但是我们可以通过学习这种部署方法来体会一些官方推荐的 kubernetes 最佳实践的设计和思想。

    kubeadm的目标是提供一个最小可用的可以通过Kubernetes 一致性测试的集群,所以并不会安装任何除此之外的非必须的 addon。

    kubeadm默认情况下并不会安装一个网络解决方案,所以用kubeadm安装完之后 需要自己来安装一个网络的插件。

    使用

    系统环境

    kubeadm支持多种系统,这里简单介绍一下需要的系统要求:

    1. Ubuntu16.04+ / Debian 9 / CentOS 7 / RHEL 7 / Fedora 25/26(best-effort) / HypriotOS v1.0.1+ / Other
    2. 2GB 或者以上的 RAM (否则将没有足够空间留给 app )
    3. 2 核以上 CPU
    4. 集群的机器之间必须能通过网络互相通信
    5. <u>SWAP 必须被关闭,否则kubelet会出错!</u>

    具体的详细信息可以在官方网站上看到。

    本篇内容基于 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

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

    切记:**kubeadm不会自动去安装和管理 kubeletkubectl,所以需要自己去确保安装的版本和你想要安装的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, kubeletkubectl了,我们需要先加一个 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 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 和其它控制组件等。

    界面差不多如下:

    2256534A-2144-4118-843C-7179EF34EC49

    最下面的这行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。

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

    比较常见的 network addon 有:Calico, Canal, Flannel, Kube-router, Romana, Weave 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 <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 )

    原文出自:我的博客

    3 条回复    2018-06-07 18:30:55 +08:00
    bilibalao
        1
    bilibalao  
       2018-06-07 16:07:36 +08:00
    膜拜 kubernates 大佬
    bilibalao
        2
    bilibalao  
       2018-06-07 16:07:44 +08:00
    膜拜 kubernates 大佬 ~
    PureWhite
        3
    PureWhite  
    OP
       2018-06-07 18:30:55 +08:00
    @bilibalao dzy,你搞事
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2552 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 05:05 PVG 13:05 LAX 22:05 JFK 01:05
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86