K8S 部署策略详解-重建、滚动、蓝绿、金丝雀
我们要更细一个服务,都用什么策略呢?
部署策略实践
- Rolling update (滚动更新)
- Recreate (重建),先停止旧的服务,都停掉之后再启动一批新的服务
- 蓝绿部署,利用 service 的 selector,去选择不同版本的服务,
- 金丝雀部署,通过一个ingress 同时去轮询的访问不同的两个后端服务
重建
web-recreate.yaml
文件
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-recreate
namespace: dev
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: web-recreate
replicas: 2
template:
metadata:
labels:
app: web-recreate
spec:
containers:
- name: web-recreate
image: hub.mooc.com/kubernetes/web:v1
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 20
periodSeconds: 10
failureThreshold: 2
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /examples/index.html
port: 8080
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 1
successThreshold: 1
timeoutSeconds: 5
---
#service
apiVersion: v1
kind: Service
metadata:
name: web-recreate
namespace: dev
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web-recreate
type: ClusterIP
---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-recreate
namespace: dev
spec:
rules:
- host: web-recreate.mooc.com
http:
paths:
- path: /
backend:
serviceName: web-recreate
servicePort: 80
部署:
kubectl apply -f web-recreate.yaml
查看运行状态:
[hemei@master 6-deployment]$ kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
web-recreate-65b55f46c-8lbgn 1/1 Running 0 10m
web-recreate-65b55f46c-wphfk 1/1 Running 0 10m
[hemei@master 6-deployment]$
修改部署文件,然后再更新
...
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: web-recreate
replicas: 2
template:
metadata:
labels:
app: web-recreate
type: webapp
...
可以看到先停止服务,然后再重建。
由于资源有限,所以,删掉部署的服务:
[heimei@master 6-deployment]$ kubectl delete -f web-recreate-new.yaml
deployment.apps "web-recreate" deleted
service "web-recreate" deleted
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.extensions "web-recreate" deleted
[hemei@master 6-deployment]$
[heimei@master 6-deployment]$ kubectl get pods -n dev
No resources found in dev namespace.
可以看到服务已经被删掉了。
滚动更新
web-rollingupdate.yaml
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-rollingupdate
namespace: dev
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector:
matchLabels:
app: web-rollingupdate
replicas: 2
template:
metadata:
labels:
app: web-rollingupdate
spec:
containers:
- name: web-rollingupdate
image: hub.mooc.com/kubernetes/web:v1
ports:
- containerPort: 8080
resources:
requests:
memory: 1024Mi
cpu: 500m
limits:
memory: 2048Mi
cpu: 2000m
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 20
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /hello?name=test
port: 8080
scheme: HTTP
initialDelaySeconds: 20
periodSeconds: 10
failureThreshold: 1
successThreshold: 1
timeoutSeconds: 5
---
#service
apiVersion: v1
kind: Service
metadata:
name: web-rollingupdate
namespace: dev
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web-rollingupdate
type: ClusterIP
---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-rollingupdate
namespace: dev
spec:
rules:
- host: web-rollingupdate.mooc.com
http:
paths:
- path: /
backend:
serviceName: web-rollingupdate
servicePort: 80
在部署后,会间隔的访问新服务和旧服务。
# 如果部署的有问题,可以再次更新部署
kubectl rollout undo deploy web-rooling.yaml
蓝绿部署
web-bluegreen.yaml
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-bluegreen
namespace: dev
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector:
matchLabels:
app: web-bluegreen
replicas: 2
template:
metadata:
labels:
app: web-bluegreen
version: v1.0
spec:
containers:
- name: web-bluegreen
image: hub.mooc.com/kubernetes/web:v1
ports:
- containerPort: 8080
resources:
requests:
memory: 1024Mi
cpu: 500m
limits:
memory: 2048Mi
cpu: 2000m
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 20
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /hello?name=test
port: 8080
scheme: HTTP
initialDelaySeconds: 20
periodSeconds: 10
failureThreshold: 1
successThreshold: 1
timeoutSeconds: 5
bluegreen-service.yaml
---
#service
apiVersion: v1
kind: Service
metadata:
name: web-bluegreen
namespace: dev
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web-bluegreen
version: v1.0
type: ClusterIP
---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-bluegreen
namespace: dev
spec:
rules:
- host: web-bluegreen.mooc.com
http:
paths:
- path: /
backend:
serviceName: web-bluegreen
servicePort: 80
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)