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

前言

官方文档:Kubernetes 文档 | Kubernetes

系统配置 CentOS 7.9(2 核 2 G)

本文为 k8s 入门指南专栏,将会使用 kubeadm 搭建单节点 k8s 集群,详细讲解环境搭建部署的细节,专栏后面章节会以实战代码介绍相关概念,带您快速入门 k8s

搭建方式

k8s 集群搭建有三种方式,目前主流的搭建 k8s 集群的方式有 kubeadm、minikube,二进制包

kubeadm

  • 是一个工具,用于快速搭建 kubernetes 集群,目前应该是比较方便和推荐的,简单易用
  • kubeadm 是 Kubernetes 1.4 开始新增的特性
  • kubeadm init 以及 kubeadm join 这两个命令可以快速创建 kubernetes 集群

minikube

  • 一般用于本地开发、测试和学习,不能用于生产环境
  • 是一个工具,minikube 快速搭建一个运行在本地的单节点的 Kubernetes

二进制包

  • 在官网下载相关的组件的二进制包,上面的两个是工具,可以快速搭建集群,也就是相当于用程序脚本帮我们装好了集群,前两者属于自动部署,简化部署操作,自动部署屏蔽了很多细节,使得对各个模块感知很少,遇到问题很难排查,如果手动安装,对 kubernetes 理解也会更全面。
  • 目前生产环境的主流搭建方式,已在生产环境验证,kubeadm 也可以搭建生产环境,不过 kubeadm 应该还没有被大规模在生产环境验证

本次我们作为演示的是 kubeadm

环境准备

官方文档:安装 kubeadm | Kubernetes

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

安装 Docker

官方文档:Install Docker Engine on CentOS | Docker Docs

安装脚本如下

bash 复制代码
#!/bin/bash

set -e
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker
sudo docker run hello-world

配置如下

bash 复制代码
cat > /etc/docker/daemon.json << EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

如果在国内,可以配置镜像加速

阿里云镜像加速地址:容器镜像服务镜像构建镜像授权_镜像托管-阿里云 (aliyun.com)

然后复制上面地址

bash 复制代码
# 更换镜像为阿里云
vim /etc/docker/daemon.json
# 添加如下内容
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}

systemctl restart docker
docker info

禁用 SELinux

将 SELinux 设置为 permissive 模式

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

关闭 Swap

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

修改/etc/fstab文件,注释掉SWAP的自动挂载,使用free -m确认 swap 已经关闭。
swappiness参数调整,修改/etc/sysctl.d/k8s.conf 添加下面一行:

bash 复制代码
vm.swappiness=0

执行 sysctl -p /etc/sysctl.d/k8s.conf 使修改生效

关闭防火墙

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

bash 复制代码
sudo systemctl stop firewalld
sudo systemctl disable firewalld

查看是否安装成功

bash 复制代码
kubeadm version
kubectl version --client
kubelet --version

其他

设置允许 iptables 检查桥接流量

bash 复制代码
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

安装相关插件

bash 复制代码
yum -y install socat conntrack-tools

集群搭建

安装 kubeadm

官方文档:安装 kubeadm | Kubernetes

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

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

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

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

执行如下脚本安装 kubeadm(国内线路)

bash 复制代码
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF
yum install -y kubelet-1.20.2 kubeadm-1.20.2 kubectl-1.20.2 --disableexcludes=kubernetes
systemctl enable --now kubelet

安装 kubectl

bash 复制代码
curl -Lo kubectl "https://storage.googleapis.com/kubernetes-release/release/v1.20.2/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/

拉取镜像

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

bash 复制代码
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

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

bash 复制代码
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

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

修改主机映射

bash 复制代码
vim /etc/hosts

初始化服务

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

bash 复制代码
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. 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

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

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

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

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

bash 复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

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

bash 复制代码
export KUBECONFIG=/etc/kubernetes/admin.conf

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

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

bash 复制代码
kubeadm join 172.25.234.148:6443 --token ls55pz.ed4wq51xex0ho1hh \
    --discovery-token-ca-cert-hash sha256:a082bb7e27b8c26625edeb8198e49967bd4dd4493b3b532c750a9f98f912f801

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

bash 复制代码
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

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

bash 复制代码
kubectl get nodes

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

bash 复制代码
kubectl get nodes -o yaml

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

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

bash 复制代码
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

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

总结

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

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

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

参考链接

本文由博客一文多发平台 OpenWrite 发布!

相关推荐
SUPER52661 小时前
FastApi项目启动失败 got an unexpected keyword argument ‘loop_factory‘
java·服务器·前端
咕噜咕噜啦啦2 小时前
Eclipse集成开发环境的使用
java·ide·eclipse
光军oi5 小时前
全栈开发杂谈————关于websocket若干问题的大讨论
java·websocket·apache
weixin_419658315 小时前
Spring 的统一功能
java·后端·spring
小许学java5 小时前
Spring AI-流式编程
java·后端·spring·sse·spring ai
haogexiaole6 小时前
Java高并发常见架构、处理方式、api调优
java·开发语言·架构
EnCi Zheng6 小时前
@ResponseStatus 注解详解
java·spring boot·后端
wdfk_prog6 小时前
闹钟定时器(Alarm Timer)初始化:构建可挂起的定时器基础框架
java·linux·数据库
怎么没有名字注册了啊7 小时前
C++后台进程
java·c++·算法
z日火7 小时前
Java 泛型
java·开发语言