kebuadm部署k8s集群

官方文档:

Installing kubeadm | Kubernetes

切记要关闭防⽕墙、selinux、禁用交换空间,

cpu核⼼数⾄少为2

内存4G

kubeadm部署k8s⾼可用集群的官方文档:

Creating Highly Available Clusters with kubeadm | Kubernetes

你需要在每台机器上安装以下的软件包:

  • kubeadm:用来初始化集群的指令。(每台机器)

    • master 用来初始化集群

    • node节点用来加入集群

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

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

一、完整安装过程

准备三台机器

192.168.199.200 k8s-master
192.168.199.201 k8s-node1
192.168.199.202 k8s-node2

制作本地解析,修改主机名。相互解析
# vim /etc/hosts
192.168.199.200 k8s-master
192.168.199.201 k8s-node1
192.168.199.202 k8s-node2

所有机器系统配置

1.关闭防⽕墙:

systemctl stop firewalld
systemctl disable firewalld

2.禁用SELinux:

setenforce 0

3.编辑文件/etc/selinux/config,将SELINUX修改为disabled

sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
SELINUX=disabled

4、注释掉swap分区

sed -i 's/.*swap.*/#&/' /etc/fstab

二、使用kubeadm部署Kubernetes

1、在所有节点安装kubeadm和kubelet、kubectl

首先配置yum源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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

提醒:如果下载失败,关闭认证,再次下载

  • kubelet: Kubernetes 的节点代理,负责在每个节点上运行,并确保容器运行在 Pod 中。

  • kubeadm: 是一个命令行工具,用于初始化和管理 Kubernetes 集群。

  • kubectl: 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。

  • ipvsadm: 是用于设置、维护和检查 Linux 内核中 IP 虚拟服务器(IPVS)表的用户空间实用程序,IPVS 可以实现 Kubernetes 中的服务负载均衡

2、安装kubelet、kubeadm、kubectl、ipvsadm组件

yum install -y kubelet-1.19.1-0.x86_64 kubeadm-1.19.1-0.x86_64 kubectl-1.19.1-0.x86_64 ipvsadm

加载ipvs相关内核模块

modprobe ip_vs && modprobe ip_vs_rr && modprobe ip_vs_wrr && modprobe ip_vs_sh && modprobe nf_conntrack_ipv4

3、编辑文件添加开机启动

vim /etc/rc.local
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4

4、给rc.local添加可执行权限

chmod +x /etc/rc.local

5、配置转发相关参数,否则可能会出错

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

使配置生效

sysctl --system

6、如果net.bridge.bridge-nf-call-iptables报错,加载br_netfilter模块

modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

7、查看是否加载成功

lsmod | grep ip_vs

8、配置kubelet的cgroups

cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs --pod-infra-container-image=k8s.gcr.io/pause:3.2"
EOF

9、启动kubelet

systemctl daemon-reload
systemctl enable kubelet && systemctl restart kubelet
systemctl status kubelet

你会发现报错误信息:错误是正常现象,因为api-server还没有在master节点上初始化启动

三、master节点初始化

kubeadm init --kubernetes-version=v1.19.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.199.200 --ignore-preflight-errors=Swap

注释:

apiserver-advertise-address=192.168.229.11 master的ip地址。
--kubernetes-version=v1.19.1 --更具具体版本进行修改
--pod-network-cidr=10.244.0.0/16 我们自定义pod给容器内指定的网段
--ignore-preflight-errors=Swap   忽略swap分区错误(我们已经关闭了swap,此处有没有都可以)
注意在检查⼀下swap分区是否关闭

1、Mater重新完成初始化

2、配置使用网络插件

---
kind: Namespace
apiVersion: v1
metadata:name: kube-flannellabels:k8s-app: flannelpod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: flannelname: flannel
rules:
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- get- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: flannelname: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: flannelname: flannelnamespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-flannellabels:tier: nodek8s-app: flannelapp: flannel
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","EnableNFTables": false,"Backend": {"Type": "vxlan"}}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-dsnamespace: kube-flannellabels:tier: nodeapp: flannelk8s-app: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxhostNetwork: truepriorityClassName: system-node-criticaltolerations:- operator: Existseffect: NoSchedule- key: node.kubernetes.io/not-readyoperator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cni-pluginimage: docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2command:- cpargs:- -f- /flannel- /opt/cni/bin/flannelvolumeMounts:- name: cni-pluginmountPath: /opt/cni/bin- name: install-cniimage: docker.io/flannel/flannel:v0.25.6command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: docker.io/flannel/flannel:v0.25.6command:- /opt/bin/flanneldargs:- --ip-masq- --iface=ens33- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN", "NET_RAW"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: EVENT_QUEUE_DEPTHvalue: "5000"volumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/- name: xtables-lockmountPath: /run/xtables.lockvolumes:- name: runhostPath:path: /run/flannel- name: cni-pluginhostPath:path: /opt/cni/bin- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg- name: xtables-lockhostPath:path: /run/xtables.locktype: FileOrCreate

3、创建flannel网络

kubectl apply -f kube-flannelv1.19.1.yaml

查看哪一个pod被分配到哪一个节点
[root@k8s-master ~]# kubectl get pod -n kube-system -o wide 

获取节点:
[root@master ~]# kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   94m   v1.19.1

四、所有node节点加⼊集群

1、开启ip转发

sysctl -w net.ipv4.ip_forward=1

2、在所有node节点操作,此命令为初始化master成功后返回的结果

kubeadm join 192.168.199.200:6443 --token 2eo635.zefoh7sqrndzdju6  --discovery-token-ca-cert-hash sha256:20fe16459d5d0f79025be51f7a800af01f7aa1fb5bd3e33b4eb37328facaff07

注意:

如果加入时显示端口占用:
[root@k8s-node2 ~]# kubeadm reset
再次即可

加入后master一直显示noready
对应的节点 systemctl restart kubelet

五、master相关操作

列举所有的token:kubeadm token list

重新生成token:kubeadm token create

查看hash值:ls  /etc/kubernetes/pki/ca.crt

查看pods:kubectl get pods -n kube-system

查看异常pod信息:kubectl describe pod 异常的pod名称 -n kube-system

删除异常pod:  kubectl delete pod pod名称 -n kube-system

查看pods:  kubectl get pods -n kube-system 

查看节点:kubectl get nodes 

1.驱离k8s-node-1节点上的pod(master上)
[root@kub-k8s-master ~]# kubectl drain kub-k8s-node1 --delete-local-data --force --ignore-daemonsets


驱离后 ,调度功能就禁用了该节点
想要恢复:
[root@kub-k8s-master ~] kubectl uncordon k8s-node2

2.删除节点(master上)
[root@kub-k8s-master ~]# kubectl delete node kub-k8s-node1


3.重置节点(node上-也就是在被删除的节点上)
[root@kub-k8s-node1 ~]# kubeadm reset
注1:需要把master也驱离、删除、重置,这⾥给我坑死了,第⼀次没有驱离和删除master,最后
的结果是查看结果⼀切正常,但coredns死活不能用,搞了整整1天,切勿尝试

注2:master上在reset之后需要删除如下文件
# rm -rf /var/lib/cni/ $HOME/.kube/config

一步到位加入集群:

第一种方法:
kubeadm token create --print-join-command
[root@k8s-master ~]# kubeadm token create --print-join-command
会自动生成一个制定了,让你在任意想添加的节点上使用该命令
kubeadm join 192.168.229.11:6443 --token plw7zn.f7pnvhok89fc0og5     --discovery-token-ca-cert-hash sha256:20fe16459d5d0f79025be51f7a800af01f7aa1fb5bd3e33b4eb37328facaff07

第⼆种⽅法:
token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0

ttl=0表示令牌用于不会过期
这种方式生成长期有效的加入集群指令

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 安装Postgres和PostGIS,并制作镜像

1. 查找postgres和postgis现有的镜像和版本号 镜像搜索网站&#xff1a;https://docker.aityp.com/ 测试使用的是postgres:15.4 和 postgis:15-3.4 2、镜像拉取 docker pull postgres:15.4docker pull postgis/postgis:15-3.4镜像下载完成&#xff0c;docker images 查看如…

konvajs -基础图形-标签-箭头,动画,学习笔记

官网&#xff1a; Konva 框架概述 |Konva - JavaScript 2d 画布 图书馆 (konvajs.org)https://konvajs.org/docs/overview.html konva是canvas的一个库&#xff0c;可快速画出想要的图形。 基础创建步骤&#xff1a; // 第一步&#xff0c;创建一个Stage舞台 var stage new…

element设置时间和日期框早于现在的时间和日期禁用

效果: 今日此时此刻之前的日期、时间禁止选用&#xff0c;切换日期和时间为“2024-10-19 00:00:00"&#xff0c;再切换为”2024-10-18 00:00:00"时&#xff0c; 会给form.time默认赋值为今日此时此刻&#xff08;日期时间少于今日此时此刻则重新赋值&#xff09; 安…

Go语言基础学习(Go安装配置、基础语法)

一、简介及安装教程 1、为什么学习Go&#xff1f; 简单好记的关键词和语法&#xff1b;更高的效率&#xff1b;生态强大&#xff1b;语法检查严格&#xff0c;安全性高&#xff1b;严格的依赖管理&#xff0c; go mod 命令&#xff1b;强大的编译检查、严格的编码规范和完整的…

【优选算法】探索双指针之美(一):双指针与单调性的完美邂逅

文章目录 前言&#xff1a;1.盛水最多的容器2.有效三角形个数3. 和为s的两个数字4. 三数之和5. 四数之和 最后想说&#xff1a; 前言&#xff1a; 在上一章中我们已经认识到了双指针&#xff0c;在这章里我们就来探索一下当双指针和单调性遇见后会擦出怎样的火花呢&#xff1f…

