• K8S原来如此简单(四)Service+Ingress


     

    正文

    上一篇我们通过deployment实现了pod的横向扩展,但是仍然不能负载,也不能对外提供服务,现在我们来看看如何通过k8s实现负载与外网访问

    Service

    service为一组pod提供一个统一的入口,实现负载,也可实现外部访问。

    原理

     在Kubernetes集群的每个Node上都会运行一个kube-proxy服务进程,kube-proxy会通过我们定义的service,自动生成iptables规则,这样就能将到某个Service的访问请求转发到后端的多个Pod实例上。

    Service类型

    ClusterIP

    通过集群的内部 IP 暴露服务,选择该模式时服务只能够在集群内部访问。 这也是默认的 ServiceType。

     

    NodePort

    通过每个节点上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。

    LoadBalancer

    使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。

     

    Service的Cluster IP与NodePort等概念是kube-proxy服务通过iptables 的NAT转换实现的。kube-proxy在运行过程中动态创建与Service相关的 iptables规则,这些规则实现了将访问服务(Cluster IP或NodePort)的请 求负载分发到后端Pod的功能。

     

    kubeadm方式修改ipvs模式:

    复制代码
    kubeadm方式修改ipvs模式:
    kubectl edit configmap kube-proxy -n kube-system
    
    ...
    mode: “ipvs“
    ...
    复制代码

    定义Service

    创建一个ClusterIP的service

    复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: chesterservice
      namespace: chesterns
    spec:
      selector:
        app: chesterapi
      ports:
        - protocol: TCP
          port: 5000
          targetPort: 5000
    复制代码

     

    部署service,并通过service访问oneapi

    kubectl apply -f service.yaml
    kubectl get service -n chesterns
    kubectl describe service chesterservice -n chesterns
    curl clusterip:5000/test

    clusterip模式的service不能通过外网访问,我们来定义一个nodeport模式的service,实现外部访问

    复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: chesterservice
      namespace: chesterns
    spec:
      type: NodePort
      selector:
        app: chesterapi
      ports:
        - protocol: TCP
          port: 5000
          targetPort: 5000
          nodePort: 30111
    复制代码
    kubectl delete -f service.yaml
    kubectl apply -f service.yaml
    kubectl get service -n chesterns
    kubectl describe service chesterservice -n chesterns
    curl nodeip:30111/test

     

    服务发现

    k8s通过两种方式实现服务的发现

    环境变量

    当 Pod 运行在 Node 上,kubelet 会为每个活跃的 Service 添加一组环境变量

    {SVCNAME}_SERVICE_HOST

    {SVCNAME}_SERVICE_PORT

    通过以下命令即可看到

    kubectl get pod -n chesternskubectl exec chesterdeployment-6d89bc6b45-c5vbv  -n chesterns -- env
    DNS

    CoreDNS 是一种灵活的,可扩展的 DNS 服务器,可以 安装为集群内的 Pod 提供 DNS 服务。

    ClusterIP A记录格式:

    <service-name>.<namespace-name>.svc.cluster.local

    示例:

    my-svc.my-namespace.svc.cluster.local

    Ingress

    NodePort存在端口不足,只支持4层负载(IP:Port)不支持7层网络负载的缺点。Ingress为了弥补这些缺点而生。

    对于基于HTTP的服务来说,不同的URL地址经常对应到不同的后端服务或者虚拟服务器(Virtual Host),这些应用层的转发机制仅通过Kubernetes的Service机制是无法实现的。

    使用Ingress进行负载分发时,Ingress Controller基于Ingress规则将客户端请求直接转发到Service对应的后端Endpoint(Pod)上,这样会跳过kube-proxy的转发功能,kube-proxy不再起作用。如果Ingress Controller提供的是对外服务,则实际上实现的是边缘路由器的功能。

     

     

    Ingress Nginx

    Ingress nginx是我们常用的一种ingress controller,他的原理是监听Ingress资源,把用户定义的Ingress转移成Nginx的配置信息

    核心代码如下

     

    安装Ingress Nginx

    通过以下链接下载yaml文件:

    https://kubernetes.github.io/ingress-nginx/deploy/

    创建Ingress Controller

    kubectl apply -f nginx-ingress.yamlkubectl get pods --namespace=ingress-nginx

    创建Ingress

    复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: chesteringress
      namespace: chesterns
      annotations:
       kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
      - host: chester.k8s.com
        http:
          paths:
          - pathType: Prefix
            path: "/test"
            backend:
             service:
              name: chesterservice
              port:
               number: 5000
    复制代码

    部署

    kubectl apply -f ingress.yaml

    查看nginx配置信息,判断ingress是否生效

    kubectl cp ingress-nginx-controller-58fccdc57c-gzkns:/etc/nginx/nginx.conf /tmp/nginx.conf -n ingress-nginx
    cat /tmp/nginx.conf

    配置hosts

    kubectl get pods --namespace=ingress-nginx -o wide
    
    vi /etc/hosts
    (ingress-nginx-controller的集群ip) chester.k8s.com

    测试访问

    curl chester.k8s.com/test/

    为Ingress配置https

    配置HTTPS步骤:

    1. 准备域名证书文件(来自:openssl/cfssl工具自签或者权威机构颁发)

    2. 将证书文件保存到Secret

    kubectl create secret tls chestertlssecret -- cert=chester.k8s.com.pem --key=chester.k8s.com-key.pem
    1. Ingress规则配置tls

    复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
     name: chesteringress
    spec:
     tls:
     - hosts:
       - chester.k8s.com
       secretName: chestertlssecret
     rules:
     - host: chester.k8s.com
       http:
        paths:
        - path: /
          pathType: Prefix
          backend:
           service:
            name: web
            port:
             number: 80
    复制代码

    C#/.net/.net core QQ群:953553560


                    
  • 相关阅读:
    Eclipse/IDEA常用快捷键
    QGIS编译(跨平台编译)之五十六:Qt Creator环境下qgispython库的pro文件
    Java————二叉树
    深入理解JavaScript——执行上下文与调用栈
    你已经是个成熟的 985 大学了,请不要在大一教 C 语言!
    Matlab:Matlab编程语言应用之数学统计(柱状图、曲线分析等)的使用方法简介、案例实现之详细攻略
    Postman(5): postman持久化保存
    Docker引擎(engine)学习总结
    Flutter组件--OverflowBox、SizedOverflowBox(子组件超出父组件裁剪)
    DockerFile打包项目实战解析,一文读懂dockerfile打包
  • 原文地址:https://www.cnblogs.com/chenyishi/p/16043899.html