kubernetes
集群有几种部署和管理POD的工具,下面简单介绍一下。
ReplicaSet
ReplicaSet
是支持基于集合的标签选择器的下一代Replication Controller
(新版本已不再使用),
它主要用作Deployment
协调创建、删除和更新Pod
,和Replication Controller
唯一的区别是,ReplicaSet
支持标签选择器。
在实际应用中,虽然ReplicaSet
可以单独使用,但是一般建议使用Deployment
来自动管理ReplicaSet
,
除非自定义的Pod不需要更新或有其他编排等。
## 查看RellicaSet资源
$ kubectl get rs
Deployment
根据声明的YAML
文件信息部署POD
,并将POD
调度到资源占用少的node
节点上,会调用ReplicaSet
管理POD
副本。
主要适合如下场景:
- 部署无状态应用
- 管理Pod和ReplicaSet
- 部署,滚动升级
- 弹性扩容等
看一下
kubernetes
官方提供deployment yaml
资源文件
apiVersion: apps/v1
kind: Deployment ## 资源类型
metadata:
name: nginx-deployment ## 名称
labels:
app: nginx ##标签
spec:
replicas: 3 ## 副本数量
selector:
matchLabels:
app: nginx ## deployment根据这个标签,选择管理POD
template:
metadata:
labels:
app: nginx ## Pod的标签,跟selector保持一致
spec:
containers:
- name: nginx ## 容器镜像
image: nginx:1.14.2 ## 镜像版本
ports:
- containerPort: 80 ## 容器的端口
DaemonSet
DaemonSet
(守护进程集)和守护进程类似,它在符合匹配条件的kubernetes
集群的node节点上均部署一个Pod。
DaemonSet
的场景:
- 集群存储守护程序,如
glusterd
、ceph
要部署在每个节点上提供持久性存储。 - 集群日志守护程序,如
fluentd
、logstash
,在每个节点运行容器。 - 节点监视守护进程,如
prometheus
监控集群,可以在每个节点上运行一个node-exporter
用进程来收集监控节点的信息。
apiVersion: apps/v1
kind: DaemonSet ## 资源类型
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# 这些容忍度设置是为了让守护进程在控制平面节点上运行
# 如果你不希望控制平面节点运行 Pod,可以删除它们
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
StatefulSet
StatefulSet
主要用于管理有状态应用程序的工作负载API
对象。
比如在生产环境中可以部署ElasticSearch
集群、MongoDB
集群或者需要持久化的RabbitMQ
集群、
Redis
集群、Kafka
集群和ZooKeeper
集群等。和Deployment
类似,一个StatefulSet
也同样管
理着基于相同容器规范的Pod
。不同的是StatefulSet
为每个Pod
维护了一个粘性标识。
这些Pod
是根据相同的规范创建的,但是不可互换,每个Pod都有一个持久的标识符,在重新调度时也会保留,
一般格式为StatefulSetName-Number
。比如定义一个名字是Redis-Sentinel
的StatefulSet
,指定创建三个Pod
,
那么创建出来的Pod
名字就为Redis-Sentinel-0
、Redis-Sentinel-1
、Redis-Sentinel-2
。
而StatefulSet
创建的Pod
一般使用Headless Service
(无头服务)进行通信。
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # 必须匹配 .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # 默认值是 1
minReadySeconds: 10 # 默认值是 0
template:
metadata:
labels:
app: nginx # 必须匹配 .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi