使用ingress-nginx访问k8s内服务

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342