【k8s】4-Service转发规则 ingress 七层代理

Service

  工作模式: userspace,iptables,ipvs

  类型: 

  1. ExternalName: 用于将集群外部的服务引入到集群内部,在集群内部可直接访问来获取服务。
      它的值必须是 FQDN, 此FQDN为集群内部的FQDN, 即: ServiceName.Namespace.Domain.LTD.
      然后CoreDNS接受到该FQDN后,能解析出一个CNAME记录, 该别名记录为真正互联网上的域名.
      如: www.test.com, 接着CoreDNS在向互联网上的根域DNS解析该域名,获得其真实互联网IP.
  2. ClusterIP: 用于为集群内Pod访问时,提供的固定访问地址,默认是自动分配地址,可使用ClusterIP关键字指定固定IP.
  3. NodePort: 用于为集群外部访问Service后面Pod提供访问接入端口.
    这种类型的service工作流程为:
      Client----->NodeIP:NodePort----->ClusterIP:ServicePort----->PodIP:ContainerPort
  4. LoadBalancer: 用于当K8s运行在一个云环境内时,若该云环境支持LBaaS,则此类型可自动触发创建
        一个软件负载均衡器用于对Service做负载均衡调度.
    因为外部所有Client都访问一个NodeIP,该节点的压力将会很大, 而LoadBalancer则可解决这个问题。
    而且它还直接动态监测后端Node是否被移除或新增了,然后动态更新调度的节点数。

资源记录

         SVC_NAME.NS_NAME.DOMAIN.LTD.

         特定域名后缀 svc.cluster.local. redis.default.svc.cluster.local.

        

    # 修改会话粘性

    Kubectl path svc myapp -p ‘{“spec”:{“sessionAffinity”:”ClientIp”}}’

    # 解析地址

    dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10

实现ipvs代理

vim /etc/sysconfig/kubelet

KUBE_PROXY_MODE=ipvs

ip_vs, ip_vs_rr, ip_vs_sh, ip_vs_wrr, nf_conntrack_ipv4

Ingress Controller七层调度

  HAProxy、默认使用Nginx 、服务网格 Envoy 、微服务 Traefik

  1、根据域名做负载到不同服务

  2、url映射 /eshop  /bbs  /api 不同服务

功能 

# 暴露端口
  负载均衡:ingress-nginx kind:service namespace: ingress-nginx
# 负7层代理
  Pod名称:nginx-ingress-controller-5bb8fb4bb6-k2x28 kind:POD namespace: ingress-nginx

# 对象转发配置模板 主机或者 api路径 https
  名称: ingress-myapp kind:ingress namespace: default

# 负载Pod 后端群组
  service myapp default
# selector 选择Pod
  deployment Pod: deployment-demo default

# 安装nginx-ingress

# 参考连接 https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/docs/deploy/index.md

 

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

kubectl create –f  mandatory.yaml

kubectl create –f  service-nodeport.yaml

 

POD_NAMESPACE=ingress-nginx

POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].metadata.name}')

kubectl exec -it $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version

 

# Service Pod
apiVersion: v1
kind: Service
metadata:
  name: tomcat
  namespace: default
spec:
  selector:
    app: tomcat
    release: canary
  ports:
  - name: http
    port: 8080
    targetPort: 8080
  - name: ajp
    targetPort: 8009
    port: 8009
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deploy
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: tomcat
      release: canary
  template:
    metadata:
      labels:
        app: tomcat
        release: canary
    spec:
      containers:
      - name: tomcat-myapp
        image: tomcat:8
        ports:
        - name: http
          containerPort: 8080
        - name: ajp
          containerPort: 8009
# ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-mytomcat
  namespace: default
  annotations:
    kubernets.io/ingress.class: "nginx"
spec:
  rules:
  - host: tomcatnode
    http:
      paths:
      - path:
        backend:
          serviceName: tomcat
          servicePort: 8080

# 生成自签证书

openssl genrsa -out tls.key 2048

openssl req -new -x509 -key tls.key -out tls.crt –subj /C=CN/ST=Beijing/L=Beijing/O=Devops/CN=tomcatnode

 

# 创建密钥关联证书  

kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key

# 创建 ingress关联证书
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-mytomcat-tls
  namespace: default
  annotations:
    kubernets.io/ingress.class: "nginx"
spec:
  tls:
  - hosts:
    - tomcatnode
    secretName: tomcat-ingress-secret
  rules:
  - host: tomcatnode
    http:
      paths:
      - path:
        backend:
          serviceName: tomcat
          servicePort: 8080

 

 # 未完待续

 

 

原文地址:https://www.cnblogs.com/oscarli/p/12800249.html