使用kubeadm方式搭建K8S集群

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。

这个工具能通过两条指令完成一个kubernetes集群的部署:

  1. # 创建一个 Master 节点
  2. kubeadm init
  3. # 将一个 Node 节点加入到当前集群中
  4. kubeadm join <Master节点的IP和端口 >

安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多【注意master需要两核】
  • 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
  • 禁止swap分区

准备环境

角色 IP
master 192.168.23.130
node1 192.168.23.131
node2 192.168.23.132

然后开始在每台机器上执行下面的命令

  1. # 关闭防火墙
  2. systemctl stop firewalld
  3. systemctl disable firewalld
  4. # 关闭selinux
  5. # 永久关闭
  6. sed -i 's/enforcing/disabled/' /etc/selinux/config
  7. # 临时关闭
  8. setenforce 0
  9. # 关闭swap
  10. # 临时
  11. swapoff -a
  12. # 永久关闭
  13. sed -ri 's/.*swap.*/#&/' /etc/fstab
  14. # 根据规划设置主机名【master节点上操作】
  15. hostnamectl set-hostname k8smaster
  16. # 根据规划设置主机名【node1节点操作】
  17. hostnamectl set-hostname k8snode1
  18. # 根据规划设置主机名【node2节点操作】
  19. hostnamectl set-hostname k8snode2
  20. # 在master添加hosts
  21. cat >> /etc/hosts << EOF
  22. 192.168.177.130 k8smaster
  23. 192.168.177.131 k8snode1
  24. 192.168.177.132 k8snode2
  25. EOF
  26. # 将桥接的IPv4流量传递到iptables的链
  27. cat > /etc/sysctl.d/k8s.conf << EOF
  28. net.bridge.bridge-nf-call-ip6tables = 1
  29. net.bridge.bridge-nf-call-iptables = 1
  30. EOF
  31. # 生效
  32. sysctl --system
  33. # 时间同步
  34. yum install ntpdate -y
  35. ntpdate time.windows.com

安装Docker/kubeadm/kubelet

所有节点安装Docker/kubeadm/kubelet ,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker

安装Docker

首先配置一下Docker的阿里yum源

  1. cat >/etc/yum.repos.d/docker.repo<<EOF
  2. [docker-ce-edge]
  3. name=Docker CE Edge - \$basearch
  4. baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/\$basearch/edge
  5. enabled=1
  6. gpgcheck=1
  7. gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
  8. EOF

然后yum方式安装docker

  1. # yum安装
  2. yum -y install docker-ce
  3. # 查看docker版本
  4. docker --version
  5. # 启动docker
  6. systemctl enable docker
  7. systemctl start docker

配置docker的镜像源

  1. cat >> /etc/docker/daemon.json << EOF
  2. {
  3. "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
  4. }
  5. EOF

然后重启docker

  1. systemctl restart docker

添加kubernetes软件源

然后我们还需要配置一下yum的k8s软件源

  1. cat > /etc/yum.repos.d/kubernetes.repo << EOF
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5. enabled=1
  6. gpgcheck=0
  7. repo_gpgcheck=0
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF

安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

  1. # 安装kubelet、kubeadm、kubectl,同时指定版本
  2. yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
  3. # 设置开机启动
  4. systemctl enable kubelet

部署Kubernetes Master【master节点】

在 192.168.177.130 执行,也就是master节点

  1. kubeadm init --apiserver-advertise-address=masterIP --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址,【执行上述命令会比较慢,因为后台其实已经在拉取镜像了】,我们 docker images 命令即可查看已经拉取的镜像

当我们出现下面的情况时,表示kubernetes的镜像已经安装成功

使用kubectl工具 【master节点操作】

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

执行完成后,我们使用下面命令,查看我们正在运行的节点

  1. kubectl get nodes



能够看到,目前有一个master节点已经运行了,但是还处于未准备状态

下面我们还需要在Node节点执行其它的命令,将node1和node2加入到我们的master节点上

加入Kubernetes Node【Slave节点】

下面我们需要到 node1 和 node2服务器,执行下面的代码向集群添加新节点

