> 文章列表 > 成功使用kubeadm搭建k8s集群的过程

成功使用kubeadm搭建k8s集群的过程

成功使用kubeadm搭建k8s集群的过程

目录

1.环境初始化:

2.安装docker

3.安装k8s组件:

4.准备集群镜像

5.集群初始化:

6.安装网络插件:

7.服务部署:


1.环境初始化:

  • 主机规划:

    节点 IP地址 操作系统 配置
    master 192.168.178.102 centos7.9 2G2核
    node1 192.168.178.152 centos7.9 2G2核
    node2 192.168.178.202 centos7.9 2G2核
  • 本次环境搭建需要安装三台Centos服务器(一主二从),然后在每台服务器中分别安装docker(18.06.3),kubeadm(1.17.4)、kubelet(1.17.4)、kubectl(1.17.4)程序。

  • centos7的系统需要执行一下操作,防止出现(错误:Invalid version flag: if)

    • 下载centos7的镜像源:

      wget -O ~/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    • 删除yum.repos.d目录并重新创建:

      rm -rf /etc/yum.repos.d;mkdir /etc/yum.repos.d
    • 将下载的镜像源移动到仓库目录中:

      mv ~/CentOS-Base.repo /etc/yum.repos.d/
    • 重建缓存:

      yum clean all;yum makecache
    • 升级所有包:只升级所有包,不升级软件和系统内核,软件和内核保持原样

      yum upgrade -y
  • 在每个节点/etc/hosts配置域名

    cat <<eof >> /etc/hosts192.168.178.102 master
    192.168.178.152 node1
    192.168.178.202 node2
    eof
  • 禁止使用selinux

    sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
  • 禁用iptables和firewalld服务,kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系

    统的规则

    systemctl stop firewalld;systemctl disable firewalld
    systemctl stop iptables;systemctl disable iptables
  • 时间同步:

    • 所有节点,安装:

      yum -y install chrony
    • 所有节点,启动进程:

      systemctl enable chronyd;systemctl start chronyd
    • 修改主节点的配置文件/etc/chrony.conf

      sed -i '/^server [0-9]/d' /etc/chrony.conf
      sed -i '2a\\server ntp.aliyun.com iburst\\' /etc/chrony.conf
      sed -i 's/#allow 192.168.0.0\\/16/allow 192.168.178.0\\/24/' /etc/chrony.conf
      sed -i 's/#local stratum 10/local stratum 10/' /etc/chrony.conf
    • 修改从节点的配置文件/etc/chrony.conf

      sed -i '/^server [0-9]/d' /etc/chrony.conf
      sed -i '2a\\server master iburst\\' /etc/chrony.conf
    • 所有节点,重启服务

      systemctl restart chronyd
    • 所有节点,查看时间同步状态

      timedatectl status
    • 所有节点,开启网络时间同步

      timedatectl set-ntp true
    • 所有节点,查看具体的同步信息:

      chronyc sources -v
  • 禁用swap分区:

    # swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
    # 启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
    # 但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
    sed -i 's/\\/dev\\/mapper\\/centos-swap/#\\/dev\\/mapper\\/centos-swap/' /etc/fstab
  • 修改linux的内核参数:

    • 编辑/etc/sysctl.d/kubernetes.conf,添加网桥过滤和地址转发功能

      cat <<eof > /etc/sysctl.d/kubernetes.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      net.ipv4.ip_forward = 1
      eof
    • 重新加载配置

      sysctl -p
    • 加载网桥过滤模块

      modprobe br_netfilter
    • 查看网桥过滤模块是否加载成功

      lsmod | grep br_netfilter
  • 配置ipvs功能:

    • 在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

    • 安装ipset和ipvsadm

      yum install -y ipset ipvsadm
    • 添加需要加载的模块写入脚本文件:

      cat <<eof > /etc/sysconfig/modules/ipvs.modules
      #!/bin/bash
      modprobe -- ip_vs
      modprobe -- ip_vs_rr
      modprobe -- ip_vs_wrr
      modprobe -- ip_vs_sh
      modprobe -- nf_conntrack_ipv4
      eof
    • 为脚本文件添加执行权限

      chmod +x /etc/sysconfig/modules/ipvs.modules
    • 执行脚本文件

      /bin/bash /etc/sysconfig/modules/ipvs.modules
    • 查看对应的模块是否加载成功

      lsmod | grep -e ip_vs -e nf_conntrack_ipv4
  • 重启linux服务

    reboot

2.安装docker

  • 添加docker镜像到本地:

    wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 然后输入命令:

    yum install -y --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 
  • 修改配置文件:

    mkdir /etc/docker
    #  Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
    cat <<eof > /etc/docker/daemon.json
    {
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://ja9e22yz.mirror.aliyuncs.com"]
    }
    eof
  • 重启,并设置开机自启:

    systemctl restart docker;systemctl enable docker

