Kubeadm部署K8s

Kubeadm部署K8s

集群规划:
在这里插入图片描述

Master节点规划:

在这里插入图片描述
Node节点规划:

在这里插入图片描述
安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
操作系统 CentOS7.x-86_x64
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
集群中所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止swap分区

此实验机器规划如下:

k8s-master  42.51.227.113    Centos 7.x-X86_64
k8s-node1   42.51.227.114  Centos 7.x-X86_64
k8s-node2   42.51.227.115  Centos 7.x-X86_64
k8s-node3   42.51.227.116  Centos 7.x-X86_64

在各节点执行—修改主机名

hostnamectl --static set-hostname k8s-master
hostnamectl --static set-hostname k8s-node1
hostnamectl --static set-hostname k8s-node2
hostnamectl --static set-hostname k8s-node3

在各节点执行—修改hosts文件

cat <<EOF > /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
42.51.227.113  k8s-master
42.51.227.114  k8s-node1
42.51.227.115  k8s-node2
42.51.227.116  k8s-node3
EOF

在各节点执行—修改DNS

cat <<EOF> /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF

在各节点执行—设置个性主机名:

带时间的个性主机名
echo "PS1='\[\e[37;1m\][\[\e[36;40m\]\t\[\e[32;40m\]\u\[\e[33;40m\]@\[\e[31;40m\]\h \[\e[34;40m\]\w\[\e[37;1m\]]\\$\[\e[m\]'" >>.bashrc不带时间的个性主机名
echo "PS1='\[\e[37;1m\][\[\e[36;40m\]\[\e[32;40m\]\u\[\e[33;40m\]@\[\e[31;40m\]\h \[\e[34;40m\]\w\[\e[37;1m\]]\\$\[\e[m\]'" >>.bashrc

在各节点执行—关闭CentOS7自带的防火墙服务

systemctl disable firewalld && systemctl stop firewalld

在各节点执行—关闭selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0

在各节点执行—互相信任

ssh-keygen
ssh-copy-id xxx

在各节点都采用网络时间服务器

安装时间服务器软件

yum install -y chrony

修改配置文件/etc/chrony.conf

sed -i -e '/^server/d' -e '1aserver ntp.aliyun.com iburst\nserver tw.pool.ntp.org iburst' -e '/local stratum 10/clocal stratum 10\nbindcmdaddress 127.0.0.1\nbindcmdaddress ::1' /etc/chrony.conf

chronyd服务启动并自启

systemctl enable chronyd --now && systemctl restart chronyd

检查323 udp端口的监听是否是*:323

ss -ntlup | grep 323

检查时间同步状态

chronyc sources

在各节点执行—安装基础软件:ebtables ethtool否则执行 kubeadm init会报错

yum install vim wget yum-utils device-mapper-persistent-data lvm2 ebtables ethtool -y

在各节点执行—添加阿里yum源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all && yum makecache

在各节点执行—添加docker阿里yum源–选一项即可

1.
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo && yum makecache fast

在各节点执行—配置kubernetes国内阿里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=1 
#repo_gpgcheck=1 
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 
EOF

在各节点执行—生成缓存

yum makecache fast -y

在各节点执行—生成系统及软件包

yum update -y

在各节点执行—安装docker-ce—不指定版本将安装最新版本

yum -y install docker-ce

如果指定版本:

1.列出所有版本的 Docker CE
yum list docker-ce --showduplicates | sort -r
2.可以安装特定版本
yum install docker-ce-18.06.2.ce-3.el7 containerd.io -y

在各节点执行—启动docker并设置为开机启动

systemctl enable docker --now

在各节点执行—配置镜像加速器和日志驱动和修改docker cgroup驱动,与k8s一致,使用systemd方式

sudo tee /etc/docker/daemon.json <<-'EOF' 
{ "registry-mirrors": ["https://nty7c4os.mirror.aliyuncs.com"],"live-restore":true,"exec-opts":["native.cgroupdriver=systemd"],"log-driver":"json-file","log-opts":{"max-size":"100m","max-file":"3"}
}
EOF

Ps:备注:systemd是系统自带的cgroup管理器, 系统初始化就存在的, 和cgroups联系紧密,为每一个进程分配cgroups, 用它管理就行了. 如果设置成cgroupfs就存在2个cgroup控制管理器, 实验证明在资源有压力的情况下,会存在不稳定的情况.cgroupfs是docker自带的

热加载配置和重启docker

systemctl daemon-reload && systemctl restart docker

在各节点执行—升级内核到5.7

