• 【02】Kubernets:使用 kubeadm 部署 K8S 集群


    写在前面的话

    通过上一节,知道了 K8S 有 Master / Node 组成,但是具体怎么个组成法,就是这一节具体谈的内容。概念性的东西我们会尽量以实验的形式将其复现。

    部署 K8S 集群

    互联网常用的 K8S 集群部署方式:

    1. kubeadm(我们本次用到的)

    2. rancher

    3. 云服务商提供的(如阿里云提供的 K8S)

    4. yum 安装(版本有点低,不推荐)

    准备:

    IP主机名角色安装
    192.168.100.101 node1 Master kubeadm/kubelet/kubectl/docker-ce/flannel
    192.168.100.102 node2 Node kubeadm/kubelet/kubectl/docker-ce/flannel
    192.168.100.103 node3 Node kubeadm/kubelet/kubectl/docker-ce/flannel

    准备 3 台初始化的机器,内存大于 2G。

    至于 kubeadm 文档如下,感兴趣的可以去看看:

    https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md

    【1】所有节点初始化操作:

    # 配置主机名解析
    echo "192.168.100.101   node1" >>/etc/hosts
    echo "192.168.100.102   node2" >>/etc/hosts
    echo "192.168.100.103   node3" >>/etc/hosts
    
    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    
    # 取消 swap
    swapoff -a
    
    # 配置 ipvs
    echo 'net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1' > /etc/sysctl.d/k8s.conf
    
    # 使配置生效
    modprobe br_netfilter
    sysctl -p /etc/sysctl.d/k8s.conf
    
    # kube-proxy 配置 ipvs
    echo 'modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4' >> /etc/sysconfig/modules/ipvs.modules
    
    # 生效配置
    chmod 755 /etc/sysconfig/modules/ipvs.modules
    bash /etc/sysconfig/modules/ipvs.modules
    lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    
    # 时间同步
    yum -y install ntpdate
    ntpdate cn.pool.ntp.org
    echo "*/20 * * * * /usr/sbin/ntpdate cn.pool.ntp.org" >> /var/spool/cron/root

    简单的做个说明,上面的步骤是每个节点都需要进行的初始化操作,属于必须进行了。第一个主机名解析需要根据自己的实际情况进行一定量的修改。关闭防火墙是为了保证我们的通信能够正常完成。至于开启 ipvs 我们在上一节提到过,在 K8S 1.11 版本以后,系统的负载均衡调度选用的是 ipvs 规则,能够提高我们集群的性能。如果你不配置 ipvs,可能还会使用 iptables 规则,这不是我们想要看到的。

    值得注意的是,时间同步在 docker 和 K8S 集群中都特别重要,所以一定要保证时间与互联网时间同步,否则可能导致莫名其妙的 BUG,如:镜像拉取失败,报错:

    x509: certificate has expired or is not yet valid

    【2】所有节点都安装配置 docker:

    # 卸载旧版本
    yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    
    # 安装依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2 bridge-utils bash-completion wget
    
    # 配置阿里 yum 源
    cd /etc/yum.repos.d
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    # 安装 docker
    yum -y install docker-ce

    配置 docker 阿里云下载加速:(这里的加速地址是网友的,如果你想用自己的,可以去阿里云搞一个,具体就不详细说明了,网上很多)

    mkdir -p /etc/docker
    echo '{
     "registry-mirrors": ["https://eyg9yi6d.mirror.aliyuncs.com"]
    }' > /etc/docker/daemon.json

    启动 docker:

    systemctl enable docker
    systemctl start docker
    docker version

    我这里 docker 版本为: 18.09.6

    【3】所有节点都配置 K8S 源并安装 K8S:

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

    安装 K8S 并设置开机启动,但是先不启动

    yum makecache fast
    yum install -y kubelet kubeadm kubectl
    systemctl enable kubelet

    我们这里安装 K8S 版本为:v1.14.2

    【4】节点下载镜像:

    由于国内网络的原因,K8S 的镜像站是连接不上的,需要手动去下载,这里有个我写的脚本,修改成你的 K8S 版本就行(K8S_VERSION):

    #!/bin/bash
    
    #################################################################
    # 作者:Dy1an <1214966109@qq.com>
    # 日期:2019-05-23
    # 作用:下载 K8S 相关镜像
    #################################################################
    
    #################################################################
    # 系统相关变量
    #################################################################
    LINE="==================================================================="
    MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/openthings
    K8S_VERSION="v1.14.2"
    
    #################################################################
    # 拉取镜像
    #################################################################
    echo ${LINE}
    echo "Pull Kubernetes ${K8S_VERSION} Images from aliyuncs.com ......"
    echo ${LINE}
    docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:${K8S_VERSION}
    docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:${K8S_VERSION}
    docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:${K8S_VERSION}
    docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:${K8S_VERSION}
    docker pull ${MY_REGISTRY}/k8s-gcr-io-etcd:3.3.10
    docker pull ${MY_REGISTRY}/k8s-gcr-io-pause:3.1
    docker pull ${MY_REGISTRY}/k8s-gcr-io-coredns:1.3.1
    
    #################################################################
    # 修改 tag
    #################################################################
    echo ${LINE}
    echo "Change Kubernetes ${K8S_VERSION} Images tags ......"
    echo ${LINE}
    docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:${K8S_VERSION} k8s.gcr.io/kube-apiserver:${K8S_VERSION}
    docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:${K8S_VERSION} k8s.gcr.io/kube-scheduler:${K8S_VERSION}
    docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:${K8S_VERSION} k8s.gcr.io/kube-controller-manager:${K8S_VERSION}
    docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:${K8S_VERSION} k8s.gcr.io/kube-proxy:${K8S_VERSION}
    docker tag ${MY_REGISTRY}/k8s-gcr-io-etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
    docker tag ${MY_REGISTRY}/k8s-gcr-io-pause:3.1 k8s.gcr.io/pause:3.1
    docker tag ${MY_REGISTRY}/k8s-gcr-io-coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
    
    #################################################################
    # 提示完成
    #################################################################
    echo ${LINE}
    echo "Pull Kubernetes ${K8S_VERSION} Images FINISHED."
    echo ${LINE}

    在每台机器上面执行脚本,下载完成后查看镜像:

    docker images

    结果如图:

    【5】Master 主节点初始化:

    在初始化之前,我们需要插播一个知识点,那就是 K8S 网络,先看个图:

    在 K8S 集群中,我们主要会提到 3 个网络:

    1. 节点网络:很好理解,就是每台机器的真实 IP 地址,比如:192.168.100.101,该 IP 称作 Node IP

    2. Pod 网络:K8S 管理的最小单位是 Pod,我们可以把 Pod 就看成一个 docker 容器,这个 IP 就像容器的 IP,称作 Pod IP。 

    3. Service 网络:前两 IP 都会配置到  Pod 或网卡,但是这个不会,若多个 Pod 组成一个 Service,这个 IP 就像统一入口。至于 Service,之后会详讲。该 IP 称作 Cluster IP

    当然还有其他网络,比如 pod 和 pod 之间通信的隧道 Overlay(叠加)网络。以及 Pod 内部容器间通过 lo 网卡通信的网络。这些都不需要我们去关注。只需要记住上面的 3 个就行。

    为了实现这样复杂的网络结构,我们引入了网络插件,常见的插件有以下几种:

    1. flannel:简单易用,但不支持网络策略。通过配置本地网络协议栈实现给本机 Pod 配置 IP。

    2. project calico:支持网络策略和网络配置,默认基于 BGP 网络实现直接通信。

    3. canel:flannel 和 calico 结合,flannel 提供网络,calico 提供策略。

    基于上面的知识点,我们再来初始化我们的集群,并定义了两个服务网段:

    # 添加配置
    echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet
    
    # 初始化主节点
    kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.1.0.0/16 --service-cidr=10.96.0.0/12

    结果如图:

    从初始化节点打印的东西我们可以看到:

    1. 系统初始化安装了两个附件:kube-proxyCoreDNS(就是 kube-dns)。

    2. 我们需要手动执行这个 3 个命令才算真正完成主节点初始化。

    3. Node 节点加入集群的命令,需要我们记录下来。 

    执行后续操作:

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

    查看集群状态:

    kubectl get cs

    结果如图: 

    查看节点信息:

    kubectl get nodes

    结果如图:

    此时可以看到,主节点的状态是 NotReady 的,原因是还没有配置 flannel

    注意:如果出现错误,我们可以通过 /var/log/messages 查看日志。

    安装 flannel 网络插件,项目地址:

    https://github.com/coreos/flannel

     执行命令在线安装:

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

    结果如图:

    此时再度查看节点状态:

    kubectl get nodes

    结果如图,已经变成 Ready 状态: 

    查看当前运行的 Pod:

    kubectl get pods -n kube-system

    结果如图:

    这里专门指定了名称空间,如果不指定,会发现默认的名称空间中什么也没有。可以查看下名称空间:

    kubectl get ns

    结果如图:

    至此,主节点配置基本完成,接下来配置 Node 节点!至于这些命令,之后会单独讲解。

    【6】Node 节点初始化:

    # 添加配置
    echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet
    
    # 加入集群
    kubeadm join 192.168.100.101:6443 --token no4hr8.4xv9xjyt9dxwqinq --discovery-token-ca-cert-hash sha256:239675f2ccb9e700ea1a60b8ff019672ea1a98c1f66ad6a81972cb5ec7d4f381

    结果如图:

    主节点查看结果:容器启动需要一定的时间(1-2分钟),所以直接查看可能出现 NotReady 的情况,这是正常的。

    主节点上查看运行的详细信息:

    kubectl get pods -n kube-system -o wide

    结果如图:-o wide 查看详细信息!

    可以看到,kube-proxykube-flannel 在其他节点上都有运行。

    这里我们得再强调一件事情,除了开始加入节点的命令我们得去 Node 从节点执行,后续的命令我们都是在 Master 节点完成的,由此可以看出 Master 节点的重要性。

    到此,K8S 简单的集群搭建完成! 

    小结

    整个部署过程中最麻烦的就是镜像下载以及镜像版本之间的兼容性。我们推荐使用相对成熟的版本部署我们的应用。因为我这里是测试,所以就选用的最新稳定版。

    主要的过程就像这些,看着很复杂,其实大多都说贴命令的过程。后续如果感兴趣,其实完全可以写成脚本,让他一键部署。

  • 相关阅读:
    使用微创联合M5S空气检测仪、树莓派3b+、prometheus、grafana实现空气质量持续监控告警WEB可视化
    nodejs:使用puppeteer在服务器中构建一个获取电影电视剧剧集的接口
    nodejs 使用puppeteer模块在nodejs中模拟浏览器运行,载入脚本,输出结果
    nodejs 使用http和fs模块读取网络图片,并写入到本地
    不同环境的性能测试计划
    React 应用的 Nginx 缓存控制
    被【BiliBili@稚晖君】大佬的圈粉-收集下大佬的软硬件工具
    第二章-在线编程题2-求解幸运数问题
    数据库系统概论 第一章绪论知识点 脑图笔记
    第36篇-return字节码指令
  • 原文地址:https://www.cnblogs.com/Dy1an/p/10812263.html
Copyright © 2020-2023  润新知