3.安装k8s组件:

  • 配置k8syum仓库:

    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
  • 安装kubeadm、kubelet和kubectl

    组件 说明
    kubeadm 搭建kubernetes集群的工具
    kubelet 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
    kubectl 用来与集群通信的命令行工具。
    yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
  • 编辑/etc/sysconfig/kubelet,配置kubelet的cgroup

    cat <<eof > /etc/sysconfig/kubelet
    KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
    KUBE_PROXY_MODE="ipvs"
    eof
  • 设置kubelet开机自启

    systemctl enable kubelet

4.准备集群镜像:

  • 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看

    kubeadm config images list
  • 下载镜像:此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案下载这些镜像

    images=(kube-apiserver:v1.17.4kube-controller-manager:v1.17.4kube-scheduler:v1.17.4kube-proxy:v1.17.4pause:3.1etcd:3.4.3-0coredns:1.6.5
    )
    for imageName in ${images[@]};dodocker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageNamedocker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageNamedocker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    done

5.集群初始化:

  • 在 master 节点:

    • 创建集群

      kubeadm init \\
      --kubernetes-version=v1.17.4 \\
      --pod-network-cidr=10.244.0.0/16 \\
      --service-cidr=10.96.0.0/12 \\
      --apiserver-advertise-address=192.168.178.102     # 集群入口指向master
      # 成功执行后将给出将node节点加入集群的命令
      kubeadm join 192.168.178.102:6443 --token pq7e3f.sbttkdodixfdmiwa \\--discovery-token-ca-cert-hash sha256:00b426328ab903e4e32abc3b368d90797e7e68a03c94fc80eb6e6b381fd465eb 
    • 创建必要文件

      mkdir -p $HOME/.kube
      cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      chown $(id -u):$(id -g) $HOME/.kube/config
  • 在 node 节点,将node节点加入集群(命令各不相同,需要在住master节点创建集群后获取命令

    kubeadm join 192.168.178.102:6443 --token pq7e3f.sbttkdodixfdmiwa \\--discovery-token-ca-cert-hash sha256:00b426328ab903e4e32abc3b368d90797e7e68a03c94fc80eb6e6b381fd465eb   
  • 在 master 节点,在查看集群状态 此时的集群状态为NotReady,这是因为还没有配置网络插件

    [root@master ~]# kubectl get nodes
    NAME     STATUS     ROLES    AGE     VERSION
    master   NotReady   master   12m     v1.17.4
    node1    NotReady   <none>   2m11s   v1.17.4
    node2    NotReady   <none>   10s     v1.17.4

6.安装网络插件:

  • kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可

  • 本次选择flannel

  • 下面操作只需在 master 节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行

  • 获取fannel的配置文件

    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 部署flannel网络:

    kubectl apply -f kube-flannel.yml
  • 过一分钟左右查看各节点状态,变为Ready说明网络打通了:

    [root@master ~]# kubectl get nodes
    NAME     STATUS   ROLES    AGE   VERSION
    master   Ready    master   24m   v1.17.4
    node1    Ready    <none>   14m   v1.17.4
    node2    Ready    <none>   12m   v1.17.4
  • 查看所有pod是否变为Running

    [root@master ~]# kubectl get pod --all-namespaces
    NAMESPACE      NAME                             READY   STATUS    RESTARTS   AGE
    kube-flannel   kube-flannel-ds-dzr2h            1/1     Running   0          5m13s
    kube-flannel   kube-flannel-ds-hjskt            1/1     Running   0          5m13s
    kube-flannel   kube-flannel-ds-t5xhn            1/1     Running   0          5m13s
    kube-system    coredns-6955765f44-4d6mm         1/1     Running   0          26m
    kube-system    coredns-6955765f44-65m72         1/1     Running   0          26m
    kube-system    etcd-master                      1/1     Running   0          26m
    kube-system    kube-apiserver-master            1/1     Running   0          26m
    kube-system    kube-controller-manager-master   1/1     Running   0          26m
    kube-system    kube-proxy-4qmwl                 1/1     Running   0          14m
    kube-system    kube-proxy-6mdck                 1/1     Running   0          26m
    kube-system    kube-proxy-q94ps                 1/1     Running   0          16m
    kube-system    kube-scheduler-master            1/1     Running   0          26m

7.服务部署:

  • 接下来在kubernetes集群中部署一个nginx程序,测试下集群是否在正常工作

  • 部署nginx

    kubectl create deployment nginx --image=nginx:1.14-alpine
  • 暴露端口:

    kubectl expose deployment nginx --port=80 --type=NodePort
  • 查看服务状态

    [root@master ~]# kubectl get pods,service
    NAME                         READY   STATUS    RESTARTS   AGE
    pod/nginx-6867cdf567-b24c4   1/1     Running   0          16s
    ​
    NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        36m
    service/nginx        NodePort    10.98.153.169   <none>        80:31812/TCP   7s
  • 最后在电脑上访问下部署的nginx服务

    http://192.168.178.102:31812