K8S核心概念
K8S有很多核心概念,我们先看下几个核心概念。
Deployment
Deployment负责创建和更新应用程序的实例。创建Deployment后,Kubernetes Master将应用程序实例调度到集群的各个节点上。如果托管实例的节点关闭或删除,Deployment控制器会将该实例替换为集群中另一个节点上的实例。这提供了一种自我修复机制来解决机器故障维护问题。
Pod
Pod相当于逻辑主机的概念,负责托管应用实例。包括一个或多个应用程序容器(如Docker),以及这些容器的一些共享资源(共享存储、网络、运行信息等)。
Service
Service是一个抽象层,它定义了一组Pod的逻辑集,并为这些Pod支持外部流量暴露、负载平衡和服务发现。
尽管每个Pod都有一个唯一的IP地址,但是如果没有Service,这些IP不会暴露在集群外部。Service允许您的程序接收流量。Service也可以用在ServiceSpec标记type的方式暴露,type类型如下:
-
ClusterIP(默认):在集群的内部IP上公开Service。这种类型使得Service只能从集群内访问。
-
NodePort:使用NAT在集群中每个选定Node的相同端口上公开Service。使用**:**从集群外部访问Service。是ClusterIP的超集。
-
LoadBalancer:在当前云中创建一个外部负载均衡器(如果支持的话),并为Service分配一个固定的外部IP。是NodePort的超集。
-
ExternalName:通过返回带有该名称的CNAME记录,使用任意名称(由spec中的externalName指定)公开service。不使用代理。
k8s中的资源
k8s中所有的内容都抽象为资源,资源实例化之后,叫做对象,上面说的那些核心概念都是k8s中的资源。
k8s中有哪些资源 -
工作负载型资源(workload):Pod,ReplicaSet,Deployment,StatefulSet,DeamonSet等等
-
服务发现及负载均衡型资源(ServiceDiscovery LoadBalance):Service,Ingress得等
-
配置与存储资源:Volume(存储卷),CSI(容器存储接口,可以扩展各种各样的第三方存储卷)
-
特殊型的存储卷:ConfigMap(配置中心使用的资源类型),Secret(保存敏感数据),DownwardAPI(把外部环境中信息输出给容器)
以上这些资源都是配置在名称空间级别。 -
集群级资源:Namespace,node,Role,ClusterRole,RoleBinding(角色绑定),ClusterRoleBinding(集群角色绑定)
-
元数据型资源:HPA(Pod水平扩展),PodTemplate(Pod模板,用于让控制器创建Pod时使用的模板),LimitRange(用来定义硬件资源限制的)
资源清单
之前我们直接用命令创建deployment,pod,service这些资源,起始在k8s中,我们一般使用yaml格式的文件来创建符合我们预期期望的资源,这样的yaml文件我们一般称为资源清单。
资源清单yaml的格式
apiVersion: group/apiversion # 如果没有给定group名称,那么默认为croe,可以使用kubectl api-versions 获取当前版本上所有的apiVersion版本信息(每个版本可能不同)
kind: # 资源类别
metadata: #资源元数据
name
namespace # k8s自身的namespce
labels
annotations # 主要目的是方便用户阅读查找
spec:# 期望的状态(disired state)
status:# 当前状态,本字段由k8s自身维护,用户不能去定义
# 配置清单有五个一级字段,其中status字段用户不能定义,由k8s自身维护
使用资源清单yaml来创建k8s的资源对象
用yaml创建deployment资源的对象
我们可以用创建deployment的命令加上参数–dry-run -o yaml就可以输出这次部署的资源清单yaml
kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine --dry-run -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-tomcat
name: my-tomcat-yaml # 修改deployment的名称
spec:
replicas: 2 # 修改pod副本为两个
selector:
matchLabels:
app: my-tomcat
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-tomcat
spec:
containers:
- image: tomcat:7.0.75-alpine
name: tomcat
resources: {}
status: {}
然后执行如下命令就可以用yaml文件来创建这次部署
kubectl apply -f deployment‐demo.yaml
从上图看出我们用yaml生成的部署已经成功。
用yaml创建service资源的对象
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort --dry-run -o yaml
修改上面yaml内容,保存为文件:service-demo.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: my-tomcat
name: tomcat-service-yaml #修改service名称
spec:
ports:
- port: 80 # service的虚拟ip对应的端口,在集群内网机器可以访问用service的虚拟ip加端口号访问服务
protocol: TCP
targetPort: 8080 # pod暴露的端口,一般与pod内部暴露的端口一致
selector:
app: my-tomcat
type: NodePort
status:
loadBalancer: {}
然后执行如下命令就可以使用yaml来创建service
kubectl apply -f service-demo.yaml
从上图看出我们用yaml创建的service已经成功。
针对已有资源输出资源清单yaml
查看pod资源列表
将资源的配置以yaml的格式输出来
# 使用 -o 参数加yaml,可以将资源的配置以yaml的格式出出出来,也可以使用json,输出为json格式
kubectl get pod nginx-f89759699-t6wgh -o yaml