📢📢📢📣📣📣
哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝
一位上进心十足的【Java ToB端大厂领域博主】!😜😜😜
喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决😜😜😜
✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
————————————————
目录
常见概念:master、node、pod、podcontroller、service、label、namespace
容器编排调度是近几年非常流行,使用非常广泛的一项云技术。是多数互联⽹公司⾥⾯⽤的技术,实现跨主机多容器编排调度管 理的最佳技术之⼀。国内外一线大厂都使用的一项技术。
今天博主就将kubernetes的基本使用记录下来。
写在前面,对k8s的使用首先先进行一次自己的整理,如果现在看不懂可以记住,根据下面内容的学习,你一定会明了的。
k8s可以理解成一个航母战斗群组,有一个master长官对整个战斗群进行总指挥,剩下的驱逐舰、护卫舰和巡洋舰等就是node节点。这里的航母暂且就认为只有指挥的作用。
服务发现和负载均衡:
战斗群能够使用 经纬度定位自己编队的战舰位置,这就是服务发现)
当敌人很多的时候,能够请求增援,或者指挥自己的编队进行队内增援,这就是负载。
存储编排:
战斗群能够将战舰航行和战斗的信息进行记录,并进行保存这就是存储,航母对战舰的指挥,这就是编排
自动部署和回滚
当与指挥部失联,只能自动部署作战了,太强大了,先保存实力等大部队来了再一句歼灭敌人
自我修复
当某个战舰收到攻击,损伤不是很严重的时候,战舰上的船员能够自己对船只进行修复
用一句话简单记忆上面的功能就是:
指挥官发现(服务发现)敌人过于强大,先忍辱负(负载均衡)重,保存(存储编排)自己的实力,回退一下(回滚),修复一下损伤的船只,等带大部队的到来,一举歼灭敌人。
是不是k8s的功能我们就记住了
⛳️ 1.文章核心知识点介绍
本文会安装下面的内容进行介绍:
- 从0到1教你掌握kubernetes核⼼组件,基于互联⽹项⽬ 部署⽅式演进,到整体容器编排调度组件架构。
- 使⽤阿⾥云ECS服务器多种⽅式搭建K8S集群,搭建 MiniKube、KubeAdm等⽅式,5分钟带你部署第⼀个 K8S应⽤
- 从k8s核⼼资源⽂件yaml解析到多个资源实战,包括 Pod、Label标签、NodeSelector选择器综合应⽤
- Pod控制器Deployment实现滚动升级、DeamonSet、 Job等案例实战;
- 服务注册发现Service多类型ClusterIP、NodePort等应 ⽤;
- 数据存储持久化劵Volume实战,包括ConfigMap、 Secret、NFS、PV、PVC多案例
- 基于当下热⻔框架SpringBoot+JDK11打包镜像,推送私有 镜像仓库+K8S集群部署实战
- 互联⽹⼤⼚DevOps链路解析,热⻔K8S可视化管理⼯具 Rancher2.X实战,部署私有镜像SpringBoot应⽤和热⻔ 中间件Redis7、Mysql8.0实战
- 基于Kubectl操作对⽐Rancher管控台和备份导出,是⼀套 从0学K8S到实战的快速上⼿课程
通过本文你会掌握上面的全部知识:
⛳️ 2.为什么学习k8s
- 多数互联⽹公司⾥⾯⽤的技术,实现跨主机多容器编排调度管 理的最佳技术之⼀
- 可以实现服务注册发现、DevOps⾃动部署和回滚,能够⾃动 实现请求的负载均衡分配⽹络流量
- 在多数互联⽹公司中,Kubernetes占有率很⾼,是近⼏年⼤ 量流⾏
- 可以作为公司内部培训技术分享必备知识,超多案例+实战等
- 多数国内外的互联网大厂都使用的一门技术
⛳️ 3.使用环境和必备知识技能
阿⾥云Linux CentOS 7服务器
- 有Linux+docker
- 框架整合这块:采⽤SpringBoot框架(采⽤其他语⾔或框架 也⾏)
K8S官方⽂档:K8S⽂档:https://kubernetes.io/docs/home/
⛳️ 4.互联⽹项⽬部署⽅式演进历史发展
相信⼤家对K8S是⼜爱⼜恨
所谓爱的深、痛的深
爱:互联⽹⼤⼚⼴泛使⽤,功能强⼤
痛:概念多、⼜抽象、底层复杂
我们可以看出k8s看起来还是很容易的,但是其中的组件还是很多很抽象的。真正做到掌握还是很有难度的。
我们的应用部署经历了很长时间的发展,下面是应用部署的发展过程。
传统部署时代:
早期的时候,在物理服务器上运⾏应⽤程序
缺点:⽆法限制在物理服务器中运⾏的应⽤程序资源使⽤,会 导致资源分配问题,过⾼或过低 部署多个物理机,维护许多物理服务器的成本很⾼。
虚拟化部署时代:
- 虚拟化技术允许在单个物理服务器的 CPU 上运⾏多台虚拟 机(VM)。
- 虚拟化能使应⽤程序在不同 VM 之间被彼此隔离,且能提 供⼀定程度的安全性
- 能够更好地利⽤物理服务器的资源,具有更⾼的可伸缩 性,以及降低硬件成本等等的好处
缺点
- 需要单独⼀个系统,占⽤资源
- 不能灵活的扩容和缩容
容器部署时代:
容器类似于 VM,但是更宽松的隔离特性,使容器之间可 以共享操作系统(OS)
最熟悉的就是Docker容器化技术
- ⼀⾏命令可以部署任意⼀个 mysql、nginx、redis、 RabbitMQ、Kakfa等热⻔中间件
- docker命令可以操作当前机器上的1个容器
- docker-compose可以操作当前机器上的多个容器
- 容器⽐起 VM 被认为是更轻量级的,每个容器都具有⾃⼰ 的⽂件系统、CPU、内存、进程空间等。
- 跨云和操作系统发⾏版本的可移植性:可在 Ubuntu、 CoreOS、CentOS、 Google Kubernetes Engine 和其他 任何地⽅运⾏
但是容器化部署还是有很多问题
基于上门的问题,容器编排管理就出现了。出现了一些容器编排管理软件。
- Docker Swarm:Docker⾃⼰的容器编排⼯具
- Mesos:Apache的资源管控的⼯具,结合Marathon使⽤
- Kubernetes:Google开源的的容器编排⼯具, 基于内部 Borg系统的开源版本
⛳️ 5.概念
说了半天,那Kubernetes是什么呢??🤔️🤔️
- K8S的本质是⼀组服务器集群,可以在对应服务器集群的每个 节点上运⾏程序,来对节点中的容器进⾏管理。
- 类似Master-Work⽅式,每个服务器上安装特定的k8s组件, 就可以形成集群,然后部署对应的应⽤即可。
⛳️ 6常见功能
服务发现和负载均衡
- Kubernetes 可以使⽤ DNS 名称或⾃⼰的 IP 地址来暴露容 器。
- 如果进⼊容器的流量很⼤, Kubernetes 能够⾃动实现请 求的负载均衡分配⽹络流量,从⽽使部署稳定
存储编排
- Kubernetes 允许⾃动挂载选择的存储系统,例如本地存 储、云提供商存储等。
⾃动部署和回滚
- 可以⽤k8s⾃动化部署创建新容器, 删除现有容器并将它 们的所有资源⽤于新容器。
- 当版本发布错误,可以⽴刻回退到之前的版本
⾃我修复
- 如果某个容器宕机了,K8S 可以快速重新启动新的的容 器,替换旧的容器
密钥与配置管理
- K8S允许存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥
⛳️ 7.常⻅组件和整体架构
- 控制节点:master-node 负责集群管理
- 工作节点:worker-node 负责为集群提供运行环境
常见概念:master、node、pod、podcontroller、service、label、namespace
-
Master
指的是集群控制节点(相当于整个集群的指挥中⼼),在 每个Kubernetes集群⾥都需要有⼀个Master来负责整个集 群的管理和控制
-
Node
除了master,k8s集群中的其他机器被称为Node节点, Node节点才是kubernetes集群中的⼯作负载节点 每个Node节点都会被master分配⼀些⼯作负载(docker 容器),node节点上的docker负责容器的运⾏
除了master,k8s集群中的其他机器被称为Node节点, Node节点才是kubernetes集群中的⼯作负载节点 每个Node节点都会被master分配⼀些⼯作负载(docker 容器),node节点上的docker负责容器的运⾏
-
Pod
Pod是⼀组容器, 在K8S中,最⼩的单位是Pod, ⼀个Pod可 以包含多个容器,但通常情况下我们在每个Pod中仅使⽤ ⼀个容器
可以把Pod理解成豌⾖荚, Pod内的每个容器是⼀颗颗豌⾖
分类
⾃主创建:直接创建出来的Pod,这种pod删除后就没 有了,也不会⾃动重建 控制器创建:通过控制器创建的pod,这类Pod删除了 之后还会⾃动重建
简单记忆
node就是一个装着豌豆的盒子。豌豆就是pod 容器就是豌豆。
-
Pod Controller
控制器是管理pod的中间层,只需要告诉Pod控制器,想要 创建多少个什么样的Pod,它会创建出满⾜条件的Pod并确 保每⼀个Pod资源处于⽤户期望的⽬标状态。如果Pod在运 ⾏中出现故障,它会基于指定策略重新编排Pod
通过它来实现对pod的管理,⽐如启动pod、停⽌pod、扩 展pod的数量等等
类型
ReplicaSet、Deployment、Horizontal Pod Autoscaler、DaemonSet等
-
service
在k8s⾥⾯,每个Pod都会被分配⼀个单独的IP地址,但这个 IP地址会随着Pod的销毁⽽消失 Service (服务)就是⽤来解决这个问题的, 对外服务的统⼀⼊ ⼝,⽤于为⼀组提供服务的Pod 抽象⼀个稳定的⽹络访问 地址 ⼀个Service可以看作⼀组提供相同服务的Pod的对外访问 接⼝,作⽤于哪些Pod是通过标签选择器来定义的
-
Label
K8S提供了⼀种机制来为Pod进⾏分类,那就是Label(标 签),同⼀类pod会拥有相同的标签 Label的具体形式是key-value的标记对,可以在创建资源 的时候设置,也可以在后期添加和修改
给某个资源对象定义⼀个Label,就相当于给它打了⼀个标 签,可以通过Label Selector(标签选择器)查询和筛选拥 有某些Label的资源对象,K8S通过这种⽅式实现了类似 SQL的对象查询机制
应⽤场景
未使⽤前,分散难管理,如果需要部署不同版本的应⽤ 到不同的环境中,难操作
为Pod打上不同标签,使⽤Label组织的Pod,轻松管理
- Label选择器
对应的资源打上标签后,可以使⽤标签选择器过滤指定的标 签
标签选择器⽬前有两个
-
基于等值关系(等于、不等于)
-
基于集合关系(属于、不属于、存在)
-
简单记忆
service-->标签选择器-->pod
-
NameSpace:
可以在⼀个物理集群上运⾏多个虚拟集群,这种虚拟集群 被称作 命名空间,⽤来隔离pod的运⾏环境
同⼀个名字空间中的资源名称必须唯⼀,⽽不同名字空间 之间则没有这个要求
NameSpace是不能嵌套的,每⼀个 Kubernetes 的资源都 只能在⼀个NameSpace内
名字空间是在多个⽤户之间划分集群资源的⼀种⽅法(通 过资源配额)例如都叫商品服务,那么能够通过namespace实现着两个商品服务的区分。
不必使⽤多个名字空间来分隔轻微不同的资源,例如同⼀ 软件的不同版本: 应该使⽤标签 来区分同⼀名字空间中的 不同资源
Kubernetes 会创建四个初始NameSpace名称空间:
default 没有指明使⽤其它名字空间的对象所使⽤的默 认名字空间 kube-system Kubernetes 系统创建对象所使⽤的名字 空间 kube-public kube-node-lease
应⽤分类
有状态应⽤(需要感应到之前的数据)
- 不能简单的实现负载均衡的服务,有数据产⽣的服务, Redis、MySql、RabbitMQ等
- 相关服务须通过⼀些较复杂的配置才能做到负载均衡。
- 有状态的应⽤,建议直接在物理机部署,⽅便维护管理
⽆状态应⽤
状态的应用,能快速扩容(账号服务没有)
- 没有对应业务数据的应⽤,可以简单的实现负载均衡,复 制⼀个节点即可快速扩容,如SpringCloud中的业务服务
- ⽆状态的应⽤适合部署在 Kubernetes(K8s)中或者容器 中。
⛳️ 8.整体架构
K8S整体架构,也是Client-Server模型
- 控制节点Master-Node,负责集群的管理
apiserver:提供操作【k8s集群资源】的唯⼀⼊⼝, RESTful⽅式请求,并提供认证、授权、访问控制、API注册 和发现等
scheduler:负责资源的调度,按照预定的调度策略,【计 算】将Pod调度到相应的Node节点进⾏应⽤部署
controller-manager:控制器管理中⼼,负责维护集群的 状态,⽐如故障检测、滚动更新等,根据调度器的安排通 知对应的节点创建pod(将上面的调度器设计的)放到对应的容器中去
etcd:存储中⼼,是兼具⼀致性和⾼可⽤性的键值数据 库,可以作为保存 Kubernetes 所有集群数据的后台数据 库
- ⼯作节点Worker-Node,负责为集群提供运⾏环境
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以上的云服务器
⛳️ 9.集群架构和云服务搭建
k8s集群类型
单master-Node集群 ⼀主多从
推荐测试环境 服务器要求:服务器要求⾄少2台2核4G以上的云服务器 多master-Node集群
多主多从(⾼可⽤集群)
推荐⽣产环境使⽤ 服务器要求:服务器要求⾄少4台2核4G以上的云服务器 单节点k8s集群
单⼀个节点
服务器要求:服务器要求⾄少⼀台2核4G以上的云服务器
一主多从的结构
多主多从的结构
k8s搭建⽅式:
- kubeadm搭建(推荐)
是⼀个K8s部署⼯具,提供kubeadm init和kubeadm join ⽤于快速搭建k8s集群,⽐较推荐
- ⼆进制包搭建
从github下载发⾏版的⼆进制包,⼿动部署每个组件, 组 成Kubernetes集群
可以了解底层,但是步骤繁琐,坑⽐较多
- Minikube搭建:
是⼀种轻量化的Kubernetes集群,是k8s社区为了帮助开 发者和学习者能够更好学习和体验k8s功能⽽推出的,使⽤ 个⼈PC的虚拟化环境就快速构建启动单节点k8s
避免这些兼容性问题:统⼀使⽤阿⾥云Linux CentOS 7.8
Minikube搭建:
安装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
minikube start --image-mirror-country='cn' --driver=docker --force
#查看集群信息
kubectl cluster-info
这里可能和我一样遇到-bash: kubectl: 未找到命令的问题,可参考文章解决
查询节点信息:
kubectl get node
状态信息是Ready
角色是:master
查询多节点多时候,就会看到多个,只有在集群中就能够获取集群中全部节点的信息。
查看内部组件
kubectl get pod
这里如果没有指定名称空间的话,会到默认的命名空间去查询,但是现在没有,所以可以加 -A查询全部
查询全部的名称空间
kubectl get pod -A
这里我们获取的就是kubectl-system的名称空间,这里是系统内置的。上面的组件我们大部分之前都讲过了
⛳️ 10. 只用5分钟带你部署k8s单节点应用
部署第⼀个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
注意这里不能有空格 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服务了。
如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。