执行在kubeadm init输出的kubeadm join命令:

注意,以下的命令是在master初始化完成后,每个人的都不一样!!!需要复制自己生成的

  1. kubeadm join 192.168.23.130:6443 --token 8j6ui9.gyr4i156u30y80xf \
  2. --discovery-token-ca-cert-hash sha256:eda1380256a62d8733f4bddf926f148e57cf9d1a3a58fb45dd6e80768af5a500

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:

  1. kubeadm token create --print-join-command

当我们把两个节点都加入进来后,我们就可以去Master节点 执行下面命令查看情况

  1. kubectl get node

部署CNI网络插件

上面的状态还是NotReady,下面我们需要网络插件,来进行联网访问

  1. # 下载网络插件配置
  2. wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

默认镜像地址无法访问,sed命令修改为docker hub镜像仓库。

  1. # 添加
  2. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  3. # 查看状态 【kube-system是k8s中的最小单元】
  4. kubectl get pods -n kube-system

要是上述方式不太行,可以更换一个网络插件

安装Calico网络插件

  1. curl https://docs.projectcalico.org/manifests/calico.yaml -O
  2. kubectl apply -f calico.yaml

运行完成后,我们查看状态可以发现,已经变成了Ready状态了

如果上述操作完成后,还存在某个节点处于NotReady状态,可以在Master将该节点删除

  1. # master节点将该节点删除
  2. kubectl delete node k8snode1
  3. # 然后到k8snode1节点进行重置
  4. kubeadm reset
  5. # 重置完后在加入
  6. kubeadm join 192.168.23.130:6443 --token 8j6ui9.gyr4i156u30y80xf --discovery-token-ca-cert-hash sha256:eda1380256a62d8733f4bddf926f148e57cf9d1a3a58fb45dd6e80768af5a500

测试kubernetes集群

我们都知道K8S是容器化技术,它可以联网去下载镜像,用容器的方式进行启动

在Kubernetes集群中创建一个pod,验证是否正常运行:

  1. # 下载nginx 【会联网拉取nginx镜像】
  2. kubectl create deployment nginx --image=nginx
  3. # 查看状态
  4. kubectl get pod

如果我们出现Running状态的时候,表示已经成功运行了

下面我们就需要将端口暴露出去,让其它外界能够访问

  1. # 暴露端口
  2. kubectl expose deployment nginx --port=80 --type=NodePort
  3. # 查看一下对外的端口
  4. kubectl get pod,svc

能够看到,我们已经成功暴露了 80端口 到 31121上

我们到我们的宿主机浏览器上,访问如下地址

  1. http://192.168.23.130:31121/

发现我们的nginx已经成功启动了

到这里为止,我们就搭建了一个单master的k8s集群

错误汇总

错误一