自带3.10内核存在BUG,建议升级到4.10.x及以上版本
BUG介绍:https://myit.icu/index.php/archives/389/
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
rpm -import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
在各节点执行---安装kernel-ml内核   lt:长期维护版本,ml:长期稳定版本
yum -y --enablerepo=elrepo-kernel install kernel-ml.x86_64 kernel-ml-devel.x86_64
在各节点执行---查看启动器
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
在各节点执行---设置默认启动为新内核---0后边内核为5.x,根据实际情况选择
grub2-set-default 0
在各节点执行---重启系统
reboot
Ps:重启后查看内核是否为:5.8.xxx,按当时装的最新版本为准

在各节点执行—永久关闭swap

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

kubernetes的想法是将实例紧密包装到尽可能接近100%。 所有的部署应该与CPU /内存限制固定在一起。 所以如果调度程序发送一个pod到一台机器,它不应该使用交换,设计者不想交换,因为它会减慢速度,所以关闭swap主要是为了性能考虑。

在各节点执行—加载 ipvs 模块,保证在节点重启后能自动加载所需模块—kube-proxy开启ipvs的前置条件

yum install ipset ipvsad -ycat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
#开启ipvs,最新支持的负载均衡(SLB)
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4   # 内核新版本改为nf_conntrack
modprobe -- br_netfilter
EOF

在各节点执行—赋值权限并执行生效

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules

加载生效出现报错,请修改

内核使用最新版本4.19.1,无法加载nf_conntrack_ipv4模块 
4.19.1最新版本的内核,nf_conntrack_ipv4已经修改为nf_conntrack。

在各节点执行—查看是否已经正确加载所需的内核模块

lsmod | grep -e ip_vs -e nf_conntrack_ipv4

在各节点执行—关闭邮箱服务(节省内存,根据自己实际来定)

systemctl stop postfix.service && systemctl disable postfix.service

在各节点执行—查看kubernetes源当前状态

yum repolist all | grep kubernetes

如果源状态为disable则需要开启—执行如下命令使kubernetes源生效。

对于CentOS,执行yum-config-manager --enable 时,“repo_name”是执行yum repolist all | grep kubernetes时回显的第二个字段“Kubernetes”,“K”为大写

在各节点执行—安装kubelet,不指定版本将安装最新版本

yum -y install kubelet kubeadm kubectl --disableexcludes=kubernetes

参数解析:“–disableexcludes=kubernetes”表示在查找包的时候禁止排除kubernetes这个源
查看当前系统存在的kubernetes的版本号

yum list all | grep kubernetes

可选:也可以指定版本号:kubelet-1.18.2

yum -y install kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2 --disableexcludes=kubernetes

链接:https://github.com/kubernetes/kubernetes/releases

在各节点执行—查看k8s版本号

kubelet --version

在各节点执行—查看配置文件目录

# rpm -ql kubelet
/etc/kubernetes/manifests  #清单目录
/etc/sysconfig/kubelet  #配置文件
/usr/bin/kubelet  #主程序
/usr/lib/systemd/system/kubelet.service

在各节点执行—设置开机自启

systemctl enable kubelet

查看kubenets需要哪些镜像

