使用 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,这样条理会比较清晰,也方便日后的管理

posted @ 2022-03-06 20:04  年轻人——001  阅读(394)  评论(0)    收藏  举报