当前位置 博文首页 > asd1358355022的博客:k8s安装笔记

    asd1358355022的博客:k8s安装笔记

    作者:[db:作者] 时间:2021-08-04 21:46

    K8S

    一、部署环境

    1.1 主机列表

    主机名Centos版本ipdocker versionflannel versionKeepalived version主机配置备注
    lvs-keepalived017.6.1810172.27.34.28//v1.3.54C4Glvs-keepalived
    lvs-keepalived017.6.1810172.27.34.29//v1.3.54C4Glvs-keepalived
    master017.6.1810172.27.34.3518.09.9v0.11.0/4C4Gcontrol plane
    master027.6.1810172.27.34.3618.09.9v0.11.0/4C4Gcontrol plane
    master037.6.1810172.27.34.3718.09.9v0.11.0/4C4Gcontrol plane
    work017.6.1810172.27.34.16118.09.9//4C4Gworker nodes
    work027.6.1810172.27.34.16218.09.9//4C4Gworker nodes
    work037.6.1810172.27.34.16318.09.9//4C4Gworker nodes
    VIP7.6.1810172.27.34.222//v1.3.54C4G在lvs-keepalived两台主机上浮动
    client7.6.1810172.27.34.85///4C4Gclient

    共有9台服务器,2台为lvs-keepalived集群,3台control plane集群,3台work集群,1台client。

    1.2 k8s 版本

    主机名kubelet versionkubeadm versionkubectl version备注
    master01v1.16.4v1.16.4v1.16.4kubectl选装
    master02v1.16.4v1.16.4v1.16.4kubectl选装
    master03v1.16.4v1.16.4v1.16.4kubectl选装
    work01v1.16.4v1.16.4v1.16.4kubectl选装
    work02v1.16.4v1.16.4v1.16.4kubectl选装
    work03v1.16.4v1.16.4v1.16.4kubectl选装
    client//v1.16.4client

    二、高可用架构

    1. 架构图

    本文采用kubeadm方式搭建高可用k8s集群,k8s集群的高可用实际是k8s各核心组件的高可用,这里使用集群模式(针对apiserver来讲),架构如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bONSy2pD-1626275361623)(https://i.loli.net/2020/03/09/n7l4JwAC23gemId.png)]

    2. 集群模式高可用架构说明

    核心组件高可用模式高可用实现方式
    apiserver集群lvs+keepalived
    controller-manager主备leader election
    scheduler主备leader election
    etcd集群kubeadm
    • apiserver 通过lvs-keepalived实现高可用,vip将请求分发至各个control plane节点的apiserver组件;
    • controller-manager k8s内部通过选举方式产生领导者(由–leader-elect 选型控制,默认为true),同一时刻集群内只有一个controller-manager组件运行;
    • scheduler k8s内部通过选举方式产生领导者(由–leader-elect 选型控制,默认为true),同一时刻集群内只有一个scheduler组件运行;
    • etcd 通过运行kubeadm方式自动创建集群来实现高可用,部署的节点数为奇数,3节点方式最多容忍一台机器宕机。

    三、安装准备工作

    1. 配置主机名

    1.1 修改主机名

    [root@centos7 ~]# hostnamectl set-hostname master01
    [root@centos7 ~]# more /etc/hostname             
    master01
    

    退出重新登陆即可显示新设置的主机名master01

    1.2 修改hosts文件

    [root@master01 ~]# cat >> /etc/hosts << EOF
    192.168.40.144 master01
    192.168.40.146 master02
    192.168.40.148 master03
    192.168.40.150 work01 
    192.168.40.152 work02
    192.168.40.154 work03
    EOF
    

    image-20200308234056556

    2. 验证mac地址uuid

    [root@master01 ~]# cat /sys/class/net/ifcfg-ens37/address
    [root@master01 ~]# cat /sys/class/dmi/id/product_uuid
    

    image-20200308234223429
    保证各节点mac和uuid唯一

    3. 禁用swap

    3.1 临时禁用

    [root@master01 ~]# swapoff -a
    

    3.2 永久禁用

    若需要重启后也生效,在禁用swap后还需修改配置文件/etc/fstab,注释swap

    [root@master01 ~]# sed -i.bak '/swap/s/^/#/' /etc/fstab
    

    image-20200308234327601

    4. 内核参数修改

    本文的k8s网络使用flannel,该网络需要设置内核参数bridge-nf-call-iptables=1,修改这个参数需要系统有br_netfilter模块。

    4.1 br_netfilter模块加载

    查看br_netfilter模块:

    [root@master01 ~]# lsmod |grep br_netfilter
    

    如果系统没有br_netfilter模块则执行下面的新增命令,如有则忽略。

    临时新增br_netfilter模块:

    [root@master01 ~]# modprobe br_netfilter
    

    该方式重启后会失效

    永久新增br_netfilter模块:

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

    image-20200308234424412

    4.2 内核参数临时修改

    [root@master01 ~]# sysctl net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-iptables = 1
    [root@master01 ~]# sysctl net.bridge.bridge-nf-call-ip6tables=1
    net.bridge.bridge-nf-call-ip6tables = 1
    

    4.3 内核参数永久修改

    [root@master01 ~]# cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    [root@master01 ~]# sysctl -p /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    

    image-20200308234508098

    5. 设置kubernetes源

    5.1 新增kubernetes源

    [root@master01 ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [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=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了

    5.2 更新缓存

    建立元数据

    [root@master01 ~]# yum clean all
    [root@master01 ~]# yum -y makecache
    

    6. 免密登录

    配置master01到master02、master03免密登录,本步骤只在master01上执行。

    6.1 创建秘钥

    [root@master01 ~]# ssh-keygen -t rsa
    

    image-20200308234613464

    6.2 将秘钥同步至master02/master03

    [root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.40.146
    [root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.40.148
    

    image-20200308234710352

    6.3 免密登陆测试

    [root@master01 ~]# ssh 192.168.40.146
    [root@master01 ~]# ssh master03
    

    image-20200308234750743

    master01可以直接登录master02和master03,不需要输入密码。

    四、Docker安装

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

    1. 安装依赖包

    [root@master01 ~]# yum install -y yum-utils   device-mapper-persistent-data   lvm2
    

    image-20200308234858636

    2. 设置Docker源

    [root@master01 ~]# yum-config-manager     --add-repo     https://download.docker.com/linux/centos/docker-ce.repo
    

    image-20200308234944098

    3. 安装Docker CE

    3.1 docker安装版本查看

    [root@master01 ~]# yum list docker-ce --showduplicates | sort -r
    

    image-20200308235024772

    3.2 安装docker

    [root@master01 ~]# yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
    

    image-20200308235110109
    指定安装的docker版本为18.09.9

    4. 启动Docker

    [root@master01 ~]# systemctl start docker
    [root@master01 ~]# systemctl enable docker
    

    image-20200308235209620

    5. 命令补全

    5.1 安装bash-completion

    [root@master01 ~]# yum -y install bash-completion
    

    5.2 加载bash-completion

    [root@master01 ~]# source /etc/profile.d/bash_completion.sh
    

    image-20200308235253548

    6. 镜像加速

    由于Docker Hub的服务器在国外,下载镜像会比较慢,可以配置镜像加速器。主要的加速器有:Docker官方提供的中国registry mirror、阿里云加速器、DaoCloud 加速器,本文以阿里加速器配置为例。

    6.1 登陆阿里云容器模块

    登陆地址为:https://cr.console.aliyun.com ,未注册的可以先注册阿里云账户

    image-20200308235440586

    6.2 配置镜像加速器

    配置daemon.json文件

    [root@master01 ~]# mkdir -p /etc/docker
    [root@master01 ~]# tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"]
    }
    EOF
    

    重启服务

    [root@master01 ~]# systemctl daemon-reload
    [root@master01 ~]# systemctl restart docker
    

    image-20200308235538222

    加速器配置完成

    7. 验证

    [root@master01 ~]# docker --version
    [root@master01 ~]# docker run hello-world
    

    image-20200308235623691

    通过查询docker版本和运行容器hello-world来验证docker是否安装成功。

    8. 修改Cgroup Driver

    8.1 修改daemon.json

    修改daemon.json,新增‘”exec-opts”: [“native.cgroupdriver=systemd”’

    [root@master01 ~]# more /etc/docker/daemon.json 
    {
      "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    

    8.2 重新加载docker

    [root@master01 ~]# systemctl daemon-reload
    [root@master01 ~]# systemctl restart docker
    

    修改cgroupdriver是为了消除告警:
    [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/

    五、keepalived安装

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

    1. 安装keepalived

    [root@master01 ~]# yum -y install keepalived
    

    image-20200308235704759

    2. keepalived配置

    master01上keepalived配置:

    [root@master01 ~]# more /etc/keepalived/keepalived.conf 
    ! Configuration File for keepalived
    global_defs {
       router_id master01
    }
    vrrp_instance VI_1 {
        state MASTER 
        interface ens160
        virtual_router_id 50
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.27.34.130
        }
    }
    

    master02上keepalived配置:

    [root@master02 ~]# more /etc/keepalived/keepalived.conf 
    ! Configuration File for keepalived
    global_defs {
       router_id master02
    }
    vrrp_instance VI_1 {
        state BACKUP 
        interface ens160
        virtual_router_id 50
        priority 90
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.27.34.130
        }
    }
    

    master03上keepalived配置:

    [root@master03 ~]# more /etc/keepalived/keepalived.conf 
    ! Configuration File for keepalived
    global_defs {
       router_id master03
    }
    vrrp_instance VI_1 {
        state BACKUP 
        interface ens160
        virtual_router_id 50
        priority 80
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.27.34.130
        }
    

    3. 启动keepalived

    所有control plane启动keepalived服务并设置开机启动

    [root@master01 ~]# service keepalived start
    [root@master01 ~]# systemctl enable keepalived
    

    image-20200308235744870

    4. VIP查看

    [root@master01 ~]# ip a
    

    image-20200308235827632

    vip在master01上

    六、k8s安装

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

    1. 版本查看

    [root@master01 ~]# yum list kubelet --showduplicates | sort -r
    

    image-20200308235926531

    本文安装的kubelet版本是1.16.4,该版本支持的docker版本为1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09。

    2. 安装kubelet、kubeadm和kubectl

    2.1 安装三个包

    [root@master01 ~]# yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4
    

    image-20200309000000283

    2.2 安装包说明

    • kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
    • kubeadm 用于初始化集群,启动集群的命令工具
    • kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

    2.3 启动kubelet

    启动kubelet并设置开机启动

    [root@master01 ~]# systemctl enable kubelet && systemctl start kubelet
    

    2.4 kubectl命令补全

    [root@master01 ~]# echo "source <(kubectl completion bash)" >> ~/.bash_profile
    [root@master01 ~]# source .bash_profile 
    

    3. 下载镜像

    3.1 镜像下载的脚本

    Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。本文通过运行image.sh脚本方式拉取镜像。书写images文件,并赋予执行权限

    [root@master01 ~]# vim image.sh 
    #!/bin/bash
    url