k8s之基于kubeadm搭建k8s集群

news2024/9/29 11:29:05

写在前面

你可能知道搭建k8s集群的kind,minikube工具,但是他们都太简单了,不能满足生产级的要求,想要真正的部署生产级别的k8s集群,我们还需要另外一个集群管理工具kubeadm ,本文就一起看下如何使用该工具来搭建k8s集群。

在这里插入图片描述

1:部署架构图

在这里插入图片描述

节点说明:

Console,用来安装kubectl工具,1核1G内存,操作k8s集群,该机器只是逻辑上的,如果只是为了学习,可以直接在master node操作,真实的生产环境还是要有一个Console的
Master:Master Node,2核4G内存,如果资源充足也可以再多给些
Worker:Worker Node,1核1G内存,如果资源充足也可以再多给些

另外Flannel是集群内部使用的网络插件 ,用来构建内部的私有网络。Docker Registry是Docker注册中心,这个无需多说。

再看下我本地的环境:

Console:直接使用Master Node
Master:2核4G 192.168.64.131 Ubuntu 11.3.0
Worker:1核1G 192.168.64.132 Ubuntu 11.3.0

2:准备工作

以下操作如无特别说明均是在Master和Worker都要做。

2.1:修改主机名

k8s会通过主机名来识别节点,所以不可重复,如下我的修改结果:

Mastre:
    dongyunqi@mongodaddy:~/k8s$ cat /etc/hostname 
    mongodaddy
Worker:
    dongyunqi@mongomummy:~/k8s/images$ cat /etc/hostname 
    mongomummy

2.2:修改docker配置

dongyunqi@mongodaddy:~/k8s$ cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://8csof3cn.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
     "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

其中"exec-opts": ["native.cgroupdriver=systemd"]修改cgroup比较重要,不过你可以直接复制我的,毕竟我也是直接复制别人的。

2.3:修改iptables

因为k8s需要构建自己的网络系统,为了能够让其转发网络流量,所以需要做此修改,如下:


cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF

sudo sysctl --system

2.4:关闭swap

该操作的目的是,避免内存操作可能发生的IO,提升k8s性能,如下:

sudo swapoff -a && sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

到这里,为了让配置生效,我们最好重启下系统。

2.5:安装kubeadm

如下:

sudo apt install -y apt-transport-https ca-certificates curl

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

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

sudo apt update

sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00

kubeadm version
kubectl version --client

在这里插入图片描述

最后执行如下命令,避免版本意外升级:

sudo apt-mark hold kubeadm kubelet kubectl

3:正式安装

3.1:下载kubeletes组件镜像

为了加快下载的速度,我们可以提前从minikube中获取需要的镜像,然后docker load到本地,如下查看需要的镜像:

kubeadm config images list --kubernetes-version v1.23.3

k8s.gcr.io/kube-apiserver:v1.23.3
k8s.gcr.io/kube-controller-manager:v1.23.3
k8s.gcr.io/kube-scheduler:v1.23.3
k8s.gcr.io/kube-proxy:v1.23.3
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6

然后我们就可以从minikube的虚拟主机中将镜像通过docker save,生成镜像tar如docker save dongsir2018/test-push-dockerhub:0.1 -o /home/dongyunqi/push.tar,然后通过
minikube cp,如minikube cp minikube:/home/docker/etcd.tar /home/dongyunqi/k8s/allimages/etcd.tar拷贝到宿主机,最后通过docker load -i,如docker load -i pause.tar加载镜像,参考下图:

在这里插入图片描述

如果你觉得麻烦也可以,也可以从以下地址下载:

coredns , pause , kube-scheduler , kube-proxy , kube-controller-manager , kube-apiserver , etcd 。

3.2:Master节点操作

使用kubeadm init创建k8s集群:

sudo kubeadm init \
    --pod-network-cidr=10.10.0.0/16 \
    --apiserver-advertise-address=你的master IP地址 \
    --kubernetes-version=v1.23.3

安装成功后会有如下输出:

To start using your cluster, you need to run the following as a regular user:

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

目的是将kubetcl的配置文件替换为k8s的版本,直接执行上述命令即可。另外kubeadm join提示信息要保存好,后续Worker加入集群的时候会用到,可能如下:

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.64.131:6443 --token whzch5.wkwijvkqo5xgyswm \
	--discovery-token-ca-cert-hash sha256:b51aed32be23df09e5afe6fe1f6c2033ded3b246339a4c599837f3857c1173dc

执行完成后我们就可以查看集群的节点了,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl get node
NAME         STATUS   ROLES                  AGE    VERSION
mongodaddy   NotReady    control-plane,master   16h    v1.23.3

