kubernetes通过service访问pod

一、service访问pod

        每个pod都会有自己的ip地址,当controller用新的pod代替发生故障的pod时,新的pod会分配到新的IP地址

       service有自己的ip,而且这个ip是不变的。客户端只需要访问service的ip kubernetes则负责建立和维护service与pod的映射关系,无论后端pod如何变化,对客户端不会有任何影响,因为service没有变。

       1.案例:

mkdir myservice
cp webyml/web.yml myservice/service.yml

vim service.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: httpd
  name: httpd
spec:
  replicas: 3
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - image: httpd
        name: httpd
        ports:
         - containerPort: 80                          

 验证结果:

2. 创建service

apiVersion: v1
kind: Service
metadata:
   name: httpd-svc
spec:
   selector:
     run: httpd
   ports:
   - protocol: TCP
     port: 8080
     targetPort: 80

1.v1是service的apiversion
2.指明了当前资源类型为service。
3.service的名字为httpd-svc
4.selector指明挑选哪些label为run:httpd的pod作为service的后端
5.将service的8080端口映射到pod的80端口,使用TCP协议。

 验证结果:

通过kubectl describe可以查看httpd-svc与pod的对应关系。

二、dns访问service

       在cluster中,除了可以通过cluster ip 访问service,kubemetes还提供了更方便的dns访问

       kubeadm部署时会默认安装coredns组件

 kubectl get deployments.apps --namespace=kube-system

   

coredns是一个dns服务器,每当有新的service被创建,coredns会添加该service的记录 cluster中的pod可以通过《service_name》《namespace_name》访问service

kubectl run -it --rm busybox --image=busybox:1.28 sh

三、外网如何访问service

      除了cluster内部可以访问service,很多情况我们也希望应用的service能够暴露给cluster外部

      kubernetes提供了多种类型的service,默认是clusterIP

       

        1.案例:

              修改service httpd-svc的配置文件:

vim http-svc

apiVersion: v1
kind: Service
metadata:
   name: httpd-svc
spec:
   type: NodePort
   selector:
     run: httpd
   ports:
   - protocol: TCP
     port: 8080
     targetPort: 80

添加type:NodePort,重新创建httpd-svc

kubectl apply -f http-svc.yml

  

 kubernetes 依然会为httpd-svc分配一个clusterIP,不同的是:

        1.EXTERNAL-IP 为nodes,表示可通过cluster每个节点自身的ip访问service

        2.PORT(S) 8080:32312。8080是clusterIP监听的端口,32312则是节点上监听的端口。kubermetes会从30000-32767中分配一个可用的端口,每个节点都会监听此端口并请求转发给service。

          

         通过三个节点ip+30904端口都能够访问httpd-svc

        其作用就是负载均衡到每一个pod

       2. 案例:

              nodePort默认的是随机选择,不过我们可以用nodePort指定某个特定端口。

vim myservice/http-svc.yml

apiVersion: v1
kind: Service
metadata:
   name: httpd-svc
spec:
   type: NodePort
   selector:
     run: httpd
   ports:
   - protocol: TCP
     nodePort: 30000
     port: 8080
     targetPort: 80

         现在配置文件中就有三个Port了:

            nodePort是节点上监听的端口。

            port是clusterip上监听的端口。

            targetPort是Pod监听的端口。

     最终,Node和ClusterIP在各自端口上接收到的请求都会通过iptables转发到pod的targetPort

   验证:

          

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值