部署公开时未创建 GCP 负载均衡器

部署公开时未创建 GCP 负载均衡器

我在 GCP 上创建了一个 Kubernetes v1.12.0 集群,由 3 个控制器虚拟机和 3 个节点虚拟机组成,全部运行 Ubuntu 18-04 LTS(内核 4.15.0-1025-gcp)

我使用 weave v2.5.0 进行联网,一切正常,只是没有创建负载均衡器,我公开了一个简单的网络服务器。我认为问题是由于我的 GCP 配置方面的一些疏忽造成的,而不是 Kubernetes 中的错误

我已将所有虚拟机放置在名为 kubernetes 的非托管 GCP 集群中,如下所示

gcloud compute instance-groups unmanaged create kubernetes
gcloud compute instance-groups unmanaged add-instances kubernetes --instances gke-controller-0,gke-controller-1,gke-controller-2,gke-worker-0,gke-worker-1,gke-worker-2

网络标记为 kubernetes-the-hard-way,子网标记为 kubernetes

kubectl run nginx --image=nginx --port=80 
kubectl expose deploy nginx--port=80 --name=nginx --type=LoadBalancer

外部 IP 处于待定状态:

kubectl get svc nginx
NAME    TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
nginx   LoadBalancer   10.32.0.198   <pending>     80:31756/TCP   33m

kubectl describe svc nginx
Name:                     nginx
Namespace:                default
Labels:                   run=nginx
Annotations:              <none>
Selector:                 run=nginx
Type:                     LoadBalancer
IP:                       10.32.0.198
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31756/TCP
Endpoints:                10.200.1.15:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

kubectl get svc nginx -o yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx
  name: nginx
  namespace: default
  resourceVersion: "39375"
  selfLink: /api/v1/namespaces/default/services/nginx
spec:
  clusterIP: 10.32.0.198
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 31756
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer: {}

kubectl get ep
NAME         ENDPOINTS                                            AGE
kubernetes   10.240.0.10:6443,10.240.0.11:6443,10.240.0.12:6443   23h
nginx        10.200.1.15:80                                       42m

我检查了事件日志和所有 pod 日志,没有报告任何问题。

kube-apiserver.service 包含以下内容:

--cloud-provider=gce \
--cloud-config=/var/lib/kubernetes/gce.conf \
--cloud-provider-gce-lb-src-cidrs=35.204.0.0/16,107.178.0.0/16 \

/var/lib/kubernetes/gce.conf:

[global] 
token-url = nil 
project-id = first-outlet-221910 
network = kubernetes-the-hard-way 
subnetwork = kubernetes 
node-instance-prefix = gke- 
node-tags = controller, kubernetes-the-hard-way, worker

如果我的输入不正确,有人能解释一下 token-url 的正确值吗?此外,我是否犯了其他导致此问题的错误/遗漏?

短暂性脑缺血发作

答案1

一般来说,当你考虑使用外部 IP 在集群外部公开任何 Web 资源时,Kubernetes 会提供入口建立到内部服务的 HTTP 和 HTTPS 路由的机制。

然而,当我们谈论在 GCP 上运行集群时, HTTP(S) 负载均衡器一旦资源成功实施,就会在 GKE 中默认创建Ingress,因此它将负责将所有外部 HTTP/S 流量路由到嵌套的 Kubernetes 服务。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
spec:
  backend:
    serviceName: web
    servicePort: 8080

您可以检查 Ingress 资源的外部 IP:

kubectl get ingress basic-ingress

检查一下关联有关通过 GCP 中的 Ingress 服务公开 Web 应用程序的更多信息。

这里gce.conf文件的示例。

相关内容