k8s-service、endpoints、pod之间是怎么进行网络互通的
1、service
在K8S中,Service是一种抽象,定义了一组Pod的逻辑集合和访问这些Pod的策略。首先,我们需要创建一个Service,并指定该Service的selector来确定要选中的Pod。
k8s集群也会为service分配个cidr,每个service都有对应的IP。
查看service。
bash
kubectl get svc
bash
[root@k8s-node2 k8s]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 33h
nginx NodePort 10.102.104.249 <none> 80:30940/TCP 5h20m
查看指定service详情。
bash
kubectl describe svc nginx
bash
[root@k8s-node2 k8s]# kubectl describe svc nginx
Name: nginx
Namespace: default
Labels: app=nginx
Annotations: <none>
Selector: app=nginx
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.102.104.249
IPs: 10.102.104.249
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30940/TCP
Endpoints: 10.244.169.129:80,10.244.36.65:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
2、endpoints
Endpoints是将Service与其后端Pod关联的方式。我们需要在创建Service后,自动创建与Service相关的Endpoints。
查看ep,可以发现,nginx 对应的endpoints是pod的ip地址和端口, 也就是访问nginx的service时,会自动映射到pod上
bash
[root@k8s-node2 k8s]# kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.8.132:6443 33h
nginx 10.244.169.129:80,10.244.36.65:80 5h22m
3、service、endpoints、pod通信图
盗用的大佬的,哈哈
4、不同服务pod内部间访问
比如,部署了nginx和mysql。 从nginx的pod要去访问mysql,直接可以访问mysql的service的name去访问。
演示,服务间通信,我是用busybox的pod去访问nginx。
bash
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
purpose: demonstrate-busybox
spec:
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"
resources:
limits:
memory: "128Mi"
cpu: "500m"
bash
kubectl apply -f busybox.yaml
进入busybox容器
bash
kubectl exec -it busybox -- sh
虽然service有IP,但是一般都是通过nginx的service的name访问nginx服务的
bash
wget http://nginx
访问成功
注意:不同pod服务之间可以跨命名空间去访问的,访问格式,service的name.命名空间name,nginx放到默认命名空间default里的。
bash
wget http://nginx.default