美文网首页
使用ingress-nginx访问k8s内服务

使用ingress-nginx访问k8s内服务

作者: bin_x | 来源:发表于2020-09-09 09:35 被阅读0次

在撘完kubernetes后,外部流量无法访问内部的服务。目前阿里云无法使用LoadBalancer模式,所以通过ingress-nginx进行流量的转发。

安装ingress-nginx

进入master节点,下载配置文件(需要翻墙):
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml

对外开放的时候需要固定node上的端口,所以修改deploy.yaml。
找到 Source: ingress-nginx/templates/controller-service.yaml
在ports上添加nodePort,对应的值就是node节点开放给外部使用的端口。
这里http端口设置为31234,https端口设置为31235。如下图:

deploy.yaml

另外,由于国内使用,无法访问k8s.gcr.io下的镜像,所以,我将该镜像下载后重新传到aliyun的镜像服务中:

继续编辑deploy.yaml,找到 # Source: ingress-nginx/templates/controller-deployment.yaml
找到下面对应的镜像文件:us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.34.1@sha256:0e072dddd1f7f8fc8909a2ca6f65e76c5f0d2fcfb8be47935ae3457e8bbceb20
替换为:registry.cn-hangzhou.aliyuncs.com/bin_x/nginx-ingress:v0.34.1@sha256:80359bdf124d49264fabf136d2aecadac729b54f16618162194356d3c78ce2fe

deploy.yaml
$ kubectl apply -f deploy.yaml

之后系统会自动进行安装配置。可以通过如下命令检查是否安装成功:

$ kubectl get pods -n ingress-nginx \
  -l app.kubernetes.io/name=ingress-nginx --watch

等到出现如下提示,说明安装成功

NAME                                        READY   STATUS      RESTARTS  
ingress-nginx-admission-create-fh95h        0/1     Completed   0         
ingress-nginx-admission-patch-d95c5         0/1     Completed   0         
ingress-nginx-controller-55497dff78-ld6cf   1/1     Running     0         

输入如下命令,检查配置是否生效

$ kubectl -n ingress-nginx get svc
NAME                                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      
ingress-nginx-controller             NodePort    10.10.10.187   <none>        80:31234/TCP,443:31235/TCP  
ingress-nginx-controller-admission   ClusterIP   10.10.77.102   <none>        443/TCP                     

看到以上两条信息说明配置已经生效,且对应的80和443端口已经绑到31234和31235端口上。

接下来讲如何将对应的流量转发到k8s的服务上
首先创建一个文件,ingress-nginx-service.yml。内如如下:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations:
    # use the shared ingress-nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: myservicea.foo.org
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-service
          servicePort: 80

以上文件创建了一个Ingress的规则,将myservicea.foo.org域名对应的http请求,转发到nginx-service服务上。服务端口为80.

接下来,创建对应的Deployment和Service,文件名nginx.yml,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80

该文件创建一个Deployment,该Deployment创建一个使用nginx镜像的容器,容器端口为80。接着创建对应的Service来开放端口。

注意,Service的name及port必须和 Ingress的serviceName和servicePort一致

执行:

$ kubectl apply -f ingress-nginx-service.yml
$ kubectl apply -f nginx.yml

查看Ingress

$ kubectl describe Ingress ingress-nginx
Name:             ingress-nginx
Namespace:        default
Address:          xxx.xxx.xxx.xxx
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host                Path  Backends
  ----                ----  --------
  myservicea.foo.org
                      /   nginx-service:80 (192.168.3.65:80)
Annotations:          nginx.ingress.kubernetes.io/rewrite-target: /
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  CREATE  45m                nginx-ingress-controller  Ingress default/ingress-nginx

看到上面Rules对应的规则,其中有一条nginx-service:80 (192.168.3.65:80) 。这个是服务nginx-service创建的,可以在master节点上通过curl测试服务是否正常

$ curl 192.168.3.65:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

接下来,本地测试,可以修改hosts,将myservicea.foo.org域名指向其中一个node节点。然后在浏览器中输入http://myservicea.foo.org:31234/ 。看到如下图说明配置都正常了。

nginx

目前还剩两个问题:
1、服务使用的端口不是80的,所以需要手动加上端口。
2、该方式只能指向其中一个节点,无法访问其他node。

可以通过添加负载均衡服务器解决以上两个问题,负载均衡配置不在此讨论,可以直接使用阿里云的,也可以自己使用nginx进行配置。

参考文章:
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
https://kubernetes.github.io/ingress-nginx/deploy/

相关文章

网友评论

      本文标题:使用ingress-nginx访问k8s内服务

      本文链接:https://www.haomeiwen.com/subject/qfjjektx.html