我们希望在生产环境下做到服务永不中断,如果应用的容器挂掉,我们希望有一种机制能及时拉起一个新的应用容器,保障服务的可用性。
这就是K8S解决的问题。除此之外,k8s还能提供很多有用的特性
所以K8S并不是一个传统意义上包罗一切的PaaS平台。
K8S集群中的机器被称为节点。
K8S集群的节点分成两种角色,Master节点和Node节点。
K8S架构简单来说就是一个Master节点管理一群Node节点。
Master节点上不存储容器,只负责调度。
pods,pod是k8s管理的最小单元。pod的内部是容器。pod是一组容器的集合。也就是说k8s不直接操作容器,而是通过pod来管理容器。
pod也是一个容器,pod是一个用来装docker容器的容器。
一个pod内部可以放一个容器,也可以是多个容器。pod可以理解为一台独立主机,有自己的ip地址和主机名,可以起一个或多个docker容器。
通常情况下,在服务部署时候,使用 Pod 来管理一组相关的服务。一个 Pod 中要么部署一个服务,要么部署一组有关系的服务。
容器本身相互之间是隔离的,根据linux的namespace和group实现。
但是一个pod中的多个容器是共享网络的。
每个pod有自己独立的ip地址,一个pod内部的容器之间用localhost访问,相当于访问本地服务,性能很高。但是不同pod之间的访问属于远程通信。
Pod 是虚拟的资源对象(进程),没有对应实体(物理机,物理网卡)与之对应,无法直接对外提供服务访问。Pod 如果想要对外提供服务,必须绑定物理机端口。也就是说在物理机上开启端口,让这个端口和 Pod 的端口进行映射,这样就可以通过物理机进行数据包的转发。概括来说:先通过物理机 IP + Port 进行访问,再进行数据包转发。
pod是一个进程,是有生命周期的。宕机、版本更新等,都会创建新的pod,IP地址和hostname都会变化,所以不能使用ip做负载均衡。
每一个 Pod 内部都有一个特殊的被称为”根容器“的 Pause 容器。Pause 容器对应的镜像是属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod
还包含一个或多个紧密相关的用户业务容器。也是通过pause容器实现了pod的共享
可以看到所有组件都是通过api-server交互,只有api-server才能操作etcd存储。
影响调度的属性:
管理和运行容器的一个对象,是实际存在的,不想pod只是一个抽象的概念。
k8s中有多种controller。如deployment。
还有另一种叫法,工作负载。和controller控制器一回事,叫法不同而已。
pod通过controller实现应用的运维。比如应用的伸缩,滚动升级。
确保预期的pod副本的数量。
pod和controller是通过label标签和selector建立关系。
最常用的一个控制器。
使用场景
kubectrl apply -f xx.yaml
有状态的controller。持久化存储。
有状态的容器需要保证pod的唯一性,启动的有序性。
有状态的应用的pod会生成一个唯一的网络标识符。在yaml中配置service的clusterIp:none设置pod的ip为none
每个有状态的pod也会自动生成唯一域名,格式为:主机名称.service名称.名称空间.svc.cluster.local
部署一个守护进程pod
job:一次性任务
cronJob:定时任务
定义一组pod的访问规则。
我们访问应用先访问的是service。
1.防止pod失联。服务发现机制。每个pod都有自己的ip。但是当pod重启时ip会发生变化。所以将pod先向service注册,可以通过service找到pod。service很像微服务中的注册中心。
2.负载均衡
service有自己的虚拟ip,vip
kubectl 是 Kubernetes 集群的命令行工具,通过 kubectl 能够对集群本身进行管理。
基本语法:kubectl [command] [type] [name] [flags]
具体的使用kubectl --help查看
K8S中有一个Object(对象)的概念。对象表示的是一种期望的实现。我们用一个yaml文件来描述一个期望得到的对象。K8S会努力去实现我们的这种期望。
比如,在K8S中Deployment 对象能够表示运行在集群中的应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
yaml文件是k8s中的资源清单文件,或者叫资源编排文件。
kubectl 命令直接使用yaml文件就可以实现对大量的资源对象进行编排部署。
是一种标记语言。
在template字段之前的部分。给controller用的。
template字段部分。
如果从零开始手写一个yaml文件还是比较困难的,尤其是各种缩进,很难保证不出错误。
我们一般是在现成的文件上修改
1.使用kubectl creaete命令创建一个yaml文件kubectl create deployment my-ng --image=nginx -o yaml --dry-run > my-ng.yaml-o yaml表示将创建过程输出为yaml格式–dry-run表示只是尝试运行,不会真正启动部署一个pod这种方式适合新创建服务。如果是已有服务,适合用下面的方法。
2.使用kubectl get 命令获取一个已存在的yaml文件# 我们先创建一个ng服务
kubectl create deployment nginx --image=nginxkubectl expose deployment nginx --port=80 --type=NodePort #暴露为一个服务kubectl get pod,svc获取创建的ng服务的yaml文件kubectl get deployment nginx -o yaml --export => my-ng2.yaml
作用:解决了密码等敏感数据的存储问题。敏感数据可以经过加密存储在etcd中,让pod容器以挂载volumn或者变量的方式进行访问。
使用步骤
简写是cm,存储不加密的数据到etcd中。让pod容器以挂载volumn或者变量的方式进行访问。
使用步骤
访问k8s集群时需要经过三个步骤:
ingress作为服务统一入口。ingress不是k8s的内置组件,需要额外安装。
NodePort服务模式的不足:每个node节点都需要开放这个端口,然后通过ip+port的形式访问。而生产环境中,一般都是通过域名访问服务。
Ingress和pod的关系:pod和ingress通过service进行关联。
helm是k8s的包管理工具。可以方便的将之前打包好的yaml文件部署到k8s上。
之前部署一个应用的过程:编写yaml文件 --> 创建service对外暴露 --> 通过ingress域名访问
这种方式的缺点:只适合简单的应用。实际上我们部署微服务项目,可能有几十个服务,用这种方式就不合适了。需要维护大量的yaml文件。
使用helm的优势:
总之,helm的作用就是让我们在k8s中部署应用更高效。
helm的核心概念:
通过传递参数,动态渲染yaml模板。做到yaml的高效复用。
Volume 是 Pod 中能够被多个容器访问的共享目录。
Kubernetes 的 Volume 定义在 Pod 上, 它被一个 Pod 中的多个容 器挂载到具体的文件目录下。
Volume 与 Pod 的生命周期相同, 但与容器的生命周期不相关,当容器终止或重启时,Volume 中的数据也不会丢失。
Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。这些虚拟集群被称为命名空间。
命名空间适合跨多个团队的大型项目,对于只有几到几十个用户的集群,根本不需要创建或考虑名字空间。
名字空间为名称提供了一个范围。资源的名称需要在名字空间内是唯一的,但不能跨名字空间。
# kubectl get namespace #查看命名空间
NAME STATUS AGE
default Active 3d #没有指明使用其它名字空间的对象所使用的默认名字空间
kube-node-lease Active 3d #此名字空间用于与各个节点相关的租期(Lease)对象,使得集群规模很大时节点心跳检测性能得到提升。
kube-public Active 3d #这个名字空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。目的是为了某些资源在所有命名空间中共享
kube-system Active 3d #Kubernetes 系统创建对象所使用的名字空间
kubectl get pods -n 查询时加上命名空间
给大家分享一篇一线开发大牛整理的java高并发核心编程神仙文档,里面主要包含的知识点有:多线程、线程池、内置锁、JMM、CAS、JUC、高并发设计模式、Java异步回调、CompletableFuture类等。
文档地址:一篇神文就把java多线程,锁,JMM,JUC和高并发设计模式讲明白了
码字不易,如果觉得本篇文章对你有用的话,请给我一键三连!关注作者,后续会有更多的干货分享,请持续关注!