一篇文章教会你使用kubernetes的基本使用

  
哈喽!大家好,我是「奇点」,江湖人称 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的基本使用_第1张图片

今天博主就将kubernetes的基本使用记录下来。

写在前面,对k8s的使用首先先进行一次自己的整理,如果现在看不懂可以记住,根据下面内容的学习,你一定会明了的。

k8s可以理解成一个航母战斗群组,有一个master长官对整个战斗群进行总指挥,剩下的驱逐舰、护卫舰和巡洋舰等就是node节点。这里的航母暂且就认为只有指挥的作用。

服务发现和负载均衡:

战斗群能够使用 经纬度定位自己编队的战舰位置,这就是服务发现

当敌人很多的时候,能够请求增援,或者指挥自己的编队进行队内增援,这就是负载

存储编排:

战斗群能够将战舰航行和战斗的信息进行记录,并进行保存这就是存储,航母对战舰的指挥,这就是编排

自动部署和回滚

当与指挥部失联,只能自动部署作战了,太强大了,先保存实力等大部队来了再一句歼灭敌人

自我修复

当某个战舰收到攻击,损伤不是很严重的时候,战舰上的船员能够自己对船只进行修复

用一句话简单记忆上面的功能就是:

指挥官发现(服务发现)敌人过于强大,先忍辱负(负载均衡)重,保存(存储编排)自己的实力,回退一下(回滚),修复一下损伤的船只,等带大部队的到来,一举歼灭敌人。

是不是k8s的功能我们就记住了

一篇文章教会你使用kubernetes的基本使用_第2张图片

 

⛳️  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占有率很⾼,是近⼏年⼤ 量流⾏
  • 可以作为公司内部培训技术分享必备知识,超多案例+实战等
  • 多数国内外的互联网大厂都使用的一门技术

一篇文章教会你使用kubernetes的基本使用_第3张图片

⛳️ 3.使用环境和必备知识技能

阿⾥云Linux CentOS 7服务器

  • 有Linux+docker
  • 框架整合这块:采⽤SpringBoot框架(采⽤其他语⾔或框架 也⾏)

K8S官方⽂档:K8S⽂档:https://kubernetes.io/docs/home/

⛳️ 4.互联⽹项⽬部署⽅式演进历史发展

相信⼤家对K8S是⼜爱⼜恨

所谓爱的深、痛的深

爱:互联⽹⼤⼚⼴泛使⽤,功能强⼤

痛:概念多、⼜抽象、底层复杂

我们可以看出k8s看起来还是很容易的,但是其中的组件还是很多很抽象的。真正做到掌握还是很有难度的。

一篇文章教会你使用kubernetes的基本使用_第4张图片

 我们的应用部署经历了很长时间的发展,下面是应用部署的发展过程。

一篇文章教会你使用kubernetes的基本使用_第5张图片

传统部署时代:

早期的时候,在物理服务器上运⾏应⽤程序

缺点:⽆法限制在物理服务器中运⾏的应⽤程序资源使⽤,会 导致资源分配问题,过⾼或过低 部署多个物理机,维护许多物理服务器的成本很⾼。

虚拟化部署时代:

  • 虚拟化技术允许在单个物理服务器的 CPU 上运⾏多台虚拟 机(VM)。
  • 虚拟化能使应⽤程序在不同 VM 之间被彼此隔离,且能提 供⼀定程度的安全性
  • 能够更好地利⽤物理服务器的资源,具有更⾼的可伸缩 性,以及降低硬件成本等等的好处

缺点

  • 需要单独⼀个系统,占⽤资源
  • 不能灵活的扩容和缩容

容器部署时代:

容器类似于 VM,但是更宽松的隔离特性,使容器之间可 以共享操作系统(OS)

最熟悉的就是Docker容器化技术

  • ⼀⾏命令可以部署任意⼀个 mysql、nginx、redis、 RabbitMQ、Kakfa等热⻔中间件
  • docker命令可以操作当前机器上的1个容器
  • docker-compose可以操作当前机器上的多个容器
  • 容器⽐起 VM 被认为是更轻量级的,每个容器都具有⾃⼰ 的⽂件系统、CPU、内存、进程空间等。
  • 跨云和操作系统发⾏版本的可移植性:可在 Ubuntu、 CoreOS、CentOS、 Google Kubernetes Engine 和其他 任何地⽅运⾏

但是容器化部署还是有很多问题

一篇文章教会你使用kubernetes的基本使用_第6张图片

 基于上门的问题,容器编排管理就出现了。出现了一些容器编排管理软件。

  • Docker Swarm:Docker⾃⼰的容器编排⼯具
  • Mesos:Apache的资源管控的⼯具,结合Marathon使⽤
  • Kubernetes:Google开源的的容器编排⼯具, 基于内部 Borg系统的开源版本

