k8s的安装部署,详细过程展示(保姆级安装教程)
k8s应用部署方式演变
在部署应用程序的方式上,主要经历了三个时代:
传统部署:互联网早期,会直接将应用程序部署在物理机上
优点:简单,不需要其它技术的参与
缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响
虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境
优点:程序环境不会相互产生影响,提供了一定程度的安全性
缺点:增加了操作系统,浪费了部分资源
容器化部署:与虚拟化类似,但是共享了操作系统
优点:
可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等
运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦
容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署

容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:
一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
当并发访问量变大的时候,怎么样做到横向扩展容器数量
这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件:
Swarm:Docker自己的容器编排工具
Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用
Kubernetes:Google开源的的容器编排工具

关于k8s的知识我就不赘述了,这次主要实践k8s的安装部署
开始实验
实验环境:
主机 IP 系统 角色
153 192.168.121.153 centos7 master
154 192.168.121.154 centos7 node
155 192.168.121.155 centos7 node
!!!系统一定要2核或者以上,最少要求2核,内存2G或以上
首先在
三台机子都安装docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
cat > /etc/docker/daemon.json << EOF
{"registry-mirrors":["https://hub-mirror.c.163.com/"]}
EOF
systemctl start docker
systemctl enable docker.service
校正时间同步
timedatectl set-timezone Asia/Shanghai
yum install -y ntpdate、
ntpdate ntp.aliyun.com
timedatectl set-local-rtc 0
配置计划任务自动校正时间(可选,实验环境而已不做也没什么影响)
# crontab -e ---配置计划任务
01 */2 * * * ntpdata npt.aliyun.com# systemctl restart crond.service
配置A记录互相解析
cat >> /etc/hosts << EOF
192.168.121.153 server153
192.168.121.154 server154
192.168.121.155 server155
EOF
关闭防火墙
iptables -F
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/SELINUX=/c\SELINUX=disabled/' /etc/selinux/config
关闭swap分区,否则会影响k8s的性能
swapoff -a
sed -i '/swap/s/.*/#&/' /etc/fstab
设置内核及相关网络参数
modprobe br_netfilter
modprobe overlay
modprobe ip_vs
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
ip_vs
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
sysctl -p /etc/sysctl.d/k8s.conf
然后制作k8s的阿里源
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
yum clean all
yum makecache fast
然后获取cri-docker安装包
wget https://github.com/Mirantis/cri-dockerd
安装git和go语言编译环境
yum install -y go git
然后解压cri-docker并编译
tar -xf cri-dockerd.tar.gz
cd cri-dockerd/
make cri-dockerd
将 应用程序拷贝到PATH 环境下
install -o root -g root -m 0755 cri-dockerd /usr/bin/cri-dockerd
安装 cri-dockerd 服务 systemd service控制文件
install packaging/systemd/* /usr/lib/systemd/system/
配置systemd service文件
cat > /usr/lib/systemd/system/cri-docker.service << EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
配置cri-docker.sockrt
cat > /usr/lib/systemd/system/cri-docker.socket << EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=root[Install]
WantedBy=sockets.target
EOF
加载配置文件,启动cri-docker
systemctl daemon-reload
systemctl start cri-docker.service
systemctl enable cri-docker.service
查看套接字文件是否启动
ls /var/run/cri-dockerd.sock
然后安装kubelet和kubeadm,用来连接API
yum install kubelet-1.26.3 kubeadm-1.26.3 -y
三个节点都做相同的配置到这里就可以了
主节点的配置
然后到master节点的配置
下载kubectl
yum install kubectl-1.26.3
查看初始集群所需要的镜像
[root@server153 cri-dockerd]# kubeadm config images list
I1107 20:01:31.050004 7050 version.go:256] remote version is much newer: v1.28.3; falling back to: stable-1.26
registry.k8s.io/kube-apiserver:v1.26.10
registry.k8s.io/kube-controller-manager:v1.26.10
registry.k8s.io/kube-scheduler:v1.26.10
registry.k8s.io/kube-proxy:v1.26.10
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.9.3
查看镜像是因为官方站点在国外,有时候网络不好不一定能下,所以可以切换阿里源镜像,或者准备好镜像在自己的镜像仓库
然后开始初始化集群
[root@server153 cri-dockerd]# kubeadm init --apiserver-advertise-address=192.168.121.153 --kubernetes-version=v1.26.3 --image-repository registry.aliyuncs.com/google_containers --cri-socket unix:///var/run/cri-dockerd.sock --service-cidr=10.1.0.0/16 --pod-network-cidr=10.2.0.0/16 --token-ttl=0
初始化好后结尾会如下提示
To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.conf
然后执行下面两段代码
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
还有这段token也记得复制
Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.121.153:6443 --token 3n3vlb.vpgsgfh6vf77tup0 \--discovery-token-ca-cert-hash sha256:c383079099cf763acc2631705cb7361d06e2156dd496ba35b348bfa03e230c36
这段是node节点加入到集群的口令
做好上面这些之后最好重新连接一下会话,刷新配置
然后去node节点加入到集群 ,用刚才我们复制的口令加入集群
只需要执行下面这段命令就可以了
[root@server154 cri-dockerd]# kubeadm join 192.168.121.153:6443 --token 3n3vlb.vpgsgfh6vf77tup0 --discovery-token-ca-cert-hash sha256:c383079099cf763acc2631705cb7361d06e2156dd496ba35b348bfa03e230c36 --cri-socket unix:///var/run/cri-dockerd.sock
加入成功后会有下面字段的提示
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节点执行kubectl get nodes查看集群
[root@server153 cri-dockerd]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
server153 NotReady control-plane 8m20s v1.26.3
server154 NotReady <none> 2m2s v1.26.3
server155 NotReady <none> 98s v1.26.3
可以看到集群加入成功
但是还有一个问题,那就是网络还没配置,所以状态才会显示NotReady
我们下载flannel,这里注意一个问题
因为是从github下载的,国内网络你们懂的,不一定能拉下载,只能多试几下或者网络好点再下
[root@server153 cri-dockerd]# cd /etc/kubernetes/manifests
[root@server153 manifests]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
查看我们所需的镜像,等下也是要拉镜像的
[root@server153 manifests]# grep "image:" kube-flannel.ymlimage: docker.io/flannel/flannel:v0.23.0image: docker.io/flannel/flannel-cni-plugin:v1.2.0image: docker.io/flannel/flannel:v0.23.0
然后修改配置文件,改两个地方
[root@server153 manifests]# vim kube-flannel.yml


修改好以后就可以部署组件了
[root@server153 manifests]# kubectl apply -f kube-flannel.yml
然后再查看集群状态
这个等待过程可能是比较久的,因为去国外站点拉镜像是有很慢的,看网络情况的
[root@server153 manifests]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
server153 NotReady control-plane 39m v1.26.3
server154 NotReady <none> 33m v1.26.3
server155 NotReady <none> 33m v1.26.3
[root@server153 manifests]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
server153 Ready control-plane 42m v1.26.3
server154 Ready <none> 36m v1.26.3
server155 Ready <none> 35m v1.26.3
然后这样我们的k8s集群就部署好了,当然这个是单master节点的,不是高可用集群的
希望对大家有帮助。
相关文章:
k8s的安装部署,详细过程展示(保姆级安装教程)
k8s应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应用程序定义资源使用…...
基于windows、GDAL2.2.3版本和Java集成安装和使用GDAL库的方法
基于windows、GDAL2.2.3版本和Java集成安装和使用GDAL库的方法 一、下载gdal windows版本64位2.2.3版本 下载地址: https://www.gisinternals.com/archive.php 找到gdal-202-1911-x64-core.msi下载并安装 安装后默认目录为:C:\Program Files\GDAL 二、…...
AlphaControls控件TsRadioGroup的使用
通常使用AlphaControls控件中的TsRadioGroup时,往往使用默认值,会造成TsRadioGroup标题被TsRadioGroup的ITEMs占用,严重影响美观: 解决方案,通过对TsRadioGroup的ContentVOffset属性,设置为10。即可立即改善…...
安卓常见设计模式8------享元模式(Kotlin版)
1. W1 是什么,什么是享元模式? 享元模式(Flyweight Pattern)是一种结构型设计模式,用于有效地支持大量细粒度的对象共享。在 Android 中,享元模式可以用于减少内存使用和提高性能,特别是在需…...
day54 django中orm数据库增删改查
昨日内容回顾 三板斧问题 HttpResponse # 返回的是字符串 render # 渲染一个HTML静态文件,模板文件 redirect # 重定向的 """在视图文件中得视图函数必须要接收一个形参request,并且,视图…...
【js逆向实战】某sakura动漫视频逆向
写在前面 再写一个逆向实战,后面写点爬虫程序来实现一下。 网站简介与逆向目标 经典的一个视频网站,大多数视频网站走的是M3U8协议,就是一个分段传输,其实这里就有两个分支。 通过传统的m3u8协议,我们可以直接进行分…...
L2-015 互评成绩
学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。 输入格式…...
【Docker安装RockeMQ:基于Windows宿主机,并重点解决docker rocketMQ安装情况下控制台无法访问的问题】
拉取镜像 docker pull rocketmqinc/rocketmq创建网络 docker network create rocketmq-net构建namesrv容器 docker run -d -p 9876:9876 -v D:/dockerFile/rocketmq/namesrv/logs:/root/logs -v D:/dockerFile/rocketmq/namesrv/store:/root/store --network rocketmq-net -…...
Android Studio——android项目运行main()函数
报错: 解决: 如图,在 .idea 的 gradle.xml 中标注的位置增加如下一行代码即可<option name"delegatedBuild" value"false" />...
移动医疗科技:开发互联网医院系统源码
在这个数字化时代,互联网医院系统成为了提供便捷、高效医疗服务的重要手段。本文将介绍利用移动医疗科技开发互联网医院系统的源码,为医疗行业的数字化转型提供有力支持。 智慧医疗、互联网医院这一类平台可以通过线上的形式进行部分医疗服务ÿ…...
代码审计, 介绍, 思路总结
代码审计 一, 代码审计介绍 渗透测试中的代码审计是一个关键步骤,它涉及到深入检查应用程序的源代码,以发现安全漏洞、弱点或不合规的编码实践。这种审计通常由专业的安全工程师或渗透测试人员执行,并侧重于识别可能被黑客利用的安全缺陷。…...
2023NOIP A层联测27 总结
T1 一棵树,操作是把一个点染黑,查询点 x x x 到黑点路径上的最小编号, n ≤ 1 0 6 n\le10^6 n≤106。当时的思路是把树分成几部分,中间和周围的散块,发现不会,就没思路了,就去打了25pts暴力。赛…...
2022最新版-李宏毅机器学习深度学习课程-P34 自注意力机制类别总结
在课程的transformer视频中,李老师详细介绍了部分self-attention内容,但是self-attention其实还有各种各样的变化形式: 一、Self-attention运算存在的问题 在self-attention中,假设输入序列(query)长度是N…...
css sprite 的优缺点,使用方法和示例
CSS Sprite是一种网页图片应用处理方式。 CSS Sprite的原理是将一个网页或者一个模块所用到的零碎的icon整合拼接到一张大图里,再把这张大图作为背景图放入到网页中,当访问该页面时,加载的图片就不会像以前那样一幅一幅地慢慢显示出来了。 …...
通过Cookie和Session来实现网站中登录账号的功能
文章目录 一、Cookie和Session二、基于Cookie和Session实现登录账号的功能2.1步骤一2.2步骤二2.3步骤三2.4总结通过Cookie和Session来实现登录功能2.5运行截图 一、Cookie和Session cookie是http请求header中的一个属性,是浏览器持久化存储数据的一种机制ÿ…...
QWidget 实现九宫格图案解锁
前言 最近需要实现一个九宫格图案解锁功能,查看网上的方案,基于QWidget的方案全网搜来搜去就一篇 Qt编写自定义控件:图案密码锁, 都是炒来炒去的同一篇,代码还比较复杂,运行后在PC端还是可以的,但是运行在arm机器上,就卡顿,或者容易断开手势连接线,各种不友好,于是自…...
设计模式-适配器模式(Adapter)
设计模式-适配器模式(Adapter) 一、适配器模式概述1.1 什么是适配器模式1.2 简单实现适配器模式1.3 使用适配器模式注意事项 二、适配器模式的用途三、实现适配器模式的方式3.1 继承适配器模式(Inheritance Adapter)3.2 组合适配器…...
react:创建项目
一: 使用create-react-app // 默认创建reactjs的webpack打包项目 npm i create-react-app -g create-react-app 项目名// 创建ts项目打包项目 sudo npx create-react-app my-app --template typescript 二: 使用vite npm create vitelatest // 创建react…...
RabbitMQ集群
RabbitMQ概述 1.RabbiMQ简介 RabbiMQ是⽤Erang开发的,集群⾮常⽅便,因为Erlang天⽣就是⼀⻔分布式语⾔,但其本身并不⽀持负载均衡。支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式系统中存储转发消…...
Qt QtCreator调试Qt源码配置
目录 前言1、编译debug版Qt2、QtCreator配置3、调试测试4、总结 前言 本篇主要介绍了在麒麟V10系统下,如何编译debug版qt,并通过配置QtCreator实现调试Qt源码的目的。通过调试源码,我们可以对Qt框架的运行机制进一步深入了解,同时…...
零阶优化算法原理与实践指南
1. 零阶优化算法基础解析零阶优化算法(Zeroth-Order Optimization)是一类仅通过目标函数值进行优化的方法,与需要梯度信息的一阶优化算法形成鲜明对比。这类方法的核心优势在于其普适性——不需要目标函数可微,甚至不需要知道目标…...
别再只用PC调试了!手把手教你用Chrome DevTools远程调试移动端H5的NFC功能
移动端H5 NFC开发实战:用Chrome DevTools突破调试瓶颈 每次修改完NFC相关代码都要反复打包、安装、测试,看着手机屏幕上的console.log一闪而过却抓不到详细日志?作为前端开发者,我们习惯了Chrome DevTools的强大调试能力ÿ…...
局部与全局优化算法:原理、应用与最佳实践
1. 优化问题概述:局部与全局视角在工程实践和科学研究中,我们经常需要寻找某个系统的最佳配置或参数组合——这个过程就是优化。想象你正在调整收音机的旋钮寻找最清晰的信号:当你微调旋钮时,可能会在某个位置听到相对清晰的声音&…...
BiliDownloader:3分钟掌握B站视频下载的终极指南
BiliDownloader:3分钟掌握B站视频下载的终极指南 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简,操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader 你是否曾经在B站上看到精彩的教学视…...
FreeRTOS Tickless模式实战:在STM32F103上实现电池续航翻倍的保姆级配置
FreeRTOS Tickless模式深度实战:STM32F103低功耗优化全解析 在物联网终端设备与便携式穿戴产品的开发中,电池续航能力往往是决定产品成败的关键因素。当工程师面对STM32F103这类经典Cortex-M3芯片时,如何在不更换硬件的前提下,通过…...
别光刷题!用蓝桥杯C/C++真题“七段数码管”和“合并检测”,教你提升编程思维
蓝桥杯C/C真题精讲:从"七段数码管"到"合并检测"的思维跃迁 在编程竞赛的征途上,许多学习者陷入了一个常见误区——把刷题简单等同于看答案和记忆解法。这种机械式的训练往往事倍功半,就像试图通过临摹字帖来学习创作诗歌…...
告别内核打印!用devmem2在嵌入式Linux上直接读写寄存器(附交叉编译踩坑实录)
嵌入式Linux寄存器调试利器:devmem2实战指南与交叉编译全解析 调试嵌入式系统时,最令人头疼的莫过于反复修改内核驱动、重新编译、烧录镜像的漫长循环。想象一下这样的场景:你正在调试一块全新的ARM开发板,GPIO死活不工作&#x…...
告别明文传输:手把手教你用PGP Desktop给邮件和文件上把‘锁‘(附Outlook配置)
告别明文传输:手把手教你用PGP Desktop给邮件和文件上把"锁" 在数字化办公日益普及的今天,一封未加密的邮件就像一张明信片——所有经手它的人都能看到内容。想象一下,当你发送一份包含客户隐私数据的合同,或是与同事讨…...
LinkSwift:八大网盘直链下载神器,彻底告别限速烦恼!
LinkSwift:八大网盘直链下载神器,彻底告别限速烦恼! 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 /…...
从零到一:基于Cadence的MOS共源放大器仿真与性能调优实战
1. 初识MOS共源放大器:从理论到仿真实践 第一次接触MOS共源放大器时,我被它简洁的结构和强大的信号放大能力所吸引。作为模拟电路设计中最基础的放大器结构之一,共源放大器就像是一个"信号放大器",能够将微弱的输入信号…...
