暴露服务

1. 通过 Ingress(推荐)

在这个示例中,我们将部署一个简单的 Nginx Web 服务器,并通过 Ingress 使其可被访问。因此,我们需要以一种能将内部端口 80(Traefik Ingress 控制器监听的端口)暴露在主机系统上的方式来创建集群。

创建集群,将 Ingress 端口 80 映射到本地主机的 8081 端口

k3d cluster create --api-port 6550 -p "8081:80@loadbalancer" --agents 2

相关说明:

--api-port 6550 对于此示例的运行并非必需。它用于让 K3s 的 API 服务器监听 6550 端口,并将该端口映射到主机系统。

端口映射结构 8081:80@loadbalancer 表示:“将主机的 8081 端口映射到匹配 loadbalancer 节点过滤器的容器的 80 端口”。

loadbalancer 节点过滤器仅匹配部署在集群服务器节点前端的 serverlb。

serverlb 上暴露的所有端口都将代理到集群中所有服务器节点上的相同端口。

获取 kubeconfig 文件(此步骤多余,因为 k3d cluster create 已经将其合并到你的默认 kubeconfig 文件中)

export KUBECONFIG="$(k3d kubeconfig write k3s-default)"

创建 Nginx 部署

kubectl create deployment nginx --image=nginx

为其创建 ClusterIP 服务

kubectl create service clusterip nginx --tcp=80:80

为其创建 Ingress 对象

将以下清单复制到一个文件中,并使用 kubectl apply -f <文件名>.yaml 来应用。

  • 注意:K3s 默认部署 Traefik 作为 Ingress 控制器。
# apiVersion: networking.k8s.io/v1beta1 # 适用于 k3s < v1.19
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

通过本地主机进行测试

curl localhost:8081/

2. 通过 NodePort

创建集群,将代理节点 0 的 30080 端口映射到本地主机的 8082 端口

k3d cluster create mycluster -p "8082:30080@agent:0" --agents 2
注意事项:
Kubernetes 的默认 NodePort 范围是 30000 - 32767。
你也可以从一开始就暴露整个 NodePort 范围,例如通过 k3d cluster create mycluster --agents 3 -p "30000 - 32767:30000 - 32767@server:0"(可参考 @portainer 的这个视频)。
警告:Docker 会为每个端口映射创建 iptables 规则和一个新的代理进程,因此这可能会花费很长时间,甚至导致系统冻结!

后续步骤(步骤 2 和 3 与上面通过 Ingress 的方式相同)。

为其创建 NodePort 服务

将以下清单复制到一个文件中,并使用 kubectl apply -f 来应用。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - name: 80-80
    nodePort: 30080
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort

通过本地主机进行测试

curl localhost:8082/