我在 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
文件的示例。