zoukankan      html  css  js  c++  java
  • debian8.2安装kubernetes

    master上通过kubeadm安装Kubernetes

    添加国内阿里源后安装kubeadm:

    1 deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    2 apt-get update && apt-get install kubeadm

    创建kubeadm.yaml文件, 然后执行安装:

    1 apiVersion: kubeadm.k8s.io/v1alpha2
    2 kind: MasterConfiguration
    3 controllerManagerExtraArgs:
    4   horizontal-pod-autoscaler-use-rest-clients: "true"
    5   horizontal-pod-autoscaler-sync-period: "10s"
    6   node-monitor-grace-period: "10s"
    7 apiServerExtraArgs:
    8   runtime-config: "api/all=true"
    9 kubernetesVersion: "stable-1.12.2"
    1 kubeadm init --config kubeadm.yaml

    安装过程中出现的问题:

    1 [ERROR Swap]: running with swap on is not supported. Please disable swap
    2 [ERROR SystemVerification]: missing cgroups: memory
    3 [ERROR ImagePull]: failed to pull image [k8s.gcr.io/kube-apiserver-amd64:v1.12.2]

    解决办法:

    1. 报错很直白, 禁用swap分区即可. 
    不过不建议使用: swapoff -a 从操作记录来看, 使用swapoff -a后kubeadm init命令虽然可以执行,但是却总是失败, 提示: [kubelet-check] It seems like the kubelet isn't running or healthy. [kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused. 查看日志发现实际还是swap没有关闭的问题: ➜ kubernetes journalctl -xefu kubelet 11月 05 22:56:28 debian kubelet[7241]: F1105 22:56:28.609272 7241 server.go:262] failed to run Kubelet: Running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/swaps contained: [Filename Type Size Used Priority /dev/sda9 partition 3905532 0 -1] ➜ kubernetes cat /proc/swaps Filename Type Size Used Priority /dev/sda9 partition 3905532 0 -1 ➜ kubernetes 注释掉/etc/fstab下swap挂载后安装成功
    2. echo GRUB_CMDLINE_LINUX="cgroup_enable=memory" >> /etc/default/grub && update-grub && reboot

    3. 国内正常网络不能从k8s.grc.io拉取镜像, 所以从docker.io拉取, 然后重新打上一个符合k8s的tag: docker pull mirrorgooglecontainers/kube-apiserver:v1.12.2 docker pull mirrorgooglecontainers/kube-controller-manager:v1.12.2 docker pull mirrorgooglecontainers/kube-scheduler:v1.12.2 docker pull mirrorgooglecontainers/kube-proxy:v1.12.2 docker pull mirrorgooglecontainers/pause:3.1 docker pull mirrorgooglecontainers/etcd:3.2.24 docker pull coredns/coredns:1.2.2 docker tag docker.io/mirrorgooglecontainers/kube-apiserver:v1.12.2 k8s.gcr.io/kube-apiserver:v1.12.2 docker tag docker.io/mirrorgooglecontainers/kube-controller-manager:v1.12.2 k8s.gcr.io/kube-controller-manager:v1.12.2 docker tag docker.io/mirrorgooglecontainers/kube-scheduler:v1.12.2 k8s.gcr.io/kube-scheduler:v1.12.2 docker tag docker.io/mirrorgooglecontainers/kube-proxy:v1.12.2 k8s.gcr.io/kube-proxy:v1.12.2 docker tag docker.io/mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1 docker tag docker.io/mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24 docker tag docker.io/coredns/coredns:1.2.2 k8s.gcr.io/coredns:1.2.2 docker rmi mirrorgooglecontainers/kube-apiserver:v1.12.2 docker rmi mirrorgooglecontainers/kube-controller-manager:v1.12.2 docker rmi mirrorgooglecontainers/kube-scheduler:v1.12.2 docker rmi mirrorgooglecontainers/kube-proxy:v1.12.2 docker rmi mirrorgooglecontainers/pause:3.1 docker rmi mirrorgooglecontainers/etcd:3.2.24 docker rmi coredns/coredns:1.2.2 也可以增加加速器(测试163后速度比直接访问更慢), 加入方法如下,然后重启docker服务: ➜ kubernetes cat /etc/docker/daemon.json { "registry-mirrors": ["http://hub-mirror.c.163.com"] } ➜ kubernetes

    安装成功记录: 

    ➜  kubernetes  kubeadm init --config kubeadm.yaml                               
    I1205 23:08:15.852917    5188 version.go:93] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.12.2.txt": Get https://dl.k8s.io/release/stable-1.12.2.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
    I1205 23:08:15.853144    5188 version.go:94] falling back to the local client version: v1.12.2
    [init] using Kubernetes version: v1.12.2
    [preflight] running pre-flight checks
    [preflight/images] Pulling images required for setting up a Kubernetes cluster
    [preflight/images] This might take a minute or two, depending on the speed of your internet connection
    [preflight/images] You can also perform this action in beforehand using 'kubeadm config images pull'
    [kubelet] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
    [kubelet] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
    [preflight] Activating the kubelet service
    [certificates] Generated front-proxy-ca certificate and key.
    [certificates] Generated front-proxy-client certificate and key.
    [certificates] Generated etcd/ca certificate and key.
    [certificates] Generated etcd/server certificate and key.
    [certificates] etcd/server serving cert is signed for DNS names [debian localhost] and IPs [127.0.0.1 ::1]
    [certificates] Generated etcd/peer certificate and key.
    [certificates] etcd/peer serving cert is signed for DNS names [debian localhost] and IPs [192.168.2.118 127.0.0.1 ::1]
    [certificates] Generated etcd/healthcheck-client certificate and key.
    [certificates] Generated apiserver-etcd-client certificate and key.
    [certificates] Generated ca certificate and key.
    [certificates] Generated apiserver certificate and key.
    [certificates] apiserver serving cert is signed for DNS names [debian kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.2.118]
    [certificates] Generated apiserver-kubelet-client certificate and key.
    [certificates] valid certificates and keys now exist in "/etc/kubernetes/pki"
    [certificates] Generated sa key and public key.
    [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"
    [controlplane] wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml"
    [controlplane] wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.yaml"
    [controlplane] wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/manifests/kube-scheduler.yaml"
    [etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/manifests/etcd.yaml"
    [init] waiting for the kubelet to boot up the control plane as Static Pods from directory "/etc/kubernetes/manifests" 
    [init] this might take a minute or longer if the control plane images have to be pulled
    [apiclient] All control plane components are healthy after 48.078220 seconds
    [uploadconfig] storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
    [kubelet] Creating a ConfigMap "kubelet-config-1.12" in namespace kube-system with the configuration for the kubelets in the cluster
    [markmaster] Marking the node debian as master by adding the label "node-role.kubernetes.io/master=''"
    [markmaster] Marking the node debian as master by adding the taints [node-role.kubernetes.io/master:NoSchedule]
    [patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "debian" as an annotation
    [bootstraptoken] using token: x4p0vz.tdp1xxxx7uyerrrs
    [bootstraptoken] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
    [bootstraptoken] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
    [bootstraptoken] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
    [bootstraptoken] creating the "cluster-info" ConfigMap in the "kube-public" namespace
    [addons] Applied essential addon: CoreDNS
    [addons] Applied essential addon: kube-proxy
    
    Your Kubernetes master has initialized successfully!
    
    To start using your cluster, you need to run the following 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:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
    You can now join any number of machines by running the following on each node
    as root:
    
      kubeadm join 192.168.2.118:6443 --token x4p0vz.tdp1xxxx7uyerrrs --discovery-token-ca-cert-hash sha256:64cb13f7f004fe8dd3e6d0e246950f4cbdfa65e2a84f8988c3070abf8183b3e9
    
    ➜  kubernetes   

    部署网络插件

    安装成功后, 通过kubectl get nodes查看节点信息(kubectl命令需要使用kubernetes-admin来运行, 需要拷贝下配置文件并配置环境变量才能运行kubectl get nods):

    ➜  kubernetes  kubectl get nodes                
    The connection to the server localhost:8080 was refused - did you specify the right host or port?
    ➜  kubernetes  echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc      
    ➜  kubernetes  source ~/.bashrc
    ➜  kubernetes  kubectl get nodes                                               
    NAME     STATUS     ROLES    AGE   VERSION
    debian   NotReady   master   21m   v1.12.2
    ➜  kubernetes 

    可以看到节点NotReady, 这是由于还没有部署任何网络插件:

    ➜  kubernetes  kubectl get pods -n kube-system 
    NAME                             READY   STATUS    RESTARTS   AGE
    coredns-576cbf47c7-4vjhf         0/1     Pending   0          24m
    coredns-576cbf47c7-xzjk7         0/1     Pending   0          24m
    etcd-debian                      1/1     Running   0          23m
    kube-apiserver-debian            1/1     Running   0          23m
    kube-controller-manager-debian   1/1     Running   0          23m
    kube-proxy-5wb6k                 1/1     Running   0          24m
    kube-scheduler-debian            1/1     Running   0          23m
    ➜  kubernetes  
    
    ➜  kubernetes  kubectl describe node debian
    Name:               debian
    Roles:              master
    Labels:             beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/os=linux
                        kubernetes.io/hostname=debian
                        node-role.kubernetes.io/master=
    Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                        node.alpha.kubernetes.io/ttl: 0
                        volumes.kubernetes.io/controller-managed-attach-detach: true
    CreationTimestamp:  Wed, 05 Dec 2018 23:09:19 +0800
    Taints:             node-role.kubernetes.io/master:NoSchedule
                        node.kubernetes.io/not-ready:NoSchedule
    Unschedulable:      false
    Conditions:
      Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
      ----             ------  -----------------                 ------------------                ------                       -------
      OutOfDisk        False   Wed, 05 Dec 2018 23:31:26 +0800   Wed, 05 Dec 2018 23:09:14 +0800   KubeletHasSufficientDisk     kubelet has sufficient disk space available
      MemoryPressure   False   Wed, 05 Dec 2018 23:31:26 +0800   Wed, 05 Dec 2018 23:09:14 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
      DiskPressure     False   Wed, 05 Dec 2018 23:31:26 +0800   Wed, 05 Dec 2018 23:09:14 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
      PIDPressure      False   Wed, 05 Dec 2018 23:31:26 +0800   Wed, 05 Dec 2018 23:09:14 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
      Ready            False   Wed, 05 Dec 2018 23:31:26 +0800   Wed, 05 Dec 2018 23:09:14 +0800   KubeletNotReady              runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized. WARNING: CPU hardcapping unsupported
    Addresses:
      InternalIP:  192.168.2.118
      Hostname:    debian
    Capacity:
     cpu:                2
     ephemeral-storage:  4673664Ki
     hugepages-2Mi:      0
     memory:             5716924Ki
     pods:               110
    Allocatable:
     cpu:                2
     ephemeral-storage:  4307248736
     hugepages-2Mi:      0
     memory:             5614524Ki
     pods:               110
    System Info:
     Machine ID:                 4341bb45c5c84ad2827c173480039b5c
     System UUID:                05F887C4-A455-122E-8B14-8C736EA3DBDB
     Boot ID:                    ff68f27b-fba0-4048-a1cf-796dd013e025
     Kernel Version:             3.16.0-4-amd64
     OS Image:                   Debian GNU/Linux 8 (jessie)
     Operating System:           linux
     Architecture:               amd64
     Container Runtime Version:  docker://18.6.1
     Kubelet Version:            v1.12.2
     Kube-Proxy Version:         v1.12.2
    Non-terminated Pods:         (5 in total)
      Namespace                  Name                              CPU Requests  CPU Limits  Memory Requests  Memory Limits
      ---------                  ----                              ------------  ----------  ---------------  -------------
      kube-system                etcd-debian                       0 (0%)        0 (0%)      0 (0%)           0 (0%)
      kube-system                kube-apiserver-debian             250m (12%)    0 (0%)      0 (0%)           0 (0%)
      kube-system                kube-controller-manager-debian    200m (10%)    0 (0%)      0 (0%)           0 (0%)
      kube-system                kube-proxy-5wb6k                  0 (0%)        0 (0%)      0 (0%)           0 (0%)
      kube-system                kube-scheduler-debian             100m (5%)     0 (0%)      0 (0%)           0 (0%)
    Allocated resources:
      (Total limits may be over 100 percent, i.e., overcommitted.)
      Resource  Requests    Limits
      --------  --------    ------
      cpu       550m (27%)  0 (0%)
      memory    0 (0%)      0 (0%)
    Events:
      Type    Reason                   Age                From                Message
      ----    ------                   ----               ----                -------
      Normal  Starting                 22m                kubelet, debian     Starting kubelet.
      Normal  NodeAllocatableEnforced  22m                kubelet, debian     Updated Node Allocatable limit across pods
      Normal  NodeHasSufficientDisk    22m (x6 over 22m)  kubelet, debian     Node debian status is now: NodeHasSufficientDisk
      Normal  NodeHasSufficientMemory  22m (x6 over 22m)  kubelet, debian     Node debian status is now: NodeHasSufficientMemory
      Normal  NodeHasNoDiskPressure    22m (x6 over 22m)  kubelet, debian     Node debian status is now: NodeHasNoDiskPressure
      Normal  NodeHasSufficientPID     22m (x5 over 22m)  kubelet, debian     Node debian status is now: NodeHasSufficientPID
      Normal  Starting                 21m                kube-proxy, debian  Starting kube-proxy.
    ➜  kubernetes  
    View Code

    部署插件后可查看所有pods已经running(插件要几分钟才能运行起来, 中间状态有ContainerCreating/CrashLoopBackOff):

    ➜  kubernetes  kubectl get pods -n kube-system                 
    NAME                             READY   STATUS              RESTARTS   AGE
    coredns-576cbf47c7-4vjhf         0/1     Pending             0          25m
    coredns-576cbf47c7-xzjk7         0/1     Pending             0          25m
    etcd-debian                      1/1     Running             0          25m
    kube-apiserver-debian            1/1     Running             0          25m
    kube-controller-manager-debian   1/1     Running             0          25m
    kube-proxy-5wb6k                 1/1     Running             0          25m
    kube-scheduler-debian            1/1     Running             0          25m
    weave-net-nj7bk                  0/2     ContainerCreating   0          21s
    ➜  kubernetes  kubectl get pods -n kube-system
    NAME                             READY   STATUS             RESTARTS   AGE
    coredns-576cbf47c7-4vjhf         0/1     CrashLoopBackOff   2          27m
    coredns-576cbf47c7-xzjk7         0/1     CrashLoopBackOff   2          27m
    etcd-debian                      1/1     Running            0          27m
    kube-apiserver-debian            1/1     Running            0          27m
    kube-controller-manager-debian   1/1     Running            0          27m
    kube-proxy-5wb6k                 1/1     Running            0          27m
    kube-scheduler-debian            1/1     Running            0          27m
    weave-net-nj7bk                  2/2     Running            0          2m32s
    ➜  kubernetes  kubectl get pods -n kube-system
    NAME                             READY   STATUS    RESTARTS   AGE
    coredns-576cbf47c7-4vjhf         1/1     Running   3          27m
    coredns-576cbf47c7-xzjk7         1/1     Running   3          27m
    etcd-debian                      1/1     Running   0          27m
    kube-apiserver-debian            1/1     Running   0          27m
    kube-controller-manager-debian   1/1     Running   0          27m
    kube-proxy-5wb6k                 1/1     Running   0          27m
    kube-scheduler-debian            1/1     Running   0          27m
    weave-net-nj7bk                  2/2     Running   0          2m42s
    ➜  kubernetes  
    ➜  kubernetes  kubectl get nodes  
    NAME     STATUS   ROLES    AGE   VERSION
    debian   Ready    master   38m   v1.12.2
    ➜  kubernetes  

    调整master可以执行Pod

    默认情况下,Kubernetes通过Taint/Toleration 机制给某一个节点打上"污点":

    ➜  kubernetes  kubectl describe node debian | grep Taints                      
    Taints:             node-role.kubernetes.io/master:NoSchedule
    ➜  kubernetes  

    那么所有Pod默认就不在被标记的节点上运行,除非:

    1 1. Pod主动声明允许在这种节点上运行(通过在Pod的yaml文件中的spec部分,加入 tolerations 字段即可)。
    2 2. 对于总共就几台机器的k8s测试机器来说,最好的选择就是删除Taint:
    3   ➜  kubernetes  kubectl taint nodes --all node-role.kubernetes.io/master-
    4   node/debian untainted
    5   ➜  kubernetes  kubectl describe node debian | grep Taints               
    6   Taints:             <none>
    7   ➜  kubernetes  

    增加节点

    由于master上kubeadm/kubelet都是v1.12.2版本,worker节点执行默认apt-get install时默认装了v1.13版本,导致加入集群失败,需卸载重装匹配的版本:
    root@debian-vm:~# kubeadm version
    kubeadm version: &version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.0", GitCommit:"ddf47ac13c1a9483ea035a79cd7c10005ff21a6d", GitTreeState:"clean", BuildDate:"2018-12-03T21:02:01Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
    root@debian-vm:~# root@debian-vm:~# kubelet --version
    Kubernetes v1.13.0
    root@debian-vm:~# apt-get --purge remove kubeadm kubelet
    root@debian-vm:~# apt-cache policy kubeadm
    kubeadm:
      已安装:  (无)
      候选软件包:1.13.0-00
      版本列表:
         1.13.0-00 0
            500 https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial/main amd64 Packages
         1.12.3-00 0
            500 https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial/main amd64 Packages
         1.12.2-00 0
            500 https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial/main amd64 Packages
    root@debian-vm:~# apt-get install kubeadm=1.12.2-00 kubelet=1.12.2-00
    
    root@debian-vm:~# kubeadm join 192.168.2.118:6443 --token x4p0vz.tdp1xxxx7uyerrrs --discovery-token-ca-cert-hash sha256:64cb13f7f004fe8dd3e6d0e246950f4cbdfa65e2a84f8988c3070abf8183b3e9
    [preflight] running pre-flight checks
    [discovery] Trying to connect to API Server "192.168.2.118:6443"
    [discovery] Created cluster-info discovery client, requesting info from "https://192.168.2.118:6443"
    [discovery] Requesting info from "https://192.168.2.118:6443" again to validate TLS against the pinned public key
    [discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.2.118:6443"
    [discovery] Successfully established connection with API Server "192.168.2.118:6443"
    [kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.12" ConfigMap in the kube-system namespace
    [kubelet] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
    [kubelet] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
    [preflight] Activating the kubelet service
    [tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...
    [patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "debian-vm" as an annotation
    
    This node has joined the cluster:
    * Certificate signing request was sent to apiserver and a response was received.
    * The Kubelet was informed of the new secure connection details.
    
    Run 'kubectl get nodes' on the master to see this node join the cluster.
    
    root@debian-vm:~# 
    节点加入集群成功
    https://github.com/kubernetes/kubernetes/issues/54914
    https://github.com/kubernetes/kubeadm/issues/610
    https://blog.csdn.net/acxlm/article/details/79069468

    Excellence, is not an act, but a habit.
    作者:子厚.
    出处:http://www.cnblogs.com/aios/
    本文版权归作者和博客园共有,欢迎转载、交流、点赞、评论,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

  • 相关阅读:
    OC内存管理
    摘要算法
    加密算法
    编码技术
    Golang遇到的一些问题总结
    SignalR
    uni-app 小程序 vue
    C# 调用 C++ dll的两种方式
    Vue 项目 VSCode 调试
    Navicat 导出 表结构
  • 原文地址:https://www.cnblogs.com/aios/p/10023299.html
Copyright © 2011-2022 走看看