使用 Kubeadm 搭建个公网 k8s 集群(单控制平面集群)

2024-05-08 07:28

本文主要是介绍使用 Kubeadm 搭建个公网 k8s 集群(单控制平面集群),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

YY:国庆的时候趁着阿里云和腾讯云的轻量级服务器做促销一不小心剁了个手😎😢,2 Cores,4G RAM 还是阔以的,既然买了,那不能不用呀🚩,之前一直想着搭建个 k8s 集群玩玩,本地开发机虽然起了个 k8s(拿 Docker Desktop 起的,不 dei 劲),但就一个 Node,不爽,对 k8s 的体验不到位😒,1024,是时候用起来了,折腾一下,顺便让最近浮躁的心冷静一下。

这次拿官方的 Kubeadm 耍一下,以阿里云的轻量级应用服务器为 Control 节点,腾讯云的轻量级应用服务器为 Worker 节点,说干就干。

Check 一下文档要求 - 准备工作

Kubenetes 官方文档给出了 Kubeadm 起 k8s 集群的几点要求,在这里微微检查下两台轻量级云服务器:

  • A compatible Linux host. The Kubernetes project provides generic instructions for Linux distributions based on Debian and Red Hat, and those distributions without a package manager.[我们用的 Ubuntu 20.04,那肯定符合 Debian 系的].
  • 2 GB or more of RAM per machine (any less will leave little room for your apps).[4G, 我们很 OK, 但感觉后面会拉跨].
  • 2 CPUs or more. [正好一台 2个 CPU, nice].
  • Full network connectivity between all machines in the cluster (public or private network is fine).[两台轻量级应用服务器都有公网 IP,那必须互通啊].
  • Unique hostname, MAC address, and product_uuid for every node.[这里得微微 check 一下两台服务器,cat /sys/class/net/eth0/address 看下 MAC 地址,sudo cat /sys/class/dmi/id/product_uuid 看下 product_uuid, hostname 看下主机名,emmm, correct!]
  • Certain ports are open on your machines. [这里得到阿里云轻量级服务器 & 腾讯云的轻量级应用服务器的防火墙开放下相关 TCP 端口]。

阿里云轻量级应用服务器开启 Control(控制平面)节点的 TCP 端口,这里要对照下文档给出的需要开放的端口:

Control Plane Open Ports

Aliyun Control Node

腾讯云轻量级应用服务器开启 Worker(工作)节点的 TCP 端口:

Worker Node Open Ports

Tencent Cloud Worker Node

  • Swap disabled. You MUST disable swap in order for the kubelet to work properly. [为了让 kubelet 起来,要把 Swap 分区关闭,使用 free -mh 看下 Swap 是否在使用, swapoff -a 关闭 Swap 分区].

参考:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

为什么需要关闭 Swap 分区,有 dalao 做了分析:https://www.jianshu.com/p/6f3268ce642f

  • Letting iptables see bridged traffic.

这里照着文档,一波操作下两台服务器:

sudo modprobe br_netfiltercat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --systemlsmod | grep br_netfilter
  • Container Runtime Interface(CRI). [这里需要安装下 Pod 运行需要的容器运行时,我们选择 Docker].
apt-get update
apt-get install -y apt-transport-https \software-properties-common \ca-certificates \curl \gnupg \lsb-release
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io

安装完毕还需要将 Docker 的 cgroup driver 替换为 systemd,确保与 Kubeneters 使用的一致。

cat>>/etc/docker/daemon.json<<EOF
{"exec-opts": ["native.cgroupdriver=systemd"]
}
EOFsystemctl daemon-reload
systemctl restart docker

安装 kubeadm, kubelet, kubectl

上面检查工作如果很顺利的话,接下来就可以准备 kubeadm, kubelet, kubectl 安装了,不过我们还得给 apt 添加 Kubenetest 软件源,官方文档中使用的如软件源是 Google 域名下的,国内云服务器访问会有问题(懂得都懂了😂),这里使用国内得源,这里两台服务器都操作一下:

# 1、添加 GPG Key
sudo curl -fsSL http://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
# 2、添加 k8s 软件源
sudo add-apt-repository "deb http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main"
3、update 一下
apt-get update

