当前位置 博文首页 > RtxTitanV的博客:kubeadm部署v1.18.5版Kubernetes集群

    RtxTitanV的博客:kubeadm部署v1.18.5版Kubernetes集群

    作者:[db:作者] 时间:2021-07-07 10:12

    本文主要对使用kubeadm部署Kubernetes集群进行总结。使用三台虚拟机来部署一个单Master节点的Kubernetes集群,Kubernetes版本选择的是v1.18.5

    一、部署要求

    1.部署集群的机器的要求

    • 需要一台或多台运行着下列系统的机器:
      • Ubuntu 16.04+
      • Debian 9+
      • CentOS 7+
      • Red Hat Enterprise Linux (RHEL) 7
      • Fedora 25+
      • HypriotOS v1.0.1+
      • Container Linux (测试 1800.6.0 版本)
    • 每台机器至少2GB内存
    • 每台机器至少2核CPU
    • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
    • 确保每个节点上的主机名、MAC地址和product_uuid的唯一性
    • 开启机器上的某些端口
    • 禁用交换(swap)分区

    2.检查所需端口

    控制平面节点:

    协议方向端口范围作用使用者
    TCP入站6443*Kubernetes API服务器所有组件
    TCP入站2379-2380etcd server client APIkube-apiserver,etcd
    TCP入站10250Kubelet APIkubelet自身、控制平面组件
    TCP入站10251kube-schedulerkube-scheduler自身
    TCP入站10252kube-controller-managerkube-controller-manager自身

    工作节点:

    协议方向端口范围作用使用者
    TCP入站10250Kubelet APIkubelet自身、控制平面组件
    TCP入站30000-32767NodePort服务所有组件

    注意事项:

    • 使用*标记的任意端口号都可以被覆盖,所以需要保证所定制的端口是开放的。
    • 虽然控制平面节点已经包含了etcd的端口,但也可以使用自定义的外部etcd集群或是指定自定义端口。
    • pod网络插件也可能需要开启某些特定端口。由于每个pod网络插件需开启的端口都有所不同,可以参阅他们的官方文档中对端口的要求。

    二、环境信息

    准备三台网络互通并能上外网的主机,这里使用的是三台虚拟机。本文所使用的环境如下:

    主机名ip操作系统Dockerkuberneteskubeadmkubectlkubeletflannel配置备注
    k8s-master192.168.1.16CentOS Linux release 8.2.200419.03.12v1.18.51.18.51.18.51.18.5v0.12.0-amd644C4Gk8s控制平面节点(control plane)
    k8s-node1192.168.1.17CentOS Linux release 8.2.200419.03.12v1.18.51.18.51.18.51.18.5/4C4Gk8s工作节点(worker node)
    k8s-node2192.168.1.18CentOS Linux release 8.2.200419.03.12v1.18.51.18.51.18.51.18.5/4C2Gk8s工作节点(worker node)

    三、系统准备

    除特殊说明的地方外,在control plane和work节点都执行本部分操作。

    1.验证mac地址和uuid

    cat /sys/class/net/ens160/address
    cat /sys/class/dmi/id/product_uuid
    

    k8s-master主机:
    1
    k8s-node1主机:
    2
    k8s-node2主机:
    3
    各节点mac和uuid唯一。

    2.配置主机名

    设置主机名:

    hostnamectl set-hostname <hostname>
    

    退出重新登陆即可显示新设置的主机名。下面修改hosts文件:

    cat >> /etc/hosts << EOF
    192.168.1.16 k8s-master
    192.168.1.17 k8s-node1
    192.168.1.18 k8s-node2
    EOF
    

    3.添加阿里源

    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
    yum install -y wget
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
    

    4.关闭防火墙

    systemctl stop firewalld && systemctl disable firewalld
    

    5.禁用swap

    临时禁用:

    swapoff -a
    

    永久禁需要在临时禁用后修改配置文件/etc/fstab,注释swap:

    sed -i.bak '/swap/s/^/#/' /etc/fstab
    

    已禁用:
    4

    6.关闭selinux

    临时关闭:

    setenforce 0
    

    永久关闭需将SELinux设置为disabled:

    sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
    

    重启系统,查看SELinux配置,成功关闭:
    5

    7.设置系统时区和同步时间

    设置系统时区为亚洲/上海,如果安装时设置过,则跳过:

    timedatectl set-timezone Asia/Shanghai
    

    如未安装chrony,执行以下命令安装

    yum install -y chrony
    

    时间同步:

    systemctl enable --now chronyd
    

    查看同步状态:

    timedatectl status
    

    System clock synchronized: yes表示时钟已同步,NTP service: active表示开启了时钟同步服务:
    6
    将当前的UTC 时间写入硬件时钟:

    timedatectl set-local-rtc 0
    

    重启依赖于系统时间的服务:

    systemctl restart rsyslog && systemctl restart crond
    

    8.修改内核参数

    在修改下面的内核参数之前需确保加载了br_netfilter模块。执行以下命令查看br_netfilter模块:

    lsmod | grep br_netfilter
    

    如果系统没有br_netfilter模块则执行下面的新增br_netfilter模块的命令,有则跳过。执行以下命令临时新增br_netfilter模块:

    modprobe br_netfilter
    

    7
    该方式重启后会失效。想要永久新增br_netfilter模块需执行以下命令:

    cat > /etc/rc.sysinit << EOF
    #!/bin/bash
    for file in /etc/sysconfig/modules/*.modules ; do
    [ -x $file ] && $file
    done
    EOF
    cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
    modprobe br_netfilter
    EOF
    chmod 755 /etc/sysconfig/modules/br_netfilter.modules
    

    8
    重启后不会失效,永久新增了br_netfilter模块。然后添加需要的内核参数,临时新增以下内核参数:

    sysctl net.bridge.bridge-nf-call-iptables=1
    sysctl net.bridge.bridge-nf-call-ip6tables=1
    sysctl net.ipv4.ip_forward=1
    

    永久新增以下内核参数:

    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    sysctl --system
    

    新增内核参数刷新生效:
    9
    验证是否生效:

    sysctl -n net.bridge.bridge-nf-call-ip6tables
    sysctl -n net.bridge.bridge-nf-call-iptables
    sysctl -n net.ipv4.ip_forward
    

    重启系统后验证是否生效,返回1表示生效:
    10

    9.kube-proxy开启ipvs的前置条件

    由于k8s已经支持了ipvs,为了kube-proxy开启ipvs需要加载以下模块,执行以下命令:

    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
    

    11
    查看是否已经正确加载所需的内核模块:

    lsmod | grep -e ipvs -e nf_conntrack_ipv4
    

    所需模块已加载:
    在这里插入图片描述
    安装ipset软件包和管理工具ipvsadm:

    yum install -y ipset ipvsadm
    

    10.免密登录

    配置k8s-master主机到k8s-node1和k8s-node2主机的免密登录,本步骤只在k8s-master上执行。首先创建秘钥:

    ssh-keygen -t rsa
    

    13
    将公钥同步至k8s-node1k8s-node2

    ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node1
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node2
    

    14
    免密登录:

    ssh root@k8s-node1
    ssh root@k8s-node2
    

    15

    四、安装配置Docker

    在control plane和work节点都执行本部分操作。

    1.安装Docker

    安装19.03.12版本的Docker:

    sudo yum update -y \
    && sudo yum install -y yum-utils device-mapper-persistent-data lvm2 \
    && sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo \
    && yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm \
    && sudo yum install -y docker-ce-19.03.12 \
    && sudo systemctl start docker \
    && sudo systemctl enable docker
    

    2.命令补全

    安装bash-completion:

    yum install -y bash-completion
    

    加载bash-completion:

    source /etc/profile.d/bash_completion.sh
    

    3.加入用户组

    root用户可跳过,非root用户执行以下命令加入docker用户组:

    sudo usermod -aG docker $USER
    newgrp docker
    

    4.配置Docker

    如下配置Docker:

    cat > /etc/docker/daemon.json << EOF
    {
      "registry-mirrors": ["https://ncq2ty7z.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      }
    }
    EOF
    

    重新加载配置并重启Docker:

    sudo systemctl daemon-reload && sudo systemctl restart docker
    

    5.验证

    验证Docker是否安装启动成功:

    docker version
    docker -v
    systemctl status docker
    

    安装成功:
    16
    启动成功:
    17

    五、安装kubeadm、kubelet和kubectl

    在control plane和work节点都执行本部分操作。

    1.添加阿里kubernetes源

    cat > /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    • []:中括号中是repository的id,唯一,用来标识不同仓库。
    • name:仓库名称。
    • baseurl:仓库地址。
    • enable:是否启用该仓库,默认为1表示启用。
    • gpgcheck:是否验证从该仓库获得程序包的合法性,1为验证。
    • repo_gpgcheck:是否验证元数据的合法性,1为验证。
    • gpgkey:数字签名的公钥所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了。

    2.安装kubeadm、kubelet和kubectl

    执行以下命令安装1.18.5版kubeadm、kubelet和kubectl:

    yum install -y kubeadm-1.18.5 kubelet-1.18.5 kubectl-1.18.5
    

    18
    设置kubelet开机自启:

    systemctl enable kubelet
    

    3.kubectl命令补全

    echo "source <(kubectl completion bash)" >> ~/.bash_profile
    source .bash_profile
    

    到这里可以拷贝一份虚拟机镜像保存,便于部署k8s集群。

    六、初始化主节点

    除特殊说明的地方外,在k8s-master节点执行本部分操作。

    1.拉取镜像

    准备了科学上网可略过此步骤。由于国内网络原因,如果没有科学上网则无法直接从k8s.gcr.io拉取镜像。最简单的方式是初始化时通过--image-repository registry.aliyuncs.com/google_container指定阿里云镜像仓库,但是阿里云仓库暂时只更新到v1.18.3版本,指定阿里云仓库暂时只能使用v1.18.3及以下版本。本文使用v1.18.5版本,所以需要从国内镜像库或Docker Hub用户仓库提前拉取。

    查看指定k8s版本需要的镜像:

    kubeadm config images list --kubernetes-version v1.18.5
    

    19
    创建一个k8s目录并新建一个脚本:

    mkdir -p /usr/local/k8s
    vi /usr/local/k8s/k8s-images.sh
    

    脚本内容如下:

    #!/bin/bash
    # 拉取镜像并打标签
    
    KUBE_VERSION=v1.18.5
    PAUSE_VERSION=3.2
    ETCD_VERSION=3.4.3-0
    COREDNS_VERSION=1.6.7
    
    # 拉取镜像
    docker pull kubeimage/kube-apiserver-amd64:$KUBE_VERSION
    docker pull kubeimage/kube-controller-manager-amd64:$KUBE_VERSION
    docker pull kubeimage/kube-scheduler-amd64:$KUBE_VERSION
    docker pull kubeimage/kube-proxy-amd64:$KUBE_VERSION
    docker pull registry.aliyuncs.com/google_containers/pause:$PAUSE_VERSION
    docker pull registry.aliyuncs.com/google_containers/etcd:$ETCD_VERSION
    docker pull registry.aliyuncs.com/google_containers/coredns:$COREDNS_VERSION
    
    # 标签打上k8s.gcr.io前缀
    docker tag kubeimage/kube-apiserver-amd64:$KUBE_VERSION k8s.gcr.io/kube-apiserver:$KUBE_VERSION
    docker tag kubeimage/kube-controller-manager-amd64:$KUBE_VERSION k8s.gcr.io/kube-controller-manager:$KUBE_VERSION
    docker tag kubeimage/kube-scheduler-amd64:$KUBE_VERSION k8s.gcr.io/kube-scheduler:$KUBE_VERSION
    docker tag kubeimage/kube-proxy-amd64:$KUBE_VERSION  k8s.gcr.io/kube-proxy:$KUBE_VERSION
    docker tag registry.aliyuncs.com/google_containers/pause:$PAUSE_VERSION k8s.gcr.io/pause:$PAUSE_VERSION
    docker tag registry.aliyuncs.com/google_containers/etcd:$ETCD_VERSION k8s.gcr.io/etcd:$ETCD_VERSION
    docker tag registry.aliyuncs.com/google_containers/coredns:$COREDNS_VERSION k8s.gcr.io/coredns:$COREDNS_VERSION
    
    # 删除打标签之前拉取的镜像
    docker rmi kubeimage/kube-apiserver-amd64:$KUBE_VERSION
    docker rmi kubeimage/kube-controller-manager-amd64:$KUBE_VERSION
    docker rmi kubeimage/kube-scheduler-amd64:$KUBE_VERSION
    docker rmi kubeimage/kube-proxy-amd64:$KUBE_VERSION
    docker rmi registry.aliyuncs.com/google_containers/pause:$PAUSE_VERSION
    docker rmi registry.aliyuncs.com/google_containers/etcd:$ETCD_VERSION
    docker rmi registry.aliyuncs.com/google_containers/coredns:$COREDNS_VERSION
    

    添加755权限并执行:

    chmod 755 /usr/local/k8s/k8s-images.sh && /usr/local/k8s/k8s-images.sh
    

    查看镜像:
    20

    2.初始化k8s-master

    kubeadm init \
      --apiserver-advertise-address=192.168.1.16 \
      --kubernetes-version v1.18.5 \
      --service-cidr=10.96.0.0/12 \
      --pod-network-cidr=10.244.0.0/16
    
    • --apiserver-advertise-address:指定与集群的其他节点通信的master的IP地址。
    • --service-cidr:指定Service网络的范围,即负载均衡使用的IP地址段。
    • --pod-network-cidr:指定Pod网络的范围,即Pod的IP地址段,使用flannel需指定为10.244.0.0/16
    • --kubernetes-version:指定kubernetes的版本号。

    初始化过程的输出如下:
    21
    22
    输出内容主要有以下关键信息:

    • [init]:指定版本进行初始化操作。
    • [preflight]:初始化前的检查和下载所需要的Docker镜像文件。
    • [kubelet-start]:生成kubelet的配置文件/var/lib/kubelet/config.yaml,没有这个文件kubelet无法启动,所以初始化之前的kubelet启动会失败。
    • [certs]:生成Kubernetes使用的证书,存放在/etc/kubernetes/pki目录。
    • [kubeconfig]:生成相关的KubeConfig 文件,存放在/etc/kubernetes目录。
    • [control-plane]:使用/etc/kubernetes/manifests目录中的yaml文件创建kube-apiserver、kube-controller-manager、kube-scheduler的静态pod。
    • [etcd]:使用/etc/kubernetes/manifest目录中的yaml文件安装Etcd服务。
    • [wait-control-plane]:等待control-plan部署的Master组件启动。
    • [apiclient]:检查Master组件的健康状态。
    • [uploadconfig]:更新配置。
    • [kubelet]:使用configMap配置kubelet。
    • [mark-control-plane]:为当前节点打标签,打了角色Master和不可调度标签,这样默认就不会使用Master节点来运行Pod。
    • [bootstraptoken]:生成token记录下来,后面使用kubeadm join往集群中添加节点时会用到。
    • [addons]:安装附加组件CoreDNS和kube-proxy。

    3.添加kubectl使用权限

    普通用户要运行kubectl,需要执行以下命令,这也是kubeadm init输出的一部分:

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

    23
    root用户,执行以下命令:

    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    source .bash_profile
    

    24
    查看所有节点:
    25
    此时只有k8s-master节点并且状态为NotReady,是因为还未安装网络插件,下面进行网络插件的安装,选择安装flannel插件。

    4.安装flannel网络

    由于raw.githubusercontent.com无法访问,需先执行以下命令修改hosts文件:

    cat >> /etc/hosts << EOF
    151.101.76.133 raw.githubusercontent.com
    EOF
    

    k8s-master上新建flannel网络,可以直接执行以下命令新建:

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

    也可以先将flannel配置文件下载下来再新建,这里使用这种方式:

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

    26
    再次查看节点已经Ready:
    27

    5.备份镜像

    如果使用了科学上网或指定的阿里云仓库部署的v1.18.3及以下版本的k8s,备份镜像是可选的。由于是使用的v1.18.5的k8s,work节点需要用到其中的部分镜像,由于网络原因无法拉取,需要导出镜像并传到work节点加载。

    将镜像导出备份:

    docker save -o /usr/local/k8s/k8s-images-v1.18.5.tar \
    k8s.gcr.io/kube-proxy:v1.18.5 \
    k8s.gcr.io/kube-apiserver:v1.18.5 \
    k8s.gcr.io/kube-controller-manager:v1.18.5 \
    k8s.gcr.io/kube-scheduler:v1.18.5 \
    k8s.gcr.io/pause:3.2 \
    k8s.gcr.io/coredns:1.6.7 \
    k8s.gcr.io/etcd:3.4.3-0 \
    quay.io/coreos/flannel:v0.12.0-amd64
    

    导出成功:
    28
    在work节点创建目录用于存放镜像备份:

    mkdir -p /usr/local/k8s
    

    k8s-master执行以下命令将镜像备份拷贝到work节点:

    scp -r /usr/local/k8s/k8s-images-v1.18.5.tar root@k8s-node1:/usr/local/k8s/
    scp -r /usr/local/k8s/k8s-images-v1.18.5.tar root@k8s-node2:/usr/local/k8s/
    

    29
    然后在work节点加载镜像:

    docker load -i /usr/local/k8s/k8s-images-v1.18.5.tar
    

    加载成功:
    30

    七、工作节点加入集群

    除特殊说明的地方外,在work节点执行本部分操作。在work节点执行以下命令将其加入到k8s集群,该命令也是kubeadm init输出的一部分:

    kubeadm join 192.168.1.16:6443 --token f5d1i5.por52kags01avsz7 \
        --discovery-token-ca-cert-hash sha256:15171b3d8414d244ef63759fbf2c3006ade34ff081f4a0381329ddc64f249b75
    

    如果没有保存这个命令可以使用以下命令创建新的token并生成一个新的加入集群命令:

    kubeadm token create --print-join-command
    

    1.k8s-node1加入集群

    k8s-node1加入集群成功:
    31

    2.k8s-node2加入集群

    k8s-node2加入集群成功:
    32

    3.查看集群状态

    在master节点上查看集群状态。首先查看k8s组件健康状态,如下图所示,每个组件都处于healthy状态:

    下一篇:没有了