阿里云kubernets使用记录5-内网访问
阿里云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