上面执行没有问题的话,就可以开始安装 kubelet kubeadm kubectl了:

sudo apt-get install -y kubelet kubeadm kubectl# 查看安装的版本, apt install apt-show-versions
apt-show-versions kubectl kubelet kubeadm
# 让 kubelet 开机启动
sudo systemctl start kubelet
sudo systemctl enable kubelet
  • kubeadm: 引导启动 Kubernate 集群的命令行工具。
  • kubelet: 在群集中的所有计算机上运行的组件, 并用来执行如启动 Pods 和 Containers 等操作。
  • kubectl: 用于操作运行中的集群的命令行工具。

初始化集群

为了能够让集群初始化更快,我们可以先预拉取集群初始化依赖的镜像,emmm,官方文档给出的又是 Google 的网址,这里我们基于 GitHub -> AliyunContainerService/k8s-for-docker-desktop 项目做镜像的快速拉取。确保相关镜像版本与 kubelet 保持一致(这里是 v1.22.2), kubeadm config images list --kubernetes-version v1.22.2 可查看需要哪些镜像。

git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git && cd k8s-for-docker-desktoprm -f images.properties
# 调整镜像版本
cat>>images.properties<<EOF
k8s.gcr.io/pause:3.5=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5
k8s.gcr.io/kube-controller-manager:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.22.2
k8s.gcr.io/kube-scheduler:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.22.2
k8s.gcr.io/kube-proxy:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.22.2
k8s.gcr.io/kube-apiserver:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.22.2
k8s.gcr.io/etcd:3.5.0-0=registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.0-0
k8s.gcr.io/coredns/coredns:v1.8.4=registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.4
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1=registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1
EOF
# 拉取镜像
./load_images.sh

初始化控制平面节点(Control Plane Node(s))

控制(Control)节点 {阿里云轻量级应用服务器} 的镜像预拉取完毕后,可执行如下命令进行初始化操作:

# api server IPv4 地址使用公网 IP
kubeadm init \--pod-network-cidr=10.244.0.0/16 \--kubernetes-version v1.22.2# --apiserver-advertise-address 120.79.73.159

为当前 root 用户生成 kubeconfig:

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

安装 CNI(Container Network Interface) -> Flannel

curl --insecure -sfL https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml | kubectl apply -f -

查看节点状况,emmm,Ready 没毛病

root@iZwz92a65mqaa8zwy83dpnZ:~/k8s-for-docker-desktop# kubectl get nodes
NAME                      STATUS   ROLES                  AGE    VERSION
izwz92a65mqaa8zwy8   Ready    control-plane,master   4m6s   v1.22.2

添加工作节点(Worker Node(s))

接下来我们将 Worker 节点加入到集群中,由于我们在初始化控制平面所在的主节点时并没有指定公网 IP,所以这里先做个 IP 转发,让 Worker 节点能够和控制平面节点间进行通信。

iptables -t nat -A OUTPUT -d <初始化控制平面节点得到的 IP> -j DNAT --to-destination <阿里云轻量级服务器公网 IP>

然后我们将 Worker 节点 join 进集群中:

kubeadm join <初始化控制平面节点得到的 IP>:6443 --token 4zicbp.d1wertghxdgcgz6y --discovery-token-ca-cert-hash sha256:1912dbf415da652f97b9fa728cb85dd338e17b24ee338ec48b073c8fa8sdfgth

顺利的话😊,那么结果如下:

worker join

然后到控制节点看下集群节点状态,顺利的话结果如下🤣:

root@iZwz92a65mqdpnZ:~/k8s-for-docker-desktop# kubectl get nodes
NAME                      STATUS   ROLES                  AGE    VERSION
izwz92a65mqaa8zwy83dpnz   Ready    control-plane,master   48m    v1.22.2
vm-8-4-ubuntu             Ready    <none>                 8m9s   v1.22.2

参考

  • Installing kubeadm
  • 使用 Kubeadm 部署
  • 解决阿里云ECS下kubeadm部署k8s无法指定公网IP

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

这篇关于使用 Kubeadm 搭建个公网 k8s 集群(单控制平面集群)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969689

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali