1.服务器配置

共使用3台服务器,依次配置hostname固定IPhosts防火墙selinuxSwap

1.1 配置HOSTNAME

  • master服务器:hostnamectl --static set-hostname k8s-master
  • node-1服务器:hostnamectl --static set-hostname k8s-node1
  • node-2服务器:hostnamectl --static set-hostname k8s-node2

1.2 配置固定IP

编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0,修改BOOTPROTO的值为static,并在文件追加

1
2
3
4
5
IPADDR="192.168.0.11"
GATEWAY="192.168.0.1"
NETMASK="255.255.255.0"
DNS1="218.2.2.2"
DNS2="218.4.4.4"

1.3 配置HOSTS

配置每台服务器的host,让每台服务器可以使用域名互相访问

1
2
3
4
cat >> /etc/hosts
192.168.0.11 work
192.168.0.12 k8s-node1
192.168.0.13 k8s-node2

最后一行回车之后,ctrl+c或者ctrl+d结束输入

1.4 配置防火墙

1
2
sudo systemctl stop firewalld
sudo systemctl disable firewalld

1.5 配置SELinux

SELinux,安全增强型Linux,是一种采用安全架构的Linux系统。因为我们不是专业的Linux运维工程师,并且防止在后续部署过程中遇到因为SELinux产生的问题,这里直接关闭SELinux

  • 查看SELinux是否开启:执行命令/usr/sbin/sestatus -v,查看SELinux status的状态是否为enabled
  • 关闭SELinux:编辑文件vi /etc/selinux/config,设置SELINUXdisabled

1.6 配置SWAP

k8s想法是将实例紧密包装到尽可能接近100%,所有的部署都应该与CPU、内存限制固定在一起。所以,如果调度程序发送一个Pod到一台机器,它不应该使用交换。同时,k8s的设计者考虑到性能的原因,关闭swap。如果在运行容器数量较多时,考虑节省资源的资源,可以添加kubelet参数--fail-swap-on=false来解决这个问题。

关闭Swap的步骤:

  • swapoff -a
  • 编辑/etc/fstab,注释swap所在的行
  • free # 可以通过这个命令查看swap是否关闭了

2. 部署容器

这里的容器运行时指的是:负责容器运行的软件,可选的有:containerddockerCRI-O,我们选择docker作为容器运行时。

配置k8s集群,需要为每个节点安装一个容器运行时,用来为Pod提供运行环境

2.1 为容器进行时配置Cgroups

CgroupsLinux内核提供的一种可以限制单个进程或者多个进程所使用的资源的机制,可以对CPU、内存等资源实现精细化的控制。Docker就使用Cgroups来对CPU、内存等部分资源进行控制。

如果Linux系统发行版使用systemd来初始化系统时,初始化进程会生成并使用一个root控制组,充当cgroup管理器。这时systemdCgroups紧密集成,并将为每个systemd单位分配一个Cgroup。更多Cgroup的内容可查看这里。

在安装容器运行时和kubelet时,可以为其指定一个Cgroups管理器,但k8s官网并不推荐这种配置,在资源压力下会变得不稳定。

容器运行时和kubelet以及systemd使用同一个Cgroups管理器,单个管理器会简化分配资源的视图,并且默认情况下对可用资源和使用的资源具有更一直的管理。

对于Docker容器运行时,可以设置native.cgroupdriver=system选项来配置。

2.2 安装docker

需要在所有的服务器节点中安装Docker

  1. 安装所需包
    1
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  2. 新增docker
    1
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  3. 安装docker-ce
    1
    sudo yum update -y && sudo yum install -y containerd.io-1.2.13 docker-ce-19.03.11 docker-ce-cli-19.03.11
  4. 配置Docker Daemon
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ## 创建/etc/docker目录
    sudo mkdir /etc/docker

    ## 设置Docker Daemon
    cat <<EOF | sudo tee /etc/docker/daemon.json
    {
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "100m"
    },
    "storage-driver": "overlay2",
    "storage-opts": [
    "overlay2.override_kernel_check=true"
    ]
    }
    EOF
  5. 配置Docker开机启动
    1
    2
    3
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    sudo systemctl enable docker

3. 安装kubeadm、kubelet和kubectl

3.1 查看节点MAC地址和product_uuid的唯一性

  • 通过命令ifconfig -a查看网络的MAC地址,其中ether后面的为网卡的MAC地址
    1
    ifconfig -a
  • 使用命令cat /sys/class/dmi/id/product_uuid对product_uuid校验

正常情况,硬件设备的网络MAC地址和product_uuid都会有唯一值,但是虚拟机中可能会存在重复值。如果这两个配置不唯一,在安装kubeadm时可能会失败

3.2 允许iptables检查桥接流量

使用命令lsmod | grep br_netfilter来查看br_netfilter模块是否被加载。如果该模块没有被加载,可执行sudo modprobe br_netfilter来加载该模块。

设置服务节点中给的sysctl配置中的net.bridge.bridge-nf-call-iptables值为1

1
2
3
4
5
6
7
8
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system

3.3 安装kubeadm、kubelet和kubectl

需要在每台服务器中安装:

  • kubeadm,用来初始化集群的指令
  • kubelet,在集群中的每个节点上用来启动Pod和容器等
  • kubectl,用来与集群通信的命令行工具

kubeadmin、kubelet和kubectl需要单独安装,因此,需要确保他们的版本相匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ 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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
$ setenforce 0
$ sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

$ systemctl enable --now kubelet

配置master节点

  1. work容器中执行
    1
    2
    3
    4
    5
    $ kubeadm init \
    --apiserver-advertise-address=192.168.0.31 \
    --image-repository registry.aliyuncs.com/google_containers \
    --service-cidr=10.96.0.0/12 \
    --pod-network-cidr=10.244.0.0/16
    其中,

–apiserver-advertise-address,API服务器所公布的其正在监听的IP地址,如果没有设置,将会使用默认网络接口
–image-repository,拉取镜像的容器仓库
–service-cidr,为服务的虚拟IP地址另外指定的IP地址段,默认值为”10.96.0.0/12”
–pod-network-cidr, 指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs

  1. 为用户设置权限

    1
    2
    3
    $ mkdir -p $HOME/.kube
    $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
  2. 安装POD网络插件

    1
    $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  3. token过期重新获取join命令

    1
    2
    3
    [root@test ~]# kubeadm token generate #生成token
    pmiad9.1g4qrc4yvkqxggse #下条命令需要使用这个结果
    [root@test ~]# kubeadm token create pmiad9.1g4qrc4yvkqxggse --print-join-command --ttl=0 #根据token输出添加命令