几何算法系列:空间实体体积计算公式推导

1.前言 面积和体积的计算是常见和基础的几何算法话题&#xff0c;面积和体积通常作为面或构件的基本信息参与相关的建模、计算、分析等过程。 有关面积的计算&#xff0c;可以参考博主此前的文章&#xff0c; 一种误差较小的轮廓面积计算算法_轮廓面积计算原理-CSDN博客文章…

深入理解Qt中的QTableView、Model与Delegate机制

文章目录 显示效果QTableViewModel(模型)Delegate(委托)ITEM控件主函数调用项目下载在Qt中,视图(View)、模型(Model)和委托(Delegate)机制是一种非常强大的架构,它们实现了MVC(模型-视图-控制器)设计模式。这种架构分离了数据存储(模型)、数据展示(视图)和数据操作(委托),使…

Apple 新品发布会亮点有哪些 | Swift 周报 issue 61

文章目录 前言新闻和社区苹果据称正洽谈投资 OpenAI 英伟达也有意跟投消息称苹果公司服务部门将裁员约百人&#xff0c;波及 Apple Books / Apple News 等业务苹果拟 9 月 10 日举行今年最重磅新品发布会&#xff0c;iPhone 16 亮相&#xff1f;都有哪些看点&#xff1f; 提案正…

京东笔试题

和谐敏感词 &#x1f517; 题目地址 &#x1f389; 模拟 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();String s scanner.next();String[] words new String[…

【Spring篇】Spring中的Bean管理

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;Spring IOC容器 &#x1f6a…

如何开启华为交换机 http

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

kafka自定义配置信息踩坑

org.apache.kafka.common.config.ConfigException: Invalid value 0 for configuration acks: Expected value to be a string, but it was a java.lang.Integer 场景描述&#xff1a; 单个kafka使用springboot框架自带的 yml 配置完全OK&#xff08;因为底层会帮我们处理好类…

QGraphics类型学习使用【Qt】【C++】

QGraphics类型学习使用 需求过程全部完整代码 首先已知&#xff0c;QGraphicsView&#xff0c;QGraphicsScene, QGraphicsItem&#xff0c;分别称为&#xff1a;视图&#xff0c;场景&#xff0c;图元&#xff0c;图表就是各种各样的元素&#xff0c;图片元素&#xff0c;线条元…

排序算法 —— 归并排序(理论+代码)

目录 1.归并排序的认识 归并排序的思想 归并排序动图演示 2.归并排序的递归实现 归并排序的遍历方式 归并排序的归并流程 归并排序的递归代码实现 3.归并排序的非递归实现 非递归实现分析 边界分析 非递归实现代码 4.归并排序总结 时间复杂度 空间复杂度 稳定性…

Postman使用-基础篇

前言 本教程将结合业界广为推崇和使用的RestAPI设计典范Github API&#xff0c;详细介绍Postman接口测试工具的使用方法和实战技巧。 在开始这个教程之前&#xff0c;先聊一下为什么接口测试在现软件行业如此重要&#xff1f; 为什么我们要学习Postman&#xff1f; 现代软件…

ubuntu 安装keepalived+haproxy

一、安装keepalived sudo apt update sudo apt install keepalived sudo systemctl start keepalived sudo systemctl enable keepalived sudo systemctl status keepalived#配置Keepalived sudo cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf …

Jmeter 实战 JDBC配置

​ JDBC JDBC&#xff08;Java Database Connectivity&#xff09;是一种用于执行SQL语句的Java API。通过这个API&#xff0c;可以直接连接并执行SQL脚本&#xff0c;与数据库进行交互。 使用JMeter压力测试时&#xff0c;操作数据库的场景 在使用JMeter进行接口压力测试时…

大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置

大规模多传感器滑坡检测数据集&#xff0c;利用landsat&#xff0c;哨兵2&#xff0c;planet&#xff0c;无人机图像等多种传感器采集数据共2w余副图像&#xff0c;mask准确标注滑坡位置 大规模多传感器滑坡检测数据集介绍 数据集概述 名称&#xff1a;大规模多传感器滑坡检测…

R语言建模线性回归

一、 a. # 给定的 (x, y) 数据 x <- c(2, 9, 10, 7) y <- c(3, 13, 12, 11)# 线性回归模型 y a bx model1 <- lm(y ~ x) summary(model1) # 查看回归结果# 提取系数 a 和 b a <- coef(model1)[1] b <- coef(model1)[2]# 预测值 y_pred <- predict(mode…

数据字典是什么?和数据库、数据仓库有什么关系?

一、数据字典的定义及作用 数据字典是一种对数据的定义和描述的集合&#xff0c;它包含了数据的名称、类型、长度、取值范围、业务含义、数据来源等详细信息。 数据字典的主要作用如下&#xff1a; 1. 对于数据开发者来说&#xff0c;数据字典包含了关于数据结构和内容的清晰…