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/