部署应用
- 创建nginx-deployment.yaml文件
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.7.9 #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
- 应用yaml文件
kubectl apply -f nginx-deployment.yaml
- 查看部署结果
kubectl get deployment
kubectl get pods | grep nginx-deployment
查看pod/nodes
Pod概述
pod的生命周期
Pod 容器组 是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些共享资源。这些资源包括:
- 共享存储,称为卷(Volumes),即图上紫色圆柱
- 网络,每个 Pod(容器组)在集群中有个唯一的 IP,pod(容器组)中的 container(容器)共享该IP地址
- container(容器)的基本信息,例如容器的镜像版本,对外暴露的端口等
pod是Kubernetes的最小调度单元,当我们执行kubectl apply -f nginx-deployment.yaml创建一个Deployment,然后会在集群上创建包含容器的 Pod (而不是直接创建容器)。该pod会被调度到一个节点上,并在该节点上保持运行直到终止或删除。
Node
Pod总是在 Node上运行。Node是 kubernetes 集群中的计算机,可以是虚拟机或物理机。每个 Node都由 master 管理。一个 Node可以有多个Pod,kubernetes master 会根据每个 Node上可用资源的情况,自动调度 Pod到最佳的 Node上。
每个 Kubernetes Node运行以下几个组件:
- Kubelet,负责 master 节点和 worker 节点之间通信的进程;管理 Pod和Pod内运行的 Container,管理pod状态。
- kube-proxy 网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。维护网络规则, 允许从集群内部或外部的网络会话与 Pod 进行网络通信。
- Container Runtime(容器运行时)负责下载镜像、创建和运行容器等。
相关指令操作
- kubectl get - 显示资源列表
- kubectl describe - 显示有关资源的详细信息
- kubectl logs - 查看pod中的容器的打印日志
- kubectl exec - 进入pod中的容器
更多详细指令
公布应用程序
在一个Kubernetes集群中,如果有多个node,pod会被调度到其中一个或几个node中,在pod调度过程中ip会经常发生变化(即使是同一node上有多个pod,不同pod的IP也不同)(一个pod的网络类似于docker中一个网络组network,是一个虚拟ip)
我们需要一种机制,为前端系统屏蔽后端系统的 Pod(容器组)在销毁、创建过程中所带来的 IP 地址的变化。
Kubernetes 中的 Service(服务) 提供了这样的一个抽象层,它选择具备某些特征的 Pod(容器组)并为它们定义一个访问方式。Service(服务)使 Pod(容器组)之间的相互依赖解耦(原本从一个 Pod 中访问另外一个 Pod,需要知道对方的 IP 地址)。一个 Service(服务)选定哪些 Pod(容器组) 通常由 LabelSelector(标签选择器) 来决定。
在创建Service的时候,通过设置配置文件中的 spec.type 字段的值,可以以不同方式向外部暴露应用程序:
-
ClusterIP(默认)
在群集中的内部IP上公布服务,这种方式的 Service(服务)只在集群内部可以访问到 -
NodePort
使用 NAT 在集群中每个的同一端口上公布服务。这种方式下,可以通过访问集群中任意节点+端口号的方式访问服务 :。此时 ClusterIP 的访问方式仍然可用。 -
LoadBalancer
在云环境中(需要云供应商可以支持)创建一个集群外部的负载均衡器,并为使用该负载均衡器的 IP 地址作为服务的访问地址。此时 ClusterIP 和 NodePort 的访问方式仍然可用。