微服务 云原生:搭建 K8S 集群

为节约时间和成本,仅供学习使用,直接在两台虚拟机上模拟 K8S 集群搭建

踩坑之旅

系统环境:CentOS-7-x86_64-Minimal-2009 镜像,为方便起见,直接在 root 账户下操作,现实情况最好不要这样做。

基础准备

  1. 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
  1. 关闭 selinux
# 临时禁用selinux
setenforce 0

# 永久关闭selinux 
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  1. 禁用 Swap
# 临时关闭 Swap
swapoff -a

# 永久禁用 Swap
vi /etc/fstab
在swap分区这行前加 # 注释掉
#/dev/mapper/centos-swap swap
  1. 设置存储库
# 安装 yum-utils 包, 并设置稳定存储库
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装配置 Docker
# 查看docker-ce支持版本
yum list docker-ce --showduplicates|sort -r

#查看docker-ce-cli版本
yum list docker-ce-cli --showduplicates|sort -r

# 指定版本号安装
#yum install -y docker-ce-24.0.4 docker-ce-cli-24.0.4 containerd.io

# 默认安装最新版本
yum install docker-ce docker-ce-cli containerd.io

# 启动 Docker
systemctl enable docker && systemctl start docker

# 查看版本
docker -v

# 配置国内镜像源,修改/新建 daemon.json
vi /etc/docker/daemon.json

# 在 daemon.json 中添加:
{
        "registry-mirrors": [
                "https://registry.docker-cn.com",
                "https://docker.mirrors.ustc.edu.cn",
                "http://hub-mirror.c.163.com",
                "https://cr.console.aliyun.com/"
        ]
}

# 重启 Docker
systemctl restart docker
  1. 安装 Docker Compose
# 下载 Docker Compose
sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 对二进制文件添加可执行权限
chmod +x /usr/local/bin/docker-compose

# 查看版本
docker-compose -v

最好使用 GitHub 的地址,如果使用其他比如:
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose,有几率会出现下面错误:

/usr/local/bin/docker-compose: line 1: html: No such file or directory
/usr/local/bin/docker-compose: line 2: syntax error near unexpected token `<'
'usr/local/bin/docker-compose: line 2: `<head><title>502 Bad Gateway</title></head>

搭建 K8S 集群

  1. 修改 K8S 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

基础环境搭建完成后,令当前虚拟机做 Master 主机,利用虚拟机平台,比如 VMWare、VirtualBox 等的克隆功能,克隆一台 Worker 主机(当然也可以克隆多台)。注意,克隆后的多台主机要保证 ip 不同,不同软件的操作不同,具体操作此处此处不做赘述。

  1. Master 端安装 kubeadm、kubectl、kubelet
# 安装指定版本
# yum install -y kubeadm-1.21.3 kubelet-1.21.3 kubectl-1.21.3

# 默认安装
yum install -y kubectl kubeadm kubelet

# 启动 kubelet 服务
systemctl enable kubelet && systemctl start kubelet

# 查看版本
docker-compose version
  1. Worker 端安装 kubeadm、kubelet
# 安装
yum install -y kubeadm kubelet

# 启动 kubelet 服务
systemctl enable kubelet && systemctl start kubelet
  1. 启动容器运行时 containerd
# Master 端和 Worker 端都要操作
mv /etc/containerd/config.toml /etc/containerd/config.bak
containerd config default | sudo tee /etc/containerd/config.toml
systemctl restart containerd
  1. 配置主机名,需要同时在 Master 和 Worker 上操作
    • Master 节点下:
    # 编辑 hosts,添加各个节点的映射
    vi /etc/hosts
    
    # 我的 Master 主机 ip 为 192.168.65.130,Worker 主机 ip 为 192.168.65.132
    192.168.65.132 k8s-node1
    192.168.65.130 k8s-master
    
    # Master 节点
    hostnamectl --static set-hostname k8s-master
    
    # 立刻生效
    hostname $hostname
    
    • Worker 节点下:
    vi /etc/hosts
    
    192.168.65.132 k8s-node1
    192.168.65.130 k8s-master
    
    # Worker 节点
    hostnamectl --static set-hostname k8s-node1
    
    # 立刻生效
    hostname $hostname
    
  2. 初始化 Master 节点
