k8s day8 google cloud使用外部ingress

222 阅读2分钟

本文参照了 cloud.google.com/kubernetes-…

创建流程:创建两个 deployment 和对应的 service,最后基于这两个service创建ingress。 最终实现效果,当访问

  • 当客户端将请求发送到网址路径为 "/" 的负载平衡器时,请求将被转发到端口 60000 上的 hello-world Service。

  • 当客户端将请求发送到网址路径为 "/kube" 的负载平衡器时,请求将被转发到端口 80 上的 hello-kubernetes Service。

大致流程:

deployment -> service -> ingress

hello-kubernetes-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes-deployment
spec:
  selector:
    matchLabels:
      greeting: hello
      department: kubernetes
  replicas: 3
  template:
    metadata:
      labels:
        greeting: hello
        department: kubernetes
    spec:
      containers:
        - name: hello-again
          image: "gcr.io/google-samples/node-hello:1.0"
          env:
            - name: "PORT"
              value: "8080"

hello-kubernetes-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes
spec:
  # 同时具有 greeting: hello 标签和 department: kubernetes 标签的任何 Pod 都是 Service 的成员。
  type: NodePort
  selector:
    greeting: hello
    department: kubernetes
  ports:
    # 当请求发送到 TCP 端口 80 上的 Service 时,它将被转发到 TCP 端口 8080 上的某个成员 Pod。
    - protocol: TCP
      port: 80
      targetPort: 8080

hello-world-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world-deployment
spec:
  selector:
    matchLabels:
      greeting: hello
      department: world
  replicas: 3
  template:
    metadata:
      labels:
        greeting: hello
        department: world
    spec:
      containers:
        - name: hello
          image: "gcr.io/google-samples/hello-app:2.0"
          env:
            - name: "PORT"
              value: "50000"

hello-world-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  type: NodePort
  selector:
    greeting: hello
    department: world
  ports:
    - protocol: TCP
      port: 60000
      # 当请求发送到 TCP 端口 60000 上的 Service 时,它将被转发到 TCP 端口 50000 上的某个成员 Pod
      targetPort: 50000

选中刚创建的两个service

image.png

配置路径

image.png

最后我们可以预览yaml

---
apiVersion: "extensions/v1beta1"
kind: "Ingress"
metadata:
  name: "my-ingress"
  namespace: "default"
spec:
  rules:
  - http:
      paths:
      - path: "/*"
        backend:
          serviceName: "hello-world"
          servicePort: 60000
      - path: "/kube"
        backend:
          serviceName: "hello-kubernetes"
          servicePort: 80

查看刚创建的ingress kubectl get ingress my-ingress --output yaml

status:
  loadBalancer:
    ingress:
    - ip: 34.117.148.159

google cloud会自动创建负载均衡器并暴露一个IP地址,比如 34.117.148.159,访问根路径和/kube会返回期望的结果拉

PS:真实情况是我怎么访问这个IP都显示超时,检查了防火墙也没有问题,无奈我联系Google cloud人工客服,虽然他们只能看懂英文,不过很好沟通。最终确认是IP被墙了,在外国访问是正常的...

另外注意

k8s.gcr.io 是 gcr.io/google-containers 的别名, 所以 k8s.gcr.io/<image>:<tag> == gcr.io/google-containers/<image>:<tag>

但是gcr.io有时候在国内访问并不稳定,我建议你先docker pull gcr.io/google-samples/hello-app:2.0进行测试

参考

cloud.google.com/kubernetes-…

cloud.google.com/kubernetes-…