在执行Kubernetes init方法的时候,出现这个问题

  1. error execution phase preflight: [preflight] Some fatal errors occurred:
  2. [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2

是因为VMware设置的核数为1,而K8S需要的最低核数应该是2,调整核数重启系统即可

错误二

我们在给node1节点使用 kubernetes join命令的时候,出现以下错误

  1. error execution phase preflight: [preflight] Some fatal errors occurred:
  2. [ERROR Swap]: running with swap on is not supported. Please disable swap

错误原因是我们需要关闭swap

  1. # 关闭swap
  2. # 临时
  3. swapoff -a
  4. # 临时
  5. sed -ri 's/.*swap.*/#&/' /etc/fstab

错误三

在给node1节点使用 kubernetes join命令的时候,出现以下错误

  1. The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused

解决方法,首先需要到 master 节点,创建一个文件

  1. # 创建文件夹
  2. mkdir /etc/systemd/system/kubelet.service.d
  3. # 创建文件
  4. vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  5. # 添加如下内容
  6. Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --fail-swap-on=false"
  7. # 重置
  8. kubeadm reset

然后删除刚刚创建的配置目录

  1. rm -rf $HOME/.kube

然后 在master重新初始化

  1. kubeadm init --apiserver-advertise-address=masterIP --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

初始完成后,我们再到 node1节点,执行 kubeadm join命令,加入到master

  1. kubeadm join masterIP:6443 --token c7a7ou.z00fzlb01d76r37s \
  2. --discovery-token-ca-cert-hash sha256:9c3f3cc3f726c6ff8bdff14e46b1a856e3b8a4cbbe30cab185f6c5ee453aeea5

添加完成后,我们使用下面命令,查看节点是否成功添加

  1. kubectl get nodes

错误四

我们再执行查看节点的时候, kubectl get nodes 会出现问题

  1. Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")

这是因为我们之前创建的配置文件还存在,也就是这些配置

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

我们需要做的就是把配置文件删除,然后重新执行一下

  1. rm -rf $HOME/.kube

然后再次创建一下即可

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

这个问题主要是因为我们在执行 kubeadm reset 的时候,没有把 $HOME/.kube 给移除掉,再次创建时就会出现问题了

错误五

安装的时候,出现以下错误

  1. Another app is currently holding the yum lock; waiting for it to exit...

是因为yum上锁占用,解决方法

  1. yum -y install docker-ce

错误六

在执行 kubeadm reset 的时候,出现下面的错误

  1. {"level":"warn","ts":"2022-01-22T04:16:31.062-0500","caller":"clientv3/retry_interceptor.go:61","msg":"retrying of unary invoker failed","target":"endpoint://client-bb6ef2cd-d17e-4821-a8b5-96a5f0296d22/172.16.174.140:2379","attempt":0,"error":"rpc error: code = Unknown desc = etcdserver: re-configuration failed due to not enough started members"}

解决措施:

执行如下命令

  1. rm -rf /etc/kubernetes/*

然后再次执行重置

  1. kubeadm reset

最后,再删除 kube 文件夹即可

  1. rm -rf /root/.kube/

错误七

在执行kubectl init 时出现下面错误

  1. [root@k8smaster ~]# kubeadm init --apiserver-advertise-address=172.16.174.140 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
  2. W0122 05:12:56.579589 38445 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
  3. [init] Using Kubernetes version: v1.18.0
  4. [preflight] Running pre-flight checks
  5. [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 18.03.1-ce. Latest validated version: 19.03
  6. error execution phase preflight: [preflight] Some fatal errors occurred:
  7. [ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
  8. [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
  9. To see the stack trace of this error execute with --v=5 or higher

需要删除 /var/lib/etcd 文件夹即可

  1. rm -rf /var/lib/etcd

错误八

在执行kubectl get nodes 的时候,出现下列的错误

  1. error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable

这是由于没有配置环境变量引起的,需要编辑文件 /etc/profile,然后末尾追加下面内容

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

然后更新环境变量,即可生效

  1. source /etc/profile

使用kubeadm方式搭建K8S集群的更多相关文章

  1. kubeadm方式搭建K8S集群

    一.kubeadm介绍 二.安装要求 三.集群规划 四.环境初始化(在每个服务器节点操作) 1.关闭防火墙 2.关闭selinux 3.关闭swap 4.根据规划设置主机名 5.在Master添加ho ...

  2. kubeadm快速搭建k8s集群

    环境 master01:192.168.1.110 (最少2核CPU) node01:192.168.1.100 规划 services网络:10.96.0.0/12 pod网络:10.244.0.0 ...

  3. 2.使用kubeadm快速搭建k8s集群

    准备工作: 时间同步 systemctl stop iptables.servicesystemctl stop firewalld.service 安装docker wget https://mir ...

  4. kubeadm 搭建 K8S集群

    kubeadm是K8s官方推荐的快速搭建K8s集群的方法. 环境: Ubuntu 16.04 1 安装docker Install Docker from Ubuntu’s repositories: ...

  5. kubeadm搭建K8s集群及Pod初体验

    基于Kubeadm 搭建K8s集群: 通过上一篇博客,我们已经基本了解了 k8s 的基本概念,也许你现在还是有些模糊,说真的我也是很模糊的.只有不断地操作去熟练,强化自己对他的认知,才能提升境界. 我 ...

  6. 教你用multipass快速搭建k8s集群

    目录 前言 一.multipass快速入门 安装 使用 二.使用multipass搭建k8s集群 创建3台虚拟机 安装master节点 安装node节点 测试k8s集群 三.其他问题 不能拉取镜像:报 ...

  7. 通过kubeadm工具部署k8s集群

    1.概述 kubeadm是一工具箱,通过kubeadm工具,可以快速的创建一个最小的.可用的,并且符合最佳实践的k8s集群. 本文档介绍如何通过kubeadm工具快速部署一个k8s集群. 2.主机规划 ...

  8. CentOS7 使用 kubeadm 搭建 k8s 集群

    一 安装Docker-CE 前言 Docker 使用越来越多,安装也很简单,本次记录一下基本的步骤. Docker 目前支持 CentOS 7 及以后的版本,内核要求至少为 3.10. Docker ...

  9. 搭建K8S集群

    一.前言 我们将现有的虚拟机称之为Node1,用作主节点.为了减少工作量,在Node1安装Kubernetes后,我们利用VirtualBox的虚拟机复制功能,复制出两个完全一样的虚拟机作为工作节点. ...

  10. 1 搭建K8s集群

    官网:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing ...

随机推荐

  1. KingbaseES 与 Oracle 用户口令管理与资源管理

    一.概述 KingbaseES可以对用户口令与用户占用资源进行必要的管理.其管理方式,在这里与Oracle数据库进行参考比较. KingbaseES 使用扩展插件建立的系统参数,这组参数可以对数据库资 ...

  2. Cluster table 与性能

    用户数据行存储在文件系统中的堆文件中,而这些行以不确定的顺序存储.如果表最初以插入/复制的顺序加载,那么以后的插入.更新和删除将导致在堆文件中以不可预测的顺序添加行.创建索引创建一个指向堆行的辅助文件 ...

  3. OpenHarmony3.0如何轻松连接华为云IoT设备接入平台?

    摘要:本文主要介绍基于OpenHarmony 3.0版本来对接华为云IoT设备接入IoTDA,以小熊派BearPi-HM_Nano开发板为例,使用huaweicloud_iot_link SDK对接华 ...

  4. Gitea 1.17.2 | 带来视觉提升、完善资源校验、加强安全性等42项优化

    Gitea 1.17.2 合并了 42 个 Pull Request,现已正式发布,我们建议所有用户升级到此版本.您可以到阅读原文了解更详细的介绍. 致谢:@zeripath 为 Gitea 贡献了诸 ...

  5. 华南理工大学 Python第7章课后小测-1

    1.(单选)以下程序对字典进行排序,按字典键值从小到大排序,空白处的代码是(  ): dt={'b':6, 'c':2, 'a':4} s=sorted(dt.items(),key=_____) p ...

  6. 请求体: Request Body

    官方文档地址:https://fastapi.tiangolo.com/zh/tutorial/body/ # -*- coding: UTF-8 -*- from fastapi import Fa ...

  7. 9个常用的Shell脚本

    1.Dos 攻击防范(自动屏蔽攻击 IP) #!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) LOG_FILE=/usr/local/nginx/logs/demo2. ...

  8. FEX-EMU Wine踩坑记录

    FEX是一个用于在ARM64平台运行X86软件的工具,比较成熟,但是网上资料很少,所以就写了这篇FEX运行Wine踩坑记录. Termux的Fex不能用(2022年5月) 要在debian系统安装fe ...

  9. 云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上

    @ 目录 概述 定义 工作原理 主要组件 核心概念 环境准备 概述 安装Kubekey 创建K8S 安装K9S OpenLB 安装ArgoCD 安装 ArgoCD CLI 从Git库中创建一个应用程序 ...

  10. 微软出品自动化神器Playwright(Playwright+Java)系列(四) 之 浏览器操作

    写在前面 今天是国庆节的最后一天,明天又要上班了,真的是感觉好像才开始放假一样,还是因为失恋没缓过来吗? 我的国庆七天 第1天,当了近半天的司机,陪家人去各大超市去购物,下午在家躺····· 第2-5 ...