12

使用ingress-nginx访问k8s内服务

 3 years ago
source link: https://www.jianshu.com/p/46dd82cb4d68
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

使用ingress-nginx访问k8s内服务

0.0772020.09.09 01:35:49字数 807阅读 2,009

在撘完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/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK