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 · 2649 次点击
    这是一个创建于 2256 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

    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   ·   我们的愿景   ·   实用小工具   ·   2669 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:19 · PVG 23:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.