k8s service label
标签实现蓝绿发布
两个版本
的deploy
和svc
,svc
打版本标签
,Service Label
标签对应的deploy版本在 Kubernetes 中,使用 kubectl
命令完成蓝绿部署.
# 创建一个名为 "yewu-app-green-deploy" 的 Deployment
kubectl create deployment yewu-app-green-deploy \
--image=yewu-app:v2 # 使用镜像 "yewu-app:v2" 部署应用
# 将名为 "yewu-app-green-deploy" 的 Deployment 暴露为一个 Service
## port是service的端口
## --target-port是pod(中的容器)的端口
## --type 指定Service 的类型为ClusterIP,用于通过节点的IP和指定端口访问服务
## --name=green-svc 指定 Service 的名称为 "green-svc"
## --save-config 保存当前命令的配置到资源的注解中,便于后续管理
kubectl expose deployment yewu-app-green-deploy --type=ClusterIP --name=green-svc --port=80 --target-port=8080 --save-config
# 创建一个名为 "yewu-app-blue-deploy" 的 Deployment
kubectl create deployment yewu-app-blue-deploy \
--image=yewu-app:v1 # 使用镜像 "yewu-app:v1" 部署应用
# 将名为 "yewu-app-blue-deploy" 的 Deployment 暴露为一个 Service
## port是service的端口
## --target-port是pod(中的容器)的端口
## --type 指定Service 的类型为ClusterIP,用于通过节点的IP和指定端口访问服务
## --name=blue-svc 指定 Service 的名称为 "blue-svc"
## --save-config 保存当前命令的配置到资源的注解中,便于后续管理
kubectl expose deployment yewu-app-blue-deploy --type=ClusterIP --name=blue-svc --port=80 --target-port=8080 --save-config
蓝绿切换SVC
(用于外部访问)创建一个外部 Service,用于切换蓝绿版本:
# 创建一个 ClusterIP 类型的 Service,名称为 "app-svc"
kubectl create service clusterip app-svc \
--tcp=80:80 # 将 Service 的端口 80 映射到后端 Pod 的端口 80
创建 Ingress 资源以暴露服务:
# 使用 kubectl 创建一个 Ingress 资源
kubectl create ingress app-ingress \
--rule="your-domain.com/*=app-svc:80"
# --rule 参数定义了 Ingress 的规则:
# - your-domain.com 是主机名
# - /* 表示匹配所有路径
# - app-svc:80 表示将流量转发到名为 app-svc 的 Service 的 80 端口
app-svc
指向绿色版本:# 更新名为 "app-svc" 的 Service 的 selector,使其指向绿色版本的 Deployment
kubectl patch svc app-svc \
-p '{"spec":{"selector":{"app":"yewu-app-green-deploy"}}}'
# -p 参数指定了一个 JSON 格式的部分更新内容
# 将 Service 的 selector 更新为匹配标签 "app=yewu-app-green-deploy"
app-svc
切换到蓝色版本:# 更新名为 "app-svc" 的 Service 的 selector,使其指向蓝色版本的 Deployment
kubectl patch svc app-svc \
-p '{"spec":{"selector":{"app":"yewu-app-blue-deploy"}}}'
# -p 参数指定了一个 JSON 格式的部分更新内容
# 将 Service 的 selector 更新为匹配标签 "app=yewu-app-blue-deploy"
先完成蓝绿部署
,然后通过修改 app-svc
的 selector
来切换流量。
service.yaml
文件# 定义 API 版本为 v1
apiVersion: v1
# 定义资源类型为 Service
kind: Service
# 定义 Service 的元数据
metadata:
# 定义 Service 的名称为 demo
name: demo
# 定义 Service 所在的命名空间为 default
namespace: default
# 定义 Service 的标签,app 标签值为 demo
labels:
app: demo
# 定义 Service 的规格
spec:
# 定义 Service 的端口配置
ports:
# 定义一个端口配置
- # 定义端口为 80
port: 80
# 定义目标端口为 http
targetPort: http
# 定义协议为 TCP
protocol: TCP
# 定义端口名称为 http
name: http
# 注意这里我们匹配 app 和 version 标签,当要切换流量的时候,我们更新 version 标签的值,比如:v2
# 定义 Service 的选择器
selector:
# 定义选择器的 app 标签值为 demo
app: demo
# 定义选择器的 version 标签值为 v1
version: v1
deploy.yaml
文件v1-deploy.yaml
文件# 定义 API 版本为 apps/v1
apiVersion: apps/v1
# 定义资源类型为 Deployment
kind: Deployment
# 定义 Deployment 的元数据
metadata:
# 定义 Deployment 的名称为 demo1-deployment
name: demo1-deployment
# 定义 Deployment 所在的命名空间为 default
namespace: default
# 定义 Deployment 的标签,app 标签值为 demo
labels:
# 定义 app 标签值为 demo
app: demo
# 定义 version 标签值为 v1
version: v1
# 定义 Deployment 的规格
spec:
# 定义副本数量为 1
replicas: 1
# 定义修订历史限制为 3
revisionHistoryLimit: 3
# 定义更新策略
strategy:
# 定义滚动更新策略
rollingUpdate:
# 定义最大 surge 百分比为 30%
maxSurge: 30%
# 定义最大不可用百分比为 30%
maxUnavailable: 30%
# 定义选择器
selector:
# 定义选择器的标签匹配规则
matchLabels:
# 定义 app 标签值为 demo
app: demo
# 定义 version 标签值为 v1
version: v1
# 定义 Pod 模板
template:
# 定义 Pod 的元数据
metadata:
# 定义 Pod 的标签
labels:
# 定义 app 标签值为 demo
app: demo
# 定义 version 标签值为 v1
version: v1
# 定义 Pod 的规格
spec:
# 定义容器列表
containers:
# 定义一个容器
- # 定义容器名称为 demo1
name: demo1
# 定义容器使用的镜像为 mritd/demo
image: mritd/demo
# 定义存活探针
livenessProbe:
# 定义 HTTP GET 请求
httpGet:
# 定义请求路径为 /
path: /
# 定义请求端口为 80
port: 80
# 定义请求协议为 HTTP
scheme: HTTP
# 定义初始延迟秒数为 30
initialDelaySeconds: 30
# 定义超时秒数为 5
timeoutSeconds: 5
# 定义周期秒数为 30
periodSeconds: 30
# 定义成功阈值为 1
successThreshold: 1
# 定义失败阈值为 5
failureThreshold: 5
# 定义就绪探针
readinessProbe:
# 定义 HTTP GET 请求
httpGet:
# 定义请求路径为 /
path: /
# 定义请求端口为 80
port: 80
# 定义请求协议为 HTTP
scheme: HTTP
# 定义初始延迟秒数为 30
initialDelaySeconds: 30
# 定义超时秒数为 5
timeoutSeconds: 5
# 定义周期秒数为 10
periodSeconds: 10
# 定义成功阈值为 1
successThreshold: 1
# 定义失败阈值为 5
failureThreshold: 5
# 定义容器端口列表
ports:
# 定义一个端口
- # 定义端口名称为 http
name: http
# 定义容器端口为 80
containerPort: 80
# 定义协议为 TCP
protocol: TCP
v2-deploy.yaml
文件# 定义 API 版本为 apps/v1
apiVersion: apps/v1
# 定义资源类型为 Deployment
kind: Deployment
# 定义 Deployment 的元数据
metadata:
# 定义 Deployment 的名称为 demo1-deployment
name: demo1-deployment
# 定义 Deployment 所在的命名空间为 default
namespace: default
# 定义 Deployment 的标签,app 标签值为 demo
labels:
# 定义 app 标签值为 demo
app: demo
# 定义 version 标签值为 v1
version: v1
# 定义 Deployment 的规格
spec:
# 定义副本数量为 1
replicas: 1
# 定义修订历史限制为 3
revisionHistoryLimit: 3
# 定义更新策略
strategy:
# 定义滚动更新策略
rollingUpdate:
# 定义最大 surge 百分比为 30%
maxSurge: 30%
# 定义最大不可用百分比为 30%
maxUnavailable: 30%
# 定义选择器
selector:
# 定义选择器的标签匹配规则
matchLabels:
# 定义 app 标签值为 demo
app: demo
# 定义 version 标签值为 v1
version: v1
# 定义 Pod 模板
template:
# 定义 Pod 的元数据
metadata:
# 定义 Pod 的标签
labels:
# 定义 app 标签值为 demo
app: demo
# 定义 version 标签值为 v1
version: v1
# 定义 Pod 的规格
spec:
# 定义容器列表
containers:
# 定义一个容器
- # 定义容器名称为 demo1
name: demo1
# 定义容器使用的镜像为 mritd/demo
image: mritd/demo
# 定义存活探针
livenessProbe:
# 定义 HTTP GET 请求
httpGet:
# 定义请求路径为 /
path: /
# 定义请求端口为 80
port: 80
# 定义请求协议为 HTTP
scheme: HTTP
# 定义初始延迟秒数为 30
initialDelaySeconds: 30
# 定义超时秒数为 5
timeoutSeconds: 5
# 定义周期秒数为 30
periodSeconds: 30
# 定义成功阈值为 1
successThreshold: 1
# 定义失败阈值为 5
failureThreshold: 5
# 定义就绪探针
readinessProbe:
# 定义 HTTP GET 请求
httpGet:
# 定义请求路径为 /
path: /
# 定义请求端口为 80
port: 80
# 定义请求协议为 HTTP
scheme: HTTP
# 定义初始延迟秒数为 30
initialDelaySeconds: 30
# 定义超时秒数为 5
timeoutSeconds: 5
# 定义周期秒数为 10
periodSeconds: 10
# 定义成功阈值为 1
successThreshold: 1
# 定义失败阈值为 5
failureThreshold: 5
# 定义容器端口列表
ports:
# 定义一个端口
- # 定义端口名称为 http
name: http
# 定义容器端口为 80
containerPort: 80
# 定义协议为 TCP
protocol: TCP
Service 中 label selector
的定义: selector:
app: demo
version: v1
# 使用 kubectl 工具应用多个 YAML 配置文件
# -f service.yaml: 应用服务配置文件
# -f v1-deploy.yaml: 应用版本1的部署配置文件
# -f v2-deploy.yaml: 应用版本2的部署配置文件
kubectl apply -f service.yaml -f v1-deploy.yaml -f v2-deploy.yaml
# 登陆任意一个pod,向 demo service 发起请求
while sleep 0.3; do curl http://demo; done
# 输出日志
Host: demo1-deployment-b5bd596d8-dw27b, Version: v1
Host: demo1-deployment-b5bd596d8-dw27b, Version: v1
# 使用 kubectl 工具更新服务的配置
# patch service demo: 对名为 demo 的服务进行补丁操作
# -p '{"spec":{"selector":{"version":"v2"}}}': 指定补丁内容,将服务的选择器更新为 version=v2
kubectl patch service demo -p '{"spec":{"selector":{"version":"v2"}}}'
# 登陆任意一个pod,向 demo service 发起请求
while sleep 0.3; do curl http://demo; done
# 输出日志
Host: demo2-deployment-b5bd596d8-dw27b, Version: v2
Host: demo2-deployment-b5bd596d8-dw27b, Version: v2