美文网首页
用kubeadm安装Kubernetes1.15.0

用kubeadm安装Kubernetes1.15.0

作者: ashin_l | 来源:发表于2019-06-27 17:19 被阅读0次

    有关所有kubeadm命令行行信息,以及有关自动化kubeadm建议,请参考官网原文kubeadm参考

    准备

    1. 多台Ubuntu 16.04+、CentOS 7或HypriotOS v1.0.1 + 系统
    2. 每台机器最少1GB+内存
    3. 集群中所有机器之间网络连接正常
    4. 关闭所有节点防火墙,SELinux,SWAP(swapoff -a)
    5. 所有节点安装配置成功 docker,kubelet, kubeadm, kubectl

    本教程使用3台ubuntu16.04虚拟机

    • 192.168.1.11 k8s-master
    • 192.168.1.12 k8s-node1
    • 192.168.1.13 k8s-node2
      每台虚拟机都需要配置host
      配置hosts
    cat > /etc/hosts << EOF
    127.0.0.1 localhost
    10.10.31.202 k8s-master
    10.10.31.203 k8s-node1
    10.10.31.204 k8s-node2
    EOF
    

    目标

    • 在您的机器上安装一个安全的Kubernetes集群
    • 在群集上安装pod网络,以便应用组件(pod)可以相互通信
    • 在集群上安装一个微服务应用示例

    步骤

    一、在主机上安装kubeadm

    添加阿里云源地址到配置文件sudo vi /etc/apt/sources.list,在文件末尾添加:
    deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
    执行以下命令:

    sudo apt-get update
    sudo apt-get install kubelet kubeadm kubectl
    

    二、初始化 master

    master 是控制组件运行的机器,包括etcd和API Server等(使用kubectl CLI与之通信启动)。
    选择 k8s-master 主机,运行以下命令来初始化 master (国内无法下载镜像,在执行此命令前先参考下边问题1解决方案,手动下载所需镜像):

    kubeadm init --pod-network-cidr=10.244.0.0/16
    

    注意

    • 因为后边选用 flannel 作为 pod网络插件,所以此处必须 有 --pod-network-cidr=10.244.0.0/16
    • 这将自动检测网络接口,并且将master节点上网卡设备设置成默认网关。如果要使用其他网卡设备,请执行kubeadm init命令增加--apiserver-advertise-address=<ip-address>参数

    kubeadm init命令执行完后需要几分钟时间下载集群控制组件。
    若要重新执行 kubeadm init 命令,需要先撤消kubeadm所做的事情参考此教程参考此教程
    输出如下所示:

    Your Kubernetes master has initialized successfully!
    
    To start using your cluster, you need to run (as a regular user):
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      http://kubernetes.io/docs/admin/addons/
    
    You can now join any number of machines by running the following on each node
    as root:
    
      kubeadm join 192.168.1.11:6443 --token 95nsez.dfn1qqcpuii09w08 \
        --discovery-token-ca-cert-hash sha256:997c2eb70158ed44894c7430a1f7391117bfcc3092e71115bccb3e4c3cc10731
    

    创建 kubeadm init 输出的 kubeadm join 命令需要保存下来,后边使用此命令添加节点。
    token用于master节点和 joining nodes之间的相互认证。这里包含的token是secret,保证安全——通过token参数可以确保将被授权的节点添加到kubernetes集群中。可以使用kubeadm token命令listed、created和deleted这些token。
    遇到的问题

    1. 初始化的时候出现这个报错
     [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.14.0: output: Trying to pull repository k8s.gcr.io/kube-apiserver ...
    Get https://k8s.gcr.io/v1/_ping: dial tcp 64.233.189.82:443: i/o timeout
    , error: exit status 1
    

    下载这些镜像需要翻墙

    k8s.gcr.io/kube-apiserver:v1.15.0
    k8s.gcr.io/kube-controller-manager:v1.15.0
    k8s.gcr.io/kube-scheduler:v1.15.0
    k8s.gcr.io/kube-proxy:v1.15.0
    k8s.gcr.io/pause:3.1
    k8s.gcr.io/etcd:3.3.10
    k8s.gcr.io/coredns:1.3.1

    解决方案:可以使用 docker pull 从 docker 官方镜像库下载

    docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0
    docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0
    docker pull mirrorgooglecontainers/kube-scheduler:v1.15.0
    docker pull mirrorgooglecontainers/kube-proxy:v1.15.0
    docker pull mirrorgooglecontainers/pause:3.1
    docker pull mirrorgooglecontainers/etcd:3.3.10
    docker pull coredns/coredns:1.3.1
    

    然后使用 docker tag 重新标记

    docker tag mirrorgooglecontainers/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0
    docker tag mirrorgooglecontainers/kube-controller-manager:v1.15.0 k8s.gcr.io/kube-controller-manager:v1.15.0
    docker tag mirrorgooglecontainers/kube-scheduler:v1.15.0 k8s.gcr.io/kube-scheduler:v1.15.0
    docker tag mirrorgooglecontainers/kube-proxy:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0
    docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
    docker tag mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
    docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
    
    1. corednspods有 CrashLoopBackOff 或者 Error(推荐使用解决方案二),执行命令 kubectl get pods -n kube-system,输出
    NAME                                       READY   STATUS             RESTARTS   AGE
    calico-node-lflwx                          2/2     Running            0          2d
    coredns-576cbf47c7-nm7gc                   0/1     CrashLoopBackOff   69         2d
    coredns-576cbf47c7-nwcnx                   0/1     CrashLoopBackOff   69         2d
    etcd-suey.nknwn.local                      1/1     Running            0          2d
    kube-apiserver-suey.nknwn.local            1/1     Running            0          2d
    kube-controller-manager-suey.nknwn.local   1/1     Running            0          2d
    kube-proxy-xkgdr                           1/1     Running            0          2d
    kube-scheduler-suey.nknwn.local            1/1     Running            0          2d
    

    执行命令kubectl -n kube-system logs -f coredns-576cbf47c7-nm7gc,输出

    2018/11/05 04:04:18 [INFO] CoreDNS-1.2.2
    2018/11/05 04:04:18 [INFO] linux/amd64, go1.11, eb51e8b
    CoreDNS-1.2.2
    linux/amd64, go1.11, eb51e8b
    2018/11/05 04:04:18 [INFO] plugin/reload: Running configuration MD5 = f65c4821c8a9b7b5eb30fa4fbc167769
    2018/11/05 04:04:24 [FATAL] plugin/loop: Seen "HINFO IN 6900627972087569316.7905576541070882081." more than twice, loop detected
    # 
    

    解决方案一:参考https://stackoverflow.com/questions/53075796/coredns-pods-have-crashloopbackoff-or-error-state
    禁用CoreDNS循环检测,编辑CoreDNS配置映射:
    kubectl -n kube-system edit configmap coredns
    删除或注释掉该行loop,保存并退出。
    然后删除 CoreDNS ,以便可以使用新配置创建新窗格:
    kubectl -n kube-system delete pod -l k8s-app=kube-dns
    解决方案二
    找到原因当部署在Kubernetes中的CoreDNS Pod检测到循环时,CoreDNS Pod将开始“CrashLoopBackOff”。这是因为每当CoreDNS检测到循环并退出时,Kubernetes将尝试重新启动Pod。

    找到宿主机 /etc/resolv.conf 里面的文件

    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    nameserver 127.0.1.1
    

    发现那么sever 127.0.1.1是指向本地,修改文件为

    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    #nameserver 127.0.1.1
    nameserver 8.8.8.8
    nameserver 114.114.114.114
    

    然后重启服务

    三、安装pod网络

    pod网络插件是必要安装,以便pod可以相互通信。
    在部署应用和启动kube-dns之前,需要部署网络,kubeadm仅支持CNI的网络(不支持kubenet)。
    网络插件完整列表,请参考 add-ons page
    本教程选用 flannel 作为 pod网络插件
    使用以下命令安装pod网络插件:

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

    注意:每个集群只能安装一种 pod网络。

    四、添加工作节点

    登录到 k8s-node1 主机,参考步骤2,手动下载镜像

    mirrorgooglecontainers/kube-proxy
    mirrorgooglecontainers/pause

    运行步骤2中输出的命令

    kubeadm join 192.168.1.11:6443 --token 95nsez.dfn1qqcpuii09w08 --discovery-token-ca-cert-hash sha256:997c2eb70158ed44894c7430a1f7391117bfcc3092e71115bccb3e4c3cc10731
    

    成功后输出:

    Node join complete:
    * Certificate signing request sent to master and response
      received.
    * Kubelet informed of new secure connection details.
    
    Run 'kubectl get nodes' on the master to see this machine join.
    

    之后,在master节点上运行 kubectl get nodes 命令,会显示所有已添加到集群中的节点主机。

    NAME         STATUS   ROLES    AGE     VERSION
    k8s-master   Ready    master   46h     v1.15.0
    k8s-node-1   Ready    <none>   45h     v1.15.0
    k8s-node-2   Ready    <none>   3h19m   v1.15.0
    

    相关文章

      网友评论

          本文标题:用kubeadm安装Kubernetes1.15.0

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