可以看到此时只有一个主机名为mongodaddy的节点,也就是我们的Master节点,Status是NotReady,这是因为目前k8s的网络环境没有创建完成,需要安装网络插件,来让k8s的网络恢复正常,这里使用Flannel,首先我们需要Flannel的yaml,可以从这里 或者是这里 下载,但是注意如下net-conf.json部分内容

  net-conf.json: |
    {
      "Network": "10.10.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

中的Network一定要和上面执行kubeadm init设置的--pod-network-cidr一致,因为都是k8s集群中的网络地址。然后执行kubectl apply -f kube-flannel.yml,稍等一会再执行kubectl get nodeMaster Node就恢复正常了,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl get node
NAME         STATUS   ROLES                  AGE    VERSION
mongodaddy   Ready    control-plane,master   16h    v1.23.3

此时我们的k8s集群就创建成功了,只不过master node还是光杆司令。

3.3:Worker节点操作

只需要执行join命令就可以了,如下:

dongyunqi@mongomummy:~/k8s/images$ sudo kubeadm join 192.168.64.131:6443 --token whzch5.wkwijvkqo5xgyswm \
> --discovery-token-ca-cert-hash sha256:b51aed32be23df09e5afe6fe1f6c2033ded3b246339a4c599837f3857c1173dc
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W0109 11:35:48.242996   55928 utils.go:69] The recommended value for "resolvConf" in "KubeletConfiguration" is: /run/systemd/resolve/resolv.conf; the provided value is: /run/systemd/resolve/resolv.conf
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

然后到Master Node查看结果:

dongyunqi@mongodaddy:~/k8s$ kubectl get node
NAME         STATUS   ROLES                  AGE    VERSION
mongodaddy   Ready    control-plane,master   16h    v1.23.3
mongomummy   Ready    <none>                 145m   v1.23.3

到这里,操作就全部完成了。

写在后面

参考文章列表:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32MP157驱动开发——Linux下的单总线驱动

STM32MP157驱动开发——Linux下的单总线驱动0.前言一、DS18B20 及工作时序简介1.DS18B20 简介2.DS18B20 时序简介4.DS18B20温度读取流程二、DHT11 及工作时序简介1.DHT11 简介2.DHT11 工作时序简介三、驱动开发1.DS18B20驱动1&#xff09;修改设备树2&#xff09;驱动编写2.测试…

IB生物:干细胞与生命的各种功能

国际学校生物老师解读IB生物&#xff0c;感兴趣的同学记得收藏哦~IB生物分为SL(standard level)和HL(higher level)SL有6个topic∶细胞生物&#xff0c;分子生物&#xff0c;遗传学&#xff0c;生态学&#xff0c;物种进化以及多样性和人体生理。HL除了上述6个topic外还要加上∶…

Python入门基础实例讲解——两个数字比大小,并输出最大值

嗨害大家好鸭&#xff01; 我是小熊猫~ 今天也是给大家带来干货的一天~ pycharm永久激活码可以从这里找到我&#xff1a; 输出&#xff1a;print&#xff08;&#xff09; print() 方法用于打印输出&#xff0c;最常见的一个函数。 比较运算符 >&#xff1a; 大于&#…

关于校园网的各种连接问题

校园网网络使用异常&#xff0c;掉线、卡顿以及无法连接网络&#xff0c;经网络上收据的信息&#xff0c;大致分为五类&#xff1a;1.能获取到校园网地址如10.*.*.*&#xff0c;但无法跳出认证界面。2.物理链路故障&#xff1b;3.IP配置故障&#xff1b;4. 网络正常&#xff0c…

SpringCloud高级应用-1(SpringCloud技术栈概览)

1、SpringCloud技术栈 开发分布式系统可能具有挑战性&#xff0c;复杂性已从应用程序层转移到网络层&#xff0c;并要求服务之间进行更多的交互。将代码设为“cloud-native”就需要解决12-factor&#xff0c;例如外部配置&#xff0c;服务无状态&#xff0c;日志记录以及连接…

【矩阵论】8. 常用矩阵总结——单阵,正规阵,幂0阵,幂等阵,循环阵

矩阵论 1. 准备知识——复数域上矩阵,Hermite变换) 1.准备知识——复数域上的内积域正交阵 1.准备知识——Hermite阵&#xff0c;二次型&#xff0c;矩阵合同&#xff0c;正定阵&#xff0c;幂0阵&#xff0c;幂等阵&#xff0c;矩阵的秩 2. 矩阵分解——SVD准备知识——奇异值…

基于Promethus+Grafana搭建监控系统

简介 ● 监测数据类型&#xff1a;JVM数据、在线人数、消息时延等 ● 接入Prometheus性能监测工具&#xff0c;暴露服务器性能监测数据 ○ 模式&#xff1a;pull/push ● 接入Grafana可视化数据 搭建流程 准备环境 Java客户端配置 <!-- The client --> <depende…

IDEA 的Http接口调试工具

简介 这个工具我们可以完成绝大部分http请求&#xff0c;是一个不错的post-man替代工具 插件安装 在使用之前先确保 HTTP Client插件的安装&#xff0c;如果已经安装请无视这一步 > 安装后记得重启IDE编辑器确保插件可以正常使用 插件使用 描述&#xff1a; 所有HTTP请求…

