0x01 背景
背景容器部署时代,容器类似于 VM,但是具有被放宽的隔离属性,可以在应用程序之间共享操作系统,因此容器被认
为是轻量级的隔离。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等,由于它们与基础架构分
离,因此可以跨云和 OS 发行版本进行移植随着微服务、容器化等技术的发展,解决了资源利用率不高的问题,但是随之而来却是如何进行容器管理,过多的
容器使得运维工作也成为了一种负担,因此容器编排对于大型依托于容器化部署的分布式系统至关重要
kubernetes 集群结构
Master 节点
Master 节点是 Kubernetes 集群的控制节点,每个 Kubernetes 集群里至少有一个 Master 节点,它负责整个集群的决策(如调度),发现和响应集群的事件。Master 节点可以运行在集群中的任意一个节点上,但是最好将Master 节点作为一个独立节点,不在该节点上创建容器,因为如果该节点出现问题导致宕机或不可用,整个集群的管理就会失效
Node 节点
Node 节点是 Kubernetes 集群的工作节点,每个集群中至少需要一台 Node 节点,它负责真正的运行 Pod,当某个 Node 节点出现问题而导致宕机时,Master 会自动将该节点上的 Pod 调度到其他节点。Node 节点可以运行在物理机上,也可以运行在虚拟机中
pod
Pod 里面包含一个或多个容器,在 yaml 中的 containers 中通过写多个 name 来创建多个容器
yaml 文件详解
指定api版本标签
apiVersion: apps/v1
定义资源的类型/角色,deployment为副本控制器
此处资源类型可以是Deployment、Job、Ingress、Service等
kind: Deployment
定义资源的元数据信息,比如资源的名称、namespace、标签等信息
metadata:
定义资源的名称,在同一个namespace空间中必须是唯一的
name: nginx-test lables: app: nginx
定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
spec:
定义副本数量
replicas: 3
定义标签选择器
selector:
定义匹配标签
matchLabels:
需与后面的.spec.template.metadata.labels定义的标签保持一致
app: nginx
定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
template: metadata:
定义Pod副本将使用的标签,需与前面的.spec.selector.matchLabels定义的标签保持一致
labels: app: nginx spec:
定义容器属性
containers:
定义一个容器名,一个-name:定义一个容器
- name: nginx
容忍度(Toleration)与污点(Taint)
Kubernetes 可以约束一个 Pod 只能在特定的节点上运行
节点亲和性是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点
污点(Taint)则相反,它使节点能够排斥一类特定的 Pod
容忍度(Toleration)是应用于 Pod 上的,允许(但并不要求)Pod 调度到带有与之匹配的污点的节点上,我们可以控制 Pod 创建时候的污点来向集群内的节点进行喷射创建。
Namespace
Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services, replication controllers和deployments 等都是属于某一个 namespace 的(默认是default),而 node, persistentVolumes 等则不属于任何 namespace Namespace 常用来隔离不同的用户,比如 Kubernetes 自带的服务一般运行在 kube-system namespace中Kubernetes 中的名称空间与 docker 中的名称空间不同,K8s 中的名称空间只是做了一个逻辑上的隔离
Deployment
Deployment 可以部署应用并管理实例数量,它提供了一种故障的自我修复机制,当应用挂了后,Deployment 可以自动启动一个新的实例,维护固定数量的 Pod
Service
Service 为 Pod 提供了一种外网访问能力,默认情况下,Pod 只能在 Kubernetes 集群的同一节点访问,如果要外部网络访问,则需要为 Pod 暴露一个 Kubnetes Service,Service 为 Pod 提供了外网访问能力
0x02 k8s搭建
安装
minikube brew install minikube
记得安装 docker
启动minikube start # 创建一个集群
kubectl get node
查看节点
kubectk get pod -A
查看内部服务组件是否成功运行
minikube node add
添加一个新节点
master 节点正常默认具有污点,等下创建pod 如果没有容忍度会一直在Pending 状态中,要创建一个新节点,minikube 的默认没污点
kubectl create deployment hello-nginx --image=nginx:latest
创建管理 Pod 的 Deployment,指定镜像为 nginx
kubectl expose deployment hello-nginx --type=NodePort --port=80
创建 Service,将 pod 的 80 端口公开
也可以用
kubectl run hello-nginx --image=nginx--port=80
来快速创建,相当于执行上面的那两个命令
之后可以用
kubectl delete service hello-nginx
来删除服务
kubectl port-forward service/hello-nginx 7080:80
转发端口,之后就能在本机的 http://127.0.0.1:7080 上访问到 pod
kubectl get deployments
查看 Deployment
kubectl get pod -o wide
查看 pod,刚才这个是在 节点2 上运行的
kubectl get services hello-nginx
查看刚才创建的 service
清理环境
minikube stop minikube delete