源自b粘 GeekHour博主 https://space.bilibili.com/102438649 博主讲的巨无敌清晰,这里做一个笔记大家可以去给博主一键三连!!!

基本概念

当容器过多,用脚本来管理就会变得非常困难,Kubernetes就是为了解决这个问题而生的,可以帮助我们优雅的管理容器化的应用程序和服务

Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了服务发现、负载均衡、自动扩缩容、滚动更新、故障恢复等功能,帮助开发者和运维团队高效管理大规模分布式系统,实现应用的高可用性和弹性伸缩,是云原生时代的核心基础设施。

核心组件

常用组件:

Node 节点

一个节点就是一个物理机或者虚拟机 

在这个 Node 节点上我们可以运行一个或者多个 Pod,Pod 是 Kubernetes 的最小调度单元,一个 Pod 就是一个或者多个应用容器的组合,创建了一个容器的运行环境,在这个容器中容器可以共享资源,例如:网络、存储 以及一些 运行时的配置等 

假设 我们的系统包括一个应用程序和一个数据库,就可以将应用程序和数据库放到两个不同的Pod

并不是一个Pod中只能运行一个程序。因为这样能够更好的实现应用程序的解耦和扩展(仅限于这些容器是高度耦合的情况,他们之间为了实现某种功能,或者共享某些资源,而放置于同一个Pod中)

将一个应用容器和辅助容器(例如 Sidecar)放到同一个 Pod 中

应用程序想要访问数据库,就需要知道数据库的IP地址,IP地址是在Pod分配时自动分配的,是一个集群内部的IP地址

Pod之间就可以通过这个IP地址来进行通信,应用程序也就能够通过这个IP地址来访问数据库了,这个IP地址是内部IP地址,集群外部无法访问,Pod并不稳定,容易被创建和销毁(故障会自动被销毁,ip 地址也会更换),为此K8S提供了SVC(Service)资源对象。

将一组Pod封装成一个服务,例如将应用程序和数据库分别封装成一个服务,应用程序能通过一个统一的入口SVC的IP地址来访问Pod数据库,SVC的IP地址是不会发生变化的

服务又分为内部服务与外部服务,比如这里的数据库服务就是内部服务,是我们没有必要暴露给外部的服务(缓存、消息队列等等)

需要暴露给外部的服务:

例如一些微服务的后端API接口,或者是一些给用户使用的前端界面 

外部服务常用类型:

1、NodePort:

在节点上开放一个Port,然后将Port映射到Service的IP地址和端口上,这样就能通过节点的IP地址和端口来访问Service服务了,在开发和测试阶段,使用这种IP和端口号的方式是没有问题的,生产环境中,通常使用域名来访问服务

2、Ingress - 域名、负载均衡SSL

用来管理从集群外部访问集群内部服务的入口和方式的,通过Ingress来配置不同的转发规则,根据不同规则,访问集群内部不同的Service以及Service对应的后端Pod,还可以使用Ingress来配置域名,将使用IP地址和端口号的方式转换成使用域名的方式来访问Service,Ingress还能配置其他的功能,例如负载均衡、SSL证书等等。

3、ConfigMap - 将配置信息封装起来、在应用程序运行时中读取与使用

解决  应用程序和数据库的耦合性问题:

通常在我们的应用程序需要访问数据库时,会将数据库的URL、username、password写入到配置文件或者环境变量中,然后在应用程序读取这些配置信息,一旦数据库 IP或者Port发生变化,就需要重新编译应用程序,重新部署到集群。

使用ConfigMap,当数据库的信息发生变化时,只需要修改ConfigMap,重新加载Pod就行,不需要重新编译和部署应用程序,但ConfigMap的信息是明文的,不建议将用户密码写在ConfigMap中

4、Secret - 与ConfigMap类似(使用Base64编码)

可以将URL、username、password封装起来。虽然不是明文,但是也只是Base64编码

5、K8S的其他安全机制:网络安全、访问控制、身份认证(user、c.role、sa)等

6、Volume - 数据持久化存储

可以将一些需要持久化存储的资源挂在到集群中的本地磁盘上,或者集群外部的远程存储上

某些需要持久化的程序被销毁和重启,数据也不会丢失

7、Deployment - 定义和管理应用程序的副本数量,应用程序的更新策略

多加几个Node节点,保证应用程序的高可用性

应用程序的高可用性,比如应用程序所在的节点发生了故障,对节点进行升级和更新维护,应用程序可能需要停止服务

当一个节点发生故障的时候,Service会自动将请求转发到其他的Node上,来继续提供服务

 

Pod可以理解为在容器上边加了一层抽象,这样就能将一个或者多个容器组合在一起,而deployment就是在Pod上加了一层抽象,将一个或者多Pod组合在一起

