www.91084.com

GVKun编程网logo

kube-router 在默认子网之外分配 ClusterIP 子网划分Kubernetes --service-cidrKube 路由器

1

此处将为大家介绍关于kube-router在默认子网之外分配ClusterIP子网划分Kubernetes--service-cidrKube路由器的详细内容,此外,我们还将为您介绍关于./node_

此处将为大家介绍关于kube-router 在默认子网之外分配 ClusterIP 子网划分Kubernetes --service-cidrKube 路由器的详细内容,此外,我们还将为您介绍关于./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”、07.kubernetes笔记 Service(一) ClusterIP、NodePort、LoadBalancer、angular j j angular j angular angular service service service j、ClusterIP 服务未在 Pod 之间平均分配流量的有用信息。

本文目录一览:

kube-router 在默认子网之外分配 ClusterIP 子网划分Kubernetes --service-cidrKube 路由器

kube-router 在默认子网之外分配 ClusterIP 子网划分Kubernetes --service-cidrKube 路由器

如何解决kube-router 在默认子网之外分配 ClusterIP 子网划分Kubernetes --service-cidrKube 路由器

我的家庭实验室默认安装了 Kubernetes,并使用 kube-router 作为网络提供商。 kube-router 默认设置为服务代理。我没有在我的 kube-controller-manager 中设置明确的 service-cluster-ip-network,所以 kube-router 应该只在默认的 10.96.x.x/16 子网内分配服务集群 IP。但是,我经常在较大的 10.x.x.x./8 子网内的任何地方获取服务集群 IP。我不知道在哪里/为什么它不在 10.96.x.x 之内。想法?谢谢!

解决方法

TL;DR

您的 Kubernetes 集群运行正常。

默认情况下(如果没有另外指定)使用 kubeadm 来配置您的集群,--service-cidr 设置为 10.96.0.0/12

ClusterIP 地址如 10.110.15.13 将包含在上述网络 (10.96.0.0/12) 中。

我在下面提供了更多解释:


子网划分

如果您使用可用的在线 IP calculators 之一,您将看到与下面包含的完全相同的情况:

CIDR 10.96.0.0/12
子网掩码 255.240.0.0
网络地址(第一个) 10.96.0.0
广播地址(最后一个) 10.111.255.255
第一个可用地址 10.96.0.1
最后可用的地址 10.111.255.254
可分配的主机数量 1048574

通过上图,您可以看到 Service IP 范围如下:

  • 10.96.0.1-10.111.255.254

这会使 IP 像:10.104.5.2,10.110.15.13 在上述网络的范围内


Kubernetes --service-cidr

如前所述,如果您在使用 --service-cidr 时不指定 $ kubeadm init,它将被设置为默认 10.96.0.0/12

遵循kubeadm的官方文档:

  1. --service-cidr string Default: "10.96.0.0/12"
  2. Use alternative range of IP address for service VIPs.

-- Kubernetes.io: Docs: Reference: Setup tools: Kubeadm: Kubeadm init: Options

如果您在没有此参数的情况下配置集群,您将能够在以下位置看到它的配置:

  • kube-apiserver
  1. $ kubectl get pods -n kube-system kube-apiserver-kubernetes-NODE_NAME -o yaml | grep "service-cluster-ip-range"
  2. - --service-cluster-ip-range=10.96.0.0/12
  • kube-controller-manager
  1. $ kubectl get pods -n kube-system kube-controller-manager-kubernetes-NODE_NAME -o yaml | grep "service-cluster-ip-range"
  2. - --service-cluster-ip-range=10.96.0.0/12

Kube 路由器

kube-router 的源代码中也明确说明了这一点:

  1. func NewKubeRouterConfig() *KubeRouterConfig {
  2. return &KubeRouterConfig{
  3. // SKIPPED
  4. ClusterIPCIDR: "10.96.0.0/12",// SKIPPED
  5. }
  6. }

