zoukankan      html  css  js  c++  java
  • 使用Kubeadm部署K8S v1.17.2集群部署详细步骤

    kubernetes组件架构图:

    集群机器

    172.16.2.10 k8s-master
    172.16.2.11 k8s-node1
    172.16.2.12 k8s-node2

     #查看Centos版本:

    cat /etc/redhat-release 
    CentOS Linux release 7.4.1708 (Core)
    ##https://www.cnblogs.com/liucx/

    #修改主机名:

    #master节点:
    hostnamectl set-hostname k8s-master
    #node1节点:
    hostnamectl set-hostname k8s-node1
    #node2节点:
    hostnamectl set-hostname k8s-node2

    #修改/etc/hosts文件

    cat >> /etc/hosts << EOF
    172.16.2.10 k8s-master
    172.16.2.11 k8s-node1
    172.16.2.12 k8s-node2
    EOF

    #关闭防火墙和selinux

    systemctl stop firewalld && systemctl disable firewalld
    sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && setenforce 0

    #关闭swap

    swapoff -a
    sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab

    #Master免密登录其它节点

    ssh-keygen
    ssh-copy-id -i root@k8s-node1
    ssh-copy-id -i root@k8s-node2

    #安装依赖包

    yum -y  install epel-release
    yum -y install  ntpdate  ipvsadm ipset  iptables curl sysstat libseccomp wget 

    #同步时间

    ntpdate ntp.shu.edu.cn
    crontab -e
    */5 * * * * ntpdate ntp5.aliyun.com

    #修改iptables相关参数
    #RHEL / CentOS 7上的一些用户报告了由于iptables被绕过而导致流量路由不正确的问题。创建/etc/sysctl.d/k8s.conf文件,添加如下内容:

    cat <<EOF >  /etc/sysctl.d/k8s.conf
    vm.swappiness = 0
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    #使配置生效
    modprobe br_netfilter
    sysctl -p /etc/sysctl.d/k8s.conf

    #由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:
    #在所有的Kubernetes节点执行以下脚本:

    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    EOF

    #执行脚本
    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    #上面脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。

    #卸载docker旧版本

    yum remove -y docker 
    docker-client 
    docker-client-latest 
    docker-common 
    docker-latest 
    docker-latest-logrotate 
    docker-logrotate 
    docker-selinux 
    docker-engine-selinux 
    docker-engine

    #安装docker

    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum makecache fast
    yum -y install docker-ce
    systemctl start docker && systemctl enable docker

    #配置镜像加速器

    cat >/etc/docker/daemon.json <<EOF
    {
      "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
    EOF
    systemctl restart docker

    #配置kubernetes的阿里云yun源

    cat > /etc/yum.repos.d/kubernetes.repo  <<EOF
    [kubernetes]
    name=Kubernetes repo
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
    enabled=1
    EOF

    #安装指定版本kubelet、kubeadm、kubectl
    #1.kubelet 在群集中所有节点上运行的核心组件, 用来执行如启动pods和containers等操作。
    #2.kubeadm 引导启动k8s集群的命令行工具,用于初始化 Cluster。
    #3.kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
    #在所有节点上安装指定版本 kubelet、kubeadm 和 kubectl

    yum install -y kubelet-1.17.2 kubeadm-1.17.2 kubectl-1.17.2

    #修改docker Cgroup Driver为systemd
    #将/usr/lib/systemd/system/docker.service文件中的这一行 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    #修改为 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
    #如果不修改,在添加Node节点时可能会碰到如下错误
    # [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
    # Please follow the guide at https://kubernetes.io/docs/setup/cri/

    sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service
    systemctl daemon-reload
    systemctl restart docker

    #启动kubelet服务

    systemctl enable kubelet && systemctl start kubelet

    #Master节点执行初始化

    kubeadm init 
        --apiserver-advertise-address=172.16.2.10 
        --image-repository registry.aliyuncs.com/google_containers 
        --kubernetes-version v1.17.2 
        --pod-network-cidr=10.244.0.0/16
    
    --apiserver-advertise-address:API服务器将通知它正在监听的IP地址,监听的地址为“0.0.0.0”,即本机所有IP地址。
    --apiserver-bind-port:API服务器绑定到的端口。(默认:6443)
    --image-repository:Kubenetes默认Registries地址是 k8s.gcr.io,在国内并不能访问 gcr.io,将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers
    --ignore-preflight-errors:将错误显示为警告的检查列表进行忽略。例如:“IsPrivilegedUser,Swp”。Value 'all'忽略所有检查中的错误。
    --pod-network-cidr:指定pod网络的IP地址范围。如果设置,控制平面将为每个节点自动分配CIDRs。
    --service-cidr:为service VIPs使用不同的IP地址。(默认“10.96.0.0/12”)

    #上面日志会生成以下信息(重要记录)

    kubeadm join 172.16.2.10:6443 --token a63pm3.gqg0nc7dphukxohv 
        --discovery-token-ca-cert-hash sha256:5bfcffc542f4aecdecb1ad5250d1ac6fe202d0d36433065eb31a83dbe56733eb 
    #默认token的有效期为24小时,当过期之后,该token就不可用了。
    #如果后续有nodes节点加入,解决方法如下:重新生成新的token ==> kubeadm token create

     #根据上面的输出提示进行操作 

    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config

    #执行完之后,再查看nodes节点时,结果如下:
    kubectl get nodes
    #可以看出master的状态是未就绪(NotReady),之所以是这种状态是因为还缺少一个附件flannel或者Calico,没有网络各Pod是无法通信的。
    #也可以通过检查组件的健康状态
    kubectl get componentstatus #componentstatus可简写为cs

    #Node节点加入集群

    #使用kubeadm join 注册Node节点到Matser

    #kubeadm join 的内容,在上面kubeadm init (kubeadm init输出结果的最后写明了) 已经生成好了
    #此操作在node节点上进行操作

    kubeadm join 172.16.2.10:6443 --token a63pm3.gqg0nc7dphukxohv 
        --discovery-token-ca-cert-hash sha256:5bfcffc542f4aecdecb1ad5250d1ac6fe202d0d36433065eb31a83dbe56733eb 

    #安装网络插件
    #一般的网络无法访问quay.io,可以找国内的镜像源,或者从docker hub上拉取flannel的镜像。
    #手动拉取flannel镜像
    #在集群的所有机器上操作,手动拉取flannel的docker镜像

    docker pull easzlab/flannel:v0.11.0-amd64
    # 修改镜像名称
    docker tag easzlab/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
    docker rmi easzlab/flannel:v0.11.0-amd64
    docker images

    #安装flannel
    #此操作在Master节点 上进行
    #下载flannel资源配置清单

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

    #部署完成后,我们可以通过 kubectl get 重新检查 Pod 的状态:

    kubectl get pod -n kube-system -o wide
    #可以看到,所有的系统 Pod 都成功启动了,而刚刚部署的flannel网络插件则在 kube-system 下面新建了一个名叫kube-flannel-ds-amd64-lkf2f的 Pod,一般来说,这些 Pod 就是容器网络插件在每个节点上的控制组件。
    再次查看master和node节点状态已经为ready状态
    kubectl get nodes 
    [root@k8s-master ~]# kubectl get pods --all-namespaces  #查看所有名称空间的pod,同时可以看到flannel已经正常启动    
    NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
    default       nginx-86c57db685-q884q               1/1     Running   0          7m3s
    kube-system   coredns-9d85f5447-jb8l2              1/1     Running   0          3h38m
    kube-system   coredns-9d85f5447-zx2j5              1/1     Running   0          3h38m
    kube-system   etcd-k8s-master                      1/1     Running   0          3h38m
    kube-system   kube-apiserver-k8s-master            1/1     Running   0          3h38m
    kube-system   kube-controller-manager-k8s-master   1/1     Running   0          3h38m
    kube-system   kube-flannel-ds-amd64-2plp7          1/1     Running   0          48m
    kube-system   kube-flannel-ds-amd64-cnlbh          1/1     Running   0          48m
    kube-system   kube-flannel-ds-amd64-zr88r          1/1     Running   0          48m
    kube-system   kube-proxy-44fpd                     1/1     Running   0          179m
    kube-system   kube-proxy-5lrvp                     1/1     Running   0          3h38m
    kube-system   kube-proxy-c64px                     1/1     Running   0          179m
    kube-system   kube-scheduler-k8s-master            1/1     Running   0          3h38m
    [root@k8s-master ~]# kubectl get pods -n kube-system #查看名称空间为kube-system的pod
    NAME READY STATUS RESTARTS AGE
    coredns-9d85f5447-jb8l2 1/1 Running 0 3h37m
    coredns-9d85f5447-zx2j5 1/1 Running 0 3h37m
    etcd-k8s-master 1/1 Running 0 3h37m
    kube-apiserver-k8s-master 1/1 Running 0 3h37m
    kube-controller-manager-k8s-master 1/1 Running 0 3h37m
    kube-flannel-ds-amd64-2plp7 1/1 Running 0 47m
    kube-flannel-ds-amd64-cnlbh 1/1 Running 0 47m
    kube-flannel-ds-amd64-zr88r 1/1 Running 0 47m
    kube-proxy-44fpd 1/1 Running 0 178m
    kube-proxy-5lrvp 1/1 Running 0 3h37m
    kube-proxy-c64px 1/1 Running 0 178m
    kube-scheduler-k8s-master 1/1 Running 0 3h37m

    #Master节点安装自动补全工具

    yum install -y bash-completion
    source /usr/share/bash-completion/bash_completion
    source <(kubectl completion bash)
    echo "source <(kubectl completion bash)" >> ~/.bashrc

    #测试Kubernetes集群

     此操作在master节点 K8S00上进行

    kubectl create deployment nginx --image=nginx
    kubectl expose deployment nginx --port=80 --type=NodePort
    kubectl get services nginx
    #kubernetes集群可能出现pod或node节点状态异常等情况,可以通过查看日志分析错误原因
    #查看pod日志
    kubectl -n kube-system logs -f <pod name>
    #查看pod运行状态及事件
    kubectl -n kube-system describe pods <pod name>

    完成!

  • 相关阅读:
    阻塞队列(BlockingQueue)
    CountDownLatch/CyclicBarrier/Semaphore
    Guava Cache详解
    Java中的常见锁(公平和非公平锁、可重入锁和不可重入锁、自旋锁、独占锁和共享锁)
    CopyOnWriteArrayList详解
    集合类线程安全问题
    原子类的 ABA 问题
    原子类CAS的底层实现
    volatile关键字
    Java 内存模型(Java Memory Model,JMM)
  • 原文地址:https://www.cnblogs.com/liucx/p/12659979.html
Copyright © 2011-2022 走看看