美文网首页k8s数客联盟
使用kubeadm部署k8s集群

使用kubeadm部署k8s集群

作者: biggeng | 来源:发表于2017-07-25 22:09 被阅读613次

    Kubernetes是Google大神开源的容器管理组件,常被称为K8s (PS:K表示第一个字母,s表示最后一个字母,8表示中间一共有8个字母:) ). 被Docker的使用者用于Docker服务的编排和管理。虽然Docker家出了Swarm用来管理Docker,但是目前来看,使用K8s的仍然居多。

    K8s的几个概念
    • Pod
      K8s部署调度的最小单元,运行在node节点上。运行在同一个Pod内的多个容器共享相同的网络命名空间、IP地址和端口。
    • RC (Replication Controller)
      RC用来保证Pod按照一定的备份数运行。
    • Service
      Service定义了Pod的逻辑集合和访问策略...
    • Node
      Node是k8s集群中Pod运行的节点。
    K8s集群部署方式

    关于K8s的集群部署方式有很多,比如说tar包/rpm下载安装,手动配置。这种方法比较麻烦。自从K8s 1.5版本后,新增了kubeadm init方法,能够快速的安装k8s集群。虽然目前这个方法还是beta版本,并且被警告不要在生产环境中使用 (: ,但是经过笔者的测试,kubeadm init能够方便的部署k8s,期待早日转正 :)

    以下是笔者在使用kubeadm init部署过程中整理的方法记录,大部分来源于官方文档: https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
    此外加了一些在过程中遇到的问题和解决方法,以供参考。

    准备条件
    此处有坑1

    如果不设置,在后面执行kubeadm init时,precheck会报错。

    sysctl -w net.bridge.bridge-nf-call-iptables="1"
    
    • 配置k8s yum源,如果能够连外网使用google的源,否则的话可以找找国内的代理源或者自行下载kubeadm和kubelet的安装包手动安装。
      google的yum源如下:
    [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
    
    安装kubeadm和kubelet

    本次安装选择的是1.6.6版本。

    yum install kubelet-1.6.6*
    
    yum install kubeadm-1.6.6*
    

    在安装过程中,会自动的将一些依赖安装,如果某些依赖的源没有在yum中配置,需要加上可以访问的源。

    使用 kubeadm init

    在k8s的安装文档中,本步骤最简单,只有一行命令,但是在实际操作过程中也是最容易出问题的一步。
    登录master节点,执行 kubeadm init,开始初始化master。

    此处有坑2

    这时候一般会卡到 [apiclient] Created API client, waiting for the control plane to become ready

    [kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
    [init] Using Kubernetes version: v1.7.0
    [init] Using Authorization modes: [Node RBAC]
    [preflight] Running pre-flight checks
    [preflight] Starting the kubelet service
    [certificates] Generated CA certificate and key.
    [certificates] Generated API server certificate and key.
    [certificates] API Server serving cert is signed for DNS names [kubeadm-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.138.0.4]
    [certificates] Generated API server kubelet client certificate and key.
    [certificates] Generated service account token signing key and public key.
    [certificates] Generated front-proxy CA certificate and key.
    [certificates] Generated front-proxy client certificate and key.
    [certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
    [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
    [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
    [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
    [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"
    [apiclient] Created API client, waiting for the control plane to become ready
    

    这个时候就比较抓瞎,没有更多有价值的log输出。这时候可以使用

    journalctl -xeu kubelet
    

    打印出log。
    如果有如下错误log, 说明kubelet的driver设置的不对。

    cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"
    

    设置 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 里的
    --cgroup-driver=cgroupfs
    保存后,执行systemctl daemon-reload 让配置生效。
    再执行kubeadm init,成功完成。

    使master节点可以调度pod

    默认情况下,master节点不能被调度启动pod,如果需要将master节点加入到调度中,需要执行以下命令:

    kubectl taint nodes --all node-role.kubernetes.io/master-
    
    配置pod网络插件

    K8s支持以下多种网络插件。在master节点使用 kubectl apply -f 配置网络插件。

    pic.png

    以Weave net插件为例,可以通过如下命令配置:

    kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
    

    验证是否添加成功可以执行:

    kubectl get pods --all-namespaces
    

    如下图,可以看到,weave相关已经成功创建并拉起。


    image.png
    给集群加入节点

    master初始化完成后,可以向此K8s集群增加node节点。一条简单的join命令即可完成。
    登录到node节点,执行:

    kubeadm join --token <token> <master-ip>:<master-port>
    
    

    其中token可以在master节点执行 kubeadm token list 查看, 另外默认的master-port一般是6443.

    image.png
    此处有坑3

    根据官方文档,执行完此语句后,在master节点上通过 kubeadm get nodes 就可以查看到已经将node节点加入集群。但是在实际操作中,发现在node节点上执行join语句成功,但是在master节点上看不到新增的node节点。
    在node节点上查看kubelet, 发现kubelet没有启动。在node节点上执行 journalctl -xeu kubelet 看到和master节点之前一样的问题,cgroup driver不一致。经过相同的解决方法,成功将node节点拉起后,过几秒钟在master节点上查看,已经能够显示新增的节点了。

    部署简单的K8s集群完成。

    相关文章

      网友评论

        本文标题:使用kubeadm部署k8s集群

        本文链接:https://www.haomeiwen.com/subject/vyxgkxtx.html