-- Github.com: Cloudnativelabds: Kube-router: Pkg: Options: Options.go: Line 73

  1. fs.StringVar(&s.ClusterIPCIDR,"service-cluster-ip-range",s.ClusterIPCIDR,"CIDR value from which service cluster IPs are assigned. Default: 10.96.0.0/12")

-- Github.com: Cloudnativelabds: Kube-router: Pkg: Options: Options.go: Line 187

它也在 user guide 中被引用。

./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”

如何解决./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”

./node_modules/react-router-dom/react-router-dom.js Attempted import error: ''Navigate'' is not exported from ''react-router''.

react-router-dom的版本是6.0.0-alpha.2,而react-router是5.2.0。 两者均已正确安装。我不确定如何解决此错误。有人可以给我任何可能的解决方法吗?

我的代码中甚至没有<Navigate to=?>行。

解决方法

为什么只安装两个都需要,这可以工作

  1. 执行npm删除react-router
  2. 删除node_modules
  3. 纱线安装或npm安装和
  4. 启动纱线或启动npm

07.kubernetes笔记 Service(一) ClusterIP、NodePort、LoadBalancer

07.kubernetes笔记 Service(一) ClusterIP、NodePort、LoadBalancer

Service简介

  • Service:可以理解为pod的负债均衡器,标准资源类型,Service Controller 为动态的一组Pod提供一个固定的访问入口, kubernetes完成SVC工作的是组件是kube-proxy
  • Endpoint Controller:管理后端端点与svc的绑定,根据标签选择器,筛选适配的pod,监控就绪的pod 并完成svc与pod的绑定
  • 工作流程:Service Controller---->创建相同标签选择器的 Endpoint Controller根据标签选择器去管理和监听后端Pod状态 完成Svc与Pod绑定
Service能够提供负载均衡的能力,但是在使用上有以下限制:
  • 只提供4层负载均衡能力,而没有7层功能,但有时我们可能需要更多的匹配规则来转发请求,这在4层负载均衡上是不支持的

kube-proxy3种不同的数据调度模式

  1. 1.Userspace
    Userspace模型:Pod-->Service, iptables拦截规则,但自己不做调度 工作流程: 用户空间-->ptables(内核)-->kube-proxy-->ptables(内核)-->再调度给用户空间 效率低
  2. iptables 用户空间-->ptables(内核 完成数据调度)-->调度给用户空间 效率高
    在iptables模型下kube-proxy的作用不在是数据调度转发,而是监听API server所有service中的定义转为本地的iptables规则
    缺点:iptables模式,一个service会生成大量的规则; 如果一个service有50条规则 那如果有一万个容器,内核的性能就会受到影响
  3. ipvs代理模式: 在继承iptables优点的情况下,同时改进了iptables产生大量规则的缺点,在大规模集群中serice多的情况下优势更明显,

Service的类型

  1. clusterIP:通过集群内部IP地址暴露服务,但该地址仅在集群内部可见、可达,它无法被集群外部的客户端访问;默认类型;建议由K8S动态指定一个;也支持用户手动明确指定;
  2. NodePort: NodePort是ClusterIP的增强类型,它会于ClusterIP的功能之外,在每个节点上使用一个相同的端口号将外部流量引入到该Service上来。
  3. LoadBalancer: 是NodePort的增强类型,为各节点上的NodePort提供一个外部负载均衡器;需要公有云支持
  4. ExternalName:外部流程引入到K8S内部,借助集群上KubeDNS来实现,服务的名称会被解析为一个CNAME记录,而CNAME名称会被DNS解析为集群外部的服务的TP地址,实现内部服务与外部服务的数据交互 ExternallP 可以与ClusterIP、NodePort一起使用 使用其中一个IP做出口IP
ServicePort

Service:被映射进Pod上的应用程序监听的端口; 而且如果后端Pod有多个端口,并且每个端口都想通过Service暴露的话,每个都要单独定义。 最终接收请求的是PodIP和ContainerPort;

