• 使用 ingress 创建对外服务


    一,使用 ingress 创建对外服务

    使用 ingress 暴露服务需要先新建一个svc,所以我们先使用如下内容创建一个,它会把 pod kubia端口8080上的服务转发到自己的8080kubia-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: kubia
    spec:
      ports:
      - port: 8080
        targetPort: 8080
      selector:
        app: kubia
    

      

     

    然后使用kubectl create -f kubia-svc.yaml创建该svc,接下来我们创建一个ingress。ingress 支持创建HTTPHTTPS的服务,接下来我们先来创建一个HTTP的:

    创建 HTTP 协议的访问

    http协议的访问比较简单,直接创建如下配置文件即可,通过这个ingress配置文件,nginx-ingress-controller就知道如何对外开发服务了。

    kubia-http-ingress.yaml

     
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: kubia
    spec:
      rules:
        # 将服务映射到该域名
      - host: kubia.example.com
        http:
          paths:
            # 通过 / 路径就可以访问该服务
          - path: /
            # 该服务后端 svc 的名称及端口号
            backend:
              serviceName: kubia
              servicePort: 8080
    

      

    然后使用kubectl create -f kubia-http-ingress.yaml就可以创建ingress了。我们可以使用kubectl describe ingress kubia来查看他的介绍

    root@master1:~# k describe ingress kubia
    Name:             kubia
    Namespace:        default
    Address:          
    Default backend:  default-http-backend:80 (<none>)
    Rules:
      Host               Path  Backends
      ----               ----  --------
      kubia.example.com  /     kubia:8080 (10.244.1.59:8080,10.244.2.31:8080,10.244.3.30:8080)
    Annotations:
    Events:  <none>
    

      

    ok,现在我们就可以通过http://kubia.example.com/来访问目标svc了,在系统的hosts文件里配置一下,将这个域名映射到nginx-ingress-controller的 ip 地址就可以了,详情见下方:

    配置域名到 ip 地址

    首先获取nginx-ingress-controller的 ip 地址,执行如下命令后按Tab补全名称,然后在IP列就可以找到对应的 ip 

    kubectl describe pod -n ingress-nginx nginx-ingress-controller-
    

      

    我的 ip 地址为192.168.56.22,执行vi /etc/hosts,输入以下内容即可:

    192.168.56.22 kubia.example.com
    

      

    修改完了之后,我们就可以进行访问了,执行curl http://kubia.example.com/,就可以看到来自 svc kubia的响应了

    root@master1:~# curl http://kubia.example.com/
    You've hit kubia-m68bq
    
    root@master1:~# curl http://kubia.example.com/
    You've hit kubia-8r2cg
    
    root@master1:~# curl http://kubia.example.com/
    You've hit kubia-flg8w
    

      

    创建 HTTPS 协议的访问

    这里的 https 访问是指从客户端到 ingress 控制器之间的连接是加密的,而控制器与后端svcpod之间的连接则还是 http,如下所示:

     
    https 请求链路

    想要让ingress可以提供https服务,我们首先需要有证书和私钥,这里我们先来创建他们俩

    openssl genrsa -out tls.key 2048
    
    openssl req -new -x509 \
      -key tls.key \
      -out tls.cert \
      -days 360 \
      -subj /CN=kubia.example.com
    

      

     

    执行完之后你就可以在当前文件夹下发现两个文件,分别为tls.certtls.key。因为这种秘钥比较敏感,不适合直接挂载到 pod 上,所以可以使用 k8s 提供的专门用于提供敏感数据的资源secret来存放它,我们先来新建一个名为tls-secretsecret资源:

    然后我们就可以修改上文中的kubia-http-ingress.yaml,将这个secret挂载上去:

    kubia-https-ingress.yaml

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: kubia
    spec:
      # 添加 tls 字段来启用 https
      tls:
      - hosts: 
          # 启用 https 的域名
        - kubia.example.com
        # 给其分配的证书及密钥,要求 tls 类型的 k8s secret 资源
        secretName: tls-secret
      rules:
      - host: kubia.example.com
        http:
          paths:
          - path: /
            backend:
              serviceName: kubia
              servicePort: 8080

    然后我们就可以通过以下命令来讲刚才创建的http服务提升至httpskubectl apply依靠kindmetadata字段中的数据来寻找要修改的资源,所以改名字并不会造成什么影响

    kubectl apply -f kubia-https-ingress.yaml
    然后输入curl -k -v https://kubia.example.com,就可以发现我们的服务已经启用的https连接:
    root@master1:~# curl -k -v https://kubia.example.com
    ...
    * successfully set certificate verify locations:
    *   CAfile: /etc/ssl/certs/ca-certificates.crt
    ...
    * Server certificate:
    *  subject: CN=kubia.example.com
    ...
    You've hit kubia-flg8w
    
    
    

      


    使用 ingress 暴露多个服务

    kubia-ingress.yaml文件中可以看到,rulespaths都是数组,所以我们可以通过其暴露多个服务,如下:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: kubia
    spec:
      rules:
      - host: foo.example.com
        http:
          paths:
            # 通过指定不同的路径来访问不同的服务
          - path: /foo
            backend:
              serviceName: foo-svc
              servicePort: 8080
          - path: /bar
            backend:
              serviceName: bar-svc
              servicePort: 8080
      # 也可以通过指定多个 host 来配置不同的主机
      - host: foo.example.com
        http:
          paths:
          - path: /kubia
            backend:
              serviceName: kubia
              servicePort: 8080
    

      

    但是哪怕在一个文件中可以配置多个规则,但是依旧推荐为每一个svc都创建一个自己专属的ingress,这样条理会比较清晰,也方便日后的管理

  • 相关阅读:
    第9章 线程编程(7)_线程同步4:信号量
    第9章 线程编程(6)_线程同步3:条件变量
    第9章 线程编程(5)_线程同步2:读写锁
    第9章 线程编程(4)_线程同步1:互斥锁
    第9章 线程编程(3)_线程清理和控制函数
    第9章 线程编程(2)_线程创建和终止
    第9章 线程编程(1)_线程概念和线程标识
    第8章 信号(6)_贯穿案例2:mini shell(3)
    第8章 信号(5)_信号集和信号屏蔽
    第8章 信号(4)_中断的系统调用和函数可重入性
  • 原文地址:https://www.cnblogs.com/chaojiyingxiong/p/15973220.html
Copyright © 2020-2023  润新知