目录
一、Kubernetes 基础概念
1.容器编排
Kubernetes(简称 K8s)是一个开源的容器编排平台,Kubernetes 用于自动化部署、扩展和管理容器化应用,解决多容器应用的调度、网络、存储等问题。
在 kubernetes 中,所有的内容都抽象为资源,用户需要通过操作资源来管理 kubernetes 。kubernetes 的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes 集群中运行一个个的容器,并将指定的程序跑在容器中。kubernetes 的最小管理单元是 pod 而不是容器,所以只能将容器放在 Pod 中,而 kubernetes 一 般也不会直接管理Pod ,而是通过 Pod控制器 来管理 Pod 的。Pod 可以提供服务之后,就要考虑如何访问 Pod 中服务, kubernetes 提供了 Service 资源实现这个功能。当然,如果Pod 中程序的数据需要持久化, kubernetes 还提供了各种 存储 系统。
2. kubernetes概念
学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作
Pod :kubernetes的最小控制单元;一组容器的集合【一个pod中可以有1个或者多个容器】;共享网络【一个Pod中的所有容器共享同一网络】;生命周期是短暂的(服务器重启后,就找不到了)
Node :工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Master :集群控制节点,每个集群需要至少一个master节点负责集群的管控
Controller :控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service :pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label :标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
二、Kubernetes 组件
Kubernetes 集群由一个控制平面和一个或多个 worker 节点组成。 以下是主要组件的简要概述:
1. 控制平面(Control Plane)
管理集群的整体状态,负责集群的决策 ( 管理 )
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、访问控制、API注册和发现等机制
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd :负责存储集群中各种资源对象的信息,k/v方式存储,所有的 k8s 集群数据存放在此
Kuberctl : 命令行配置工具
2. 工作节点(Node)
在每个节点上运行,维护正在运行的pod 并提供 Kubernets 运行时环境(干活)
Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器,会按固定频率检查节点健康状态并上报给 APIServer,该状态会记录在 Node 对象的 status 中。
KubeProxy : 负责提供集群内部的服务发现和负载均衡,主要就是为 Service 提供服务的,来实现内部从 Pod 到 Service 和外部 NodePort 到 Service 的访问。
Docker : 负责节点上容器的各种操作
三、kubernetes 入门实战
kubernetes在集群启动之后,会默认创建几个namespace:default、kube-node-lease、kube-public、kube-system
默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。
1.Pod
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。同一个Pod中的容器共享 IP 地址,进程间的通讯(IPC,Inter-Process Communication,进程间通信),主机名以及其他资源。
- 同一 Node 中的 Pod 的默认路由都是 docker0 的地址,由于他们关联在同一个 docker0 网桥上,地址段相同,所以能直接通信。
- 不同 Node 中的 Pod 间通信要满足两个条件: Pod 的 IP 不能冲突;将 Pod 的 IP 和所在的 Node 的 IP 关联起来,通过这个关联让 Pod 可以互相访问。
常用命令:
#查看Pod基本信息
kubectl get pods -n dev
#查看Pod详细信息
kubectl describe pod nginx -n dev
#获取Pod 的ip
kubectl get pods -n dev -o wide
#访问Pod
curl http://10.244.1.23:80
#删除指定Pod
kubectl delete pod nginx -n dev
#通过yaml文件创建Pod
kubectl create -f pod.yaml
yaml 配置:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
2.LABEL
Label(标签)是 Kubernetes 系统中另外一个核心概念。一个 Label 是一个 key-value 的键值对,其中 key 与 value 由用户自己指定。Label 可以附加到各种资源对象上,例如 Node、Pod、Service、RC 等。一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源对象中,也可以在对象创建后动态添加或者删除。
另外可以通过给指定的资源对象捆绑一个或多个不同的 Label,来实现多纬度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等管理工作。给某个资源对象定义一个 Label,就相当于给它打了一个标签;随后可以通过 Label selector 标签选择器查询和筛选拥有某些 Label 的资源对象,Kubernetes 通过这种方式实现了类似 SQL 的简单又通用的对象查询机制。
kubectl label pod nginx-pod ver=2.0 -n dev
如果要更新标签,需要在上面一条后面加上 --overwrite
#删除标签:
kubectl label pod nginx-pod ver- -n dev
3.Namespace
命名空间namespace是k8s集群级别的资源,可以给不同的用户、租户、环境或项目创建对应的命名空间,实现资源的隔离。在Kubernetes中,名称空间可以用来:
- 将不同的应用程序隔离开来,避免命名冲突和资源竞争。 -
- 为不同的团队或项目提供独立的环境,使它们可以独立地管理和部署应用程序。
- 控制资源配额和访问权限,以确保应用程序之间的安全隔离。
可以抽象的吧Namespace理解为,QQ分组,分组中存着不同的好友,好友就是容器。
#查看所有名称空间
kubectl get ns
#查看具体哪一个名称空间
kubectl get ns dev
#以yaml的形式查看名称空间
kubectl get ns dev -o yaml
#创建名称空间
kubectl create ns dev
#删除名称空间
kubectl delete ns dev
使用配置文件(命令对象配置 )的方式:
[root@k8s-master ~]# kubectl get ns dev
Error from server (NotFound): namespaces "dev" not found
#写一个ns的yaml文件
[root@k8s-master ~]# vim ns-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
#创建命名空间
[root@k8s-master ~]# kubectl create -f ns-dev.yaml
namespace/dev created
#删除命名空间
[root@k8s-master ~]# kubectl delete -f ns-dev.yaml
namespace "dev" deleted
4.Deployment
可以创建一组Pod来提供具有高可用的服务,如果只删除Pod,控制器会立即拉取一个Pod出来,彻底删除则需要删除deployment。
1.命令行形式:
kubectl create deployment nginx-deployment --image nginx:1.19 --replicas 3 --port 80 -n dev
#其中 --replicas 3 表示指定Pod数
2.yaml 形式:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
5.servie
在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。
为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。
Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个Node节点上都运行着一个kube-proxy服务进程。当创建Service的时候会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种Service的变动,然后它会将最新的Service信息转换成对应的访问规则。
1.命令行形式:
kubectl expose deployment nginxpod --name=svc-ngx --type=NodePort --port 80 --target-port 80 -n dev
然后浏览器访问任意节点的ip地址奖赏端口号就能访问到服务了
2.yaml 配置文件:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP # 或 NodePort/LoadBalancer