一般不使用,deployment的副本控制来实现数据库的多副本

 需要额外机制、把数据写到一个共享的存储中、把数据同步到其他的副本中

8、StatefulSet(sta) - 数据库、缓存、消息队列等等,有状态类的应用,以及一些保留会话状态

像数据库、缓存、消息队列等等,有状态类的应用,以及一些保留会话状态的应用程序,就使用StatefulSet来部署,但是比较的复杂

通用和更加简单的方式,是将数据库这类有状态的应用程序从K8S中剥离出,在集群外单独部署

架构原理

Master-Worker架构:Master-Node负责管理,Worker-Node负责运行应用程序和服务

K8S中包含多个节点

worker节点上的组件

这就需要一个负载均衡器来接收请求,将请求发送到不同的Node上来完成负载均衡的功能,kube-proxy就是负责这个功能的组件,他会在每一个Node上启动一个网络代理,使发往Service的流量以一种高效的方式路由到正确的Pod中

Master 节点上的组件

Api server就像一个集群的网关,整个系统的入口,所有的请求都会先经过API server,然后由它来分发给不同的组件进行处理,比如一些创建、更新、删除Pod的请求,或者是一些查询集群状态的命令,除了提供接口服务,api-server还负责对所有资源对象的增删改查等操作进行认证,授权和访问控制,确保经过认证的用户才能访问到集群中的资源对象

minikube搭建环境

什么好似minikube和kubectl,以及如何在本地搭建一个K8S环境

  

而在生产环境的K8S集群,一般都是由多个节点组成的,每个节点都是一台服务器或者虚拟机

两台master节点和三台worder节点,就需要5台服务器或者虚拟机,这样的集群才能保证高可用性,因此在本地开发环境中,我们就可以使用minikube来搭建一个简化版的Kubernetes集群,模拟生产环境进行开发测试或者部署验证,minikube是可以让我们在本地运行K8S的一个工具

minikube 安装:

mac:

brew install minikube

minikube

如果下载失败:在后边加上

下载完成

输入:可以获取一些常用命令

kubectl

kubectl get nodes

minikube status

使用k3s和multipass搭建环境

安装完multipass之后,可以创建三个虚拟机,再安装三个k3s

multipass --version

创建虚拟机:指定虚拟机名称k3s,cpu 2核4G内存 磁盘10G

multipass launch --name k3s --cpus 2 --memory 4G --disk 10G

multipass 会自动现在ubuntu的镜像、使用这个镜像来创建虚拟机

multipass list 

multipass ls

来查看当前虚拟机列表

multipass 常用命令:

multipass创建的虚拟机默认是不允许ssh远程登录的,解决办法:使用以下办法修改ssh配置

安装k3s

curl -sfL https://get.k3s.io | sh -

或者使用国内的镜像

安装完成之后,就可以使用

sudo kubectl get nodes

此时已经成功创建成功了一个master节点

从这个master节点上获取一个token,这是用来创建 worker 节点时的一个认证凭证,保存在

/var/lib/rancher/k3s/server/node-token

查看token:

sudo cat /var/lib/rancher/k3s/server/node-token

设置TOKEN

TOKEN=$(multipass exec k3s sudo cat /var/lib/rancher/k3s/server/node-token)
MASTER_IP=$(multipass info k3s | grep IPv4 | awk '{print $2}')

创建两个虚拟机worker,并在这两个虚拟机中安装k3s,并且将他们加入到了集群中

安装 k3s

for f in 1 2; do
    multipass exec worker$f -- bash -c "curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=\"https://$MASTER_IP:6443\" K3S_TOKEN=\"$TOKEN\" sh -"
done

目前我们就登录到了master 和 两个 worker上了

方法1:删除单个虚拟机

# 先停止虚拟机(如果正在运行)
multipass stop worker1

# 删除虚拟机
multipass delete worker1

# 永久删除(清理数据)
multipass purge

方法2:一键停止并删除

# 删除并立即清理(推荐)
multipass delete --purge worker1
multipass delete --purge worker2

方法3:批量删除多个虚拟机

# 同时删除多个
multipass delete --purge worker1 worker2

# 或使用循环
for vm in worker1 worker2; do
    multipass delete --purge $vm
done

kubectl 常用指令:

创建一个pod用来运行nginx

sudo kubectl run nginx --image=nginx

容器创建到运行的过程

查看创建资源对象的帮助文档

sudo kubectl create -h

eg:创建一个deployment:

ubuntu@k3s:~$ sudo kubectl create deployment nginx-deployment --image=nginx
deployment.apps/nginx-deployment created
ubuntu@k3s:~$ 

配置文件:

create(一般只是用于创建资源对象) 与 apply(用于根据配置文件的内容,创建或者更新资源对象) 创建资源对象的区别

更多推荐