ReturnTmp's Blog ReturnTmp's Blog
首页
基础课程
编程语言
框架技术
运维笔记
人工智能
随笔摘录
  • 友链
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

ReturnTmp

分享有趣好玩的计算机知识
首页
基础课程
编程语言
框架技术
运维笔记
人工智能
随笔摘录
  • 友链
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • GLIBC_2.28 not found 问题解决
  • Monorepo 多项目单仓库
  • Renovate 第三方依赖更新监控
  • 【IDEA】Maven 构建项目生成文件解析
  • K8s

    • k8s 入门指南
    • K8s 集群 Windows 安装部署指南
    • K8s 部署
    • K8s 入门指南(一):单节点集群环境搭建
    • K8s 入门指南(一):单节点集群环境搭建(ubuntu)
      • 前言
      • 环境准备
        • 安装 Docker
        • 禁用 SELinux
        • 关闭 Swap
        • 关闭防火墙
        • 其他
      • 集群搭建
        • 安装 kubeadm
        • 拉取镜像
        • 修改主机映射
        • 初始化服务
      • 总结
      • 参考链接
    • K8s 入门指南(二):实战概念讲解
  • Zotero 使用指南
  • package-lock.json 是否提交问题
  • 『ARM』和『x86』处理器架构解析指南
  • GlassFish 安装配置
  • 手把手教你安装配置『Oracle Database 19c』
  • Oracle Database 19c 彻底卸载
  • 语雀故障回顾
  • OpenStack 云计算平台 Nova 计算服务学习指南
  • Vue devServer 教程
  • Swagger 导出 API 文档
  • MapStruct POJO 映射框架指南
  • IDEA 代码热部署和热加载
  • SpringBoot 启动参数配置
  • Nacos 入门指南
  • seleuim 指南
  • Spring 服务降级熔断
  • Maven BOM 解析
  • .vscode 文件夹
  • Spring Security Token 认证
  • SpringBoot 基于 Actuator 和 Admin 实现应用监控管理
  • SPM/SCM 流量跟踪体系
  • Netty 入门
  • Flyway 数据库版本管理实战指南
  • Swagger 2 和 3 安装区别
  • MP 配置分页
  • MySQL 分库分表
  • Git Commit 提交规范,变更日志、版本发布自动化和 Emoji 提交标准
  • VSCode 插件 i18n Ally 进行国家化配置
  • Vue3 组合式 全局挂载
  • TS 教程
  • 架构解析:同城双活、异地多活、单元化架构
  • Spring 跨域配置
  • SpringCloud 微服务实战
  • Sentinel 流量治理组件教程
  • leetcode 上分
  • JMeter 压测
  • Netty IM 系统
  • IDEA 插件开发
  • SpringBoot 邮件服务 集成配置 详解
  • Maven 依赖包冲突问题解决
  • 社区项目 forest 修改
  • Maven 项目命名规范
  • 新版 PyCharm 设置 Conda 虚拟环境
  • 框架工具
  • K8s
ReturnTmp
2023-12-14
目录

K8s 入门指南(一):单节点集群环境搭建(ubuntu)

# 前言

本文为 K8s 入门指南(一):单节点集群环境搭建 的姊妹篇,针对 ubuntu(ubuntu 22.04) 系统进行安装配置

# 环境准备

官方文档:安装 kubeadm | Kubernetes (opens new window)

注:如果是使用的云服务器,下面的 swap、selinux 和防火墙都是默认关闭的,无需进行对应操作

# 安装 Docker

官方文档:Install Docker Engine on Ubuntu | Docker Docs (opens new window)

# 禁用 SELinux

将 SELinux 设置为  permissive  模式

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
1
2
3

# 关闭 Swap

Kubernetes 1.8 开始要求关闭系统的 Swap。如果不关闭,默认配置下 kubelet 将无法启动。可以通过 kubelet 的启动参数--fail-swap-on=false更改这个限制。我们这里简单起见,直接关闭系统的 Swap

禁用交换内存

暂时禁止:

sudo swapoff -a  
1

永久禁止:

sudo vim /etc/fstab
1

在此文件中,注释掉该 /swapfile 行

# 关闭防火墙

如果各个主机启用了防火墙,需要开放 Kubernetes 各个组件所需要的端口

sudo systemctl stop ufw
sudo systemctl disable ufw
1
2

# 其他

设置允许 iptables 检查桥接流量

cat > /etc/modules-load.d/k8s.conf << EOF
br_netfilter
EOF

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system
1
2
3
4
5
6
7
8
9
10

# 集群搭建

sudo apt-get install -y ca-certificates curl software-properties-common apt-transport-https curl

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt-get update

sudo apt-get install -y kubelet kubeadm kubectl
1
2
3
4
5
6
7
8
9
10
11
sudo apt-mark hold kubelet kubeadm kubectl
1

# 安装 kubeadm

官方文档:安装 kubeadm | Kubernetes (opens new window)

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

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

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

kubeadm 不能帮你安装或者管理 kubelet 或 kubectl,所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。然而,控制平面与 kubelet 之间可以存在一个次要版本的偏差,但 kubelet 的版本不可以超过 API 服务器的版本。例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。

更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:

sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
1
2
3

下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略 URL 中的版本 (适用于 Kubernetes 1.20.2):

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.20.2/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
1

添加 Kubernetes apt 仓库

# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.20.2/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
1
2

更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
1
2
3

注:在 Debian 12 和 Ubuntu 22.04 之前的早期版本中,默认情况下不存在 /etc/apt/keyrings 目录;你可以通过运行 sudo mkdir -m 755 /etc/apt/keyrings 来创建它

kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环

查看是否安装成功

kubeadm version
kubectl version --client
kubelet --version
1
2
3

