Kubernetes教程FG042-Kubernetes服务发现与负载均衡实战
本文档风哥主要介绍Kubernetes服务发现与负载均衡实战,包括服务概述、服务类型、负载均衡概述、服务规划、负载均衡规划、最佳实践规划、服务实现、负载均衡实现、服务发现实现、ClusterIP服务案例、NodePort服务案例、LoadBalancer服务案例等内容,风哥教程参考Kubernetes官方文档和服务相关文档,适合想使用和理解Kubernetes服务的开发人员和运维人员。
Part01-基础概念与理论知识
1.1 服务概述
服务(Service)是Kubernetes中用于暴露应用的抽象概念,它定义了一组Pod的访问方式,提供了稳定的网络地址和负载均衡能力。
服务的主要功能包括:
- 服务发现:通过服务名称自动发现后端Pod
- 负载均衡:在多个Pod之间分发流量
- 稳定访问:提供固定的网络地址,不受Pod IP变化的影响
- 会话亲和性:可选的会话亲和性,确保同一客户端的请求始终发送到同一Pod
1.2 服务类型
Kubernetes支持多种服务类型,包括:
- ClusterIP:默认类型,只在集群内部可访问
- NodePort:在每个节点上暴露一个端口,可从集群外部访问
- LoadBalancer:使用云提供商的负载均衡器,可从外部访问
- ExternalName:将服务映射到外部域名
1.3 负载均衡概述
负载均衡是指将网络流量分发到多个后端Pod,以提高应用的可用性和性能。Kubernetes提供了多种负载均衡方式:
- 内部负载均衡:通过ClusterIP服务实现,在集群内部分发流量
- 外部负载均衡:通过NodePort或LoadBalancer服务实现,从外部访问集群
- 会话亲和性:基于客户端IP或会话ID的负载均衡策略
- 健康检查:自动检测后端Pod的健康状态,只将流量分发到健康的Pod
Part02-生产环境规划与建议
2.1 服务规划
Kubernetes服务的规划:
# 服务规划
– 目标:
– 确保服务的高可用性
– 确保服务的可扩展性
– 确保服务的安全性
– 确保服务的性能
– 范围:
– 服务类型选择
– 服务端口配置
– 服务标签选择器
– 服务会话亲和性
– 服务健康检查
– 工具选择:
– kubectl:用于创建和管理服务
– Helm:用于部署和管理服务
– Prometheus:用于监控服务
– Grafana:用于可视化服务监控数据
– 流程设计:
– 服务设计:定义服务的类型和配置
– 服务部署:部署服务到集群
– 服务测试:测试服务的可用性和性能
– 服务监控:监控服务的运行状态
– 服务优化:优化服务的配置和性能
– 资源分配:
– 人力资源:服务设计人员、运维人员
– 时间资源:服务设计时间、部署时间、测试时间
– 基础设施:网络资源、计算资源、存储资源
– 目标:
– 确保服务的高可用性
– 确保服务的可扩展性
– 确保服务的安全性
– 确保服务的性能
– 范围:
– 服务类型选择
– 服务端口配置
– 服务标签选择器
– 服务会话亲和性
– 服务健康检查
– 工具选择:
– kubectl:用于创建和管理服务
– Helm:用于部署和管理服务
– Prometheus:用于监控服务
– Grafana:用于可视化服务监控数据
– 流程设计:
– 服务设计:定义服务的类型和配置
– 服务部署:部署服务到集群
– 服务测试:测试服务的可用性和性能
– 服务监控:监控服务的运行状态
– 服务优化:优化服务的配置和性能
– 资源分配:
– 人力资源:服务设计人员、运维人员
– 时间资源:服务设计时间、部署时间、测试时间
– 基础设施:网络资源、计算资源、存储资源
2.2 负载均衡规划
Kubernetes负载均衡的规划:
# 负载均衡规划
– 目标:
– 均匀分发流量
– 提高应用可用性
– 提高应用性能
– 减少单点故障
– 范围:
– 负载均衡策略选择
– 健康检查配置
– 会话亲和性配置
– 负载均衡器配置
– 网络策略配置
– 工具选择:
– Kubernetes内置负载均衡:ClusterIP、NodePort、LoadBalancer
– 外部负载均衡:HAProxy、Nginx、F5
– 服务网格:Istio、Linkerd
– 流程设计:
– 负载均衡设计:选择合适的负载均衡策略
– 负载均衡配置:配置负载均衡器
– 负载均衡测试:测试负载均衡效果
– 负载均衡监控:监控负载均衡器的运行状态
– 负载均衡优化:优化负载均衡配置
– 资源分配:
– 人力资源:负载均衡设计人员、运维人员
– 时间资源:负载均衡设计时间、配置时间、测试时间
– 基础设施:负载均衡器资源、网络资源
– 目标:
– 均匀分发流量
– 提高应用可用性
– 提高应用性能
– 减少单点故障
– 范围:
– 负载均衡策略选择
– 健康检查配置
– 会话亲和性配置
– 负载均衡器配置
– 网络策略配置
– 工具选择:
– Kubernetes内置负载均衡:ClusterIP、NodePort、LoadBalancer
– 外部负载均衡:HAProxy、Nginx、F5
– 服务网格:Istio、Linkerd
– 流程设计:
– 负载均衡设计:选择合适的负载均衡策略
– 负载均衡配置:配置负载均衡器
– 负载均衡测试:测试负载均衡效果
– 负载均衡监控:监控负载均衡器的运行状态
– 负载均衡优化:优化负载均衡配置
– 资源分配:
– 人力资源:负载均衡设计人员、运维人员
– 时间资源:负载均衡设计时间、配置时间、测试时间
– 基础设施:负载均衡器资源、网络资源
2.3 最佳实践规划
Kubernetes服务和负载均衡的最佳实践规划:
# 最佳实践规划
– 服务最佳实践:
– 使用标签选择器:合理使用标签选择器,确保服务能正确匹配后端Pod
– 服务类型选择:根据访问需求选择合适的服务类型
– 端口配置:合理配置服务端口,避免端口冲突
– 会话亲和性:根据应用需求配置会话亲和性
– 健康检查:配置适当的健康检查,确保服务只将流量分发到健康的Pod
– 负载均衡最佳实践:
– 负载均衡策略:根据应用特点选择合适的负载均衡策略
– 健康检查:配置适当的健康检查,及时发现和移除不健康的Pod
– 会话亲和性:根据应用需求配置会话亲和性,确保会话一致性
– 负载均衡器配置:优化负载均衡器配置,提高性能和可靠性
– 监控和告警:监控负载均衡器的运行状态,及时发现和解决问题
– 服务发现最佳实践:
– DNS服务:使用Kubernetes内置的DNS服务进行服务发现
– 环境变量:使用环境变量进行服务发现
– 服务网格:使用服务网格进行更高级的服务发现和管理
– 健康检查:定期检查服务的可用性
– 安全最佳实践:
– 网络策略:配置网络策略,限制服务的访问
– 服务账户:使用服务账户控制服务的权限
– 加密通信:使用TLS加密服务通信
– 访问控制:配置RBAC,控制服务的访问权限
– 服务最佳实践:
– 使用标签选择器:合理使用标签选择器,确保服务能正确匹配后端Pod
– 服务类型选择:根据访问需求选择合适的服务类型
– 端口配置:合理配置服务端口,避免端口冲突
– 会话亲和性:根据应用需求配置会话亲和性
– 健康检查:配置适当的健康检查,确保服务只将流量分发到健康的Pod
– 负载均衡最佳实践:
– 负载均衡策略:根据应用特点选择合适的负载均衡策略
– 健康检查:配置适当的健康检查,及时发现和移除不健康的Pod
– 会话亲和性:根据应用需求配置会话亲和性,确保会话一致性
– 负载均衡器配置:优化负载均衡器配置,提高性能和可靠性
– 监控和告警:监控负载均衡器的运行状态,及时发现和解决问题
– 服务发现最佳实践:
– DNS服务:使用Kubernetes内置的DNS服务进行服务发现
– 环境变量:使用环境变量进行服务发现
– 服务网格:使用服务网格进行更高级的服务发现和管理
– 健康检查:定期检查服务的可用性
– 安全最佳实践:
– 网络策略:配置网络策略,限制服务的访问
– 服务账户:使用服务账户控制服务的权限
– 加密通信:使用TLS加密服务通信
– 访问控制:配置RBAC,控制服务的访问权限
Part03-生产环境项目实施方案
3.1 服务实现
服务实现的具体步骤:
# 服务实现
1. 创建ClusterIP服务:
# 创建Deployment
$ cat > deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 EOF $ kubectl apply -f deployment.yaml # 创建ClusterIP服务 $ cat > service-clusterip.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-clusterip spec: type: ClusterIP,风哥提示:。 selector: app: nginx ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f service-clusterip.yaml # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 1d
nginx-service-clusterip ClusterIP 10.96.123.45 80/TCP 1m
2. 创建NodePort服务:
# 创建NodePort服务
$ cat > service-nodeport.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-nodeport spec: type: NodePort selector: app: nginx ports: - port: 80 targetPort: 80 nodePort: 30080 EOF $ kubectl apply -f service-nodeport.yaml # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 1d
nginx-service-clusterip ClusterIP 10.96.123.45 80/TCP 1m
nginx-service-nodeport NodePort 10.96.78.90 80:30080/TCP 1m
3. 创建LoadBalancer服务:
# 创建LoadBalancer服务
$ cat > service-loadbalancer.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-loadbalancer spec: type: LoadBalancer selector: app: nginx ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f service-loadbalancer.yaml # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 1d
nginx-service-clusterip ClusterIP 10.96.123.45 80/TCP 1m
nginx-service-nodeport NodePort 10.96.78.90 80:30080/TCP 1m
nginx-service-loadbalancer LoadBalancer 10.96.45.67 192.168.1.100 80:30180/TCP 1m
4. 创建ExternalName服务:
# 创建ExternalName服务
$ cat > service-externalname.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-externalname spec: type: ExternalName externalName: example.com EOF $ kubectl apply -f service-externalname.yaml # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 1d
nginx-service-clusterip ClusterIP 10.96.123.45 80/TCP 1m
nginx-service-nodeport NodePort 10.96.78.90 80:30080/TCP 1m
nginx-service-loadbalancer LoadBalancer 10.96.45.67 192.168.1.100 80:30180/TCP 1m
nginx-service-externalname ExternalName example.com 1m
1. 创建ClusterIP服务:
# 创建Deployment
$ cat > deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 EOF $ kubectl apply -f deployment.yaml # 创建ClusterIP服务 $ cat > service-clusterip.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-clusterip spec: type: ClusterIP,风哥提示:。 selector: app: nginx ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f service-clusterip.yaml # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1
nginx-service-clusterip ClusterIP 10.96.123.45
2. 创建NodePort服务:
# 创建NodePort服务
$ cat > service-nodeport.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-nodeport spec: type: NodePort selector: app: nginx ports: - port: 80 targetPort: 80 nodePort: 30080 EOF $ kubectl apply -f service-nodeport.yaml # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1
nginx-service-clusterip ClusterIP 10.96.123.45
nginx-service-nodeport NodePort 10.96.78.90
3. 创建LoadBalancer服务:
# 创建LoadBalancer服务
$ cat > service-loadbalancer.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-loadbalancer spec: type: LoadBalancer selector: app: nginx ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f service-loadbalancer.yaml # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1
nginx-service-clusterip ClusterIP 10.96.123.45
nginx-service-nodeport NodePort 10.96.78.90
nginx-service-loadbalancer LoadBalancer 10.96.45.67 192.168.1.100 80:30180/TCP 1m
4. 创建ExternalName服务:
# 创建ExternalName服务
$ cat > service-externalname.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-externalname spec: type: ExternalName externalName: example.com EOF $ kubectl apply -f service-externalname.yaml # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1
nginx-service-clusterip ClusterIP 10.96.123.45
nginx-service-nodeport NodePort 10.96.78.90
nginx-service-loadbalancer LoadBalancer 10.96.45.67 192.168.1.100 80:30180/TCP 1m
nginx-service-externalname ExternalName
3.2 负载均衡实现
负载均衡实现的具体步骤。,风哥提示:。
# 负载均衡实现
1. 配置负载均衡策略:
# 创建带有会话亲和性的服务
$ cat > service-session-affinity.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-session-affinity spec: type: ClusterIP selector: app: nginx ports: - port: 80 targetPort: 80 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 EOF $ kubectl apply -f service-session-affinity.yaml 2. 配置健康检查: # 创建带有就绪探针的Deployment $ cat > deployment-health-check.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-health-check spec: replicas: 3 selector: matchLabels: app: nginx-health-check,学习交流加群风哥微信: itpux-com。 template: metadata: labels: app: nginx-health-check spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 15 periodSeconds: 20 EOF $ kubectl apply -f deployment-health-check.yaml # 创建服务 $ cat > service-health-check.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-health-check spec: type: ClusterIP selector: app: nginx-health-check ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f service-health-check.yaml 3. 配置外部负载均衡器: # 安装MetalLB(用于裸金属集群) $ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml # 配置MetalLB地址池 $ cat > metallb-config.yaml << 'EOF' apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: default spec: addresses: - 192.168.1.100-192.168.1.200 --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: default spec: ipAddressPools: - default EOF $ kubectl apply -f metallb-config.yaml # 创建LoadBalancer服务 $ cat > service-metallb.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-metallb spec: type: LoadBalancer selector: app: nginx ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f service-metallb.yaml # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 1d
nginx-service-metallb LoadBalancer 10.96.78.90 192.168.1.100 80:30080/TCP 1m
1. 配置负载均衡策略:
# 创建带有会话亲和性的服务
$ cat > service-session-affinity.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-session-affinity spec: type: ClusterIP selector: app: nginx ports: - port: 80 targetPort: 80 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 EOF $ kubectl apply -f service-session-affinity.yaml 2. 配置健康检查: # 创建带有就绪探针的Deployment $ cat > deployment-health-check.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-health-check spec: replicas: 3 selector: matchLabels: app: nginx-health-check,学习交流加群风哥微信: itpux-com。 template: metadata: labels: app: nginx-health-check spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 15 periodSeconds: 20 EOF $ kubectl apply -f deployment-health-check.yaml # 创建服务 $ cat > service-health-check.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-health-check spec: type: ClusterIP selector: app: nginx-health-check ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f service-health-check.yaml 3. 配置外部负载均衡器: # 安装MetalLB(用于裸金属集群) $ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml # 配置MetalLB地址池 $ cat > metallb-config.yaml << 'EOF' apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: default spec: addresses: - 192.168.1.100-192.168.1.200 --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: default spec: ipAddressPools: - default EOF $ kubectl apply -f metallb-config.yaml # 创建LoadBalancer服务 $ cat > service-metallb.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: nginx-service-metallb spec: type: LoadBalancer selector: app: nginx ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f service-metallb.yaml # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1
nginx-service-metallb LoadBalancer 10.96.78.90 192.168.1.100 80:30080/TCP 1m
3.3 服务发现实现
服务发现实现的具体步骤。
# 服务发现实现
1. 使用DNS进行服务发现:
# 创建服务
$ kubectl create deployment nginx –image=nginx:latest
$ kubectl expose deployment nginx –port=80 –target-port=80
# 在Pod中使用DNS解析服务
$ cat > dns-test.yaml << 'EOF' apiVersion: v1 kind: Pod metadata: name: dns-test spec: containers: - name: dns-test image: busybox command: ['sh', '-c', 'nslookup nginx && sleep 3600'] EOF $ kubectl apply -f dns-test.yaml # 查看DNS解析结果 $ kubectl logs dns-test # 输出 Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: nginx Address 1: 10.96.123.45 nginx.default.svc.cluster.local 2. 使用环境变量进行服务发现: # 创建服务 $ kubectl create deployment redis --image=redis:latest $ kubectl expose deployment redis --port=6379 --target-port=6379 # 在Pod中使用环境变量 $ cat > env-test.yaml << 'EOF' apiVersion: v1 kind: Pod,学习交流加群风哥QQ113257174。 metadata: name: env-test spec: containers: - name: env-test image: busybox command: ['sh', '-c', 'env | grep REDIS && sleep 3600'] EOF $ kubectl apply -f env-test.yaml # 查看环境变量 $ kubectl logs env-test # 输出 REDIS_SERVICE_HOST=10.96.56.78 REDIS_SERVICE_PORT=6379 REDIS_PORT=tcp://10.96.56.78:6379 REDIS_PORT_6379_TCP=tcp://10.96.56.78:6379 REDIS_PORT_6379_TCP_PROTO=tcp REDIS_PORT_6379_TCP_PORT=6379 REDIS_PORT_6379_TCP_ADDR=10.96.56.78 3. 使用服务网格进行服务发现: # 安装Istio $ istioctl install --set profile=default -y # 启用自动注入 $ kubectl label namespace default istio-injection=enabled # 创建应用 $ kubectl create deployment nginx --image=nginx:latest $ kubectl expose deployment nginx --port=80 --target-port=80 # 创建测试Pod $ cat > istio-test.yaml << 'EOF' apiVersion: v1 kind: Pod metadata: name: istio-test spec: containers: - name: istio-test image: curlimages/curl command: ['sh', '-c', 'curl nginx && sleep 3600'] EOF $ kubectl apply -f istio-test.yaml # 查看服务发现结果 $ kubectl logs istio-test # 输出
Welcome to nginx!
…
1. 使用DNS进行服务发现:
# 创建服务
$ kubectl create deployment nginx –image=nginx:latest
$ kubectl expose deployment nginx –port=80 –target-port=80
# 在Pod中使用DNS解析服务
$ cat > dns-test.yaml << 'EOF' apiVersion: v1 kind: Pod metadata: name: dns-test spec: containers: - name: dns-test image: busybox command: ['sh', '-c', 'nslookup nginx && sleep 3600'] EOF $ kubectl apply -f dns-test.yaml # 查看DNS解析结果 $ kubectl logs dns-test # 输出 Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: nginx Address 1: 10.96.123.45 nginx.default.svc.cluster.local 2. 使用环境变量进行服务发现: # 创建服务 $ kubectl create deployment redis --image=redis:latest $ kubectl expose deployment redis --port=6379 --target-port=6379 # 在Pod中使用环境变量 $ cat > env-test.yaml << 'EOF' apiVersion: v1 kind: Pod,学习交流加群风哥QQ113257174。 metadata: name: env-test spec: containers: - name: env-test image: busybox command: ['sh', '-c', 'env | grep REDIS && sleep 3600'] EOF $ kubectl apply -f env-test.yaml # 查看环境变量 $ kubectl logs env-test # 输出 REDIS_SERVICE_HOST=10.96.56.78 REDIS_SERVICE_PORT=6379 REDIS_PORT=tcp://10.96.56.78:6379 REDIS_PORT_6379_TCP=tcp://10.96.56.78:6379 REDIS_PORT_6379_TCP_PROTO=tcp REDIS_PORT_6379_TCP_PORT=6379 REDIS_PORT_6379_TCP_ADDR=10.96.56.78 3. 使用服务网格进行服务发现: # 安装Istio $ istioctl install --set profile=default -y # 启用自动注入 $ kubectl label namespace default istio-injection=enabled # 创建应用 $ kubectl create deployment nginx --image=nginx:latest $ kubectl expose deployment nginx --port=80 --target-port=80 # 创建测试Pod $ cat > istio-test.yaml << 'EOF' apiVersion: v1 kind: Pod metadata: name: istio-test spec: containers: - name: istio-test image: curlimages/curl command: ['sh', '-c', 'curl nginx && sleep 3600'] EOF $ kubectl apply -f istio-test.yaml # 查看服务发现结果 $ kubectl logs istio-test # 输出
…
Part04-生产案例与实战讲解
4.1 ClusterIP服务案例
ClusterIP服务的实战案例。。
# 案例:使用ClusterIP服务实现内部服务发现
# 场景:在集群内部部署多个微服务,通过ClusterIP服务实现服务间通信
# 问题:
– 微服务间需要安全、稳定的通信方式
– 需要负载均衡多个微服务实例
– 需要服务发现机制,避免硬编码IP地址
# 解决方案:
1. 部署后端服务:
# 创建后端Deployment
$ cat > backend-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: backend spec: replicas: 3 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - name: backend image: nginx:latest ports: - containerPort: 80 env: - name: BACKEND_VERSION value: "v1" EOF $ kubectl apply -f backend-deployment.yaml # 创建ClusterIP服务 $ cat > backend-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: backend spec: type: ClusterIP selector: app: backend ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f backend-service.yaml 2. 部署前端服务: # 创建前端Deployment $ cat > frontend-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: frontend spec: replicas: 2 selector: matchLabels: app: frontend template: metadata: labels:,更多视频教程www.fgedu.net.cn。 app: frontend spec: containers: - name: frontend image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: config mountPath: /etc/nginx/conf.d volumes: - name: config configMap: name: frontend-config EOF # 创建配置文件 $ cat > frontend-config.yaml << 'EOF' apiVersion: v1 kind: ConfigMap metadata: name: frontend-config data: default.conf: | server { listen 80; server_name localhost; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } EOF $ kubectl apply -f frontend-config.yaml $ kubectl apply -f frontend-deployment.yaml # 创建前端服务 $ cat > frontend-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: frontend spec: type: NodePort selector: app: frontend ports: - port: 80 targetPort: 80 nodePort: 30080 EOF $ kubectl apply -f frontend-service.yaml 3. 测试服务发现: # 进入前端Pod $ kubectl exec -it $(kubectl get pods -l app=frontend -o jsonpath='{.items[0].metadata.name}') -- /bin/bash # 测试后端服务访问 $ curl backend # 输出
Welcome to nginx!
…
# 测试负载均衡
$ for i in {1..10}; do curl -s backend | grep “BACKEND_VERSION”; done
# 输出
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
4. 验证服务发现:
# 查看服务
$ kubectl get services
# 输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend ClusterIP 10.96.123.45 80/TCP 1m
frontend NodePort 10.96.78.90 80:30080/TCP 1m
kubernetes ClusterIP 10.96.0.1 443/TCP 1d
# 从外部访问前端服务
$ curl http://$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[0].address}’):30080
# 输出
Welcome to nginx!
…
# 输出结果:
# 服务间通信正常
# 负载均衡工作正常
# 服务发现机制正常
# 场景:在集群内部部署多个微服务,通过ClusterIP服务实现服务间通信
# 问题:
– 微服务间需要安全、稳定的通信方式
– 需要负载均衡多个微服务实例
– 需要服务发现机制,避免硬编码IP地址
# 解决方案:
1. 部署后端服务:
# 创建后端Deployment
$ cat > backend-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: backend spec: replicas: 3 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - name: backend image: nginx:latest ports: - containerPort: 80 env: - name: BACKEND_VERSION value: "v1" EOF $ kubectl apply -f backend-deployment.yaml # 创建ClusterIP服务 $ cat > backend-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: backend spec: type: ClusterIP selector: app: backend ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f backend-service.yaml 2. 部署前端服务: # 创建前端Deployment $ cat > frontend-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: frontend spec: replicas: 2 selector: matchLabels: app: frontend template: metadata: labels:,更多视频教程www.fgedu.net.cn。 app: frontend spec: containers: - name: frontend image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: config mountPath: /etc/nginx/conf.d volumes: - name: config configMap: name: frontend-config EOF # 创建配置文件 $ cat > frontend-config.yaml << 'EOF' apiVersion: v1 kind: ConfigMap metadata: name: frontend-config data: default.conf: | server { listen 80; server_name localhost; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } EOF $ kubectl apply -f frontend-config.yaml $ kubectl apply -f frontend-deployment.yaml # 创建前端服务 $ cat > frontend-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: frontend spec: type: NodePort selector: app: frontend ports: - port: 80 targetPort: 80 nodePort: 30080 EOF $ kubectl apply -f frontend-service.yaml 3. 测试服务发现: # 进入前端Pod $ kubectl exec -it $(kubectl get pods -l app=frontend -o jsonpath='{.items[0].metadata.name}') -- /bin/bash # 测试后端服务访问 $ curl backend # 输出
…
# 测试负载均衡
$ for i in {1..10}; do curl -s backend | grep “BACKEND_VERSION”; done
# 输出
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
BACKEND_VERSION: v1
4. 验证服务发现:
# 查看服务
$ kubectl get services
# 输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend ClusterIP 10.96.123.45
frontend NodePort 10.96.78.90
kubernetes ClusterIP 10.96.0.1
# 从外部访问前端服务
$ curl http://$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[0].address}’):30080
# 输出
…
# 输出结果:
# 服务间通信正常
# 负载均衡工作正常
# 服务发现机制正常
4.2 NodePort服务案例
NodePort服务的实战案例。
# 案例:使用NodePort服务实现外部访问
# 场景:部署Web应用,需要从集群外部访问
# 问题:
– 需要从集群外部访问应用
– 需要在多个节点上暴露服务
– 需要简单的外部访问方案
# 解决方案:
1. 部署应用:
# 创建Deployment
$ cat > web-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 3 selector: matchLabels: app: web,更多学习教程公众号风哥教程itpux_com。 template: metadata: labels: app: web spec: containers: - name: web image: nginx:latest ports: - containerPort: 80 EOF $ kubectl apply -f web-deployment.yaml # 创建NodePort服务 $ cat > web-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: web spec: type: NodePort selector: app: web ports: - port: 80 targetPort: 80 nodePort: 30080 EOF $ kubectl apply -f web-service.yaml 2. 测试外部访问: # 获取节点IP $ NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[0].address}') # 测试访问 $ curl http://$NODE_IP:30080 # 输出
Welcome to nginx!
…
3. 测试负载均衡:
# 测试多次访问
$ for i in {1..10}; do curl -s http://$NODE_IP:30080 | grep “Server address” | head -1; done
# 输出
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
4. 验证服务:
# 查看服务
$ kubectl get services
# 输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 1d
web NodePort 10.96.123.45 80:30080/TCP 1m
# 查看Pod
$ kubectl get pods -l app=web
# 输出
NAME READY STATUS RESTARTS AGE
web-12345-abcde 1/1 Running 0 1m
web-12345-fghij 1/1 Running 0 1m
web-12345-klmno 1/1 Running 0 1m
# 输出结果:
# 外部访问正常
# 负载均衡工作正常
# 服务部署成功
# 场景:部署Web应用,需要从集群外部访问
# 问题:
– 需要从集群外部访问应用
– 需要在多个节点上暴露服务
– 需要简单的外部访问方案
# 解决方案:
1. 部署应用:
# 创建Deployment
$ cat > web-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 3 selector: matchLabels: app: web,更多学习教程公众号风哥教程itpux_com。 template: metadata: labels: app: web spec: containers: - name: web image: nginx:latest ports: - containerPort: 80 EOF $ kubectl apply -f web-deployment.yaml # 创建NodePort服务 $ cat > web-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: web spec: type: NodePort selector: app: web ports: - port: 80 targetPort: 80 nodePort: 30080 EOF $ kubectl apply -f web-service.yaml 2. 测试外部访问: # 获取节点IP $ NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[0].address}') # 测试访问 $ curl http://$NODE_IP:30080 # 输出
…
3. 测试负载均衡:
# 测试多次访问
$ for i in {1..10}; do curl -s http://$NODE_IP:30080 | grep “Server address” | head -1; done
# 输出
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
4. 验证服务:
# 查看服务
$ kubectl get services
# 输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1
web NodePort 10.96.123.45
# 查看Pod
$ kubectl get pods -l app=web
# 输出
NAME READY STATUS RESTARTS AGE
web-12345-abcde 1/1 Running 0 1m
web-12345-fghij 1/1 Running 0 1m
web-12345-klmno 1/1 Running 0 1m
# 输出结果:
# 外部访问正常
# 负载均衡工作正常
# 服务部署成功
4.3 LoadBalancer服务案例
LoadBalancer服务的实战案例。
# 案例:使用LoadBalancer服务实现云环境外部访问
# 场景:在云环境中部署应用,需要使用云提供商的负载均衡器
# 问题:
– 需要在云环境中暴露服务
– 需要使用云提供商的负载均衡器
– 需要高可用的外部访问方案
# 解决方案:
1. 部署应用:
# 创建Deployment
$ cat > app-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: app spec: replicas: 3 selector: matchLabels: app: app template: metadata: labels: app: app spec: containers: - name: app image: nginx:latest ports: - containerPort: 80 EOF $ kubectl apply -f app-deployment.yaml # 创建LoadBalancer服务 $ cat > app-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: app spec: type: LoadBalancer selector: app: app ports: - port: 80,from K8S+DB视频:www.itpux.com。 targetPort: 80 EOF $ kubectl apply -f app-service.yaml 2. 查看负载均衡器: # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE app LoadBalancer 10.96.123.45 203.0.113.100 80:30080/TCP 1m kubernetes ClusterIP 10.96.0.1 443/TCP 1d
。
# 等待外部IP分配
$ kubectl get services app -w
# 输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
app LoadBalancer 10.96.123.45 80:30080/TCP 10s
app LoadBalancer 10.96.123.45 203.0.113.100 80:30080/TCP 1m
3. 测试外部访问:
# 获取外部IP
EXTERNAL_IP=$(kubectl get service app -o jsonpath='{.status.loadBalancer.ingress[0].ip}’)
# 测试访问
$ curl http://$EXTERNAL_IP
# 输出
Welcome to nginx!
…
4. 测试负载均衡:
# 测试多次访问
$ for i in {1..10}; do curl -s http://$EXTERNAL_IP | grep “Server address” | head -1; done
# 输出
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
5. 验证服务:
# 查看Pod
$ kubectl get pods -l app=app
# 输出
NAME READY STATUS RESTARTS AGE
app-12345-abcde 1/1 Running 0 1m
app-12345-fghij 1/1 Running 0 1m
app-12345-klmno 1/1 Running 0 1m
# 输出结果:
# 外部访问正常
# 负载均衡工作正常
# 服务部署成功
# 场景:在云环境中部署应用,需要使用云提供商的负载均衡器
# 问题:
– 需要在云环境中暴露服务
– 需要使用云提供商的负载均衡器
– 需要高可用的外部访问方案
# 解决方案:
1. 部署应用:
# 创建Deployment
$ cat > app-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: app spec: replicas: 3 selector: matchLabels: app: app template: metadata: labels: app: app spec: containers: - name: app image: nginx:latest ports: - containerPort: 80 EOF $ kubectl apply -f app-deployment.yaml # 创建LoadBalancer服务 $ cat > app-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: app spec: type: LoadBalancer selector: app: app ports: - port: 80,from K8S+DB视频:www.itpux.com。 targetPort: 80 EOF $ kubectl apply -f app-service.yaml 2. 查看负载均衡器: # 查看服务 $ kubectl get services # 输出 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE app LoadBalancer 10.96.123.45 203.0.113.100 80:30080/TCP 1m kubernetes ClusterIP 10.96.0.1
。
# 等待外部IP分配
$ kubectl get services app -w
# 输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
app LoadBalancer 10.96.123.45
app LoadBalancer 10.96.123.45 203.0.113.100 80:30080/TCP 1m
3. 测试外部访问:
# 获取外部IP
EXTERNAL_IP=$(kubectl get service app -o jsonpath='{.status.loadBalancer.ingress[0].ip}’)
# 测试访问
$ curl http://$EXTERNAL_IP
# 输出
…
4. 测试负载均衡:
# 测试多次访问
$ for i in {1..10}; do curl -s http://$EXTERNAL_IP | grep “Server address” | head -1; done
# 输出
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
Server address: 10.244.2.3:80
Server address: 10.244.3.4:80
Server address: 10.244.1.2:80
5. 验证服务:
# 查看Pod
$ kubectl get pods -l app=app
# 输出
NAME READY STATUS RESTARTS AGE
app-12345-abcde 1/1 Running 0 1m
app-12345-fghij 1/1 Running 0 1m
app-12345-klmno 1/1 Running 0 1m
# 输出结果:
# 外部访问正常
# 负载均衡工作正常
# 服务部署成功
Part05-风哥经验总结与分享
5.1 服务使用技巧
Kubernetes服务使用的技巧。
- 选择合适的服务类型:根据访问需求选择合适的服务类型,如ClusterIP用于内部访问,NodePort或LoadBalancer用于外部访问
- 合理配置端口:避免端口冲突,使用标准端口,便于管理和维护
- 使用标签选择器:合理使用标签选择器,确保服务能正确匹配后端Pod
- 配置健康检查:为Pod配置适当的健康检查,确保服务只将流量分发到健康的Pod
- 使用会话亲和性:根据应用需求配置会话亲和性,确保会话一致性
- 监控服务状态:定期监控服务的运行状态,及时发现和解决问题
- 优化服务配置:根据应用特点优化服务配置,提高性能和可靠性
- 使用服务网格:对于复杂的微服务架构,考虑使用服务网格进行更高级的服务管理
5.2 负载均衡技巧
Kubernetes负载均衡的技巧:
- 选择合适的负载均衡策略:根据应用特点选择合适的负载均衡策略,如轮询、会话亲和性等
- 配置健康检查:为Pod配置适当的健康检查,及时发现和移除不健康的Pod
- 使用外部负载均衡器:对于生产环境,考虑使用外部负载均衡器,如HAProxy、Nginx等
- 优化负载均衡器配置:根据应用特点优化负载均衡器配置,提高性能和可靠性
- 监控负载均衡器:定期监控负载均衡器的运行状态,及时发现和解决问题
- 使用服务网格:对于复杂的微服务架构,考虑使用服务网格进行更高级的负载均衡管理
- 测试负载均衡效果:定期测试负载均衡效果,确保流量分发均匀
- 考虑容错性:配置适当的容错机制,确保负载均衡器故障时能快速切换
5.3 未来趋势
Kubernetes服务发现与负载均衡的未来趋势:
- 服务网格的普及:服务网格将成为微服务架构的标准配置,提供更高级的服务发现和负载均衡能力
- 智能化负载均衡:使用AI技术实现智能化负载均衡,根据应用特点和流量模式自动调整负载均衡策略
- 边缘计算集成:负载均衡将延伸到边缘节点,支持边缘计算场景
- 多集群服务发现:支持跨集群的服务发现和负载均衡,实现多集群统一管理
- 安全增强:负载均衡将集成更多安全功能,如TLS终止、WAF等
- 自动化配置:负载均衡配置将更加自动化,减少人工干预
- 性能优化:负载均衡性能将进一步优化,支持更高的并发和更低的延迟
- 标准化:负载均衡将更加标准化,便于跨云平台部署和管理
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
