环境准备

  • 这里要先准备 linux 环境,提供一下几种方案
  • 1 )在云产品上购买一台裸机
  • 2 )选择一台刚安装好的 linux 服务器
  • 3 )选择虚拟机安装 linux
  • 这里,我选择linux的环境为 centos

在安装了 centos 的裸机上进行搭建


1 )在所有节点上禁用 selinux

  • 查看 selinux 状态: $ getenforce
  • 修改 /etc/selinux/config 文件,将 SELINUX=enforcing改为SELINUX=disabled
  • 重启 $ shutdown -r now 或 $ init 6 或 $ reboot

2 ) 关闭 Firewalld 防火墙

  • 查看防火墙状态: $ systemctl status firewalld
  • 关闭防火墙: $ systemctl stop firewalld
  • 开机禁用防火墙: $ systemctl disable firewalld

3 )关闭 swap

  • 临时关闭:$ sudo swapoff -a
  • 永久关闭:$ sudo sed -ri 's/.*swap.*/#&/' /etc/fstab (选择这个)

4 )同步时间

  • 4.1 )centos 8 之前可以使用 ntpdate
  • 安装软件: $ sudo yum -y install ntpdate
  • 同步: $ ntpdate 0.asia.pool.ntp.org
  • 注意:之后版本,上述不能使用,使用
  • 4.2 )较新版本的 centos 采用如下方案
  • 检查当前时间设置:$ timedatectl status
  • 更改时区:$ timedatectl set-timezone Asia/Shanghai 这时候基本可以了
  • 使系统时间自动与网络时间服务器同步:$ timedatectl set-ntp true

5 )配置hostname

  • 查看hostname: $ hostname
  • 为节点配置hostname: $ hostnamectl set-hostname k8s.master (推荐)
  • 永久修改方式: $ vi /etc/hostname 配置ip 和 域名,比如:k8s.master 这个需要重启
  • 配置完成后,执行第一个进行验证
  • 注意,上面配置的是 主节点,工作节点也类似配置

6 )为所有节点添加配置 hosts

  • $ vi /etc/hosts
    11.11.11.11 master
    22.22.22.22 node1
    33.33.33.33 node2
    
  • 注意:集群内的所有主机都要配置
  • 之后相互 ping 一下,比如 在 master 上执行 ping node1
  • 上面ip使用你真实的ip地址
  • 11 代表 master, 22 代表 node1, 33 代表node2 这里是模拟(假设的ip)

