Kubernetes 是一个软件系统,使你在数以万计的电脑节点上运行软件时就像 所有节点是以单个大节点一样, 它将底层基础设施抽象,这样做同时简化了应用开发、部署,以及对开发和运维团队的管理。
Kubernetes集群由很多节点组成,分为两大类:
控制集群并使它工作,包含多个组件(组件单节点或通过副本分别部署到多个主节点以确保高可用)
本处window10+Hyper-V搭建minikube本地集群
这台虚拟机既作为master,又作为worker,Kubectl从集群外部发起管理和控制。
# 因国内极差的网络环境,建议使用阿里云的镜像地址:
minikube start --image-mirror-country=cn --image-repository=http://registry.aliyuncs.com/google_containers --registry-mirror=https://aq32bn7a.mirror.aliyuncs.com
以管理员权限执行CMD命令:
Kubernetes API作为声明式配置方案
的基石,API文档中定义了API端点、资源,kubectl命令行工具可操作API对象,对象的序列化对象存储在etcd中,各组件也是通过API交互。
Kubernetes对象代表系统中持久化的实体,下面的实体都作为对象:
Kubernetes对象是期望状态
,创建对象之后,你就通知了K8s你希望集群这样运作。
大多数K8s对象由spec和status组成:
当你创建k8s对象, 你需要提供对象spec来描述预期状态。 当使用k8s API(或者kubectl),在API请求的body包含json信息;大多数时给kubectl提供.yaml文件来代替json,kubectl会将yaml文件中信息转换为json再发起API请求。
下面的kubia-rs.yaml文件
:ReplicaSet对象启动3个nodejs应用, spec定义了此次ReplicaSet的规格
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: kubia-rs
spec:
replicas: 3
selector:
matchLabels:
app: kubia
template:
metadata:
labels:
app: kubia
spec:
containers:
- name: kubia
image: luksa/kubia
ports:
- containerPort: 8080对于ReplicaSet啰嗦两句: 新一代的ReplicationController; 通常不会直接创建ReplicaSet,而是在创建更高级的Deployment资源时自动创建它们。
Kubernetes Pod是创建/部署k8s对象中最小最简单的单元:
由于不能将多个进程聚集在一个单独容器,需要另外一种高级结构将容器绑定在一起,作为一个单元管理,这就是Pod背后根本原理, 一个pod中容器共享相同ip和端口空间。
k8s控制器是一个control loop
(监控集群状态,在被需要时或主动请求时更新集群),每个控制器都试图将当前集群状态移动到期望状态
。
在机器人和自动化,
control loop
是一个非终止回路,用于调节系统状态,例如房间的空调。undefined控制器自身可以执行操作,但一般情况下,控制器会将引起连锁反应的消息发往api server.
Kubernetes内置了一些控制器: ReplicaSet、Deployment、StatefulSets、DaemonSet、Job...
# k8s deployment检查容器健康状态、保证容器数量、还具备部署相关的特性, deployment是管理和缩放容器的推荐控制器
kubectl create deployment hello-kubia --iamge=luksa/kubia
这4个概念连起来就是:
K8s已经定义了API元数据,Controller调度K8s系统到指定的 预期状态(这个预期状态以K8s对象体现),在落地形式上以创建/调度Pod来承载应用。 (此4个概念还不包含NetWork相关)
> kubectl get pod --show-labels=true
NAME READY STATUS RESTARTS AGE LABELS
kubia-rs-96ncq 1/1 Running 0 3m40s app=kubia
kubia-rs-h5ppz 1/1 Running 0 3m41s app=kubia
kubia-rs-x5578 1/1 Running 0 3m40s app=kubia注意:Pod控制器中使用标签选择器
来指定哪些Pod属于同一组(服务也使用同样机制)。
集群内访问: ClusterIP
提供集群外访问
4种网络方式的yaml代码如下:请通过kubectl create -f ...ymal命令生成对应的服务(ingress不是服务)
LoadBalancer是服务暴露到集群外或者公网上的标准方式;undefinedIngress 这个服务类型跟我们前面的三种服务类型不一样,
它实际上不是一种服务类型
,而是类似一种集群服务入口的存在,它可以基于你配置的不同路径或者子域名把流量路由到对应的后端服务,更像是一个“智能路由”服务。
上面输出差异体现了随机Pod(即使连接来自同一个客户端),SessionAffinity亲和力属性值(ClientIP)可让单一客户端请求都指向一个Pod。
本文从K8s全局架构讲起,力求先在你头脑中构筑宏观思维导图;
提出核心概念帮助全流程理解;
通过一个常见的多实例nodejs应用来实践k8s核心功能。
本文的所有代码:https://github.com/zaozaoniao/k8s-example.git
https://blog.csdn.net/weixin_44267608/article/details/102728050
阅读更多