阿里云kubernets使用记录5-内网访问

1、我们还有一些内部项目,如果也想访问kubernets里的服务怎么办呢?

上节中我们谈到svc直接的访问,直接使用svc的名字就可以了。那么外部的ecs访问肯定是不行的,如果是走公网就比较简单了,直接走ingress域名解析就行了。

内网的话,我们也可以通过ingress来处理,例如我们在kubernets里面建立了一个elasticsearch的项目,它对外暴露端口是9200,这种不管是kubertnets里面,还是ecs内部,都是要走内部流量的。

上节我们说过了kubernets内部的访问方式,这里说一下ecs如果想访问的话,怎么来处理

1、我们先处理下内网的slb

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx-controller
  namespace: kube-system  # 修改为 kube-system 命名空间
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"  # 只分配内网 IP
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: 80
    - name: https
      port: 443
      targetPort: 443
  selector:
    app.kubernetes.io/name: ack-ingress-nginx-v1
    app.kubernetes.io/component: controller

这个文件执行,我们的负载均衡中就会自动增加一个只有内网的记录,会有一个内网的ip,我们后面有用

2、我们新建一个elasticsearch-ingress.yaml文件,内容如下

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: elasticsearch-ingress
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: ack-nginx
  rules:
    - host: elasticsearch.xxx.com  # 公网访问
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: elasticsearch
                port:
                  number: 9200
    - host: elasticsearch.myservices.internal #私网访问
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: elasticsearch
                port:
                  number: 9200

这里我们定义了2个规则,第一个外网访问的,需要解析,这个可有可无,根据需要,上线也是要删除的,这个主要是方便测试。

主要是第二个,后面的明显不是域名,这是属于我们自己定义的,可以自由填写。

我们执行后,就会生成对应的ingress

3、执行后,到ecs里,直接访问curl elasticsearch.myservices.internal是访问不通的

是因为我们还没有解析,这里有2个方法,第一个就是修改 /etc/hosts,添加上 第一步的内网ip 空格 elasticsearch.myservices.internal,就可以访问了。

如果我们有多台ecs,这样操作就很麻烦,并且容易新增ecs的时候遗漏,我们可以使用阿里云的内网解析,在云解析的服务里,我们可以找到,添加权威域名myservices.internal,确定vpc后,就可以添加记录了,我们添加记录elasticsearch到第一步的ip后,这样的话,我们在该vpc下的所有的ecs,在访问elasticsearch.myservices.internal的时候,就会自动指向第一步的ip了

ps:如果想从kubernets里访问ecs的服务

一般来说直接访问ecs的内网地址+端口号就可以了,但是ecs的安全组一般和kubernets不一样,我们需要找到ecs的安全组,去开放对应的端口到172.16.0.0/12就可以了

补充:

最近碰到了一个业务,需要从ecs访问k8s里的服务,本来按照上面的ingress里的内网解析就可以了,但是这个默认只支持http服务,我们新的需求,需要访问tcp服务,如果继续按照上面的方法,结果就是HTTP/1.1 400 Bad Request,简而言之

stream_socket_client -> 原生 TCP 协议
Ingress -> HTTP(不是 TCP)协议

这里我们只能使用NodePort的方案了,我们来修改service文件

apiVersion: v1
kind: Service
metadata:
  name: dt-catering
  namespace: default
spec:
  selector:
    app: dt-catering
  ports:
    - name: api
      port: 80
      targetPort: 8787
      protocol: TCP
    - name: internal
      port: 9512
      targetPort: 9512
      protocol: TCP
      nodePort: 31512  # 可以手动指定端口(范围通常是 30000-32767)
  type: NodePort

apply后,我们就在k8s里对外暴露了31512的端口,指向的是dt-catering的9512端口,然后我们在项目中配置的地址里,写上集群内任意的node的内网ip+31512端口,就可以访问了,这里我们最好选择稳定的node

文章作者: Wind
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 雕刻时光
喜欢就支持一下吧