在mac上配置k8s 集群让service通过clusterIp进行内网访问

在mac上配置k8s 集群让service通过clusterIp进行内网访问,第1张

目录

环境准备

mac本机设置通过ip访问自身k8s service

brew安装docker-connector

配置brew的docker-connector

映射本机网络到docker容器

内网中其他机器通过ip访问这个k8s service

配置内网中的dns解析

安装dnsmasq

开放k8s CoreDns 

配置dnsmasq

参考资料


期待效果:我们在 default 命名空间创建一个nginx的deployment,对应service名称是 nginx-service 80端口开放clusterIp访问,期待内网中其他机器(不一定在集群中)输入 http://nginx-service.default.svc.cluster.local/ 能访问到nginx服务

环境准备

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s.kuboard.cn/layer: web
    k8s.kuboard.cn/name: nginx
  name: nginx
spec:
  selector:
    matchLabels:
      k8s.kuboard.cn/layer: web
      k8s.kuboard.cn/name: nginx
  template:
    metadata:
      labels:
        k8s.kuboard.cn/layer: web
        k8s.kuboard.cn/name: nginx
    spec:
      containers:
        - image: 'nginx:alpine'
          name: nginx
          ports:
            - containerPort: 80
              name: http
              protocol: TCP

nginx-service.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    k8s.kuboard.cn/name: nginx
  type: ClusterIP

执行成功后效果如下:


 为了达到  内网中其他机器(不一定在集群中)输入 http://nginx-service.default.svc.cluster.local/ 能访问到nginx服务,需要满足3个条件

  1. 内网中所有机器的dns解析 nginx-service.default.svc.cluster.local 时能够拿到 10.103.15.56 这个ip
  2. k8s集群中的机器访问 10.103.15.56 这个ip能够看到nginx的页面
  3. 内网中非集群的机器访问 10.103.15.56 这个ip能够看到nginx的页面

经过测试,如果k8s集群是linux的,第二个条件 “k8s集群中的机器访问 10.103.15.56 这个ip能够看到nginx的页面” 是可行的,如果你的情况属于这一种,可以直接跳过下一步,然而我的是k8s是mac的docker搭建的,自己电脑访问这个ip是无法访问的。 

mac本机设置通过ip访问自身k8s service brew安装docker-connector

安装命令如下:

brew install wenjunxiao/brew/docker-connector
配置brew的docker-connector

希望暴露k8s的 10.103.0.0/16 这个ip段给本机访问,于是 `vim /usr/local/etc/docker-connector.conf` 增加一行配置

route 10.103.0.0/16 expose
expose 0.0.0.0:2512 #开放端口给其他机器访问
token user1 192.168.31.103 #配置机器的token
映射本机网络到docker容器

一条命令映射docker-connector到docker容器

docker run -it -d --restart always \
--net host --cap-add NET_ADMIN \
--name connector wenjunxiao/mac-docker-connector

至此,本机可以通过ip访问k8s的这个clusterIP的service了,附上效果图

其他机器如果想要访问你本地容器需要安装docker-accessor

brew install wenjunxiao/brew/docker-accessor

安装完成之后,需要从容器提供者获取地址和token之后使用sudo运行

sudo docker-accessor -remote 192.168.31.17:2512 -token user1
内网中其他机器通过ip访问这个k8s service

为了让内网中的其他机器输入 10.103.15.56 这个ip也能够访问这个nginx,需要让这个ip的流量自动转发到那台k8s机器上,也就是让这台k8s机器成为 10.103.0.0/16 这个网段流量的中转机器。实现方式有两种:

1. 通过路由器设置ip段转发

2. 在每台电脑上通过route命令配置ip段的流量转发

这里使用第二种方法,linux机器上的命令为

sudo route add -net 10.103.0.0 netmask 255.255.0.0 gw 192.168.31.17
配置内网中的dns解析 安装dnsmasq

内网dns软件首选dnsmasq,mac安装命令是

brew install dnsmasq
开放k8s CoreDns 

coredns-service.yaml,coredns 的 udp 53端口映射到节点上的 32192 端口

---
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/port: '9153'
    prometheus.io/scrape: 'true'
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: CoreDNS
  name: kube-dns
  namespace: kube-system
spec:
  ports:
    - name: dns
      nodePort: 32192
      port: 53
      protocol: UDP
      targetPort: 53
    - name: dns-tcp
      nodePort: 32192
      port: 53
      protocol: TCP
      targetPort: 53
    - name: metrics
      nodePort: 31144
      port: 9153
      protocol: TCP
      targetPort: 9153
  selector:
    k8s-app: kube-dns
  type: NodePort
配置dnsmasq

mac上的路径为 /usr/local/etc/dnsmasq.conf,linux上的路径为 /etc/dnsmasq.conf,增加如下配置,指定k8s service的域名dns走本机的 32192 这个端口查询ip :

server=/svc.cluster.local/127.0.0.1#32192

配置完成后重启dnsmasq,mac命令是

sudo brew services start dnsmasq

linux命令是

sudo systemctl restart dnsmasq

最后设置电脑的dns服务器地址是 内网dns服务器的地址,方法省略,企业里通常是在路由器上设置dns地址。最后看看效果吧

参考资料

mac/windows docker容器ip开放给宿主机 https://blog.csdn.net/adparking/article/details/114026613

dnsmasq安装使用教程 https://xdhuxc.github.io/posts/common/dns/dns-dnsmasq/ 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/796117.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存