当我们使用deployment或者RS创建了一些pod时,比如创建了一个nginx的pod,该pod中有三个replicas,此时,如果我们查看pod状态大概是这个样子的

nginx-deploy.yaml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-app
name: nginxapp
spec:
selector:
matchLabels:
app: nginx-app
replicas: 3
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- image: nginx
name: nginxapp
ports:
- containerPort: 80

我们创建并查看pod情况

1
2
3
4
5
6
7
8
#kubectl apply -f nginx-deploy.yaml
deployment.apps/nginxapp created

#kubectl get pod
NAME READY STATUS RESTARTS AGE
nginxapp-59946895d9-gt4xw 1/1 Running 0 20s
nginxapp-59946895d9-ld2dt 1/1 Running 0 49s
nginxapp-59946895d9-v2cd7 1/1 Running 0 20s

使用 -o wide 参数查看看加详细的内容

1
2
3
4
5
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginxapp-59946895d9-gt4xw 1/1 Running 0 2m18s 10.1.0.58 docker-desktop <none> <none>
nginxapp-59946895d9-ld2dt 1/1 Running 0 2m47s 10.1.0.56 docker-desktop <none> <none>
nginxapp-59946895d9-v2cd7 1/1 Running 0 2m18s 10.1.0.57 docker-desktop <none> <none>

可以看到它们分别被创建在了 10.1.0.56,10.1.0.57,10.1.0.58上,但是使用浏览器访问这三个地址,并不会得到响应,如果想要访问到创建的nginx pod,还需要再创建与之对应的service.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Service
metadata:
labels:
app: nginxlabelser
name: nginxlabelser
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx-app
type: NodePort

它使用的type是NodePort,

1
2
3
4
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d8h
nginxlabelser NodePort 10.105.36.53 <none> 80:31844/TCP 90s

Service 目前有 4 种类型:

  • ClusterIP: 是 K8S 当前默认的 Service 类型。将 service 暴露于一个仅集群内可访问的虚拟 IP 上。
  • NodePort: 是通过在集群内所有 Node 上都绑定固定端口的方式将服务暴露出来,这样便可以通过 : 访问服务了。
  • LoadBalancer: 是通过 Cloud Provider 创建一个外部的负载均衡器,将服务暴露出来,并且会自动创建外部负载均衡器路由请求所需的 NodeportClusterIP
  • ExternalName: 是通过将服务由 DNS CNAME 的方式转发到指定的域名上将服务暴露出来,这需要 kube-dns 1.7 或更高版本支持。

如果使用了NodePort的话,则可以通过node:port 的方式访问到,此时我们通过http://127.0.0.1:31844 则可以正常的访问。