Pod
Pod是kubernetes的最小操作单元,一个Pod里面可以包含多个容器(如Docker容器),每个容器共享Pod的网络、Volume等资源。
Pod-配置文件示例
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
name: pod-demo-redis
spec:
containers:
name: pod-demo-redis
image: kubeguide/redis-master
port: 6379
Pod-配置文件解读
- 创建一个name为pod-demo的pod资源对象
- 命名空间为默认命名空间default
- 为该pod定义一个标签为 name=pod-demo-redis的标签
- 根据kubeguide/redis-master镜像创建一个name为pod-demo-redis的容器,且端口为6379。
Deployment
Deployment主要起到管理Pod部署的作用,包括后面的HPA也是通过监控Deployment的目的实现Pod的自动扩缩容。
Deployment-配置文件示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-demo-redis
labels:
name: pod-demo-redis
spec:
replicas: 3
selector:
matchLabels:
app: pod-demo-redis
template:
metadata:
labels:
app: pod-demo-redis
spec:
containers:
name: pod-demo-redis
image: kubeguide/redis-master
ports:
- containerPort: 6379
Deployment-配置文件解读
- 创建一个Deployment的资源对象,并且赋值name和labels(标签)为pod-demo-redis。
- 选择器匹配带有label为pod-demo-redis的pod进行部署管理,并且保证kubernetes集群内这些被管理的pod至少要存在3个运行正常的pod(负载均衡)。
- 定义标签为pod-demo-redis的pod模板,并且改pod内部运行redis容器,当集群数量少于3的时候,会根据template的模板创建pod知道达到replicas的值。
Service
Kubernetes的实现服发现离开不了Service资源对象,Service自带一种全局唯一的虚拟IP地址-ClusterIP,Kubernetes通过把ClusterIP和Service的name绑定在一起就能简单粗暴地解决了服务发现功能。例如在kubernetes集群内部,不同宿主机的Pod内部都可以使用serviceName:port实现访问,Service的创建往往依赖Pod。
Service-配置文件示例
apiVersion: v1
kind: Service
metadata:
name: demo-redis-service
spec:
selector:
app: demo-boot-redis
type: NodePort
ports:
- port: 8082
targetPort: 8082
protocol: TCP
nodePort: 32088
Service-配置文件解读
创建一个Service类型的资源对象,并且name为demo-redis-service
选择标签(label)为 app: pod-demo-redis 的Pod资源对象进行管理创建服务。
该Service的端口类型为NodePort(可以直接通过宿主机的ip+nodePort访问),targetPort是用来确定提供该服务的容器的端口,Port是该Service的端口,通常设置targetPort和port一样。
Volume
Volume(存储卷)是Kubernetes的存储类资源对象,常用的类型有emptyDir和hostPath,其他类型有iscsi、nfs、glusterfs、rbd、gitRepo、configmap、sercret等。同一个Pod内部共享volume。
Volume-配置文件示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-demo-redis
labels:
name: pod-demo-redis
spec:
replicas: 3
selector:
matchLabels:
app: pod-demo-redis
template:
metadata:
labels:
app: pod-demo-redis
spec:
containers:
name: pod-demo-redis
image: kubeguide/redis-master
ports:
- containerPort: 6379
volumeMounts:
- name: demo-emptydir
mountPath: /usr/demo-empty
- name: demo-hostpath
mountPath: /usr/logs
volumes:
- name: demo-emptydir
emptyDir: {}
- name: demo-hostpath
hostPath:
path: /usr/local/logs
Volume-配置文件解读
- 在Deployment的示例中添加了2个volumes资源对象,并且类型依次为emptyDir和hostPath(主义hostPath的前提是宿主机存在/user/local/logs等文件路径)。
- pod-demo-redis的Pod容器内部挂载这两个存储卷,挂载这两个存储卷之后,容器内部对该存储卷的内部修改会影响到对应的Volume资源。
Ingress
Ingress是Kubernetes的网关规则配置资源对象,需要和IngressController、实际的网关服务器(例如Nginx、Apisix等)等结合使用。Ingress负责管理Service的访问路由规则、IngressController用以实时监控资源对象Ingress、Service、Endpoint、Secret、Node、Sercret等变化,自动对Nginx进行对应操作。而实现具体的应用层负载均衡则有类似Nginx的服务器负责。
Ingress的配置比较繁琐复杂、通常使用Helm进行配置,该单元另开文章讲述。
HPA
HPA全称HorizontalPodAutoscaler,是kubernetes里面的一种资源对象,主要作用是可以对Deployment的pod资源配置水平、垂直扩缩容。
HPA-配置文件示例
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: my-web-app-hpa
namespace: default
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef
kind: Deployment
name: my-web-app-deploy
targetCPUUtilizationPercentage: 90
HPA-配置文件解读
- 当前这个name为 my-web-app-hpa 的HPA资源对象控制的目标对象是一个name为 my-web-app-deploy 的Deployment里的Pod副本。
- 当这些Pod副本里面的CPU利用率的值都超过90%时,会触发自动动态扩容,限定Pod的数量范围为1~10。
++参考书籍为《Kubernetes零基础快速入门》《Kubernetes权威指南》《Nginx应用与运维实战》++