一篇文章教会你使用kubernetes的基本使用_第7张图片

⛳️ 5.概念

说了半天,那Kubernetes是什么呢??️️

  • K8S的本质是⼀组服务器集群,可以在对应服务器集群的每个 节点上运⾏程序,来对节点中的容器进⾏管理。
  • 类似Master-Work⽅式,每个服务器上安装特定的k8s组件, 就可以形成集群,然后部署对应的应⽤即可。

⛳️ 6常见功能

服务发现和负载均衡

  • Kubernetes 可以使⽤ DNS 名称或⾃⼰的 IP 地址来暴露容 器。
  • 如果进⼊容器的流量很⼤, Kubernetes 能够⾃动实现请 求的负载均衡分配⽹络流量,从⽽使部署稳定

存储编排

  • Kubernetes 允许⾃动挂载选择的存储系统,例如本地存 储、云提供商存储等。

⾃动部署和回滚

  • 可以⽤k8s⾃动化部署创建新容器, 删除现有容器并将它 们的所有资源⽤于新容器。
  • 当版本发布错误,可以⽴刻回退到之前的版本

⾃我修复

  • 如果某个容器宕机了,K8S 可以快速重新启动新的的容 器,替换旧的容器

密钥与配置管理

  • K8S允许存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥

⛳️ 7.常⻅组件和整体架构

  • 控制节点:master-node 负责集群管理
  • 工作节点:worker-node 负责为集群提供运行环境

一篇文章教会你使用kubernetes的基本使用_第8张图片

常见概念: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删除了 之后还会⾃动重建

一篇文章教会你使用kubernetes的基本使用_第9张图片

简单记忆

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的对象查询机制

    应⽤场景

    未使⽤前,分散难管理,如果需要部署不同版本的应⽤ 到不同的环境中,难操作

一篇文章教会你使用kubernetes的基本使用_第10张图片

为Pod打上不同标签,使⽤Label组织的Pod,轻松管理 

一篇文章教会你使用kubernetes的基本使用_第11张图片

  1. Label选择器 

    对应的资源打上标签后,可以使⽤标签选择器过滤指定的标 签

    标签选择器⽬前有两个

    1. 基于等值关系(等于、不等于)

    2. 基于集合关系(属于、不属于、存在)

简单记忆

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集群内部的

一篇文章教会你使用kubernetes的基本使用_第12张图片

通过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以上的云服务器

一篇文章教会你使用kubernetes的基本使用_第13张图片

 一主多从的结构

 

一篇文章教会你使用kubernetes的基本使用_第14张图片

多主多从的结构 

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

一篇文章教会你使用kubernetes的基本使用_第15张图片

 

#查看集群信息

kubectl cluster-info

这里可能和我一样遇到-bash: kubectl: 未找到命令的问题,可参考文章解决

https://blog.csdn.net/qq_29235677/article/details/125933839icon-default.png?t=M666https://blog.csdn.net/qq_29235677/article/details/125933839 

一篇文章教会你使用kubernetes的基本使用_第16张图片

查询节点信息:

kubectl get node

 状态信息是Ready

角色是:master

 查询多节点多时候,就会看到多个,只有在集群中就能够获取集群中全部节点的信息。

查看内部组件

kubectl get pod 

这里如果没有指定名称空间的话,会到默认的命名空间去查询,但是现在没有,所以可以加 -A查询全部

查询全部的名称空间 

kubectl get pod -A

一篇文章教会你使用kubernetes的基本使用_第17张图片

这里我们获取的就是kubectl-system的名称空间,这里是系统内置的。上面的组件我们大部分之前都讲过了

一篇文章教会你使用kubernetes的基本使用_第18张图片 

 

⛳️ 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

一篇文章教会你使用kubernetes的基本使用_第19张图片 

⚠️注意这里可以缩写

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是一个服务

⚠️注意开启 安全组 

一篇文章教会你使用kubernetes的基本使用_第20张图片

 完美!!!

一篇文章教会你使用kubernetes的基本使用_第21张图片

 

 

注意

Minikube的搭建跟⽤Kubeadm的有⼀点不⼀样

Nodeport不能通过ip+端⼝直接访问,要通过minikube service(内⽹访问)和端⼝转发(公⽹访问)

⛳️ 

到这里我们就将k8s的大部分概念讲解完了,现在我们能够通过k8s注册一个应用,并访问nginx服务了。

如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

你可能感兴趣的:(kubernetes,运维,容器,java,servlet)