[root@k8s-master ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.18.2
k8s.gcr.io/kube-controller-manager:v1.18.2
k8s.gcr.io/kube-scheduler:v1.18.2
k8s.gcr.io/kube-proxy:v1.18.2
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

我们可以先提前下载这些镜像—但是要确认是否使用了代理,因为国内无法访问k8s.gcr.io

kubeadm config images pull

如果没有国外代理机器,就使用以下脚本来使用阿里源镜像仓库下载后更改标签为k8s.gcr.io

方法:

vim /root/pullimages.sh
#!/bin/bash
#https://deanit.cn
#使用阿里镜像仓库
#查看版本号并替换为阿里镜像仓库源下载
kubeadm config images list | sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' | sh -x
#将镜像名字更改为原来的k8s.gcr.io
docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker tag",$1":"$2,$1":"$2}' | sed -e 's/registry.cn-hangzhou.aliyuncs.com\/google_containers/k8s.gcr.io/2' | sh -x
#将从阿里镜像仓库下载的镜像删除
docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker rmi """$1""":"""$2}' | sh -x

赋值脚本权限并执行

chmod a+x /root/pullimages.sh && sh /root/pullimages.sh

Node节点:

Node节点仅需要这两个镜像,所以使用上边办法单独下载这两个镜像即可。

k8s.gcr.io/kube-proxy:v1.18.2
k8s.gcr.io/pause:3.2

在k8s-master节点执行—使用kubeadm初始化集群

指定版本:需要与我们上边安装的版本一致:–kubernetes-version=v1.18.2

不指定版本:不指定版本,不添加–kubernetes-version=v1.18.2参数即可

kubeadm init  --kubernetes-version=v1.18.2 --apiserver-advertise-address=42.51.227.113 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --dry-run

重要提示:–dry-run:试运行不应用任何变化;输出将要完成的工作,测试没问题后将该参数去掉执行即可!

Ps:由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。如果使用以上的两个方法拉取镜像,这里就不用再次指定镜像仓库地址就行了。

在k8s-master节点执行—初始化完成后,根据提示执行以下三步

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

保存以下内容:用于添加节点时需要

kubeadm join 42.51.227.113:6443 --token p1vfu6.qt4hypzpvoyxfuaf \
--discovery-token-ca-cert-hash sha256:6534570565aa1a8b66539287f2e478201bad41fa8c0fe2811533442e51f882f5 

在k8s-master节点执行安装Pod网络插件—加入flannel

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

Ps:确保能够访问到quay.io这个registery,有时会出现连接失败,我们可以先通过wget下载yml文件,再进行安装。
在k8s-master节点执行—查看flannel镜像

可以通过docker image list镜像列表看到quay.io/coreos/flannel镜像被下载,大小为52.8MB,因网络原因下载镜像慢可以等一会即可查看到flannel镜像

[root@k8s-master ~]# docker images
在这里插入图片描述
执行了加入flannel命令并不代表就可以使用,我们可以通过kubectl get pods -n kube-system来获取当前系统上正在运行的pods,我们看到flannel处于正在运行的状态才算正常

待测试方法:

使用pod的网络通讯(这里使用七牛云镜像,七牛云相当于CDN资源)
#下载flannel
curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#替换为七牛云镜像
sed -i "s/quay.io\/coreos\/flannel/quay-mirror.qiniu.com\/coreos\/flannel/g" kube-flannel.yml
#加入
kubectl apply -f kube-flannel.yml
#删除
rm -f kube-flannel.yml

在k8s-master节点执行—验证pod信息—查看system名称空间下的所有pod**

[root@k8s-master ~]# kubectl get pod -n kube-system

kubectl get pods -o wide -A  #查看所有pod详细信息

在这里插入图片描述
以上信息我们看到kube-flannel-ds-amd64-ckp6m已经处于运行中

验证集群节点

上面执行完命令后,集群不会马上变成ready状态,因为系统需要去下载docker镜像,稍等片刻后我们可以执行一下命令验证集群状态。

-o wide:表示查看消息信息

kubectl get node效果等于kubectl get nodes[root@k8s-master ~]# kubectl get node -o wide

在这里插入图片描述
在这里插入图片描述
验证pod信息查看system命名空间下的所有pods

[root@k8s-master ~]# kubectl get pod -n kube-system

在这里插入图片描述

Ps:当所有节点都变成ready后,所有pod的ready都变成1/1,表示集群搭建完成!!!

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

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

相关文章

CANopen转Profinet网关连接西门子PLC与变流器通讯

CANopen转Profinet网关&#xff08;XD-COPNm20&#xff09;在智能领域&#xff0c;变流器的应用非常广泛&#xff0c;变流器一般会采用CANopen协议。现场采用台达的变流器&#xff08;支持CANopen协议&#xff09;作为CANopen从站&#xff0c;S7-1500系列PLC做主站&#xff0c;…

表单进阶(3)-上传文件和隐藏字段

上传文件&#xff1a;<input type"file"> 隐藏字段&#xff1a;<input type"hidden" name"" id"" value"带给后端的信息"> 禁用disabled&#xff1a;<button disabled"disabled">注册</bu…

蓝牙系列七:开源蓝牙协议栈BTStack数据处理(Wireshark抓包分析)

继续蓝牙系列的研究。 在上篇博客&#xff0c;通过阅读BTStack的源码&#xff0c;大体了解了其框架&#xff0c;对于任何一个BTStack的应用程序都有一个main函数&#xff0c;这个main函数是统一的。这个main函数做了某些初始化之后&#xff0c;最终会调用到应用程序提供的btst…

【嵌入式】嵌入式系统稳定性建设:最后的防线

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…

一文带你了解MySQL之B+树索引的原理

前言 学完前面我们讲解了InnoDB数据页的7个组成部分&#xff0c;知道了各个数据页可以组成一个双向链表&#xff0c;而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表&#xff0c;每个数据页都会为存储在它里边儿的记录生成一个页目录&#xff0c;在通过主键查…

蓝桥杯真题讲解:子矩阵(二维滑动窗口)

蓝桥杯真题讲解&#xff1a;子矩阵&#xff08;二维滑动窗口&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;子矩阵&#xff08;二维滑动窗口&#xff09; 二、正解代码 //二维单调队列 #include<bits/stdc.h> #define endl \n #def…

MapBox添加带箭头的轨迹线

效果&#xff1a; // 轨迹线 export const MAP_PATH_LINE (values, layerId) > {// 箭头-右var svgXML <svg viewBox"0 0 1024 1024" xmlns"http://www.w3.org/2000/svg"> <path d"M529.6128 512L239.9232 222.4128 384.7168 77.5168…

成都爱尔林江院长解析巩膜镜是什么?它适合哪些人群

巩膜镜&#xff0c;全称为硬性透氧性巩膜接触镜&#xff0c;它有着特殊设计&#xff0c;大直径镜片像桥梁一样呈拱形覆盖角膜及角巩膜缘&#xff0c;从角膜上方横跨而过完全无接触、无任何机械性摩擦&#xff0c;最终贴合于巩膜。 巩膜镜的作用原理 光学成像&#xff1a; 配戴…

嵌入式物联网项目实战-STM32F103实现外部中断EXIT事件(物联技术666)

EXIT中断测试 功能描述 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型&#xff08;脉冲或挂起&#xff09;和对应的触发事件&#xff08;上升沿或下降沿或者双边沿触发&#xff09;。每个输入线都可以被独立的屏蔽。挂起寄…

Unity L屏幕实现方式(已抛弃)

效果 右侧主要的参数&#xff1a;Line参数能够调整中间线的高度&#xff0c;PointXY能够调整整个下方弯曲图像的比例。 使用的是RenderTexture填充RawImage显示的方式&#xff0c;需要将一张RenderTexture设置位摄像机的输出内容。 ShaderGraph 由于这个采用了一定的数学模型…

HarmonyOS NEXT应用开发之多层嵌套类对象监听

介绍 本示例介绍使用Observed装饰器和ObjectLink装饰器来实现多层嵌套类对象属性变化的监听。 效果图预览 使用说明 加载完成后显示商品列表&#xff0c;点击刷新按钮可以刷新商品图片和价格。 实现思路 创建FistGoodsModel类&#xff0c;类对象是用Observed修饰的类Secon…

【C++】手把手教你模拟实现 list

目录 前提&#xff1a;list 的基本介绍 一、构造/析构/拷贝/赋值 1、构造函数 2、析构函数 3、拷贝构造函数 4、赋值 二、修改操作 1、push_back 2、insert 3、erase 4、clear 三、list iterator 的使用 1、operator * 2、operator 3、operator -- 4、operator &…

MATLAB中的矩阵的重构和重新排列

师从清风 矩阵的重构和重新排列 reshape函数 reshape函数可以改变矩阵的形状&#xff0c;其常用语法为reshape(A,m,n)或者reshape(A,[m,n]),这可以将矩阵A的形状更改为m行n列&#xff0c;前提是转化前后的两个矩阵的元素总数要相同。例如有一个矩阵A&#xff0c;它原来的大小是…

字节跳动也启动春季校园招聘了(含二面算法原题)

字节跳动 - 春招启动 随着各个大厂陆续打响春招的响头炮&#xff0c;字节跳动也官宣了春季校园招聘的正式开始。 还是那句话&#xff1a;连互联网大厂启动校招计划尚且争先恐后&#xff0c;你还有什么理由不马上行动&#xff1f;&#xff01; 先来扫一眼「春招流程」和「面向群…

掌握Redis,看完这篇文章就够了

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Redis是什么&#xff1f;二、Redis安装三、Redis相关数据类型 四、基础操作&#xff08;使用了python连接redis&#xff09;1.字符串2.键对应操作3.哈希&am…

2024.3.12

1. 要求&#xff1a;自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void sho…

[Unity3D]--更换天空盒子

我们原来的天空盒子是这样的。 感觉不是特别满意&#xff0c;想换一个更好看的。 去资源商店找个好看的 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 例如这个 然后在Window>Rendering>Lighting里的环境选项里更换材质 更换&#xff1a; ​ …

考察1学生学籍系统winform .net6 sqlserver

考察1学生学籍系统winform .net6 sqlserver 下载地址: 考察1学生学籍系统winform .net6 sqlserver winform(.net6)sqlserver数据库 只有数据库的表结构需要自己建表 启动程序 登录失败 进入主界面 项目获取&#xff1a; 项目获取&#xff1a;typora: typora/img (gitee.com…

【C语言程序设计】C语言求圆周率π(三种方法)

题目一&#xff1a; 利用公式①计求π的近似值&#xff0c;要求累加到最后一项小于10^(-6)为止。 程序代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <math.h> int main(){float s1;float pi0;float i1.0;float n1.0;while(fabs(i)&…

Java中的参数传递

程序设计语言将实参传递给方法&#xff08;或函数&#xff09;的方式分为两种&#xff1a; 值传递&#xff1a;方法接收的是实参值的拷贝&#xff0c;会创建副本。引用传递&#xff1a;方法接收的直接是实参所引用的对象在堆中的地址&#xff0c;不会创建副本&#xff0c;对形…