再下面这种情况下
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: app
image: harryhare/testapp:test
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: app-service
labels:
name: app-service
spec:
type: LoadBalancer
ports:
- name: http
port: 81
protocol: TCP
targetPort: 80
selector:
app: web
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
app-74fdb9975c-bk6mb 1/1 Running 0 7m32s 172.16.0.5 10.0.2.8 <none> <none>
app-74fdb9975c-vrlzc 1/1 Running 0 7m32s 172.16.0.4 10.0.2.8 <none> <none>
$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
app-service LoadBalancer 172.16.254.121 106.54.143.7 81:32475/TCP 7m19s app=web
kubernetes ClusterIP 172.16.252.1 <none> 443/TCP 93m <none>
在创建集群时,ip分配:
- node 10.0.0.0/8
- pod 和 service 共享 172.16.0.0/16
- 我们从结果可以看到 pods 从地地址开始分配,services 从高地址分配
可访问地址:
name | ip | port | desc | 可访问 |
---|---|---|---|---|
external ip | 106.54.143.7 | 81 | 云服务 load balancer 的 外网ip | 网外/node/pod |
cluster ip | 172.16.254.121 | 81 | kubernate cluster ip | node/pod |
cluster name | app-service | 81 | service name, 解析到172.16.254.121 | pod |
pod ip | 172.16.0.4/ 172.16.0.5 | 80 | pod 通过docker 暴露的ip | node/pod |
node ip | 当前node 的 ip | 32475 | 如果登录到那个node上则就是localhost | node/pod |
在使用node ip 时,也并不是 当前在哪个ip 就访问哪个ip的pod,而是被分配过
即使当前node没有pods,访问端口32475也是有数据的
name | port | desc |
---|---|---|
port | 81 | service 的 port, cluster ip 或者 loadbalancer 使用的端口 |
node port | 32475 | 也可以指定,如果不指定,则会随机在一个范围中分配 |
target port | 80 | docker 容器 暴露的端口 |