了解 kubernetes 中的服务?
Understanding services in kubernetes?
我正在学习 here
中的 k8s 服务
我创建了没有选择器但只有一个端点的服务。我想做的是我已经安装了 apache 并且它在端口 80 上是 运行。我在端口 31000 上创建了一个节点端口服务。现在这个服务应该重定向 ip:31000 到 ip:80 端口.
它是针对服务的内部 ip 而不是外部 ip。
我的-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 9376
targetPort: 80
nodePort: 31000
type: NodePort
我的-endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: <IP>
ports:
- port: 80
kubectl get service -o wide的输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 53m <none>
my-service NodePort 10.111.205.207 <none> 9376:31000/TCP 30m <none>
有多种服务可以为您提供不同级别的访问权限:
ClusterIP - 可以从另一个 pod 访问服务(仅在 Kubernetes 集群内)
NodePort - 可以从另一个 pod 访问服务,并从它是 运行 Kubernetes 集群的机器
LoadBalancer - 可以从 Kubernetes 集群外部访问服务(使用外部 IP)
LoadBalancers 在您拥有 TCP 级连接时非常有用。如果你有更高级别的连接 ( http ) 你也可以使用 Ingress + NodePort.
首先,您需要 运行 集群中的一个 pod,然后在 Endpoints yaml 中分配该 pod 的 ip 和端口,因为服务将 pods 公开到集群内部或外部集群,我们必须使用选择器或 pod 的地址,以便服务可以将其自身附加到特定的 pod。
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: <ip address of the pod>
ports:
- port: <port of the pod>
还有一件事是使用 Statefulset 代替部署到 运行 pods。
服务的用途是在所有不同的 pods 之间建立通信,或者从集群外部访问 pod。
因此,您创建的每个 pod 或每个部署总是会有某种匹配服务。有几种不同的服务。
1. Cluster IP:设置一个好记的URL来访问一个pod。仅在集群中公开 pods。因此,您可以随时使用集群 IP 服务,以便在集群内部的不同 pods 之间建立通信。
例如:事件总线-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: event-bus-depl
spec:
replicas: 1
selector:
matchLabels:
app: event-bus
template:
metadata:
labels:
app: event-bus
spec:
containers:
- name: event-bus
image: lordrafiq/event-bus:latest
---
apiVersion: v1
kind: Service
metadata:
name: event-bus-srv
spec:
selector:
app: event-bus
type: ClusterIP
ports:
- name: event-bus
protocol: TCP
port: 4005
targetPort: 4005
因此,从任何要与事件总线通信的 pod 内部,您可以在端口 4005 上使用 event-bus-srv。
await axios.post('http://event-bus-srv:4005/events', {});
2。节点端口: 使 pod 可以从集群外部访问(通常仅用于开发目的)。因此,节点端口可用于您想要从集群外部访问 pod 的任何时间,但它仅用于开发目的,负载均衡器是从集群访问 pod 的正确方法。
apiVersion: v1
kind: Service
metadata:
name: posts-srv
spec:
type: NodePort
selector:
app: posts
ports:
- name: posts
protocol: TCP
port: 4000
targetPort: 4000
http://192.168.39.234:31154/posts
31154是我们创建节点端口服务后得到的nodePort
3。负载均衡器: 使 pod 可从集群外部访问。这才是将pod暴露给外界的正确方式。
4.外部名称: 将集群内请求重定向到 CNAME url。
我正在学习 here
中的 k8s 服务我创建了没有选择器但只有一个端点的服务。我想做的是我已经安装了 apache 并且它在端口 80 上是 运行。我在端口 31000 上创建了一个节点端口服务。现在这个服务应该重定向 ip:31000 到 ip:80 端口.
它是针对服务的内部 ip 而不是外部 ip。
我的-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 9376
targetPort: 80
nodePort: 31000
type: NodePort
我的-endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: <IP>
ports:
- port: 80
kubectl get service -o wide的输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 53m <none>
my-service NodePort 10.111.205.207 <none> 9376:31000/TCP 30m <none>
有多种服务可以为您提供不同级别的访问权限:
ClusterIP - 可以从另一个 pod 访问服务(仅在 Kubernetes 集群内)
NodePort - 可以从另一个 pod 访问服务,并从它是 运行 Kubernetes 集群的机器
LoadBalancer - 可以从 Kubernetes 集群外部访问服务(使用外部 IP)
LoadBalancers 在您拥有 TCP 级连接时非常有用。如果你有更高级别的连接 ( http ) 你也可以使用 Ingress + NodePort.
首先,您需要 运行 集群中的一个 pod,然后在 Endpoints yaml 中分配该 pod 的 ip 和端口,因为服务将 pods 公开到集群内部或外部集群,我们必须使用选择器或 pod 的地址,以便服务可以将其自身附加到特定的 pod。
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: <ip address of the pod>
ports:
- port: <port of the pod>
还有一件事是使用 Statefulset 代替部署到 运行 pods。
服务的用途是在所有不同的 pods 之间建立通信,或者从集群外部访问 pod。
因此,您创建的每个 pod 或每个部署总是会有某种匹配服务。有几种不同的服务。
1. Cluster IP:设置一个好记的URL来访问一个pod。仅在集群中公开 pods。因此,您可以随时使用集群 IP 服务,以便在集群内部的不同 pods 之间建立通信。
例如:事件总线-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: event-bus-depl
spec:
replicas: 1
selector:
matchLabels:
app: event-bus
template:
metadata:
labels:
app: event-bus
spec:
containers:
- name: event-bus
image: lordrafiq/event-bus:latest
---
apiVersion: v1
kind: Service
metadata:
name: event-bus-srv
spec:
selector:
app: event-bus
type: ClusterIP
ports:
- name: event-bus
protocol: TCP
port: 4005
targetPort: 4005
因此,从任何要与事件总线通信的 pod 内部,您可以在端口 4005 上使用 event-bus-srv。
await axios.post('http://event-bus-srv:4005/events', {});
2。节点端口: 使 pod 可以从集群外部访问(通常仅用于开发目的)。因此,节点端口可用于您想要从集群外部访问 pod 的任何时间,但它仅用于开发目的,负载均衡器是从集群访问 pod 的正确方法。
apiVersion: v1
kind: Service
metadata:
name: posts-srv
spec:
type: NodePort
selector:
app: posts
ports:
- name: posts
protocol: TCP
port: 4000
targetPort: 4000
http://192.168.39.234:31154/posts
31154是我们创建节点端口服务后得到的nodePort
3。负载均衡器: 使 pod 可从集群外部访问。这才是将pod暴露给外界的正确方式。
4.外部名称: 将集群内请求重定向到 CNAME url。