kubernetes容器编排-服务

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

文档和安装

参考:https://blog.csdn.net/vampiresuper/article/details/122036310
官方文档

Ingress-nginx需要安装才能使用:非官方文档,二次修改

架构图

高并发,生产可用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实际情况写

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值