Service资源规范

Service名称空间级别的资源不能跨名称空间

apiVersion: v1
kind: Service
metadata:
  name: ..
  namespace: ...
  labels:
    key1: value1
    key2: value2
spec:
  type <string>  #Service类型,默认为ClusterIP
  selector <map[string]string> #等值类型的标签选择器,内含“与"逻辑
  ports: # Service的端口对象列表
  - name <string>#端口名称
    protocol <string> #协议,目前仅支持TCP、UDP和SCTP,默认为TCP
    port <integer> # Service的端口号
    targetPort <string> #后端目标进程的端口号或名称,名称需由Pod规范定义
    nodePort <integer> # 节点端口号,仅适用于NodePort和LoadBalancer类型
  clusterIP <string> # Service的集群IP,建议由系统自动分配
  externalTrafficPolicy <string>#外部流量策略处理方式,Local表示由当前节点处理,#Cluster表示向集群范围调度
  loadBalancerIP <string> #外部负载均衡器使用的IP地址,仅适用于LoadBlancer
  externalName <string>  # 外部服务名称,该名称将作为Service的DNS CNAME值

示例1: ClusterIP 演示

[root@k8s-master svc]# cat services-clusterip-demo.yaml 
apiVersion: v1
kind: Service
metadata:
  name: demoapp-svc
  namespace: default
spec: 
  clusterIP: 10.97.72.1   #正式部署不需要指定 会自动生成,手动指定还可能会导致冲突
  selector:               #定义过滤条件
    app: demoapp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80    #后端pod端口

[root@k8s-master svc]# kubectl apply -f services-clusterip-demo.yaml 
service/demoapp-svc created


[root@k8s-master svc]# kubectl get svc -o wide
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE   SELECTOR
demoapp-svc   ClusterIP   10.97.72.1       <none>        80/TCP         11s   app=demoapp
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP        30d   <none>
my-grafana    NodePort    10.96.4.185      <none>        80:30379/TCP   27d   app.kubernetes.io/instance=my-grafana,app.kubernetes.io/name=grafana
myapp         NodePort    10.106.116.205   <none>        80:31532/TCP   30d   app=myapp,release=stabel

[root@k8s-master svc]# curl 10.97.72.1  #通过访问svc IP访问到后端节点
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-66db74fcfc-9wkgj, ServerIP: 10.244.2.97!
[root@k8s-master svc]# curl 10.97.72.1
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-66db74fcfc-vzb4f, ServerIP: 10.244.1.98!

[root@k8s-master svc]# kubectl describe svc demoapp-svc
Name:              demoapp-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=demoapp
Type:              ClusterIP
IP:                10.97.72.1
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.98:80,10.244.2.97:80   #后端节点
Session Affinity:  None
Events:            <none>

[root@k8s-master svc]# kubectl get pod -o wide --show-labels   #匹配到前1、2个
NAME                          READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES   LABELS
demoapp-66db74fcfc-9wkgj      1/1     Running   0          39m   10.244.2.97    k8s-node2   <none>           <none>            app=demoapp,pod-template-hash=66db74fcfc,release=stable
demoapp-66db74fcfc-vzb4f      1/1     Running   0          39m   10.244.1.98    k8s-node1   <none>           <none>            app=demoapp,pod-template-hash=66db74fcfc,release=stable,track=daily
liveness-httpget-demo         1/1     Running   3          29m   10.244.1.99    k8s-node1   <none>           <none>            app=liveness
liveness-tcpsocket-demo       1/1     Running   3          29m   10.244.1.100   k8s-node1   <none>           <none>            <none>
my-grafana-7d788c5479-kpq9q   1/1     Running   4          27d   10.244.1.84    k8s-node1   <none>           <none>            app.kubernetes.io/instance=my-grafana,app.kubernetes.io/name=grafana,pod-template-hash=7d788c5479

[root@k8s-master svc]# kubectl get ep  #实际管理后端端点与svc的绑定是Endpoints
NAME          ENDPOINTS                       AGE
demoapp-svc   10.244.1.98:80,10.244.2.97:80   2m33s
kubernetes    192.168.4.170:6443              30d
my-grafana    10.244.1.84:3000                27d
myapp         <none>                          30d

[root@k8s-master svc]#  kubectl scale deployment demoapp  --replicas=4  #修改deployment副本数为4
deployment.apps/demoapp scaled

[root@k8s-master svc]# kubectl get pod --show-labels
NAME                          READY   STATUS    RESTARTS   AGE    LABELS
demoapp-66db74fcfc-9jzs5      1/1     Running   0          18s    app=demoapp,pod-template-hash=66db74fcfc,release=stable
demoapp-66db74fcfc-9wkgj      1/1     Running   0          100m   app=demoapp,pod-template-hash=66db74fcfc,release=stable
demoapp-66db74fcfc-dw9w2      1/1     Running   0          18s    app=demoapp,pod-template-hash=66db74fcfc,release=stable
demoapp-66db74fcfc-vzb4f      1/1     Running   0          100m   app=demoapp,pod-template-hash=66db74fcfc,release=stable,track=daily
liveness-httpget-demo         1/1     Running   3          90m    app=liveness
liveness-tcpsocket-demo       1/1     Running   3          90m    <none>
my-grafana-7d788c5479-kpq9q   1/1     Running   4          27d    app.kubernetes.io/instance=my-grafana,app.kubernetes.io/name=grafana,pod-template-hash=7d788c5479

[root@k8s-master svc]# kubectl get ep  #已实时添加到ep与svc绑定
NAME          ENDPOINTS                                                   AGE
demoapp-svc   10.244.1.101:80,10.244.1.98:80,10.244.2.97:80 + 1 more...   63m
kubernetes    192.168.4.170:6443                                          30d
my-grafana    10.244.1.84:3000                                            27d
myapp         <none>                                                      30d

示例2: NodePort 演示

[root@k8s-master svc]# cat services-nodeport-demo.yaml 
apiVersion: v1
kind: Service
metadata:
  name: demoapp-nodeport-svc
  namespace: default
spec: 
  type: NodePort
  clusterIP: 10.97.56.1   #正式部署不需要指定 会自动生成手动指定还可能会导致冲突
  selector:
    app: demoapp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80    #后端pod端口
    nodePort: 31399  #正式部署不需要指定 会自动生成   默认生成端口在30000-32768之间

[root@k8s-master svc]# kubectl apply -f services-nodeport-demo.yaml 
service/demoapp-nodeport-svc created
[root@k8s-master svc]# kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
demoapp-66db74fcfc-9jzs5      1/1     Running   0          8m47s
demoapp-66db74fcfc-9wkgj      1/1     Running   0          109m
demoapp-66db74fcfc-dw9w2      1/1     Running   0          8m47s
demoapp-66db74fcfc-vzb4f      1/1     Running   0          109m
liveness-httpget-demo         1/1     Running   3          98m
liveness-tcpsocket-demo       1/1     Running   3          98m
my-grafana-7d788c5479-kpq9q   1/1     Running   4          27d
[root@k8s-master svc]# kubectl get svc
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
demoapp-nodeport-svc   NodePort    10.97.56.1       <none>        80:31399/TCP   11s    #可以看到两个prot 其中31399就是nodeport端口
demoapp-svc            ClusterIP   10.97.72.1       <none>        80/TCP         72m

[root@k8s-master svc]# while true;do curl 192.168.4.171:31399;sleep 1;done  #通过节点IP:prot访问
iKubernetes demoapp v1.0 !! ClientIP: 10.244.2.1, ServerName: demoapp-66db74fcfc-9wkgj, ServerIP: 10.244.2.97!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.2.0, ServerName: demoapp-66db74fcfc-dw9w2, ServerIP: 10.244.1.101!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.2.0, ServerName: demoapp-66db74fcfc-vzb4f, ServerIP: 10.244.1.98!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.2.1, ServerName: demoapp-66db74fcfc-9wkgj, ServerIP: 10.244.2.97!
  • 可以看到上面虽然是通过节点2访问,但通过IP地址发现还是会轮询到节点1上的pod
    这时就要提到 ''externalTrafficPolicy <string>'' #外部流量策略处理方式,
    Local表示由当前节点处理
    Cluster表示向集群范围调度
[root@k8s-master ~]# kubectl edit svc demoapp-nodeport-svc
...
spec:
  clusterIP: 10.97.56.1
  externalTrafficPolicy: Local  #把默认的Cluster改成Local
...

[root@k8s-master svc]# kubectl scale deployment demoapp  --replicas=1  #调整deployment副本数为1
deployment.apps/demoapp scaled

[root@k8s-master ~]# kubectl get pod -o wide  #可以看到唯一的pod运行node2节点上
NAME                          READY   STATUS    RESTARTS   AGE    IP             NODE        NOMINATED NODE   READINESS GATES
demoapp-66db74fcfc-9wkgj      1/1     Running   0          123m   10.244.2.97    k8s-node2   <none>           <none>
liveness-httpget-demo         1/1     Running   3          112m   10.244.1.99    k8s-node1   <none>           <none>

[root@k8s-master ~]# curl 192.168.4.171:31399  #通过节点1  失败

^C
[root@k8s-master ~]# curl 192.168.4.172:31399  #通过节点2
iKubernetes demoapp v1.0 !! ClientIP: 192.168.4.170, ServerName: demoapp-66db74fcfc-9wkgj, ServerIP: 10.244.2.97!

示例3: LoadBalancer 演示

[root@k8s-master svc]# cat services-loadbalancer-demo.yaml 
apiVersion: v1
kind: Service
metadata:
  name: demoapp-loadbalancer-svc
  namespace: default
spec: 
  type: LoadBalancer
  selector:
    app: demoapp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80    #后端pod端口
#  loadBalancerIP: 1.2.3.4    #这里应该不是在Iaas平台上,无法创建ELB,所以无法创建

[root@k8s-master svc]# kubectl get svc
NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
demoapp-loadbalancer-svc   LoadBalancer   10.110.155.70    <pending>     80:31619/TCP   31s    #可以看到因为不是Iaas平台上 EXTERNAL-IP一直为pending状态,表示一直在申请资源而挂起,依然可以通过NodePort的方式访问
demoapp-nodeport-svc       NodePort       10.97.56.1       <none>        80:31399/TCP   30m
demoapp-svc                ClusterIP      10.97.72.1       <none>        80/TCP         102m


[root@k8s-master svc]# while true;do curl 192.168.4.171:31399;sleep 1;done  #通过NodePort的方式访问
iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.0, ServerName: demoapp-66db74fcfc-9wkgj, ServerIP: 10.244.2.97!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.1, ServerName: demoapp-66db74fcfc-2jf49, ServerIP: 10.244.1.103!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.0, ServerName: demoapp-66db74fcfc-9wkgj, ServerIP: 10.244.2.97!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.1, ServerName: demoapp-66db74fcfc-5dp5n, ServerIP: 10.244.1.102!

示例4: externalIPs 演示

NodePort 实际应用中还需要在前面加一层负载均衡,以起到统一入口和高可用,而且后端新增的节点也不会自动添加到负载上
externalIPs 在只有1个或多个节点暴露IP的情况下,可通过虚拟IP,实现高可用

[root@k8s-master ~]# ip addr add 192.168.100.100/16 dev eth0
[root@k8s-master ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:44:16:16 brd ff:ff:ff:ff:ff:ff
    inet 192.168.4.170/24 brd 192.168.4.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.100.100/16 scope global eth0
       valid_lft forever preferred_lft forever
       
[root@k8s-master svc]# cat services-
services-clusterip-demo.yaml     services-externalip-demo.yaml    services-loadbalancer-demo.yaml  services-nodeport-demo.yaml
[root@k8s-master svc]# cat services-externalip-demo.yaml 
apiVersion: v1
kind: Service
metadata:
  name: demoapp-externalip-svc
  namespace: default
spec: 
  type: ClusterIP
  selector:
    app: demoapp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80    #后端pod端口
  externalIPs:
  - 192.168.100.100  #实际应用中,可以通过过haproxy等实现虚拟IP 达到高可用
  
[root@k8s-master svc]# kubectl apply -f services-externalip-demo.yaml 
service/demoapp-externalip-svc created
[root@k8s-master svc]# kubectl get svc
NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)        AGE
demoapp-externalip-svc     ClusterIP      10.110.30.133    192.168.100.100   80/TCP         16s
demoapp-loadbalancer-svc   LoadBalancer   10.110.155.70    <pending>         80:31619/TCP   3h6m
demoapp-nodeport-svc       NodePort       10.97.56.1       <none>            80:31399/TCP   3h36m
demoapp-svc                ClusterIP      10.97.72.1       <none>            80/TCP         4h47m

#访问测试
[root@k8s-master svc]# curl 192.168.100.100
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-66db74fcfc-9wkgj, ServerIP: 10.244.2.97!
[root@k8s-master svc]# while true;do curl 192.168.100.100;sleep 1;done
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-66db74fcfc-z682r, ServerIP: 10.244.2.99!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-66db74fcfc-5dp5n, ServerIP: 10.244.1.102!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-66db74fcfc-5dp5n, ServerIP: 10.244.1.102!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-66db74fcfc-9wkgj, ServerIP: 10.244.2.97!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-66db74fcfc-5dp5n, ServerIP: 10.244.1.102!

angular j j angular j angular angular service service service j

angular j j angular j angular angular service service service j

我试图写一个业务/茉莉花测试,我想要一些关于mocks如何在一个正在退回承诺的服务上的解释。我解释我的情况:

我有一个控制器,我在其中进行以下调用:

mapService.getMapByUuid(mapUUID,isEditor).then(function(datas){
    fillMapDatas(datas);
});

