使用 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 Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma