kubernetes中的服务类型
当我们使用deployment或者RS创建了一些pod时,比如创建了一个nginx的pod,该pod中有三个replicas,此时,如果我们查看pod状态大概是这个样子的
nginx-deploy.yaml 文件
| 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情况
| #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 参数查看看加详细的内容
| 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.
| 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,
| 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
创建一个外部的负载均衡器,将服务暴露出来,并且会自动创建外部负载均衡器路由请求所需的 Nodeport
或 ClusterIP
。
ExternalName
: 是通过将服务由 DNS CNAME 的方式转发到指定的域名上将服务暴露出来,这需要 kube-dns
1.7 或更高版本支持。
如果使用了NodePort的话,则可以通过node:port 的方式访问到,此时我们通过http://127.0.0.1:31844 则可以正常的访问。