一,使用 ingress 创建对外服务
使用 ingress 暴露服务需要先新建一个svc
,所以我们先使用如下内容创建一个,它会把 pod kubia
端口8080
上的服务转发到自己的8080
上kubia-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 支持创建HTTP
和HTTPS
的服务,接下来我们先来创建一个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
列就可以找到对应的 ipkubectl 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 控制器之间的连接是加密的,而控制器与后端svc
及pod
之间的连接则还是 http,如下所示:
想要让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.cert
和tls.key
。因为这种秘钥比较敏感,不适合直接挂载到 pod 上,所以可以使用 k8s 提供的专门用于提供敏感数据的资源secret
来存放它,我们先来新建一个名为tls-secret
的secret
资源:
然后我们就可以修改上文中的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
服务提升至https
,kubectl apply
依靠kind
及metadata
字段中的数据来寻找要修改的资源,所以改名字并不会造成什么影响:
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
文件中可以看到,rules
和paths
都是数组,所以我们可以通过其暴露多个服务,如下:
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
,这样条理会比较清晰,也方便日后的管理