我试图在kubernetes上部署nginx, kubernetes版本是v1.5.2,
我已经部署了nginx的3个副本,YAML文件如下,
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: deployment-example
spec:
replicas: 3
revisionHistoryLimit: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.10
ports:
- containerPort: 80
现在我想在节点的30062端口上公开它的80端口,为此我在下面创建了一个服务,
kind: Service
apiVersion: v1
metadata:
name: nginx-ils-service
spec:
ports:
- name: http
port: 80
nodePort: 30062
selector:
app: nginx
type: LoadBalancer
这项服务工作得很好,但它不仅在kubernetes仪表板上也在终端上显示为待定。
我使用kubeadm创建了一个单节点k8s集群。当我尝试PortForward和kubectl代理时,它显示外部IP为未决。
$ kubectl get svc -n argocd argocd-server
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-server LoadBalancer 10.107.37.153 <pending> 80:30047/TCP,443:31307/TCP 110s
在我的情况下,我打了这样的服务:
kubectl patch svc <svc-name> -n <namespace> -p '{"spec": {"type": "LoadBalancer", "externalIPs":["172.31.71.218"]}}'
在此之后,它开始通过公共IP服务
$ kubectl get svc argo-ui -n argo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argo-ui LoadBalancer 10.103.219.8 172.31.71.218 80:30981/TCP 7m50s
下面是@Javier的回答。我已经决定为我的负载均衡器“修补外部IP”。
$ kubectl patch service my-loadbalancer-service-name \
-n lb-service-namespace \
-p '{"spec": {"type": "LoadBalancer", "externalIPs":["192.168.39.25"]}}'
这将用一个新的补丁IP地址替换那个“pending”,你可以为你的集群使用。
了解更多。请参阅karthik关于Minikube支持LoadBalancer的帖子
这么做可不干净。我需要一个临时的解决方案。希望这能帮助到一些人。
如果它是您的私有k8s集群,MetalLB将是一个更好的选择。以下是步骤。
步骤1:在集群中安装MetalLB
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml
# On first install only
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
步骤2:使用configmap配置它
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.42.42.100-172.42.42.105 #Update this with your Nodes IP range
步骤3:创建您的服务以获得外部IP(可能是私有IP)。
FYR:
安装MetalLB前:
安装MetalLB后:
为在amazon-eks上运行时遇到此错误的用户添加解决方案。
首先运行:
kubectl describe svc <service-name>
然后查看下面示例输出中的events字段:
Name: some-service
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"some-service","namespace":"default"},"spec":{"ports":[{"port":80,...
Selector: app=some
Type: LoadBalancer
IP: 10.100.91.19
Port: <unset> 80/TCP
TargetPort: 5000/TCP
NodePort: <unset> 31022/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EnsuringLoadBalancer 68s service-controller Ensuring load balancer
Warning SyncLoadBalancerFailed 67s service-controller Error syncing load balancer: failed to ensure load balancer: could not find any suitable subnets for creating the ELB
查看错误消息:
Failed to ensure load balancer: could not find any suitable subnets for creating the ELB
在我的例子中,没有为创建ELB提供合适的子网的原因是:
原因1:EKS集群部署在错误的子网组中——内部子网,而不是公网子网。
(*)默认情况下,如果没有service.beta.kubernetes, LoadBalancer类型的服务将创建面向公共的负载均衡器。Io /aws-load-balancer-internal:“true”注释)。
2:子网没有按照这里提到的要求进行标记。
为VPC添加标签:
Key: kubernetes.io/cluster/yourEKSClusterName
Value: shared
用以下标记公共子网:
Key: kubernetes.io/role/elb
Value: 1
在Kubernetes中,将运行在一组Pods上的应用程序公开为网络服务的一般方法称为service。Kubernetes中有四种类型的服务。
ClusterIP
服务只能从集群内访问。
NodePort
您可以使用NodeIP:NodePort.default节点端口范围是30000-32767从集群外部与服务通信,在创建集群时可以通过define——Service -node-port-range来更改这个范围。
loadbalance
使用云提供商的负载平衡器在外部公开服务。
ExternalName
通过返回带有值的CNAME记录,将服务映射到externalName字段的内容(例如,foo.bar.example.com)。没有设置任何类型的代理。
只有LoadBalancer为External-IP列提供值。只有当Kubernetes集群能够为特定的服务分配IP地址时,它才能工作。您可以使用metalLB负载均衡器为您的负载均衡器服务提供ip。
我希望你的疑虑能消失。
我在AWS EKS上也有同样的问题
问题是这样解决的:
Amazon虚拟私有云(Amazon VPC)的正确标记
子网
所需的AWS IAM (Identity and Access Management)权限
一个有效的Kubernetes服务定义Load
有足够的空闲IP地址
在子网上
需要确保以下标签
关键:kubernetes.io /集群/ yourEKSClusterName
价值:分享
关键:kubernetes.io /角色/ elb
值:1
关键:kubernetes.io /角色/ internal-elb
值:1
供参考,也确保sts是为您正在工作的区域启用sts设置可以在用户,区域设置下找到。