Bookmarks

You haven't yet saved any bookmarks. To bookmark a post, just click .

  • 使用 kubeadm 安装 K8s 集群过程小记(一)

  • 最后更新时间: 2019 年 12 月 20 日
    安装 Kubernetes 版本:1.17.0

    1. 前言

    之前纯手工搭建过 K8s 集群,虽然最后勉强成功,但也得到一个结论:如果没有足够深度的 Linux 知识,还是不要自寻烦恼。目前官方提供的安装工具 kubeadm 已经达到了生产可用的程度,所以进行了尝试,非常简单快捷,值得推荐。

    本文以学习为主要目的,以生产环境的搭建方式体验 K8s,为使用 kubeadm 搭建高可用集群提供基础。

    2. 安装步骤

    2.1 基础检查

    在安装 kubeadm 之前,需要确保所有主机满足以下条件:

    • 运行支持的操作系统,本文选择使用 CentOS 7搭建
    • 内存不低于 2G,CPU 不少于 2核
    • 集群中不同主机之间保证网络连通性
    • 唯一的 hostname、MAC 地址、product_uuid
    • 相关端口开放
    • swap 已被禁用

    在实际操作中,大部分无须关心,重点需要关注以下几点:

    2.1.1 更新系统

    服务器系统安装完成后,请自行更新系统,并安装需要的软件:

    # 更新系统
    yum update
    # 安装常用工具
    yum install vim git
    

    2.1.2 禁用 swap 分区

    swapoff -a #关闭交换分区
    sed -i '/ swap / s/^/#/' /etc/fstab #禁止重启后自动开启
    

    kubeadm-install-k8s-1.png

    2.1.3 关闭防火墙

    请参阅参考资料1,其中提供了检测方法,本文不再重复,一般无需操作,如果主机商有防火墙,请自行至主机商控制台设置。

    2.1.4 更换 Yum 源为国内源(墙内用户)

    如果你是墙内用户,可以将 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
    

    2.2 配置容器环境

    2.2.1 安装 Docker 环境

    K8s 同时支持 Docker、CRI-O、Containered 等多种容器环境,我们使用 Docker,安装过程如下:

    # Install required packages.(安装依赖包)
    yum install yum-utils device-mapper-persistent-data lvm2
    
    # Add Docker repository.(添加 Docker 库)
    yum-config-manager --add-repo \
      https://download.docker.com/linux/centos/docker-ce.repo
    
    # Install Docker CE.(安装 Docker CE)
    yum update && yum install \
      containerd.io-1.2.10 \
      docker-ce-19.03.4 \
      docker-ce-cli-19.03.4
    
    # Create /etc/docker directory.(创建 /etc/docker 目录)
    mkdir /etc/docker
    
    # Setup daemon.(配置 daemon)
    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
    systemctl enable docker.service
    
    # Restart Docker(重启 Docker)
    systemctl daemon-reload
    systemctl restart docker
    

    安装完成后可以使用 docker -v命令查看一下安装版本:
    kubeadm-install-k8s-2.png

    2.2.2 Docker 更换国内源(墙内用户可选)

    mkdir -p /etc/docker
    
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    EOF
    
    service docker restart
    

    2.3 安装 kubeadm、kubelet 和kubectl

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

    2.3.1 配置 K8s 源

    2.3.1.1 配置官方源(墙外用户)
    # 配置官方源
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOF
    

    kubeadm-install-k8s-3.png

    2.3.1.2 配置国内源(墙内用户)
    # 配置国内源
    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.3.2 关闭 SELinux

    # Set SELinux in permissive mode (effectively disabling it)
    setenforce 0
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    

    2.3.3 网络参数配置

    某些网络参数可能会导致问题,按官方文档推荐调整,具体说明可参阅参考资料2:

    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
    

    kubeadm-install-k8s-4.png

    2.3.4 安装并启动 kubeadm、kubelet、kubectl

    yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    
    systemctl enable --now kubelet
    

    kubeadm-install-k8s-5.png

    2.4 使用 kubeadm 初始化集群

    由于 kubeadm 初始化集群的依赖镜像位于墙外,墙内用户必须在运行初始化集群集合之前使用国内源拉取依赖镜像,墙外用户则直接在初始化集群命令运行时自动拉取即可。

    2.4.1 拉取依赖镜像(墙内用户)

    # 获取依赖镜像列表
    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 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.4.2 主节点初始化

    使用kubeadm init命令可以初始化主节点,具体参数请查看官方文档,目前最新的 K8s 版本为 1.17.0,我们直接运行以下命令:

    kubeadm init --kubernetes-version=1.17.0
    

    执行成功后,按提示操作即可,如果不是 root 用户可执行以下命令:

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

    如果是 root 用户也可直接执行以下命令:

    export KUBECONFIG=/etc/kubernetes/admin.conf`
    

    初始化完成后会自动创建一个 token,记录下面加入节点的命令,24小时内可使用该 token 向集群添加节点:
    kubeadm-install-k8s-6.png

    2.5 添加网络组件

    此时我们使用kubectl get nodes查看集群节点运行情况,会发现节点始终是 NotReady,因为我们没有安装必要的网络组件,可参考参考资料4的官方文档进行选择,这里选择比较精致的 WeaveNet,根据文档进行安装,稍等几分钟后集群就正常运行了:

    kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
    

    kubeadm-install-k8s-7.png

    2.6 向集群添加节点

    即使只有一台 Master 主机,集群也是可以正常使用的,但默认情况下,出于安全考虑,集群不会在 control-plane 运行节点上部署 pods,如果需要正常使用单节点集群,需要使用如下命令解除该限制:

    kubectl taint nodes --all node-role.kubernetes.io/master-
    

    kubeadm-install-k8s-9.png
    如果需要添加节点请继续按下面步骤操作:

    2.6.1 配置节点

    每一台节点同样需要安装 Docker 和 kubeadm,所以需要在每一台主机上重复步骤1、2、3。

    2.6.2 使用 kubeadm join 命令加入集群

    我们配置一台主机,并加入该节点:
    kubeadm-install-k8s-11.png
    回到 Master 节点使用kubectl get nodes查看集群,可以看到节点已经加入了集群:
    kubeadm-install-k8s-12.png

    3. 总结

    经过上面的操作,我们就已经成功创建了集群。下一篇文章中将主要讲解 K8s 中的一些重要概念、常用操作,以及暴露服务等。

    参考资料

    1. Kubernetes 官方文档 —— Container runtimes
    2. Kubernetes 官方文档 —— Installing kubeadm
    3. Kubernetes 官方文档 —— Creating a single control-plane cluster with kubeadm
    4. Kubernetes 官方文档 —— Installing Addons
    5. Kubernetes 官方文档 —— Run a Stateless Application Using a Deployment
    6. centOS7 搭建k8s, 少受翻墙的苦
    7. 墙内安装kubernetes教程