尝试一下k8s自带的滚动升级。
其他的就不讲了,直接记录一下我的操作。 先把k8s的配置文件放上来: tomcat-service.yaml:
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
k8s-app: tomcat-service
spec:
ports:
- port: 8080
targetPort: 8080
protocol: TCP
name: http
selector:
k8s-app: tomcat-service
---
apiVersion: v1
kind: Deployment
metadata:
name: tomcat-service
spec:
replicas: 3
template:
metadata:
labels:
k8s-app: tomcat-service
spec:
terminationGracePeriodSeconds: 60
containers:
- name: tomcat-service
image: tomcat:7
ports:
- containerPort: 8080
ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: host-based-ingress
spec:
rules:
- host: tomcat.com
http:
paths:
- backend:
serviceName: tomcat-service
servicePort: 8080
部署到k8s,把hosts文件改一下。
接下来是这样的,不停地请求这个deployment,k8s会把我们的请求负载到3个pod,然后我们部署滚动升级,看看请求是否会出现中断,来验证可用性。
$ while : ; do curl --connect-timeout 1 -m 2 tomcat.com -I ; sleep 0.5 ;done
下面是升级的命令:
$ kubectl set image deployment/tomcat tomcat=tomcat:9.0.20
结果是会有一到两个请求失败,原因是tomcat启动的时候需要时间,而k8s在tomcat启动的时候就把流量导入了新的pod。这样就不好,那么我们需要用一个ReadinessProbe来告诉k8s我们的pod准备好了:
apiVersion: v1
kind: Deployment
metadata:
name: tomcat-service
spec:
replicas: 3
template:
metadata:
labels:
k8s-app: tomcat-service
spec:
terminationGracePeriodSeconds: 60
containers:
- name: tomcat-service
image: tomcat:7
ports:
- containerPort: 8080
readinessProbe:
exec:
command:
- rm -f index.html;wget localhost:8080 && grep tomcat index.html
initialDelaySeconds: 10
periodSeconds: 5
用一个命令来检测tomcat准备好了,而且设置了延迟10s。
$ kubectl set image deployment/tomcat tomcat=tomcat:9.0.20
下面是结果:
HTTP/1.1 200
Server: nginx/1.15.6
Date: Thu, 04 Jul 2019 07:32:01 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
HTTP/1.1 200 OK
Server: nginx/1.15.6
Date: Thu, 04 Jul 2019 07:32:01 GMT
Content-Type: text/html;charset=ISO-8859-1
Connection: keep-alive
Vary: Accept-Encoding
HTTP/1.1 200
Server: nginx/1.15.6
Date: Thu, 04 Jul 2019 07:32:02 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
HTTP/1.1 200 OK
Server: nginx/1.15.6
Date: Thu, 04 Jul 2019 07:32:02 GMT
Content-Type: text/html;charset=ISO-8859-1
Connection: keep-alive
Vary: Accept-Encoding
HTTP/1.1 200
Server: nginx/1.15.6
Date: Thu, 04 Jul 2019 07:32:03 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
在更新pod的时候发现charset这个参数,tomcat版本不同是不一样的,说明这里在更新pod,而且没有出现请求异常。那么在部署的时候应该能提供零停机。❤️