function fillMapDatas(datas){
    if($scope.elements === undefined){
        $scope.elements = [];
    }
 //Here while debugging my unit test,'datas' contain the promise javascript object instead //of my real reponse.
   debugger;
    var allOfThem = _.union($scope.elements,datas.elements);

    ...

以下是我的服务:

(function () {
'use strict';

var serviceId = 'mapService';

angular.module('onmap.map-module.services').factory(serviceId,[
    '$resource','appContext','restHello','restMap',serviceFunc]);

function serviceFunc($resource,appContext,restHello,restMap) {

    var Maps = $resource(appContext+restMap,{uuid: '@uuid',editor: '@editor'});

    return{          
        getMapByUuid: function (uuid,modeEditor) {
            var maps = Maps.get({'uuid' : uuid,'editor': modeEditor});
            return maps.$promise;
        }
    };
}

})();

最后,这是我的单位测试:

describe('Map controller',function() {
var $scope,$rootScope,$httpBackend,$timeout,createController,MapService,$resource;

beforeEach(module('onmapApp'));

beforeEach(inject(function($injector) {
    $httpBackend = $injector.get('$httpBackend');
    $rootScope = $injector.get('$rootScope');
    $scope = $rootScope.$new();

    var $controller = $injector.get('$controller');

    createController = function() {
        return $controller('maps.ctrl',{
            '$scope': $scope
        });
    };
}));

afterEach(function() {
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
});

var response = {"elements":[1,2,3]};

it('should allow user to get a map',function() {

    var controller = createController();
    $httpBackend.expect('GET','/onmap/rest/map/MY-UUID?editor=true')
        .respond({
            "success": response
        });


// hope to call /onmap/rest/map/MY-UUID?editor=true url and hope to have response as the fillMapDatas parameter
    $scope.getMapByUUID('MY-UUID',true); 

    $httpBackend.flush();
});
});

我真正想要做的是将我的响应对象({“elements:…})作为fillMapDatas函数的datas参数,我不明白如何模拟所有的服务(服务,承诺,然后)

提前感谢您的帮助

所以你想测试,如果你的服务响应如预期的?然后,这是你想要的服务测试。基于单元测试的方法可能如下所示:
var mapService,$q,$rootScope;

beforeEach(inject(function (_mapService_,_$httpBackend_,_$q_,_$rootScope_) {
  mapService = mapService;
  $httpBackend = _$httpBackend_;
  $q = _$q_;
  $rootScope = _$rootScope_;

  // expect the actual request
  $httpBackend.expect('GET','/onmap/rest/map/uuid?editor=true');

  // react on that request
  $httpBackend.whenGET('/onmap/rest/map/uuid?editor=true').respond({
    success: {
      elements: [1,3]
    }
  });
}));

您可以看到,您不需要使用$ inject,因为您可以直接注入所需的服务。如果您想在整个测试中使用正确的服务名称,您可以使用前缀和后缀“_”注入它们,注入()足够聪明地识别出您的意思。我们还为每个it()规范设置$ httpBackend mock。并且我们设置$ q和$ rootScope进行后续处理。

以下是您如何测试您的服务方法返回承诺:

it('should return a promise',function () {
  expect(mapService.getMapUuid('uuid',true).then).tobedefined();
});

由于承诺总是有一个.then()方法,我们可以检查这个属性,看看它是否是一个承诺(当然,其他对象也可以使用这个方法)。

接下来,您可以用适当的价值测试您得到的解决方案的承诺。您可以设置您明确解析的延迟。

it('should resolve with [something]',function () {
  var data;

  // set up a deferred
  var deferred = $q.defer();
  // get promise reference
  var promise = deferred.promise;

  // set up promise resolve callback
  promise.then(function (response) {
    data = response.success;
  });

  mapService.getMapUuid('uuid',true).then(function(response) {
    // resolve our deferred with the response when it returns
    deferred.resolve(response);
  });

  // force `$digest` to resolve/reject deferreds
  $rootScope.$digest();

  // make your actual test
  expect(data).toEqual([something]);
});

希望这可以帮助!

ClusterIP 服务未在 Pod 之间平均分配流量

ClusterIP 服务未在 Pod 之间平均分配流量

如何解决ClusterIP 服务未在 Pod 之间平均分配流量?

我们正试图找出为什么 ClusterIP 服务将 30% 的流量分配给一个 Pod 而每个 10% 的流量分配给其他 2 个,见以下 2 个文档 k8s docs 和 stackoverflow 问题 Stackoverflow Question

我怎样才能找到确切的原因和日志来显示这种行为。我们应该检查 kube-proxy 配置吗?

以下是服务清单

---
apiVersion: v1
kind: Service
@R_301_5624@data:
  name: kong-proxy-svc
  namespace: kong
spec:
  type: ClusterIP
  ports:
  - name: kong-proxy
    port: 8000
    targetPort: 8000
    protocol: TCP
  selector:
    app: kong

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

我们今天的关于kube-router 在默认子网之外分配 ClusterIP 子网划分Kubernetes --service-cidrKube 路由器的分享就到这里,谢谢您的阅读,如果想了解更多关于./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”、07.kubernetes笔记 Service(一) ClusterIP、NodePort、LoadBalancer、angular j j angular j angular angular service service service j、ClusterIP 服务未在 Pod 之间平均分配流量的相关信息,可以在本站进行搜索。

本文标签: