实际上可以使用NGINX Ingress来实现。
入口不支持TCP或UDP服务。为此,此入口控制器使用标志--TCP-Services-ConfigMap
和--UDP-Services-ConfigMap
来指向现有的配置映射,其中键是要使用的外部端口,值指示要公开的服务,其格式为:
。
本指南描述了如何使用minikube实现这一点,但在内部kubernetes上实现这一点是不同的,需要更多的步骤。
缺少文档来描述如何在非MiniKube系统上完成,这就是为什么我决定在这里进行所有的步骤。本指南假设您有一个未安装NGINX Ingress的新集群。
我使用的是一个GKE集群,所有命令都是从我的Linux工作站运行的。它也可以在裸机K8S集群上完成。
创建示例应用程序和服务
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-deployment
namespace: default
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- image: redis
imagePullPolicy: Always
name: redis
ports:
- containerPort: 6379
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: redis-service
namespace: default
spec:
selector:
app: redis
type: ClusterIP
ports:
- name: tcp-port
port: 6379
targetPort: 6379
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: redis-service2
namespace: default
spec:
selector:
app: redis
type: ClusterIP
ports:
- name: tcp-port
port: 6380
targetPort: 6379
protocol: TCP
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
在Kube-System命名空间上安装NGINX Ingress:
$ helm install -n kube-system ingress-nginx ingress-nginx/ingress-nginx
正在准备新的NGINX Ingress Controller部署
我们必须在spec.template.spec.containers.args下添加以下行:
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
$ kubectl edit deployments -n kube-system ingress-nginx-controller
...
spec:
containers:
- args:
- /nginx-ingress-controller
- --publish-service=kube-system/ingress-nginx-controller
- --election-id=ingress-controller-leader
- --ingress-class=nginx
- --configmap=kube-system/ingress-nginx-controller
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
...
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: kube-system
apiVersion: v1
kind: ConfigMap
metadata:
name: udp-services
namespace: kube-system
$ kubectl patch configmap tcp-services -n kube-system --patch '{"data":{"6379":"default/redis-service:6379"}}'
$ kubectl patch configmap tcp-services -n kube-system --patch '{"data":{"6380":"default/redis-service2:6380"}}'
6379
:您的服务应该从minikube虚拟机外部侦听的端口默认
:您的服务安装在其中的命名空间redis-service
:服务的名称我们可以使用以下命令验证资源是否已修补:
$ kubectl get configmap tcp-services -n kube-system -o yaml
apiVersion: v1
data:
"6379": default/redis-service:6379
"6380": default/redis-service2:6380
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"name":"tcp-services","namespace":"kube-system"}}
creationTimestamp: "2020-04-27T14:40:41Z"
name: tcp-services
namespace: kube-system
resourceVersion: "7437"
selfLink: /api/v1/namespaces/kube-system/configmaps/tcp-services
uid: 11b01605-8895-11ea-b40b-42010a9a0050
您需要验证的唯一值是data
属性下有一个值,该值如下所示:
"6379": default/redis-service:6379
"6380": default/redis-service2:6380
spec:
template:
spec:
containers:
- name: controller
ports:
- containerPort: 6379
hostPort: 6379
- containerPort: 6380
hostPort: 6380
$ kubectl patch deployment ingress-nginx-controller -n kube-system --patch "$(cat nginx-ingress-controller-patch.yaml)"
与为minikube提供的解决方案不同,我们必须为NGINX Ingress Controller服务打补丁,因为它负责公开这些端口。
spec:
ports:
- nodePort: 31100
port: 6379
name: redis
- nodePort: 31101
port: 6380
name: redis2
创建一个名为nginx-ingress-svc-controller-patch.yaml
的文件,并粘贴上面的内容。
接下来,使用以下命令应用更改:
$ kubectl patch service ingress-nginx-controller -n kube-system --patch "$(cat nginx-ingress-svc-controller-patch.yaml)"
$ kubectl get service -n kube-system ingress-nginx-controller
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.15.251.203 34.89.108.48 6379:31100/TCP,6380:31101/TCP,80:30752/TCP,443:30268/TCP 38m
$ telnet 34.89.108.48 6379
Trying 34.89.108.48...
Connected to 34.89.108.48.
Escape character is '^]'.
我们还可以测试端口6380:
$ telnet 34.89.108.48 6380
Trying 34.89.108.48...
Connected to 34.89.108.48.
Escape character is '^]'.
如果您无法连接,请查看上面的步骤。
相关文章
什么是port和targetport? 是否为每个代理设置LoadBalancer服务? 这些多个代理是否映射到cloud LB的单个公共IP地址? K8S/Cloud之外的服务如何访问单个代理?通过使用?或者使用?。还有,这里用的是哪个端口?还是? 如何在Kafka Broker的属性中指定此配置?对于k8s集群内部和外部的服务,As端口可能不同。 请帮忙。
我正在尝试建立一个多集群部署,其中有多个集群,一个入口正在负载平衡它们之间的请求。 这是我所说的正式文件。
我刚刚在我的kubernetes集群上部署了graylog。 我需要能够公开udp端口作为入口规则,在graylog下。本地主机/gelf。目前,我的服务包括: 我的服务如下: 我的入口控制器是traefik。
我有多个运行RDP应用程序的部署,它们都是通过ClusterIP服务公开的。我的k8s群集中有nginx ingress controller,为了允许tcp,我在nginx ingress controller部署中添加了tcp services configmap标志,并为其创建了configmap,如下所示 这将公开“rdp-service1”服务。我还有10个这样的服务需要在相同的端口号上
我正在尝试公开公共IPv6地址上的kubernetes TCP服务。应用程序在IPv4上运行良好,但我无法在IPv6上配置它。问题是这不是HTTP服务。当前服务按类型完成:非标准端口11042上的LoadBalancer。所以我认为它创建了网络负载均衡器。 支持IPv6的文档转发规则如下:目标HTTP代理目标HTTPS代理、目标SSL代理、目标TCP代理,但TCP代理已关闭可使用的端口列表。我也尝
框架默认提供创建 TCP/UDP 服务的能力。只需要进行简易的配置,便可使用。 使用 TCP 服务 创建 TcpServer 类 <?php declare(strict_types=1); namespace App\Controller; use Hyperf\Contract\OnReceiveInterface; class TcpServer implements OnRecei