1. 在 K8s 集群中启动一个 Envoy Deployment
1.1 从文件创建 ConfigMap
在本地保存以下文件 "envoy.yaml"
admin:
address:
socket_address: { address: 127.0.0.1, port_value: 9901 }
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 10000 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: some_service }
http_filters:
- name: envoy.filters.http.router
clusters:
- name: some_service
connect_timeout: 0.25s
type: LOGICAL_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: some_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: nginx
port_value: 80
创建 ConfigMap
kubectl create configmap envoy-config --from-file=envoy.yaml
1.2 创建 Deployment
在本地保存以下文件 "envoy-deploy.yaml"
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: envoy
name: envoy
spec:
replicas: 1
selector:
matchLabels:
run: envoy
template:
metadata:
labels:
run: envoy
spec:
containers:
- image: envoyproxy/envoy-dev
name: envoy
volumeMounts:
- name: envoy-config
mountPath: "/etc/envoy"
readOnly: true
volumes:
- name: envoy-config
configMap:
name: envoy-config
创建 deployment
kubectl create -f envoy-deploy.yaml
1.3 暴露端口
kubectl expose deploy envoy --selector run=envoy --port=10000 --type=NodePort
1.4 查看pod
kubectl get deploy,pod,svc -owide
请求暴露的端口
curl 10.96.252.102:10000
1.5 进入 Pod 查看 Envoy 进程和配置
# 进入 pod
kubectl exec -it envoy-fb5d77cc9-6lfqw /bin/bash
# 查看进程
ps -ef
# 查看配置
cat /etc/envoy/envoy.yaml
1.6 更改配置的监听端口并测试访问入口的变化
kubectl edit configmap envoy-config
修改其中的端口 10000 为 18000
修改后进入 pod 中通过netstat查看,端口还是监听的 10000
但是配置文件 envoy.yaml 中的端口已经变成了 18000
需要重启 envoy 进程
先扩容
kubectl scale deploy envoy --replicas=2
通过 curl 查看发现新创建的 pod envoy-fb5d77cc9-tztk6 监听的端口是 18000
这时候通过 svc 访问发现时好时坏
因为老的 pod 监听的还是 10000,所以svc负载均衡到老的 pod 的时候还是可以通的,负载到新的 pod 的时候就不通了
删除老的 pod
kubectl delete pod envoy-fb5d77cc9-6lfqw
删除之后k8s又重启调度启动了一个新的 pod ,现在2个pod 监听的端口都是 18000 了,通过 svc 请求不通了
kubectl edit svc envoy
修改 svc 将其中 targetPort: 10000 改为 targetPort: 18000
然后再通过 svc 请求就可以了
2. 非级联删除的方法逐个删除对象
默认情况下 k8s 是会级联删除的,当删除 deployment 时,会级联删除 replicationset 和 pod
非级联删除需要在删除命令中增加 --cascade=orphan 参数
- 首先删除 deployment
kubectl delete deploy envoy --cascade=orphan
- 然后删除 replicationset
kubectl delete rs envoy-fb5d77cc9 --cascade=orphan
- 最后删除两个pod
kubectl delete pod envoy-fb5d77cc9-tztk6
kubectl delete pod envoy-fb5d77cc9-vmzlk