部署应用
DaemonSet
和 Deployment
是 Kubernetes 中用于管理容器化应用的两种不同的资源控制器。
DaemonSet
用于确保集群中的每个节点上
都运行一个实例(Pod)副本。这对于在整个集群中的每个节点上运行系统级别的服务或网络代理等任务非常有用。适合用于日志收集器或监控代理。Deployment
用于在集群中创建可扩展的副本集,以确保应用的高可用性。它允许你定义、更新和扩展应用的副本数量,并在发生故障时进行自动修复。当你想要确保在集群中运行指定数量的 Pod 副本,并且需要在应用版本更新时进行滚动更新时,使用 Deployment 是一个常见的选择。
deployment 部署无状态应用
创建应用实例后,Kubernetes Deployment 控制器会持续监视这些实例。 如果托管实例的节点关闭或被删除,则 Deployment 控制器会将该实例替换为集群中另一个节点上的实例。 这提供了一种自我修复机制来解决机器故障维护问题。
创建nginx deployment服务模版
通过创建模版生成yaml文件
kubectl create deployment nginx --image=nginx:1.7.9 -o yaml --dry-run=client > nginx-deployment.yaml
nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.7.9
name: nginx
resources: {}
status: {}
部署deployment
kubectl apply -f nginx-deployment.yaml
创建 nginx svc
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort -o yaml --dry-run=client > nginx-svc.yaml
nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
status:
loadBalancer: {}
部署svc
kubectl apply -f nginx-svc.yaml
Deployment 滚动更新
在 Kubernetes 中,Deployment
资源提供了一种机制,可以通过滚动更新(Rolling Updates)的方式来升级应用程序。这确保了在更新期间始终有一定数量的 Pod 处于运行状态,从而实现了应用程序的零宕机升级。
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 3
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- name: example-container
image: example/image:tag
strategy: # 滚动更新
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 最多允许一个 Pod 不可用
maxSurge: 1 # 在更新期间最多可以多出一个 Pod
执行更新
kubectl app -f example-deployment.yaml
监视更新状态
kubectl rollout status deployment example-deployment
deployment 执行回滚
列出 deployment 的所有版本:
kubectl rollout history deployment <deployment-name>
## 例如
kubectl rollout history deployment nginx-deployment -n devops
返回参数
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
查看指定版本的详细信息
kubectl rollout history deployment <deployment-name> --revision=1
## 例如
kubectl rollout history deployment nginx-deployment --revision=1 -n devops
回滚到指定版本
# 在 --to-revision 中指定你从步骤 1 中获取的修订版本
kubectl rollout undo deployment <deployment-name> --to-revision=<revision>
## 例如
kubectl rollout undo deployment nginx-deployment --to-revision=1 -n devops
监视 deployment 回滚进度
kubectl rollout status deployment <deployment-name>
## 例如
kubectl rollout status deployment nginx-deployment -n devops
DaemonSet 滚动更新
DaemonSet 有两种更新策略:
OnDelete
:使用 OnDelete 更新策略时,在更新 DaemonSet 模板后,只有当你手动删除老的 DaemonSet Pod 之后,新的 DaemonSet Pod 才会被自动创建。跟 Kubernetes 1.6 以前的版本类似。RollingUpdate
:这是默认的更新策略。使用 RollingUpdate 更新策略时,在更新 DaemonSet 模板后, 老的 DaemonSet Pod 将被终止,并且将以受控方式自动创建新的 DaemonSet Pod。 更新期间,最多只能有 DaemonSet 的一个 Pod 运行于每个节点上。
执行滚动更新
要启用 DaemonSet 的滚动更新功能,必须设置 .spec.updateStrategy.type
为 RollingUpdate。
你可能想设置 .spec.updateStrategy.rollingUpdate.maxUnavailable
(默认为 1)、 .spec.minReadySeconds
(默认为 0)和 .spec.updateStrategy.rollingUpdate.maxSurge
(默认为 0)。
创建带有 RollingUpdate 更新策略的 DaemonSet:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
updateStrategy: #滚动更新设置
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# 这些容忍度设置是为了让该守护进程集在控制平面节点上运行
# 如果你不希望自己的控制平面节点运行 Pod,可以删除它们
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
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
执行更新
kubectl app -f fluentd-elasticsearch.yaml
监视更新状态
kubectl rollout status daemonset fluentd-elasticsearch -n kube-system
daemonset 执行回滚
列出 daemonset 的所有版本:
kubectl rollout history daemonset <daemonset-name>
## 例如
kubectl rollout history daemonset nginx-daemonset -n devops
返回参数
daemonset.apps/nginx-daemonset
REVISION CHANGE-CAUSE
1 <none>
2 <none>
查看指定版本的详细信息
kubectl rollout history daemonset <daemonset-name> --revision=1
## 例如
kubectl rollout history daemonset nginx-daemonset --revision=1 -n devops
回滚到指定版本
# 在 --to-revision 中指定你从步骤 1 中获取的修订版本
kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>
## 例如
kubectl rollout undo ddaemonset nginx-daemonset --to-revision=1 -n devops
监视 daemonset 回滚进度
kubectl rollout status daemonset <daemonset-name>
## 例如
kubectl rollout status daemonset nginx-daemonset -n devops
滚动更新到latest
kubectl rollout restart deployment nginx-deployment -n devops
kubectl rollout status deployment nginx-deployment -n devops