我正在尝试在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仪表板上显示为待处理。
所以请帮我解决这个问题。谢谢......
答案 0 :(得分:93)
您似乎正在使用自定义Kubernetes群集(使用minikube
,kubeadm
等)。在这种情况下,没有集成LoadBalancer(与AWS或Google Cloud不同)。使用此默认设置,您只能使用NodePort
或Ingress Controller。使用Ingress Controller,您可以设置一个映射到您的广告连播的域名。
答案 1 :(得分:22)
答案 2 :(得分:21)
如果您未使用GCE或EKS(您使用过kubeadm
),则可以向服务YAML中添加externalIPs
规范。您可以使用与节点的主接口关联的IP,例如eth0
。然后,您可以使用节点的外部IP从外部访问服务。
...
spec:
type: LoadBalancer
externalIPs:
- 192.168.0.10
答案 3 :(得分:17)
如果您使用的是Minikube,那么会有一个神奇的命令!
$ minikube tunnel
希望有人可以为此节省几分钟。
答案 4 :(得分:7)
我使用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
答案 5 :(得分:4)
如果您使用的是minikube,请在终端
下运行以下命令$ minikube ip
$ 172.17.0.2 // then
$ curl http://172.17.0.2:31245
or simply
$ curl http://$(minikube ip):31245
答案 6 :(得分:3)
为在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群集部署在错误的子网组上-内部子网,而不是面向公众的子网。
(*)默认情况下,如果没有提供LoadBalancer
注释,则service.beta.kubernetes.io/aws-load-balancer-internal: "true"
类型的服务会创建面向公众的负载均衡器。
2 :未根据提到的here的要求对子网进行标记。
使用以下方式标记VPC:
Key: kubernetes.io/cluster/yourEKSClusterName
Value: shared
使用以下方式标记公共子网:
Key: kubernetes.io/role/elb
Value: 1
答案 7 :(得分:1)
使用NodePort:
kubectl运行用户登录--replicas = 2 --labels =“ run =用户登录” --image = kingslayerr / teamproject:version2 --port = 5000
kubectl公开部署用户登录--type = NodePort --name =用户登录服务
kubectl描述服务user-login-service (记下端口)
kubect群集信息 (IP->获取运行主服务器的IP)
可以通过(IP):(端口)访问您的服务
答案 8 :(得分:1)
如果这是您的私有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步:使用配置映射进行配置
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:
答案 9 :(得分:1)
使用Minikube时,您可以获取IP和端口 可以通过运行minikube服务kubia-http访问该服务。
答案 10 :(得分:1)
如果您不在受支持的云(aws,azure,gcloud等)上,那么在没有MetalLB https://metallb.universe.tf/的情况下不能使用LoadBalancer 但是它还处于测试阶段。
答案 11 :(得分:1)
仅当基础基础结构支持自动创建负载均衡器并在Kubernetes中具有相应的支持时,LoadBalancer ServiceType才能工作,例如Google Cloud Platform和AWS。如果未配置任何此类功能,则不会填充LoadBalancer IP地址字段,而该状态仍处于待处理状态,并且该服务将以与NodePort类型的服务相同的方式工作
答案 12 :(得分:1)
您可以修补托管Pod的Node的IP(Node的Private IP),这是简单的解决方法。
参考以上文章,以下为我工作:
kubectl修补程序服务my-loadbalancer-service-name \ -n lb-service-namespace \ -p'{“ spec”:{“ type”:“ LoadBalancer”,“ externalIPs”:[“ xxx.xxx.xxx.xxx物理服务器的专用IP-节点-完成部署的位置”]}}'
答案 13 :(得分:0)
可能是您部署服务所在的子网,没有足够的 ip
答案 14 :(得分:0)
如果有人正在使用MicroK8s:您需要一个网络负载平衡器。
metalK附带MicroK8s,您可以这样启用它:
microk8s enable metallb
<pending>
应该变成一个实际的IP地址。
答案 15 :(得分:0)
公开服务有以下三种类型 节点端口 集群IP 负载均衡器
当我们使用负载平衡器时,我们基本上会要求我们的云提供商提供一个可以在线访问的dns 注意不是域名,而是DNS。
因此负载均衡器类型在我们的本地minikube环境中不起作用。
答案 16 :(得分:0)
按照@Javier的回答。我决定为我的负载均衡器使用“修补外部IP”。
$ kubectl patch service my-loadbalancer-service-name \
-n lb-service-namespace \
-p '{"spec": {"type": "LoadBalancer", "externalIPs":["192.168.39.25"]}}'
这将用可用于您的群集的新修补IP地址替换该“待处理”。
有关此的更多信息。请参阅LoadBalancer support with Minikube for Kubernetes
上的 karthik's 帖子不是最干净的方法。我需要一个临时解决方案。希望这对某人有帮助。
答案 17 :(得分:0)
检查kube-controller日志。通过将clusterID标记设置为部署集群的ec2实例,我能够解决此问题。
答案 18 :(得分:0)
如果在 minikube 上运行,请不要忘记提及默认名称空间。
minikube服务<< service_name >> --url --namespace = << namespace_name >>
答案 19 :(得分:0)
删除现有服务并创建相同的新服务解决了我的问题。我的问题是使用了我定义的负载平衡Ip,以便外部端点处于暂挂状态。当我更改新的负载平衡IP时,它仍然无法工作。最后,删除现有服务并创建一个新服务即可解决我的问题。
答案 20 :(得分:0)
同一问题:
os> kubectl获取svc右剑齿wordpress
名称类型群集IP外部IP端口(S)
right-sabertooth-wordpress LoadBalancer 10.97.130.7“待处理” 80:30454 / TCP,443:30427 / TCPos> minikube服务列表
| ----------------- | ---------------------------- | --- ----------------------------- |
|名称空间| NAME |网址|
| ----------------- | ---------------------------- | --- ----------------------------- |
|默认值kubernetes |没有节点端口|
|默认值右剑齿马里亚德|没有节点端口|
|默认值剑齿剑右键 | http://192.168.99.100:30454 |
| | | http://192.168.99.100:30427 |
| kube系统| kube-dns |没有节点端口|
| kube系统|分er部署|没有节点端口|
| ----------------- | ---------------------------- | --- ----------------------------- |
但是,可以通过该http://192.168.99.100:30454访问。