# 拉取镜像

执行 kubeadm config images pull 拉取镜像,但是很大可能因为网络原因连接失败,可以使用如下阿里云命令(版本 v 1.21)

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull coredns/coredns:1.7.0
1
2
3
4
5
6
7

在 k8s 安装时会默认在镜像中获取 k8s. gcr. io 前缀的镜像,所以我们需要将上文下载好的镜像更改名称

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.1 k8s.gcr.io/kube-apiserver:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.1 k8s.gcr.io/kube-proxy:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.1 k8s.gcr.io/kube-controller-manager:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.1 k8s.gcr.io/kube-scheduler:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag coredns/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0
1
2
3
4
5
6
7

注:后面 kubeadm init初始集群的时候可能报错,显示镜像版本不对应,自行更改上面的版本即可,重新 docker pull 和 docker tag 即可,群体替换版本即可(1.21.1 -> 1.20.15),我这里就是偶尔需要用 1.21.1 版本,偶尔需要用 1.20.15 版本,所以我索性给这两个版本镜像都拉取到本地

# 修改主机映射

vim /etc/hosts
1

image.png

# 初始化服务

在初始化集群之前需要先重启下 kubelet systemctl restart kubelet

kubeadm init --apiserver-advertise-address=172.25.234.148 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.21.1
# 或
kubeadm init
1
2
3

解释下命令

  1. kubeadm init: 这是命令的主体部分,它告诉 kubeadm 初始化一个新的 Kubernetes 控制平面。
  2. --apiserver-advertise-address=192.168.44.15: 这个选项指定 Kubernetes API Server 监听的网络地址。在这里,它设置为 192.168.44.15。
  3. --pod-network-cidr=10.244.0.0/16: 这个选项指定用于 Pod 网络的 CIDR 地址范围。这是容器之间通信的地址范围。在这里,它设置为 10.244.0.0/16。
  4. --kubernetes-version=v1.21.1: 这个选项指定要安装的 Kubernetes 版本,这里设置为 v1.21.1。

如果出现问题,需要自行查看日志然后搜索解决(因为可能的出现错误太多,这里没法一一列出)

image.png

可以尝试重新启动 kubelet systemctl restart kubelet ,然后重置集群kubeadm reset,然后再次尝试初始化

image.png

注意:这里我使用的是 kubeadm init 初始化集群

下面解释成功日志输出,要使非 root 用户可以运行 kubectl,请运行以下命令,它们也是 kubeadm init 输出的一部分

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

如果是 root 用户,可以运行如下

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

我们可以运行 kubectl apply -f [podnetwork].yaml 部署 Pod 网络

然后如果多集群部署,并且多服务器之间内网是连通的话,可以使用如下命令添加工作节点

kubeadm join 172.25.234.148:6443 --token ls55pz.ed4wq51xex0ho1hh \
    --discovery-token-ca-cert-hash sha256:a082bb7e27b8c26625edeb8198e49967bd4dd4493b3b532c750a9f98f912f801
1
2

然后我们可以安装 Flannel,Flannel 通过给每台宿主机分配一个子网的方式为容器提供虚拟网络,它基于 Linux TUN/TAP,使用 UDP 封装 IP 包来创建 overlay 网络,并借助 etcd 维护网络的分配情况

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
1

最后验证节点,如果为 Ready 则 master 节点已经注册到了 k 8 s

kubectl get nodes
1

如果是 NotReady,可以执行以下语句判断服务器状态

image.png

kubectl get nodes -o yaml
1

然后查看 kubelet 日志 journalctl -f -u kubelet.service

部分日志显示错误:networkPlugin cni failed to set up pod

vim /etc/yum.repos.d/kubernetes.repo

gpgcheck=0
repo_gpgcheck=0
# 上面两项修改如下
gpgcheck=1
repo_gpgcheck=1

# 然后执行如下
yum clean all
yum install kubernetes-cni -y
1
2
3
4
5
6
7
8
9
10
11

最后可以看到节点添加成功

image.png

# 总结

至此单节点环境部署已经结束,博主刚刚接触学习 k8s,希望和大家分享学习中的经验教训,如果文中有错误纰漏还望各位指出

后面专栏大概还会有一到两个章节,以实战 demo 代码学习 Pod,Deployment,Service 等概念

除此之外的话,我自己也尝试过 windows(WSL 2)搭建 minikube k8s 环境,不是很理想,哪怕是对于学习目的也并不推荐。然后其实相较于 CentOS 其实官方更推荐使用 Ubuntu ,官方社区长期维护,也比较稳定

sudo apt update
sudo apt upgrade -y

# 禁用防火墙
sudo systemctl disable ufw
sudo apt install -y policycoreutils
sudo setenforce 0
sudo sed -i 's#=permissive#=disabled#g' /etc/selinux/config
sudo sestatus  #确保状态为disabled

# 禁用swap分区
sudo swapoff -a
sudo sed -ri 's/.swap./#&/' /etc/fstab
# 或者编辑下面文件,注释掉swap这一行
sudo vim /etc/fstab


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 参考链接

  • ubuntu20.04安装minikube - Hu知非 - 博客园 (cnblogs.com) (opens new window)

room.jpg

编辑 (opens new window)
上次更新: 2024/01/02, 01:26:45
K8s 入门指南(一):单节点集群环境搭建
K8s 入门指南(二):实战概念讲解

← K8s 入门指南(一):单节点集群环境搭建 K8s 入门指南(二):实战概念讲解→

最近更新
01
百度网盘加速
03-24
02
新版 PyCharm 设置 Conda 虚拟环境
03-24
03
腾讯云域名转到阿里云
03-24
更多文章>
Theme by Vdoing | Copyright © 2023-2024 ReturnTmp | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式