[英]Messaging vs RPC in a distributed system (Openstack vs K8s/Swarm)
[英]Testing locally k8s distributed system
我是 k8s 的新手,我正在尝试构建一个分布式系统。 这个想法是为每个用户生成一个有状态的 pod。
主要服务是两个 Python 应用程序MothershipService
和Ship
。 MothershipService 的目的是跟踪每个用户的 ship、进行健康检查等Ship
正在运行一些(不受信任的)用户代码。
MothershipService Ship-user1
| | ---------- | |---vol1
|..............| -----. |--------|
\
\ Ship-user2
'- | |---vol2
|--------|
我可以很好地安排船舶服务
> kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/ship-0 1/1 Running 0 7d 10.244.0.91 minikube <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/ship ClusterIP None <none> 8000/TCP 7d app=ship
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d <none>
NAME READY AGE CONTAINERS IMAGES
statefulset.apps/ship 1/1 7d ship ship
我的问题是如何通过curl
或浏览器进行测试? 这些都是后端服务,因此NodePort
似乎不是正确的方法,因为公众不应访问这些服务。 最终我将为所有这些构建一个测试套件并部署在 GKE 上。
ship.yml(伪规范)
kind: Service
metadata:
name: ship
spec:
ports:
- port: 8000
name: ship
clusterIP: None # headless service
..
---
kind: StatefulSet
metadata:
name: ship
spec:
serviceName: "ship"
replicas: 1
template:
spec:
containers:
- name: ship
image: ship
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
name: ship
..
一种可能是使用kubectl port-forward
命令在系统本地公开 pod 端口。 例如,如果我使用此部署运行一个简单的 Web 服务器,监听端口 8000:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: example
name: example
spec:
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- args:
- --port
- "8000"
image: docker.io/alpinelinux/darkhttpd
name: web
ports:
- containerPort: 8000
name: http
我可以通过运行在我的本地系统上公开它:
kubectl port-forward deploy/example 8000:8000
只要port-forward
命令在运行,我就可以将我的浏览器(或curl
)指向http://localhost:8000
以访问该服务。
或者,我可以使用kubectl exec
在 pod 中运行命令(如curl
或wget
):
kubectl exec -it web -- wget -O- http://127.0.0.1:8000
关于如何创建公开外部 IP 地址的 Kubernetes 服务对象的示例过程:
**为在五个 pod 中运行的应用程序创建服务:**
在您的集群中运行 Hello World 应用程序:
kubectl run hello-world --replicas=5 --labels="run=load-balancer-example" --image=gcr.io/google-samples/node-hello:1.0 --port=8080
前面的命令创建一个 Deployment 对象和一个关联的 ReplicaSet 对象。 ReplicaSet 有五个 Pod,每个 Pod 都运行 Hello World 应用程序。
显示有关 Deployment 的信息:
kubectl get deployments hello-world
kubectl describe deployments hello-world
显示有关您的 ReplicaSet 对象的信息:
kubectl get replicasets
kubectl describe replicasets
创建一个公开部署的服务对象:
kubectl expose deployment hello-world --type=LoadBalancer --name=my-service
显示有关服务的信息:
kubectl get services my-service
输出类似于:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-service 10.3.245.137 104.198.205.71 8080/TCP 54s
注意:如果外部 IP 地址显示为,请稍等片刻,然后再次输入相同的命令。
显示有关服务的详细信息:
kubectl describe services my-service 输出类似这样:
Name: my-service
Namespace: default
Labels: run=load-balancer-example
Selector: run=load-balancer-example
Type: LoadBalancer
IP: 10.3.245.137
LoadBalancer Ingress: 104.198.205.71
Port: <unset> 8080/TCP
NodePort: <unset> 32377/TCP
Endpoints: 10.0.0.6:8080,10.0.1.6:8080,10.0.1.7:8080 + 2 more...
Session Affinity: None
事件:记下您的服务公开的外部 IP 地址。 在此示例中,外部 IP 地址为 104.198.205.71。 还要注意端口的值。 在此示例中,端口为 8080。
在前面的输出中,您可以看到该服务有几个端点:10.0.0.6:8080、10.0.1.6:8080、10.0.1.7:8080 + 2 个。 这些是运行 Hello World 应用程序的 pod 的内部地址。 要验证这些是 Pod 地址,请输入以下命令:
kubectl get pods --output=wide
输出类似于:
NAME ... IP NODE
hello-world-2895499144-1jaz9 ... 10.0.1.6 gke-cluster-1-default-pool-e0b8d269-1afc
hello-world-2895499144-2e5uh ... 0.0.1.8 gke-cluster-1-default-pool-e0b8d269-1afc
hello-world-2895499144-9m4h1 ... 10.0.0.6 gke-cluster-1-default-pool-e0b8d269-5v7a
hello-world-2895499144-o4z13 ... 10.0.1.7 gke-cluster-1-default-pool-e0b8d269-1afc
hello-world-2895499144-segjf ... 10.0.2.5 gke-cluster-1-default-pool-e0b8d269-cpuc
使用外部 IP 地址访问 Hello World 应用程序:
curl http://<external-ip>:<port>
其中<external-ip>
是您服务的外部 IP 地址, <port>
是您服务描述中端口的值。
对成功请求的响应是一条问候消息:
Hello Kubernetes!
请参考如何在 GKE 中使用外部 IP和暴露外部 IP 地址以访问集群中的应用程序以获取更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.