哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步
一位上进心十足的【Java ToB端大厂领域博主】!
喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决
✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
————————————————
目录
⛳️ 1.文章核心知识点介绍
⛳️ 2.为什么学习k8s
⛳️ 3.使用环境和必备知识技能
⛳️ 4.互联⽹项⽬部署⽅式演进历史发展
传统部署时代:
虚拟化部署时代:
容器部署时代:
⛳️ 5.概念
⛳️ 6常见功能
服务发现和负载均衡
存储编排
⾃动部署和回滚
⾃我修复
密钥与配置管理
⛳️ 7.常⻅组件和整体架构
常见概念:master、node、pod、podcontroller、service、label、namespace
Master
Node
Pod
Pod Controller
service
Label
NameSpace:
应⽤分类
⛳️ 8.整体架构
⛳️ 9.集群架构和云服务搭建
k8s集群类型
单master-Node集群 ⼀主多从
多主多从(⾼可⽤集群)
单⼀个节点
k8s搭建⽅式:
Minikube搭建:
常见命令
启动minikube
#查看集群信息
查询节点信息:
查看内部组件
⛳️ 10. 只用5分钟带你部署k8s单节点应用
容器编排调度是近几年非常流行,使用非常广泛的一项云技术。是多数互联⽹公司⾥⾯⽤的技术,实现跨主机多容器编排调度管 理的最佳技术之⼀。国内外一线大厂都使用的一项技术。
今天博主就将kubernetes的基本使用记录下来。
写在前面,对k8s的使用首先先进行一次自己的整理,如果现在看不懂可以记住,根据下面内容的学习,你一定会明了的。
k8s可以理解成一个航母战斗群组,有一个master长官对整个战斗群进行总指挥,剩下的驱逐舰、护卫舰和巡洋舰等就是node节点。这里的航母暂且就认为只有指挥的作用。
服务发现和负载均衡:
战斗群能够使用 经纬度定位自己编队的战舰位置,这就是服务发现)
当敌人很多的时候,能够请求增援,或者指挥自己的编队进行队内增援,这就是负载。
存储编排:
战斗群能够将战舰航行和战斗的信息进行记录,并进行保存这就是存储,航母对战舰的指挥,这就是编排
自动部署和回滚
当与指挥部失联,只能自动部署作战了,太强大了,先保存实力等大部队来了再一句歼灭敌人
自我修复
当某个战舰收到攻击,损伤不是很严重的时候,战舰上的船员能够自己对船只进行修复
用一句话简单记忆上面的功能就是:
指挥官发现(服务发现)敌人过于强大,先忍辱负(负载均衡)重,保存(存储编排)自己的实力,回退一下(回滚),修复一下损伤的船只,等带大部队的到来,一举歼灭敌人。
是不是k8s的功能我们就记住了
本文会安装下面的内容进行介绍:
通过本文你会掌握上面的全部知识:
阿⾥云Linux CentOS 7服务器
- 有Linux+docker
- 框架整合这块:采⽤SpringBoot框架(采⽤其他语⾔或框架 也⾏)
K8S官方⽂档:K8S⽂档:https://kubernetes.io/docs/home/
相信⼤家对K8S是⼜爱⼜恨
所谓爱的深、痛的深
爱:互联⽹⼤⼚⼴泛使⽤,功能强⼤
痛:概念多、⼜抽象、底层复杂
我们可以看出k8s看起来还是很容易的,但是其中的组件还是很多很抽象的。真正做到掌握还是很有难度的。
我们的应用部署经历了很长时间的发展,下面是应用部署的发展过程。
早期的时候,在物理服务器上运⾏应⽤程序
缺点:⽆法限制在物理服务器中运⾏的应⽤程序资源使⽤,会 导致资源分配问题,过⾼或过低 部署多个物理机,维护许多物理服务器的成本很⾼。
缺点
容器类似于 VM,但是更宽松的隔离特性,使容器之间可 以共享操作系统(OS)
最熟悉的就是Docker容器化技术
但是容器化部署还是有很多问题
基于上门的问题,容器编排管理就出现了。出现了一些容器编排管理软件。
说了半天,那Kubernetes是什么呢??️️
- 控制节点:master-node 负责集群管理
- 工作节点:worker-node 负责为集群提供运行环境
指的是集群控制节点(相当于整个集群的指挥中⼼),在 每个Kubernetes集群⾥都需要有⼀个Master来负责整个集 群的管理和控制
除了master,k8s集群中的其他机器被称为Node节点, Node节点才是kubernetes集群中的⼯作负载节点 每个Node节点都会被master分配⼀些⼯作负载(docker 容器),node节点上的docker负责容器的运⾏
除了master,k8s集群中的其他机器被称为Node节点, Node节点才是kubernetes集群中的⼯作负载节点 每个Node节点都会被master分配⼀些⼯作负载(docker 容器),node节点上的docker负责容器的运⾏
Pod是⼀组容器, 在K8S中,最⼩的单位是Pod, ⼀个Pod可 以包含多个容器,但通常情况下我们在每个Pod中仅使⽤ ⼀个容器
可以把Pod理解成豌⾖荚, Pod内的每个容器是⼀颗颗豌⾖
分类
⾃主创建:直接创建出来的Pod,这种pod删除后就没 有了,也不会⾃动重建 控制器创建:通过控制器创建的pod,这类Pod删除了 之后还会⾃动重建
简单记忆
node就是一个装着豌豆的盒子。豌豆就是pod 容器就是豌豆。
控制器是管理pod的中间层,只需要告诉Pod控制器,想要 创建多少个什么样的Pod,它会创建出满⾜条件的Pod并确 保每⼀个Pod资源处于⽤户期望的⽬标状态。如果Pod在运 ⾏中出现故障,它会基于指定策略重新编排Pod
通过它来实现对pod的管理,⽐如启动pod、停⽌pod、扩 展pod的数量等等
类型
ReplicaSet、Deployment、Horizontal Pod Autoscaler、DaemonSet等
在k8s⾥⾯,每个Pod都会被分配⼀个单独的IP地址,但这个 IP地址会随着Pod的销毁⽽消失 Service (服务)就是⽤来解决这个问题的, 对外服务的统⼀⼊ ⼝,⽤于为⼀组提供服务的Pod 抽象⼀个稳定的⽹络访问 地址 ⼀个Service可以看作⼀组提供相同服务的Pod的对外访问 接⼝,作⽤于哪些Pod是通过标签选择器来定义的
K8S提供了⼀种机制来为Pod进⾏分类,那就是Label(标 签),同⼀类pod会拥有相同的标签 Label的具体形式是key-value的标记对,可以在创建资源 的时候设置,也可以在后期添加和修改
给某个资源对象定义⼀个Label,就相当于给它打了⼀个标 签,可以通过Label Selector(标签选择器)查询和筛选拥 有某些Label的资源对象,K8S通过这种⽅式实现了类似 SQL的对象查询机制
应⽤场景
未使⽤前,分散难管理,如果需要部署不同版本的应⽤ 到不同的环境中,难操作
为Pod打上不同标签,使⽤Label组织的Pod,轻松管理
对应的资源打上标签后,可以使⽤标签选择器过滤指定的标 签
标签选择器⽬前有两个
基于等值关系(等于、不等于)
基于集合关系(属于、不属于、存在)
简单记忆
service-->标签选择器-->pod
可以在⼀个物理集群上运⾏多个虚拟集群,这种虚拟集群 被称作 命名空间,⽤来隔离pod的运⾏环境
同⼀个名字空间中的资源名称必须唯⼀,⽽不同名字空间 之间则没有这个要求
NameSpace是不能嵌套的,每⼀个 Kubernetes 的资源都 只能在⼀个NameSpace内
名字空间是在多个⽤户之间划分集群资源的⼀种⽅法(通 过资源配额)例如都叫商品服务,那么能够通过namespace实现着两个商品服务的区分。
不必使⽤多个名字空间来分隔轻微不同的资源,例如同⼀ 软件的不同版本: 应该使⽤标签 来区分同⼀名字空间中的 不同资源
Kubernetes 会创建四个初始NameSpace名称空间:
default 没有指明使⽤其它名字空间的对象所使⽤的默 认名字空间 kube-system Kubernetes 系统创建对象所使⽤的名字 空间 kube-public kube-node-lease
有状态应⽤(需要感应到之前的数据)
⽆状态应⽤
状态的应用,能快速扩容(账号服务没有)
K8S整体架构,也是Client-Server模型
apiserver:提供操作【k8s集群资源】的唯⼀⼊⼝, RESTful⽅式请求,并提供认证、授权、访问控制、API注册 和发现等
scheduler:负责资源的调度,按照预定的调度策略,【计 算】将Pod调度到相应的Node节点进⾏应⽤部署
controller-manager:控制器管理中⼼,负责维护集群的 状态,⽐如故障检测、滚动更新等,根据调度器的安排通 知对应的节点创建pod(将上面的调度器设计的)放到对应的容器中去
etcd:存储中⼼,是兼具⼀致性和⾼可⽤性的键值数据 库,可以作为保存 Kubernetes 所有集群数据的后台数据 库
Node是Pod真正运⾏的主机,可以是物理机也可以是虚拟 机, Node本质上不是K8S来创建的, K8S只是管理Node上 的资源,为了管理Pod,每个Node节点上⾄少需要运⾏ container runtime(Docker)、kubelet和kube-proxy服 务
kubelet:相当于主节点派到⼯作节点的⼀个代表(小跟班),⽤于管 理本机容器(相当于master节点的化身),负责维护容器 的⽣命周期也负责Volume(CVI)和⽹络(CNI)的管理
kube-proxy:负责为Service提供cluster内部的服务发现/ ⽹络代理/负载均衡等操作,为部署的应⽤程序提供访问⼊ ⼝(对外的通讯员),和apiserver(操作内部的)是不⼀样的,后者是操作k8s集群内部的
通过Kubectl(kubecontroller)进行交互,连接apiserver,到etcd中获取各个资源的pod等连接的情况。再执行调度器进行计算,计算pod到哪一个容器中去。由apiserver通知controller-manager来决定部署到哪里去。由controller-manager通知node节点(小跟班),然后通过容器引擎,来通知在创建pod部署容器。
现在对k8s的概念和各个组件和整体又了一个大致的了解,接下来我们将亲自搭建一个K8s集群。这里使用的是centos7机器。用自己的虚拟机也可以
服务器要求:服务器要求⾄少⼀台2核4G以上的云服务器
推荐测试环境 服务器要求:服务器要求⾄少2台2核4G以上的云服务器 多master-Node集群
推荐⽣产环境使⽤ 服务器要求:服务器要求⾄少4台2核4G以上的云服务器 单节点k8s集群
服务器要求:服务器要求⾄少⼀台2核4G以上的云服务器
一主多从的结构
多主多从的结构
是⼀个K8s部署⼯具,提供kubeadm init和kubeadm join ⽤于快速搭建k8s集群,⽐较推荐
从github下载发⾏版的⼆进制包,⼿动部署每个组件, 组 成Kubernetes集群
可以了解底层,但是步骤繁琐,坑⽐较多
是⼀种轻量化的Kubernetes集群,是k8s社区为了帮助开 发者和学习者能够更好学习和体验k8s功能⽽推出的,使⽤ 个⼈PC的虚拟化环境就快速构建启动单节点k8s
避免这些兼容性问题:统⼀使⽤阿⾥云Linux CentOS 7.8
安装Docker
# 1.先安装yml
yum install -y yum-utils device-mapper-persistentdata lvm2
# 2.设置阿⾥云镜像 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo
# 3.查看可安装的docker版本
yum list docker-ce --showduplicates | sort -r
#4. 安装docker
yum -y install docker-ce-20.10.10-3.el7
#5. 查看docker版本
docker -v
#配置开机⾃启动
systemctl enable docker.service
#6. 启动docker
systemctl start docker
#7. 查看docker 启动状态
systemctl status docker
配置镜像源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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/d oc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpmpackage-key.gpg
EOF
安装kubectl
yum install -y kubectl-1.18.0
安装minikube
curl -LO https://storage.googleapis.com/minikube/releases/v1.18.1/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube
检查minikube安装是否成功
minikube version
minikube start --image-mirror-country='cn' --driver=docker --force
kubectl cluster-info
这里可能和我一样遇到-bash: kubectl: 未找到命令的问题,可参考文章解决
https://blog.csdn.net/qq_29235677/article/details/125933839https://blog.csdn.net/qq_29235677/article/details/125933839
kubectl get node
状态信息是Ready
角色是:master
查询多节点多时候,就会看到多个,只有在集群中就能够获取集群中全部节点的信息。
kubectl get pod
这里如果没有指定名称空间的话,会到默认的命名空间去查询,但是现在没有,所以可以加 -A查询全部
查询全部的名称空间
kubectl get pod -A
这里我们获取的就是kubectl-system的名称空间,这里是系统内置的。上面的组件我们大部分之前都讲过了
部署第⼀个K8S应⽤-Nginx,并通过公⽹ip访问
创建deployment(Pod控制器的⼀种, 直接删除pod后,会⾃ 动创建新的,需要删除deployment)
kubectl create deployment my-nginx --image=nginx:1.23.0
查看deployment和pod
kubectl get deployment,pod,svc
⚠️注意这里可以缩写
svc 是service的缩写
deploy 是deployment的缩写
暴露80端⼝, 就是service服务
node的type有下面几种
supported values: "ClusterIP", "ExternalName", "LoadBalancer", "NodePort
ClusterIP:pod之间的通信内部的通信
ExternalName
LoadBalancer
NodePort :对外的通信
kubectl expose deployment my-nginx --port=80 --type=NodePort
暴露出80端口之后,现在的服务就有两个了,上面我们查看的是1个
转发端⼝(Mini Kube临时)
kubectl port-forward --address 0.0.0.0 service/my-nginx 8087:80
解释: kubectl port-forward 转发⼀个本地端⼝到 Pod 端⼝,不 会返回数据,需要打开另⼀个终端来继续这个练习 my-nginx是一个服务
⚠️注意开启 安全组
完美!!!
注意
Minikube的搭建跟⽤Kubeadm的有⼀点不⼀样
Nodeport不能通过ip+端⼝直接访问,要通过minikube service(内⽹访问)和端⼝转发(公⽹访问)
⛳️
到这里我们就将k8s的大部分概念讲解完了,现在我们能够通过k8s注册一个应用,并访问nginx服务了。
如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。