# 仅在 Master 主机上执行:
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--apiserver-advertise-address=192.168.65.130 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl 0
  • –apiserver-advertise-address=192.168.65.130,master 主机的 IP 地址
  • –image-repository=registry.aliyuncs.com/google_containers,这个是镜像地址
  • –service-cidr=10.96.0.0/12,IP 地址直接就套用10.96.0.0/12
  • –pod-network-cidr=10.244.0.0/16,K8S 内部的 pod 节点之间网络可以使用的 IP 段,是可以更改的,暂时用 10.244.0.0/16 也无所谓

初始化完成后结果如下:
在这里插入图片描述
将这里提示的 kubeadm join xxx 命令保存下来,如果忘记了也可以通过下面命令查看:

kubeadm token create --print-join-command

继续执行:

mkdir -p ~/.kube
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
  1. 将 Worker 加入到 Master 节点
# Worker 端,使用上一步得到的 join 命令
kubeadm join 192.168.65.130:6443 --token 4olf44.2t6sqev73d6ewm48 --discovery-token-ca-cert-hash sha256:3603cf3bd9efa671e95a93f922f097580b1ffbfe3e55ca8b7f1876bf8fc4be69

成功后的提示如下:
在这里插入图片描述
这一步可能报错:

[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

解决办法:

echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
  1. Master 端安装 Calico 网络插件
    注意,Calico 的版本需要与 kubelet 匹配,适配关系在 Calico 每个版本的说明都有,比如我的 kubelet 是 1.21.3,满足此版本的 Calico 有 3.20、3.21:
    在这里插入图片描述
    https://docs.tigera.io/archive/v3.20/getting-started/kubernetes/requirements
# 下载 calico.yaml 到本地
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O

# 执行
kubectl apply -f calico.yaml

在这里插入图片描述
9. 查看节点、pod 状态

# 查看 nodes
kubelet get node

# 查看 pods
kubectl get pods -n kube-system -o wide

一开始节点处于 NotReady 状态:
在这里插入图片描述
相关的 coredns 等也在启动中:
在这里插入图片描述
经过一段时间后,可以看到,所有 pods 均已启动(running),节点已就绪(Ready):
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/42570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA Copyright添加

IDEA代码文件的版权(copyright)信息配置 1. 快速创建Copyright 版权配置文件 1.1 创建copyright文件 依次点击 File > Settings… > Editor > Copyright > 点击 “” 号或 “Add profile”***&#xff0c;弹出创建 Copyright Profile 操作窗口&#xff0c;在***文…

低代码如何帮助企业数字化转型?

在数字化时代背景下&#xff0c;企业都面临着巨大的数字化转型挑战。为了迎接这一挑战&#xff0c;企业软件开发工具和平台都在不断地创新和进化。其中&#xff0c;低代码开发平台应运而生&#xff0c;并成为了众多企业转型的首选方案。企业为什么都选择低代码开发平台&#xf…

【基于CentOS 7 的NFS服务】

目录 一、概述 二、应用场景 三、安装 四、启动服务 五、目录结构 1.nfs的主配置文件 2.存储配置文件 六、命令解析 1.共享存储管理命令 2.共享目录查看 七、配置 八、客户端访问 1.查看nfs服务器的共享目录 2.挂载 九、实际案例 一、概述 network filesystemt…

【GitOps系列】使用Kustomize和Helm定义应用配置

文章目录 使用 Kustomize 定义应用改造示例应用1.创建基准和多环境目录2.环境差异分析3.为 Base 目录创建通用 Manifest4.为开发环境目录创建差异 Manifest5.为预发布环境创建差异 Manifest6.为生产环境创建差异 Manifest 部署 Kustomize 应用部署到开发环境部署到生产环境 使用…

Flink笔记

Flink笔记 2.Flink学习笔记2.1流式处理对比2.2 Flink核心概念2.2.1并行度2.2.2算子链2.2.3任务槽 2.3 DataStream2.3.2 读取数据源-源算子&#xff08;Source&#xff09;2.3.3 转换算子&#xff08;Transformation&#xff09; 2.Flink学习笔记 2.1流式处理对比 学习Spark S…

ubuntu22.04上如何创建有privilege权限,有固定自定义IP的空容器

需求背景&#xff1a; 我想用docker来隔离自己的主机环境&#xff0c;来创建一个隔离的空白全新的开发环境&#xff0c;并且使之有固定的IP&#xff0c;在里面可以自由更新下载各种编译依赖&#xff0c;具有privileged权限的容器&#xff0c;以下是操作实现的具体步骤 查看do…

1.12 springboot 整合log4j打印日志

1.除去springboot自带的日志 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><!-- 除去springboot自带的日志 --><exclusion><groupId>org.sprin…

在vscode中运行Hbuilder创建的项目

想必习惯使用vscode的人突然使用HBuilder很不习惯吧&#xff0c;但是HBuilder创建的项目本身没有调试功能。当你有一个app项目但又不想使用HBuilder编写&#xff0c;需要浏览器调试的时候&#xff0c;你这时就需要一个插件了&#xff1a;uni run 插件 基于HBuilderX的采用unia…

JVM运行时区域——对象创建内存分配过程

新创建的对象&#xff0c;都存放在伊甸园区域&#xff0c;当垃圾回收时&#xff0c;将伊甸园区域的垃圾数据销毁&#xff0c;然后将存活的对象转移到幸存者0区域&#xff0c;之后创建的新的对象还是存放在伊甸园区域&#xff0c;等到再次垃圾回收后&#xff0c;将伊甸园区域和幸…

Aurix TC3xx系列MCU ADC采集时间计算方法(四)

文章目录 1 前言2 各阶段时间的计算方法2.1 计算公式2.2 采样阶段2.3 转换阶段2.4 降噪阶段2.5 校准阶段3 采集时间示例>>返回总目录<< 1 前言 在项目开发前期评估阶段,会比较关注ADC的采集时间,我们可以给出一个大概的采样的时间0.5us~1.2us左右,但是对于精确…

SpringCloud nacos 集成 feign 实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

创建型设计模式-4.原型设计模式

创建型设计模式-4.原型设计模式 原型设计模式&#xff08;Prototype Design Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在通过复制现有对象来创建新对象&#xff0c;而不是通过使用构造函数进行创建。它允许我们通过克隆&#xff08;复制&#xff09;现有对象的实…

【C++】开源:跨平台轻量日志库easyloggingpp

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍跨平台轻量日志库easyloggingpp。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&am…

【SQL应知应会】表分区(四)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分区表 • MySQL版 前言一、分区表1.非分区表2.分区…

Spring MVC异步上传、跨服务器上传和文件下载

一、异步上传 之前的上传方案&#xff0c;在上传成功后都会跳转页面。而在实际开发中&#xff0c;很多情况下上传后不进行跳转&#xff0c;而是进行页面的局部刷新&#xff0c;比如&#xff1a;上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。 1.1 JSP页面 …

centos7 访问windows系统的共享文件夹

window系统上共享文件夹 选择共享文件夹&#xff0c;点击属性 点击共享 选择用户&#xff0c;点击共享 centos系统挂载共享文件夹 创建挂载目的文件夹 mkdir -p /mnt/smb 挂载命令 mount -t cifs -o usernamezenglg,password*** //192.168.1.10/ftp /mnt/smb/其中&#xff…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 18 日论文合集)

文章目录 一、分割|语义相关(14篇)1.1 Multimodal Diffusion Segmentation Model for Object Segmentation from Manipulation Instructions1.2 Variational Probabilistic Fusion Network for RGB-T Semantic Segmentation1.3 Dense Affinity Matching for Few-Shot Segmentat…

Spring MVC拦截器和跨域请求

一、拦截器简介 SpringMVC的拦截器&#xff08;Interceptor&#xff09;也是AOP思想的一种实现方式。它与Servlet的过滤器&#xff08;Filter&#xff09;功能类似&#xff0c;主要用于拦截用户的请求并做相应的处理&#xff0c;通常应用在权限验证、记录请求信息的日志、判断用…

二十四章:SEgmentation TRansformer (SETR)——以Transformer的序列到序列的视角重新思考语义分割问题

0.摘要 最近的语义分割方法采用了全卷积网络&#xff08;FCN&#xff09;和编码器解码器架构。编码器逐渐降低空间分辨率&#xff0c;并学习具有更大感受野的抽象/语义视觉概念。由于上下文建模对于分割是至关重要的&#xff0c;最新的研究工作将重点放在增加感受野上&#xff…

Upgrading kubeadm clusters from v1.27.3 to v1.27.4

文章目录 1. Before you begin2. Notes3. Master3.1 Login into the first node and upgrade the kubeadm tool only3.2 Verify the upgrade plan3.3 Drain the control plane node3.4 kubeadm upgrade3.5 Uncordon the control plane node3.6 Upgrade kubelet and kubectl3.7 …