我希望能够在不使用Digital Ocean的负载均衡器的情况下,在端口80上公开我的Kubernetes托管的Digital Ocean(单节点)集群服务。这是否有可能?我该如何实现?
这基本上是一个业余项目(我正在开始学习Kubernetes),只想保持成本非常低。
我希望能够在不使用Digital Ocean的负载均衡器的情况下,在端口80上公开我的Kubernetes托管的Digital Ocean(单节点)集群服务。这是否有可能?我该如何实现?
这基本上是一个业余项目(我正在开始学习Kubernetes),只想保持成本非常低。
$ doctl compute firewall create \
--inbound-rules="protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0" \
--tag-names=k8s:CLUSTER_UUID \
--name=k8s-extra-mycluster
从仪表板或doctl kubernetes cluster list
的ID列中获取CLUSTER_UUID
值。
编辑:上面链接中的Helm图表已被弃用,因此安装图表的正确方式(根据新文档)是:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
在该仓库添加并更新后{{}}
# For Helm 2
$ helm install stable/nginx-ingress --name=myingress -f myingress.values.yml
# For Helm 3
$ helm install myingress stable/nginx-ingress -f myingress.values.yml
#EDIT: The New way to install in helm 3
helm install myingress ingress-nginx/ingress-nginx -f myingress.values.yaml
用于图表的myingress.values.yml
:
---
controller:
kind: DaemonSet
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
daemonset:
useHostPort: true
service:
type: ClusterIP
rbac:
create: true
您应该能够通过任何工作节点IP访问集群的:80和:443端口,并且它将路由流量到您的Ingress。
由于节点IP可能会更改,因此请考虑部署external-dns来管理DNS条目以指向您的工作节点。同样,使用helm图表并假设您的DNS域由DigitalOcean托管(尽管任何受支持的DNS提供商都可以使用):
# For Helm 2
$ helm install --name=mydns -f mydns.values.yml stable/external-dns
# For Helm 3
$ helm install mydns stable/external-dns -f mydns.values.yml
mydns.values.yml
用于图表:
---
provider: digitalocean
digitalocean:
# create the API token at https://cloud.digitalocean.com/account/api/tokens
# needs read + write
apiToken: "DIGITALOCEAN_API_TOKEN"
domainFilters:
# domains you want external-dns to be able to edit
- example.com
rbac:
create: true
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: testing123-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: testing123.example.com # the domain you want associated
http:
paths:
- path: /
backend:
serviceName: testing123-service # existing service
servicePort: 8000 # existing service port
$ dig testing123.example.com # should return worker IP address
$ curl -v http://testing123.example.com # should send the request through the Ingress to your backend service
编辑:编辑自动创建的防火墙规则最终会出问题,应添加单独的防火墙。
helm install myingress stable/nginx-ingress -f myingress.values.yml
- hkaraskmyingress.values.yml
进行更改来解决这个问题:将 controller.publishService.enabled
设置为 false
。不确定这是否是正确的做法,但它修复了 DNS。 - 46bitk8s.mydomain
的地址。然后,每当我添加新的 nginx ingress 时,我只需向此地址添加一个 CNAME。 - mcartmell一个NodePort服务可以实现你想要的功能。就像这样:
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
type: NodePort
selector:
app: MyApp
ports:
- protocol: TCP
nodePort: 80
targetPort: 80
LoadBalancer
的情况下将ingress controller service
暴露给外部用户的唯一方法吗?当我使用NodePort
时,我必须通过使用Nginx
或Apache
将80绑定到NodePort(在30000〜32767之间)。 - Jinsu