繁体   English   中英

本地测试k8s分布式系统

[英]Testing locally k8s distributed system

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

主要服务是两个 Python 应用程序MothershipServiceShip 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 中运行命令(如curlwget ):

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM