本地k8s分布式系统测试



我是k8s的新手,我正在尝试构建一个分布式系统。这个想法是为每个用户生成一个有状态的pod。

主服务是两个Python应用程序MothershipServiceShip。MothershipService的目的是跟踪每个用户的船,进行健康检查等。

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上。

船。yml (pseudo-spec)

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内运行命令(如curlwget):

kubectl exec -it web -- wget -O- http://127.0.0.1:8000

如何创建一个公开外部IP地址的Kubernetes Service对象的示例过程:

**为运行在五个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应用程序。

显示部署信息:

kubectl get deployments hello-world
kubectl describe deployments hello-world

显示你的ReplicaSet对象的信息:

kubectl get replicasets
kubectl describe replicasets

创建公开部署的Service对象:

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 description services输出如下所示:

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"。还要注意Port的值。本例中端口为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>Port的值

对成功请求的响应是一个hello消息:

Hello Kubernetes!

请参考如何在GKE中使用外部IP和暴露外部IP地址以访问集群中的应用程序获取更多信息。

相关内容

  • 没有找到相关文章