我有一个简单的服务
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
这是我的集群的外观。很简单。
$kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-shell-95cb5df57-cdj4z 1/1 Running 0 23m 10.60.1.32 aks-nodepool-19248108-0 <none> <none>
nginx-deployment-76bf4969df-58d66 1/1 Running 0 36m 10.60.1.10 aks-nodepool-19248108-0 <none> <none>
nginx-deployment-76bf4969df-jfkq7 1/1 Running 0 36m 10.60.1.21 aks-nodepool-19248108-0 <none> <none>
$kubectl get services -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
internal-ingress LoadBalancer 10.0.0.194 10.60.1.35 80:30157/TCP 5m28s app=nginx-deployment
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 147m <none>
$kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
my-shell-95cb5df57 1 1 1 23m my-shell ubuntu pod-template-hash=95cb5df57,run=my-shell
nginx-deployment-76bf4969df 2 2 2 37m nginx nginx:1.7.9 app=nginx,pod-template-hash=76bf4969df
我看到我的Nginx应用有2个Pod。我希望能够从任何其他新Pod向其中一个发送请求。如果发生崩溃,我希望仍然能够发送此请求。 过去,我为此使用了负载平衡器。负载平衡器的问题在于它们开放了公共IP并在此特定情况下运行,我不再需要公共IP。我希望该服务在没有公共IP的情况下直接由其他Pod调用。
我尝试使用内部负载均衡器。
apiVersion: v1
kind: Service
metadata:
name: internal-ingress
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "my-subnet"
spec:
type: LoadBalancer
loadBalancerIP: 10.60.1.45
ports:
- port: 80
selector:
app: nginx-deployment
问题在于,它在我的10.60.0.0/16
网络中没有获得IP,如此处所述:https://docs.microsoft.com/en-us/azure/aks/internal-lb#specify-a-different-subnet
我得到了永无止境的<pending>
。
kubectl get services -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
internal-ingress LoadBalancer 10.0.0.230 <pending> 80:30638/TCP 15s app=nginx-deployment
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 136m <none>
我想念什么?如何排除故障?甚至可以使用Pod进行服务通信吗?
答案 0 :(得分:2)
根据您提供的消息,您似乎想要使用一个特殊的私有IP地址,该地址在子网中与AKS群集使用的相同。我认为可能的原因是您要使用的特殊IP地址已经由AKS分配,这意味着您无法使用它。
问题排查
因此,您需要引导至AKS群集使用的Vnet,并检查IP地址是否已在使用中。这是屏幕截图:
解决方案
从AKS使用的子网中选择AKS未分配的IP地址。 或者不要使用特殊的,让AKS动态分配您的负载均衡器。然后按如下所示更改您的YAML文件:
apiVersion: v1
kind: Service
metadata:
name: internal-ingress
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx-deployment
答案 1 :(得分:0)
使用ClusterIP服务(默认类型),该服务仅创建群集内部IP,而不创建公用IP:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
然后,您可以使用服务名称作为DNS名称,从同一命名空间中的任何其他Pod访问服务(及其后的Pod):
curl nginx-service
如果要从中访问服务的Pod位于其他名称空间中,则必须使用服务的完全限定域名:
curl nginx-service.my-namespace.svc.cluster.local