Ingress

本指南介绍如何在 kind 集群上设置 ingress

设置 Ingress 控制器 🔗︎

在创建集群时,我们可以利用 KIND 的 extraPortMapping 配置选项将端口从主机转发到运行在节点上的 Ingress 控制器。

我们还可以使用 kubeadm InitConfiguration 中的 node-labels 设置自定义节点标签,供 Ingress 控制器 nodeSelector 使用。

  1. 创建集群
  2. 部署 Ingress 控制器,我们在此记录 Ingress NGINX,但其他 Ingress 也可能有效,包括 Contour 和 Kong,如果您选择使用它们,请遵循其文档。

注意:您可能还想考虑使用 Gateway API 而不是 Ingress。Gateway API 有一个 Ingress 迁移指南

您可以使用 blixit 来测试 kind 中的 Gateway API https://github.com/kubernetes-sigs/blixt#usage

创建集群 🔗︎

使用 extraPortMappingsnode-labels 创建 kind 集群。

cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
EOF

Ingress NGINX 🔗︎

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

清单包含特定于 kind 的补丁,用于将主机端口转发到 Ingress 控制器,设置污点容忍度并将其调度到自定义标记的节点。

现在 Ingress 已全部设置完毕。等待其准备好处理运行的请求

kubectl wait --namespace ingress-nginx \
  --for=condition=ready pod \
  --selector=app.kubernetes.io/component=controller \
  --timeout=90s

有关基本示例用法,请参阅 使用 Ingress

使用 Ingress 🔗︎

以下示例创建简单的 http-echo 服务和一个 Ingress 对象,用于路由到这些服务。

注意,此示例使用 nginx 特定的 Ingress 注释,该注释可能不被所有 Ingress 实现支持。

kind: Pod
apiVersion: v1
metadata:
  name: foo-app
  labels:
    app: foo
spec:
  containers:
  - command:
    - /agnhost
    - netexec
    - --http-port
    - "8080"
    image: registry.k8s.io/e2e-test-images/agnhost:2.39
    name: foo-app
---
kind: Service
apiVersion: v1
metadata:
  name: foo-service
spec:
  selector:
    app: foo
  ports:
  # Default port used by the image
  - port: 8080
---
kind: Pod
apiVersion: v1
metadata:
  name: bar-app
  labels:
    app: bar
spec:
  containers:
  - command:
    - /agnhost
    - netexec
    - --http-port
    - "8080"
    image: registry.k8s.io/e2e-test-images/agnhost:2.39
    name: bar-app
---
kind: Service
apiVersion: v1
metadata:
  name: bar-service
spec:
  selector:
    app: bar
  ports:
  # Default port used by the image
  - port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: /foo(/|$)(.*)
        backend:
          service:
            name: foo-service
            port:
              number: 8080
      - pathType: Prefix
        path: /bar(/|$)(.*)
        backend:
          service:
            name: bar-service
            port:
              number: 8080
---

应用内容

kubectl apply -f https://kind.kubernetes.ac.cn/examples/ingress/usage.yaml

现在验证 Ingress 是否有效

# should output "foo-app"
curl localhost/foo/hostname
# should output "bar-app"
curl localhost/bar/hostname