linux运维、架构之路-K8s通过Service访问Pod

一、通过Service访问Pod

         每个Pod都有自己的IP地址,当Controller用新的Pod替换发生故障的Pod时,新Pod会分配到新的IP地址,例如:有一组Pod对外提供HTTP服务,它们的IP很可能发生变化,那么客户端如何找到并访问这个服务呢,Service由此而生。Service从逻辑上代表了一组Pod,具体是哪些则由label来挑选,Service有自己的IP,并且这个IP是不变的,客户端只需要访问Service IP,无论后端Pod如何变化,对客户端访问不会有任何影响,k8s负责建立和维护Service与Pod映射关系。

1、创建Service

①创建示例文件

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: httpd     #Service将会用这个label来挑选Pod
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80

②创建一个Httpd的Deployment应用

[root@k8s-node1 ~]# kubectl apply -f httpd.yaml 
deployment.extensions "httpd" created

[root@k8s-node1 ~]# kubectl get pod -o wide
NAME                    READY     STATUS    RESTARTS   AGE       IP            NODE
httpd-fcdb8b4d8-bzsq8   1/1       Running   0          2m        10.2.72.180   192.168.56.12
httpd-fcdb8b4d8-k5ds9   1/1       Running   0          2m        10.2.72.182   192.168.56.12
httpd-fcdb8b4d8-ks4qq   1/1       Running   0          2m        10.2.72.181   192.168.56.12

上图Pod分配了各自的IP,这些IP只能被k8s集群中的容器和节点访问

[root@k8s-node2 ~]# curl 10.2.72.180
<html><body><h1>It works!</h1></body></html>

③创建Service文件

apiVersion: v1      #Service的apiVersion
kind: Service       #资源类型
metadata:
  name: httpd-svc   #Service的名字
spec:
  selector: 
    app: httpd      #标签选择,挑选哪些label为app: httpd的Pod作为Service的后端
  ports:
  - protocol: TCP   #将Service的8080端口映射到Pod的80端口,使用TCP协议
    port: 8080
    targetPort: 80

④创建Service并查看

[root@k8s-node1 ~]# kubectl apply -f httpd-svc.yaml 
service "httpd-svc" created

[root@k8s-node1 ~]# kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
httpd-svc    ClusterIP   10.1.168.37   <none>        8080/TCP   7s
kubernetes   ClusterIP   10.1.0.1      <none>        443/TCP    8d

httpd-svc分配到一个集群IP,可以通过该IP访问后端的Pod

[root@k8s-node2 ~]# curl 10.1.168.37:8080
<html><body><h1>It works!</h1></body></html>

⑤查看httpd-svc和Pod的对应关系

[root@k8s-node1 ~]# kubectl describe service httpd-svc 
Name:              httpd-svc
Namespace:         default
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"httpd-svc","namespace":"default"},"spec":{"ports":[{"port":8080,"protocol":"TC...
Selector:          app=httpd
Type:              ClusterIP
IP:                10.1.168.37
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.2.72.180:80,10.2.72.181:80,10.2.72.182:80
Session Affinity:  None
Events:            <none>

Service的Cluster IP是通过iptables映射到Pod中

猜你喜欢

转载自www.cnblogs.com/yanxinjiang/p/12030758.html