Centos7.7安装kubernetes集群

基础

本文主要讲解使用kubeadm搭建高可用的集群,这种方式是最简单最快的。

安装步骤

我们安装k8s的机器资源条件如下:

  • centos7.7
  • 内存不低于2G,CPU不少于2核,否则在安装的时候会报错
  • 集群中的所有机器都要保证网络连通性
  • 相关端口开放
  • swap关闭
  1. 更新系统

    在开始安装服务之前,我们先更新一下yum源,然后安装相关的软件

    1
    2
    3
    4
    5
    # 更新yum源
    yum update

    # 安装git(可选)
    yum install git
  2. 禁用swap分区

    1
    2
    3
    4
    5
    # 关闭swap分区,该命令只是临时关闭,机器重启后还会自动打开
    swapoff -a

    # 永久性关闭swap分区,禁止机器重启后自动打开
    sed -i '/ swap / s/^/#/' /etc/fstab
  3. 更换yum源为国内镜像

    centos的yum源默认为国外的,如果你的服务器是在国内,那么可能访问不了,所以我们需要把yum的源更换为国内的

    1
    2
    3
    4
    5
    6
    # 这里有一个注意点,就是下面的Centos-7.repo,这里因为我们使用的centos7,如果你的系统是centos8,那么就改成Centos-8.repo,也就是改成相对应的版本,否则yum安装不了软件
    cd /etc/yum.repos.d && \
    sudo mv CentOS-Base.repo CentOS-Base.repo.bak && \
    sudo wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
    yum clean all && \
    yum makecache
  4. 安装docker环境

    k8s内部可以支持多种容器,我们最常使用的就是docker,所以我们这里也以docker为基础

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    # 安装docker依赖包
    yum install yum-utils device-mapper-persistent-data lvm2

    # 添加docker库
    yum-config-manager --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

    # 更新源
    yum update

    # 安装docker
    yum install containerd.io-1.2.10 \
    docker-ce-19.03.4 \
    docker-ce-cli-19.03.4

    # 配置docker daemon
    mkdir /etc/docker

    cat > /etc/docker/daemon.json <<EOF
    {
    "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

    # 创建docker.service.d
    mkdir -p /etc/systemd/system/docker.service.d

    # 启用docker.service
    systemctl enable docker.service

    # 重载&重启docker
    systemctl daemon-reload
    systemctl restart docker

    安装完之后使用docker -v查看版本

  5. 更换docker为国内源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 配置
    tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    EOF

    # 重启docker
    service docker restart
  6. 安装kubeadm、kubelet、和kubectl

    kubeadm 负责引导集群,kubelet 在集群的所有节点运行,负责启动 pods 和 containers,kubectl 则负责与集群交互,我们需要在所有节点安装这些组件

    1. 配置k8s国内源

      我们把k8s的源修改为阿里云的

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 配置国内源
      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
    2. 关闭SELinux

      1
      2
      setenforce 0
      sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    3. 配置网络参数

      1
      2
      3
      4
      5
      6
      7
      8
      9
      cat <<EOF >  /etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      EOF

      sysctl --system

      # 确保 br_netfilter 模块已经加载
      modprobe br_netfilter
    4. 安装并启动kubeadm、kubelet、和kubectl

      1
      2
      3
      4
      5
      # 安装
      yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

      # 启动
      systemctl enable --now kubelet
  7. 使用kubeadm初始化集群

    因为我的服务器在国内,且由于 kubeadm 初始化集群的依赖镜像在国内访问不了,所以初始化集群之前先使用国内源拉取依赖镜像

    1. 拉取依赖镜像

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 获取依赖镜像列表
      kubeadm config images list

      # 使用阿里源下载 K8s 依赖镜像
      kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' |sh -x

      # 通过docker tag修改镜像与国外镜像名称相同,这样的目的是在初始化的时候,docker会先在本地查找,若本地已有镜像则不会再去远程拉取,等于来了一招瞒天过海
      docker images |grep registry.cn-hangzhou.aliyuncs.com/google_containers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's#registry.cn-hangzhou.aliyuncs.com/google_containers#k8s.gcr.io#2' |sh -x

      # 删除原镜像,这个可选
      docker images |grep registry.cn-hangzhou.aliyuncs.com/google_containers |awk '{print "docker rmi ", $1":"$2}' |sh -x
    2. master节点初始化

      我们使用kubeadm init指令初始化master节点,具体的参数可参考官方文档:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/

      1
      2
      # local_ip是本机局域网ip,kubectl_version是我们镜像的版本
      kubeadm init --apiserver-advertise-address=<local_ip> --kubernetes-version=<kubectl_version> --pod-network-cidr=10.244.0.0/16 --v=5

      执行成功之后,日志会打印出下面语句,并且会告知我们节点加入的方式

      1
      2
      3
      4
      # root或非root用户均可执行
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config

      1
      export KUBECONFIG=/etc/kubernetes/admin.conf
    3. 开启使用master节点资源

      默认master节点是不参与pod调度的,这样对于master节点的资源来说有点太过浪费,所以我们通过下面的命令使master节点也参与pod调度

      1
      kubectl taint nodes --all node-role.kubernetes.io/master-
  8. 添加网络组件

    我们通过kubectl get nodes查看集群内的节点,当前应该只有master一个节点,但是节点的状态为NotReady,查看coredns的pod(kubectl get pod --all-namespaces),会发现coredns处于pending状态,原因就是我们还未安装网络组件。

    1
    2
    # 网络组件我们选择WeaveNet,安装完之后稍等一会就可以了
    kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
  9. 向集群中添加node节点

    每一台node都需要操作从1~6的步骤,然后我们使用kubeadm join来添加到集群中,这里的token是在master节点创建的,我们可以使用kubeadm token list命令查看可用的token,如果没有可用的token,那么我们使用kubeadm token create创建新的token,一个token的有效期为24小时

    1
    2
    kubeadm join 192.168.0.54:6443 --token 9dmyq2.c50cvh32r62o6jlx \
    --discovery-token-ca-cert-hash sha256:4640dd5d3788968d86ce3cb792c1e368586ee6731de5a07ad8ad331926a2f233
  10. 验证

    加入之后我们在master节点通过kubectl get nodes来查看所有的节点,验证是否加入成功。