文章目录
- Service
- k8s网络架构:⭐⭐⭐⭐⭐
- clusterIP示例:
- NodePort示例:
- ExternalName 示例
- LoadBalancer
- 集群内通过域名访问的方式 ⭐⭐⭐⭐⭐
- Ingress
- 文档和安装
- 架构图
- ingress示例
- 过滤host(主机域名),并过滤路由的示例
- 未指定域名,未指定路由匹配规则的示例
- 改全局配置
- annotation
- 路径重写和限流和示例
- 基于cookie的会话保持
- canary 金丝雀部署
Service
k8s网络架构:⭐⭐⭐⭐⭐
共有四种不同IP的port,根据实际情况,通过设置端口的映射,设置不同的访问权限
clusterIP示例:
apiVersion: v1
kind: Service
metadata:
name: canary-test
namespace: default
spec:
selector:
app: canary-nginx
clusterIP: None # 这一项是可选项,type 一定要是 CluesterIP才能用
## None 不要给这个SVC分配IP,在pod内是使用域名访问,pod外不能访问,称为headless service无头服务,配合有状态副本集StatefulSet使用
## 也可以指定IP,如10.96.xx.xx
type: ClusterIP
## NodePort #每个节点所在机器都开这个端口,浏览器可以通过每个节点的IP+暴漏的端口访问,并且相当于访问的是负载均衡网络
## ClusterIP: 不写type,默认就是这个,指的是,当前Service在集群内可以被所有人发现,默认给这个service分配一个集群内网络
## podcidr: pod的子网范围 svcdi: service的子网范围
ports:
- name: abc ## 随便起名,无所谓
port: 80 # service 端口
targetPort: 8080 # pod 端口
- name: redis ## 随便起名,无所谓
port: 99 # service 端口
targetPort: 6379 # pod 端口
NodePort示例:
apiVersion: v1
kind: Service
metadata:
name: canary-test
namespace: default
spec:
selector:
app: canary-nginx
type: NodePort
ports:
- name: abc ## 随便起名,无所谓
port: 80 # service 端口
targetPort: 8080 # pod 端口
- name: redis ## 随便起名,无所谓
port: 99 # service 端口
targetPort: 6379 # pod 端口
nodePort: 30088 # type要是NodePort才能用,所有集群中的机器都打开这个端口,暴漏给外界,没写就自动指定,访问任意一台机器,都能访问到Service代理的pod
kubectl get svc
查看
ExternalName 示例
apiVersion: v1
kind: Service
metadata:
name: external-test
namespace: default
spec:
type: ExternalName
externalName: baidu.com
LoadBalancer
请求云服务商提供负载均衡器
一般不用
集群内通过域名访问的方式 ⭐⭐⭐⭐⭐
- 用stafulset部署的应用,一定会指定servicename,其他pod可以通过域名访问特定的service或pod,可以避免pod重启后pod的IP变化的问题
访问服务,service名.namespace名.固定字符串
访问特定Pod,pod名.服务名.命名空间名[.固定字符串]
- 用deployment部署的pod,不能用上述方式访问,但可以使用service名访问service
Ingress
文档和安装
架构图
高并发,生产可用k8s完整网络架构
ingress示例
host和path都可以选择过滤和不过滤
过滤host(主机域名),并过滤路由的示例
前置工作,先建立deploy和service
deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeploy-01
namespace: default
labels:
dep: test-01
# 期望状态
spec:
selector: # 指定控制的Pod标签
matchLabels:
app: nginx-t
replicas: 5
template:
metadata:
labels:
app: nginx-t
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 100m
为了方便测试,使用NodePort,svc.yaml,实际上不用NodePort,用Cluster即可
apiVersion: v1
kind: Service
metadata:
name: my-nginx
namespace: default
spec:
selector:
app: nginx-t
type: NodePort
ports:
- name: aaa
protocol: TCP
port: 8089
targetPort: 80
ingress的yaml
apiVersion: networking.k8s.io/v1
kind: Ingress ### 代表nginx的一项配置
metadata:
name: hello-ingress
namespace: default
spec:
rules:
- host: it666.com ## 指定监听的主机域名,相当于请求头中的host字段 相当于nginx的server_name,
http:
paths:
- path: /
pathType: Prefix # 还有Exact精确匹配
backend:
service:
name: my-nginx
port:
number: 80 # 这是service暴漏的Cluster端口,host:80的请求转发到my-nginx:80服务,这里的number要根据service实际情况写
假设已经申请了域名(这里使用本机DNS的hosts模拟),使用it666.com访问即可实现负载均横
未指定域名,未指定路由匹配规则的示例
apiVersion: networking.k8s.io/v1
kind: Ingress ### 代表nginx的一项配置
metadata:
name: hello-ingress
namespace: default
spec:
defaultBackend:
service:
name: nginx
port: 80
改全局配置
官方文档
kubectl edit cm ingressnginx-controller -n ngress-nginx
编辑配置加上:
data :
配置项: 配置值
配置参考:
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/
基于环境变量带去的
annotation
使用 metadata.annotations的字段指定
路径重写和限流和示例
更多请看 官方文档
apiVersion: networking.k8s.io/v1
kind: Ingress ### 代表nginx的一项配置
metadata:
name: hello-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/limit-rps: "2" #限流配置 # 注意value只能是string类型
nginx.ingress.kubernetes.io/rewrite-target: /$2 # 路径重写,配合path,只截取最后的/后的部分
spec:
rules:
- host: it666.com ## 指定监听的主机域名,相当于请求头中的host字段 相当于nginx的server_name,
http:
paths:
- path: /api(/|$)(.*)
pathType: Prefix # 还有Exact精确匹配
backend:
service:
name: my-nginx
port:
number: 8089 # 这是service暴漏的Cluster端口,host:80的请求转发到my-nginx:8089服务,这里的number要根据service实际情况写
基于cookie的会话保持
apiVersion: networking.k8s.io/v1
kind: Ingress ### 代表nginx的一项配置
metadata:
name: hello-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
spec:
rules:
- host: it666.com ## 指定监听的主机域名,相当于请求头中的host字段 相当于nginx的server_name,
http:
paths:
- path: /
pathType: Exact # 还有Exact精确匹配
backend:
service:
name: my-nginx
port:
number: 8089 # 这是service暴漏的Cluster端口,host:80的请求转发到my-nginx:80服务,这里的number要根据service实际情况写
canary 金丝雀部署
先准备2个不同的deploy,2个不同的service,分别是 my-nginx1,my-nginx2,这里忽略过程。
然后应用两个ingress,两个版本分别是,绑定my-nginx1的hello-ingress-v1 和 绑定 my-nginx2的hello-ingress-v2(金丝雀版本),这里只展示 hello-ingress-v2的yaml文件,可以通过标头或cookie或默认流量将请求路由到金丝雀版本
apiVersion: networking.k8s.io/v1
kind: Ingress ### 代表nginx的一项配置
metadata:
name: hello-ingress-v2
namespace: default
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "canaryflag" # 根据标头判断路由到金丝雀
# always 总是转到这个ingress
# never 从来不转到这个ingress
nginx.ingress.kubernetes.io/canary-by-cookie: "haha"
# 根据cookie判断
nginx.ingress.kubernetes.io/canary-weightnginx: "70%" # 70%请求路由到金丝雀
# 优先级 canary-by-header -> canary-by-cookie -> canary-weight
spec:
rules:
- host: session.gerenblog.top ## 指定监听的主机域名,相当于请求头中的host字段 相当于nginx的server_name,
http:
paths:
- path: /
pathType: Prefix # 还有Exact精确匹配
backend:
service:
name: my-nginx2
port:
number: 8089 # 这是service暴漏的Cluster端口,host:80的请求转发到my-nginx:80服务,这里的number要根据service实际情况写