2023年1月6日星期五-PPP/BPP相关学习-旧版重写

1. 独立均匀分布 matlab的rand指令可以帮助我们生成[0,1]的均匀分布的数据&#xff0c;这样&#xff0c;如果我们想要[a,b]的分布数据&#xff0c;只需要a(b-a)*rand就可以了。 [a,b] 均值μ&#xff0c;标准差 均值 标准差 matlab代码&#xff1a; %% 生成一个n行p列的矩…

Excel 中合并单元格的快捷键(ALT+H+M+M)

要在 excel 中合并单元格,首先选择要合并到一个单元格中的单元格,然后可以使用从ALT开始的快捷键,然后同时按H+M+M。 一旦我们使用快捷键执行该函数,它将弹出一条警告消息“合并单元格时,仅保留左上角的值,而放弃其他值“。如果我们继续,单元格将被合并,只保留一个值。…

Nature chemistry|机器学习可以克服自组装肽发现中的人类偏见

题目&#xff1a;Machine learning overcomes human bias in the discovery of self-assembling peptides 文献来源&#xff1a;Nature Chemistry | Volume 14 | December 2022 | 1427–1435 代码&#xff1a;https://doi.org/10.5281/zenodo.6564202&#xff08;非商业化证书…

Java安全:SecurityManager与AccessController

前言 什么是安全&#xff1f; 程序不能恶意破坏用户计算机的环境&#xff0c;比如特洛伊木马等可自我进行复制的恶意程序。程序不可获取主机及其所在网络的私密信息。程序的提供者和使用者的身份需要通过特殊验证。程序所涉及的数据在传输、持久化后都应是被加密的。程序的操…

Hudi的核心概念 —— 文件布局(File Layout)

文章目录文件布局&#xff08;File Layout&#xff09;Hudi 存储分为两个部分文件布局&#xff08;File Layout&#xff09; Hudi 将一个表映射为如下文件结构 Hudi 存储分为两个部分 &#xff08;1&#xff09;元数据&#xff1a;.hoodie 目录对应着表的元数据信息&#xff…

Vivado综合设置之-no_lc

本文详细讨论了当勾选或者不勾选-no_lc时的差异&#xff0c;也详细介绍了using O5 and O6以及using O6 output only的具体含义。 -no_lc表示NO LUT Combining&#xff0c;即无LUT整合&#xff0c;默认不勾选&#xff0c;即默认有LUT整合。LUT整合可以减少对LUT的使用量&#x…

架构设计---数据库的存储优化

前言&#xff1a; 互联网系统架构中&#xff0c;承受着最大出力压力&#xff0c;最难以被伸缩的&#xff0c;就是数据存储部分&#xff0c;原因主要有两方面&#xff0c;一方面&#xff0c;数据存储需要使用硬盘&#xff0c;而硬盘的处理速度要比其他几种计算资源都要慢&#…

6、Servlet——网络协议、HTTP协议、HTTP报文格式

目录 一、网络协议 1、网络协议三要素 2、层次结构 3、层次划分 二、HTTP协议 1、HTTP工作原理 2、HTTP协议特点 3、 三次握手 4、四次挥手 三、HTTP报文格式 1、请求报文 2、响应报文 一、网络协议 网络协议&#xff0c;简称协议 &#xff0c;网络协议是通信计算…

【Python百日进阶-数据分析】Day150 - plotly使用日期类型轴的时间序列 1

文章目录一、使用轴类型的时间序列date1.1 使用 plotly.express1.2 使用 graph_objects二、Dash 中的时间序列三、日期轴上的不同图表类型3.1 相对股票代码值的条形图3.2 多面区域图四、配置刻度标签五、将刻度标签移动到期间的中间六、用直方图总结时间序列数据七、显示期间数…

macOS 上安装和配置 Flutter 开发环境

本文基于此&#xff1a; Flutter中文网 一、安装和运行Flutter的系统环境要求 想要安装并运行 Flutter&#xff0c;你的开发环境需要最低满足以下要求&#xff1a; 操作系统:macOS磁盘空间:2.8 GB(不包括IDE/tools的磁盘空间)。工具:Flutter使用git进行安装和升级。我们建议安…

vue3中的写法以及,一些语法糖

vue3新增setup&#xff0c;属性执行比 created更早,同时setup中this不会指向实例&#xff09;这个方法在onBeforeMounted之前被调用。定义数据需要在数据前面加ref&#xff0c;ref在vue3中是将数据转换成响应式数据结构的一种,因为vue3中没有了data(){ },那么就没办法劫持数据做…

PDF拆分成多个页面怎么办?这三个方法让你实现将文件拆分成多页

PDF是我们常见的文件格式之一&#xff0c;在日常办公中&#xff0c;我们经常会将WORD、PPT、EXCEL等文档转换成PDF的格式后再进行传输&#xff0c;这样不仅传输速度快&#xff0c;格式也不会出现乱码的情况&#xff0c;但在一些特殊的场景下&#xff0c;我们也需要将一份完整的…