7 )为所有节点进行安装

  • 目前可用的 k8s版本在 1.29,每个版本配置不一样,最新版本基于 containerd.io 的, 删除了docker运行时

  • 也可以使用 docker 的运行时,但配置比较麻烦,所以,我们使用 1.22.4版本,这是一个简单的版本

  • 除了配置有些不一样,用法都基本一样

  • 开始配置 k8s 安装源

    # 添加 k8s 安装源
    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
    
    • 如遇到权限问题,换种方式, 自行处理,
    • 如 $ sudo vi /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
      
  • 配置 Docker 安装源

    # 添加 Docker 安装源
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
    • 如果没有 命令,执行 $ yum -y install yum-utils
    • 备注:集群内所有节点均执行
  • 删除之前服务器上的一些 相关软件,(裸机的话,不用执行)

    yum remove docker-ce docker-ce-cli containerd.io -y
    
    • 备注:所有节点均执行
  • 开始正式安装

    sudo yum install -y kubelet-1.22.4 kubectl-1.22.4 kubeadm-1.22.4 docker-ce docker-ce-cli containerd.io
    
    • 这里没有指定 docker-ce, docker-ce-cli, containerd.io 的版本,安装最新版
  • 注意

    • 主节点需要组件
      • docker(也可以是其他容器运行时)
      • kubectl 集群命令行交互工具
      • kubeadm 集群初始化工具
    • 工作节点需要组件
      • docker(也可以是其他容器运行时)
      • kubelet 管理 Pod 和容器,确保他们健康稳定运行
      • kube-proxy 网络代理,负责网络相关的工作
    • 所有节点均可执行上述安装命令,不需要特别区分
  • 如果是最新版本,还需要配置 cri-dockerdcontainerd, 这里不做演示

  • 启动 kubelet、docker,并设置开机启动

    sudo systemctl enable kubelet
    sudo systemctl start kubelet
    sudo systemctl enable docker
    sudo systemctl start docker
    
  • 修改 docker 配置: $ sudo vi /etc/docker/daemon.json

    # kubernetes 官方推荐 docker 等使用 systemd 作为 cgroupdriver,否则 kubelet 启动不了
    {
    	"exec-opts": ["native.cgroupdriver=systemd"],
    	"registry-mirrors": ["https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]
    }
    
  • 重启生效

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    • 注意:所有节点执行
  • 在 master 节点上执行,创建集群

    sudo kubeadm init --kubernetes-version=1.22.4 --apiserver-advertise-address=11.11.11.11 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
    
    • 在这执行完成后,会再 log 日志中 提示你 一个 加入集群的命令
    • 这个命令在其他节点上执行, 类似于如下
      Your Kubernetes control-plane has initialized successfully!
      
      To start using your cluster, you need to run the following as a regular user:
      
        mkdir -p $HOME/.kube
        sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
        sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
      Alternatively, if you are the root user, you can run:
      
        export KUBECONFIG=/etc/kubernetes/admin.conf
      
      You should now deploy a pod network to the cluster.
      Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
        https://kubernetes.io/docs/concepts/cluster-administration/addons/
      
      Then you can join any number of worker nodes by running the following on each as root:
      
      kubeadm join 11.11.11.11:6443 --token 37xcrq.ksdfs6l8rqkounif \
      	--discovery-token-ca-cert-hash sha256:1cb2eabf2b0259b1ce09b8ba52340ea7bfb799444edf2afe362affb71ea81668
      
  • 接着创建相关目录和文件

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    
    # 在其他机器上创建 ~/.kube/config 文件也能通过 kubectl 访问到集群
    # 复制授权文件,以便 kubectl 可以有权限访问集群
    # 如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点
    
  • 接着,在主节点上将 /etc/kubernetes/admin.conf 文件拷贝到 工作节点上

    sudo scp /etc/kubernetes/admin.conf root@k8s.node1:/etc/kubernetes/admin.conf 
    
    • 复制的时候,可能需要输入密码
    • 这里会有拷贝权限问题, 自行处理
    • 比如:$ sudo chmod +r /etc/kubernetes/admin.conf
    • 或者分两步移动,可以先拷贝到 node1 节点的 ~/admin.conf, 之后再mv过去
  • 现在工作节点上,也有这个文件了, 在工作节点上 执行

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    
  • 在工作节点上,加入集群

    sudo kubeadm join 11.11.11.11:6443 --token 37xcrq.ksdfs6l8rqkounif --discovery-token-ca-cert-hash sha256:1cb2eabf2b0259b1ce09b8ba52340ea7bfb799444edf2afe362affb71ea81668
    
    • 如果这个命令忘记了,或者遗失了
    • 重新获取方式,在 master 节点上执行:$ kubeadm token create --print-join-command
  • 验证节点: $ kubectl get nodes

    • 可以看到 有 master 和 node1 但是 not ready

8 ) 配置flannel网络

  • 安装网络插件 flannel, 现在都是 not ready 的状态, 需要安装 flannel

    # 很有可能国内网络访问不到这个资源,你可以网上找找国内的源安装 flannel
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    • 这个只在 主节点 上 安装即可
  • 之后获取状态验证: $ kubectl get nodes

    • 这时候发现已经是 ready 的状态了 (需要等一小会儿)
  • 验证:$ ifconfig |grep flan

    flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
    
  • 下面的配置可忽略,仅作为可能性问题的解决

  • 如果你后续在运行 $ kubectl describe pod/nginx 发现 Events 中有下面这个错误

    networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default"
    network: open /run/flannel/subnet.env: no such file or directory
    
    • Flannel是由CoreOS开源的针对k8s的网络服务
    • 其目的是为解决k8s集群中各主机上Pod之间的通信问题
    • 其借助etcd维护网络IP地址分配,并为每个Node节点分配一个不同的IP地址段
    • 在每个节点创建文件 /run/flannel/subnet.env 写入以下内容,配置后等待一会就好了
    • $ vi /run/flannel/subnet.env
      FLANNEL_NETWORK=10.244.0.0/16
      FLANNEL_SUBNET=10.244.0.1/24
      FLANNEL_MTU=1450
      FLANNEL_IPMASQ=true
      
      • 注意,所有节点执行,而且这个文件在重启后可能会消失
      • 如果这个文件消失,就是在初始化的时候的问题
      • 按照上述init不会出问题,重启后也不会丢失这个文件
  • 基于以上,k8s 环境基本搭建完成

  • 还有需要了解 master 节点不跑任务,都是在 工作节点来跑

9 ) 重新 init

  • 会有重新init集群的场景,如果需要重置,需要特别注意
  • $ sudo kubeadm reset 注意,按照日志上的提示,删除必要的目录文件
  • 之后重新走上面的 kubeadm init … 的流程
  • 注意了:如果主节点重新初始化,工作节点也要执行 reset, 并重新执行上述相关配置

10 )启动pod

  • 运行 nginx 应用任务, 在工作节点来运行

    kubectl run nginx --image=nginx:latest
    
  • 再执行 $ kubectl get pod -o wide 查看pod状态

  • 也可以按照之前说的 通过 kubectl describe pod/nginx 查看具体创建状态

  • 让外部可访问

    kubectl port-forward --address 0.0.0.0 pod/nginx 8000:80 # 将本机80端口转发至Pod的 80 端口
    
    • 注意在 centos9 上能使用80端口会有权限问题
    • 这里使用 8000 来对应pod中的80端口
    • 这样,在 外部,通过 22.22.22.22:8000 即可访问了

11 ) 云主机特别注意

  • 如果在 阿里云等云产品上,还需要配置安全组, 配置安全组类似于这样
    • 入站规则,添加规则
    • 类型:自定义
    • 来源:0.0.0.0/0
    • 协议端口: TCP:80
    • 策略: 允许
    • 备注: 80
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