kubernetes使用kubeadm创建集群实操教程(全)

 更新时间:2024年06月29日 10:55:04   作者:STRANGEX-03  

安装kubernetes的方式,分别是kubeadm引导集群、kOps、Kubespray,本文采用kubeadm引导集群的方式,主要运用了安装kubeadm、对kubeadm进行故障排查、使用kubeadm创建集群,目标是要安装单个控制平面的Kubernetes集群,在集群上安装Pod网络,以便Pod可以相互连通

目录
  • 一、虚拟机准备
    • (一)主机基本配置
    • (二)安装docker
      • 1. 安装docker
      • 2. 设置阿里云源
      • 3. 安装 Docker Engine-Community
      • 4. 设置docker开机自动启动
    • (三)配置cri-docker环境
      • 1. 提前下载cri-docker环境拖入虚拟机,解压缩并移动到指定位置
      • 2. 配置cri-dockerd.service文件
      • 3. 配置cri-dockerd.socket文件
      • 4. 启动cri-docker服务
    • (四)安装kubeadm、kubelet、kubectl
      • 1. 配置kubernetes的yum源
      • 2. 安装Kubernetes三大组件
      • 3. 设置kubectl开机自动启动
    • (五)克隆主机
      • 1. 进入克隆虚拟机向导,选择创建完整克隆
      • 2. 根据需要为克隆主机重命名,修改存储位置
  • 二、环境配置工作
    • (一)修改主机名
      • (二)编辑hosts文件
        • 1. 查看主机ip地址
        • 2. 编辑/etc/hosts文件
      • (三)关闭防火墙、selinux、swap
        • 1. 关闭防火墙
        • 2. 关闭selinux
        • 3. 关闭swap分区,编辑/etc/fstab文件
      • (四)配置同步时间、系统模块
        • 1. 设置本地时区,加载RTC设置
        • 2. 加载和检查系统模块
      • (五)配置SSH免密登录
        • 1. 生成新的密钥对
        • 2. 将公钥复制到目标主机
        • 3. 检验配置结果
    • 三、准备容器所需的镜像
      • (一)查看所需镜像文件
        • (二)配置daemon.json文件
          • 1. 在阿里云中启用镜像加速器
          • 2. 配置/etc/docker/daemon.json文件
          • 3. 载入daemon.json文件并重启docker
        • (三)拉取镜像文件
          • (四)修改镜像标签
            • (五)查看镜像结果
            • 四、具体节点配置
              • (一)初始化Kubernetes集群
                • 1. 在主节点执行初始化的命令
                • 2. 初始化成功显示以下内容
                • 3. 根据提示运行kubectl
              • (二)部署Pod网络
                • 1. 进入提示的网站,选择flannel网络组件
                • 2. 安装CNI网络插件
                • 3. 使用kubectl部署flannel
              • (三)加入子节点
                • 1. 在主节点中将kubeconfig环境变量分发到子节点
                • 2. 在两个node节点中输入以下命令
              • (四)确保节点Ready状态
                • 1. 查看节点状态
                • 2. 显示NotReady,需要修改yml文件
                • 3. 查看命名空间kube-system的pod的状态
            • 五、Kubernetes集群测试
              • (一)创建mynginx pod
                • (二)暴露端口
                  • (三)访问nginx
                  • 六、总结

                    根据官方文档,总共有三种使用部署工具安装kubernetes的方式,分别是使用kubeadm 引导集群、使用kOps安装 Kubernetes、使用Kubespray安装 Kubernetes。

                    在本次部署设计中,采用kubeadm引导集群的方式,主要运用了安装kubeadm、对kubeadm进行故障排查、使用kubeadm创建集群。目标是要安装单个控制平面的Kubernetes集群,在集群上安装Pod网络,以便Pod可以相互连通。

                    一、虚拟机准备

                    准备三台预先安装docker、cri-docker环境、kubernetes组件、cri-docker环境的虚拟机。

                    (一)主机基本配置

                    创建虚拟机,根据官方文档,本次实验在CentOS 8环境下进行,主机内存设置4GB,处理器个数为4,采用NAT网络适配器。

                    (二)安装docker

                    详细安装过程:CentOS 8:在Linux环境下安装和卸载Docker

                    1. 安装docker

                    yum install -y
                    yum-utils device-mapper-persistent-data lvm2
                    

                    2. 设置阿里云源

                    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
                    

                    3. 安装 Docker Engine-Community

                    yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
                    

                    4. 设置docker开机自动启动

                    systemctl enable docker
                    

                    (三)配置cri-docker环境

                    1. 提前下载cri-docker环境拖入虚拟机,解压缩并移动到指定位置

                    tar -xf cri-dockerd-0.3.4.amd64.tgz -C /usr/local/
                    ls /usr/local
                    mv /usr/local/cri-dockerd/cri-dockerd /usr/local/bin/
                    

                    2. 配置cri-dockerd.service文件

                    vim /etc/systemd/system/cri-dockerd.service
                    
                    # cri-dockerd.service文件内容
                    
                    [Unit]
                    Description=CRI Interface for Docker Application Container Engine
                    Documentation=https://docs.mirantis.com
                    After=network-online.target firewalld.service docker.service
                    Wants=network-online.target
                    
                    [Service]
                    Type=notify
                    ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker
                    ExecReload=/bin/kill -s HUP $MAINPID
                    TimeoutSec=0
                    RestartSec=2
                    Restart=always
                    StartLimitBurst=3
                    StartLimitInterval=60s
                    LimitNOFILE=infinity
                    LimitNPROC=infinity
                    LimitCORE=infinity
                    TasksMax=infinity
                    Delegate=yes
                    KillMode=process
                    
                    [Install]
                    WantedBy=multi-user.target
                    

                    3. 配置cri-dockerd.socket文件

                    vim /etc/systemd/system/cri-dockerd.socket
                    
                    # cri-dockerd.socket文件内容
                    
                    [Unit]
                    Description=CRI Docker Socket for the API
                    PartOf=cri-docker.service
                    
                    [Socket]
                    ListenStream=/var/run/cri-dockerd.sock
                    SocketMode=0660
                    SocketUser=root
                    SocketGroup=docker
                    
                    [Install]
                    WantedBy=sockets.target
                    

                    4. 启动cri-docker服务

                    systemctl daemon-reload
                    systemctl start cri-dockerd.service
                    systemctl enable cri-dockerd.service
                    

                    (四)安装kubeadm、kubelet、kubectl

                    kubeadm:用来初始化集群的指令。

                    kubelet:在集群中的每个节点上用来启动 Pod 和容器等。

                    kubectl:用来与集群通信的命令行工具。

                    1. 配置kubernetes的yum源

                    vim /etc/yum.repos.d/kubernetes.repo
                    
                    # kubernetes.repo文件内容
                    
                    [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
                    

                    2. 安装Kubernetes三大组件

                    dnf install kubelet kubeadm kubectl
                    

                    3. 设置kubectl开机自动启动

                    systemctl enable kubectl
                    

                    (五)克隆主机

                    1. 进入克隆虚拟机向导,选择创建完整克隆

                    2. 根据需要为克隆主机重命名,修改存储位置


                    二、环境配置工作

                    在三台主机中均要进行如下的环境配置工作

                    (一)修改主机名

                    对三台主机分别修改主机名

                    hostnamectl set-hostname master
                    
                    hostnamectl set-hostname slave1
                    
                    hostnamectl set-hostname slave2
                    

                    (二)编辑hosts文件

                    1. 查看主机ip地址

                    ifconfig
                    

                    2. 编辑/etc/hosts文件

                    vim /etc/hosts
                    
                    # /etc/hosts文件内容
                    
                    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
                    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
                    192.168.211.137 master
                    192.168.211.136 slave1
                    192.168.211.138 slave2
                    

                    (三)关闭防火墙、selinux、swap

                    1. 关闭防火墙

                    避免后续需要配置开放端口

                    systemctl stop firewalld.service
                    systemctl disable firewalld.service
                    

                    2. 关闭selinux

                    selinux会限制容器对宿主机文件系统和系统资源的访问权限

                    setenforce 0
                    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
                    

                    3. 关闭swap分区,编辑/etc/fstab文件

                    kubelet要求必须禁用交换分区,kubeadm初始化时会检测swap是否关闭

                    vim /etc/fstab
                    

                    修改/etc/fstab文件内容,注释swap行

                    # /etc/fstab文件内容(局部)
                    
                    # /dev/mapper/cl-swap     none                    swap    defaults        0 0
                    

                    (四)配置同步时间、系统模块

                    1. 设置本地时区,加载RTC设置

                    确保集群中的各个组件在进行各种操作时具有一致的时间戳

                    timedatectl set-local-rtc 0
                    timedatectl set-timezone Asia/Shanghai
                    hwclock –systohc
                    

                    2. 加载和检查系统模块

                    确保Kubernetes网络和容器的正常运行

                    modprobe br_netfilter
                    lsmod | grep br_netfilter
                    

                    (五)配置SSH免密登录

                    配置Kubernetes集群需要在不同的节点之间进行通信和操作,配置SSH免密登录能够简化操作,避免每次执行操作都需要手动输入密码。

                    1. 生成新的密钥对

                    ssh-keygen
                    

                    2. 将公钥复制到目标主机

                    ssh-copy-id root@master
                    ssh-copy-id root@slave1
                    ssh-copy-id root@slave2
                    

                    3. 检验配置结果

                    ssh root@master
                    ssh root@slave1
                    ssh root@slave2
                    

                    三、准备容器所需的镜像

                    由于无法访问外网,不能下载存放在registry.k8s.io上的默认容器镜像,这里选择在阿里云上进行拉取镜像,然后使用tag命令修改为它需求的镜像标签,以下操作在三台主机中都要进行。

                    (一)查看所需镜像文件

                    查看Kubernetes集群需要的镜像

                    kubeadm config images list
                    

                    (二)配置daemon.json文件

                    1. 在阿里云中启用镜像加速器

                    2. 配置/etc/docker/daemon.json文件

                    在阿里云操作文档的基础上添加驱动命令修改docker的驱动为systemd,使其与与k8s保持一致,避免冲突

                    tee
                    /etc/docker/daemon.json <<-'EOF'
                    {
                      "registry-mirrors":["https://2nd8r72o.mirror.aliyuncs.com"],
                      "exec-opts":[ "native.cgroupdriver=systemd" ]
                    }
                    EOF
                    

                    3. 载入daemon.json文件并重启docker

                    systemctl daemon-reload
                    systemctl restart docker
                    

                    (三)拉取镜像文件

                    拉取阿里云里所需要的镜像

                    docker pull  registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.4
                    docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.4
                    docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.4
                    docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.4
                    docker pull registry.aliyuncs.com/google_containers/pause:3.9
                    docker pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0
                    docker pull registry.aliyuncs.com/google_containers/coredns:v1.10.1
                    

                    (四)修改镜像标签

                    使用tag修改为需求的镜像标签

                    docker tag  registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.4   registry.k8s.io/kube-apiserver:v1.28.4
                    docker tag  registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.4   registry.k8s.io/kube-controller-manager:v1.28.4
                    docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.4   registry.k8s.io/kube-scheduler:v1.28.4
                    docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.28.4   registry.k8s.io/kube-proxy:v1.28.4
                    docker tag registry.aliyuncs.com/google_containers/pause:3.9  registry.k8s.io/pause:3.9
                    docker tag registry.aliyuncs.com/google_containers/etcd:3.5.9-0 registry.k8s.io/etcd:3.5.9-0
                    docker tag registry.aliyuncs.com/google_containers/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1
                    

                    (五)查看镜像结果

                    查看本地镜像,确认是否有需要的镜像

                    docker images
                    

                    四、具体节点配置

                    (一)初始化Kubernetes集群

                    1. 在主节点执行初始化的命令

                    apiserver-advertise-address用来指定API服务器的广播地址。

                    kubernetes-version指定要安装的Kubernetes版本。

                    service-cidr指定服务网络的CIDR范围。

                    pod-network-cidr指定Pod网络的CIDR范围。

                    ignore-preflight-errors=all忽略所有预检错误。

                    cri-socket指定容器运行时的UNIX套接字路径。

                    另外,由于前一步骤已经安装了集群所需的镜像,在命令进行时会提示镜像已存在而不再拉取,故也不再需要设置image-repository的值

                    kubeadm init \
                    --apiserver-advertise-address=192.168.211.137 \
                    --kubernetes-version v1.28.4 \
                    --service-cidr=10.96.0.0/12 \
                    --pod-network-cidr=10.244.0.0/16 \
                    --ignore-preflight-errors=all \
                    --cri-socket=unix:///var/run/cri-dockerd.sock
                    

                    如果报错则输入下面命令恢复原有状态

                    systemctl stop kubelet
                    rm -rf /etc/kubernetes/*
                    systemctl stop docker 
                    rm -rf /var/lib/kubelet/
                    rm -rf /var/lib/etcd
                    

                    在这一部分出现的主要问题是:在前期原本只安装了docker而没有安装cri-dockerd,经过查资料发现k8s在1.20.X版本以后就弃用了docker,于是临时改用containerd,重新在containerd拉取镜像和改标签,但在使用中仍有bug无法解决。于是选择安装cri-dockerd再次进行以上命令,执行成功。

                    2. 初始化成功显示以下内容

                    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 192.168.211.137:6443 --token ejgoxs.086hnhj7qipovd6v \
                    	--discovery-token-ca-cert-hash sha256:6bbe9e754e2b0ab13301e76268c347b9f95b661b2399630ecfa8da9497ca5744
                    
                    

                    初始化成功后虚拟机卡顿严重,通过关闭后提高处理器、内存等配置得以缓解

                    3. 根据提示运行kubectl

                    我使用root用户,可以直接设置KUBECONFIG环境变量,可以让kubectl命令行工具自动找到并使用这个配置文件

                    export KUBECONFIG=/etc/kubernetes/admin.conf
                    

                    (二)部署Pod网络

                    部署Pod网络是为了提供容器间和跨节点的网络通信,实现网络策略和安全性,支持服务发现和负载均衡

                    1. 进入提示的网站,选择flannel网络组件

                    2. 安装CNI网络插件

                    根据网站内提示,Flannel默认用作 CNI 网络插件,部署Flannel时需确保CNI网络插件有安装,由于国内访问Github不稳定,这里提前下载好插件,拖入虚拟机的主目录,再进行解压等命令

                    mkdir -p /opt/cni/bin
                    tar -C /opt/cni/bin -xzf cni-plugins-linux-amd64-v1.2.0.tgz
                    

                    3. 使用kubectl部署flannel

                    根据网站内提示,提前下载好yml文件,拖入虚拟机的主目录,再输入命令

                    kubectl apply -f kube-flannel.yml
                    

                    (三)加入子节点

                    1. 在主节点中将kubeconfig环境变量分发到子节点

                    kubeconfig环境变量指定了kubectl命令使用的kubeconfig文件的路径,该文件包含了连接到集群所需的认证和配置信息,让子节点上的kubectl命令能够连接到Kubernetes集群的控制平面

                    scp /etc/kubernetes/admin.conf slave1:/etc/kubernetes/
                    scp /etc/kubernetes/admin.conf slave2:/etc/kubernetes/
                    

                    设计结束后,在官方安装文档上注意到其实建议不要将admin.conf文件与任何人共享,应该使用kubeadm kubeconfig user命令为其他用户生成 kubeconfig文件

                    2. 在两个node节点中输入以下命令

                    由于同时有containerd和docker,在提示的命令基础上加了cri-socket参数,指定为cri-dockerd

                    kubeadm join 192.168.211.137:6443 \
                    --token ejgoxs.086hnhj7qipovd6v \
                    --discovery-token-ca-cert-hash sha256:6bbe9e754e2b0ab13301e76268c347b9f95b661b2399630ecfa8da9497ca5744 \
                    --cri-socket=unix:///var/run/cri-dockerd.sock
                    

                    报错则输入下面命令恢复原有状态,再根据报错提示进行调整

                    rm -rf /etc/kubernetes/kubelet.conf
                    rm -rf /etc/kubernetes/pki/ca.crt
                    systemctl restart kubelet
                    

                    (四)确保节点Ready状态

                    1. 查看节点状态

                    kubectl get nodes
                    

                    2. 显示NotReady,需要修改yml文件

                    原因是pod之间无法ping通,需要让flanneld包发到指定网卡,数据包才能正常的经过flannel进行传送

                    ifconfig
                    vim kube-flannel.yml
                    

                    在kube-flannel.yml文件第139行加上

                            - --iface=ens160
                    

                    再次查看显示正确

                    kubectl get nodes
                    

                    3. 查看命名空间kube-system的pod的状态

                    kubectl get pods -n kube-system
                    

                    五、Kubernetes集群测试

                    (一)创建mynginx pod

                    创建一个nginx镜像,向Kubernetes集群提交一个Pod创建的请求,控制平面会根据集群的配置和调度策略,在可用的节点上选择一个节点来运行这个Pod。

                    kubectl create deployment mynginx --image=nginx
                    

                    (二)暴露端口

                    创建一个Service资源,并将其关联到mynginx Pod,将其与集群的外部网络连接起来,指定Service的端口为80,并使用NodePort类型,NodePort类型会在每个节点上选择一个端口,将外部流量转发到Service的端口上。

                    kubectl expose deployment mynginx --port=80 --type=NodePort
                    

                    (三)访问nginx

                    通过浏览器访问任一节点的IP地址和暴露的NodePort端口,可以访问到nginx服务,说明测试成功

                    192.168.211.136:30619

                    192.168.211.138:30619

                    六、总结

                    到此这篇关于kubernetes使用kubeadm创建集群实操教程(全) 的文章就介绍到这了,更多相关kubernetes使用kubeadm创建集群内容请搜索小闻网以前的文章或继续浏览下面的相关文章希望大家以后多多支持小闻网!

                    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。