Dor*_*rin 15 kubernetes kubernetes-ingress
我尝试在kubernetes群集上配置入口。我按照文档安装了入口控制器并运行了以下命令
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml
Run Code Online (Sandbox Code Playgroud)
在运行默认的http-backend和nginx-ingress-controller之后:
ingress-nginx default-http-backend-846b65fb5f-6kwvp 1/1 Running 0 23h 192.168.2.28 node1
ingress-nginx nginx-ingress-controller-d658896cd-6m76j 1/1 Running 0 6m 192.168.2.31 node1
Run Code Online (Sandbox Code Playgroud)
我尝试测试入口,并部署了以下服务:
apiVersion: apps/v1
kind: Deployment
metadata:
name: echoserver-deploy
spec:
replicas: 2
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: my-echo
image: gcr.io/google_containers/echoserver:1.8
---
apiVersion: v1
kind: Service
metadata:
name: echoserver-svc
spec:
selector:
app: echo
ports:
- protocol: TCP
port: 8080
targetPort: 8080
Run Code Online (Sandbox Code Playgroud)
以及以下入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: happy-ingress
annotations:
INGRESS.kubernetes.io/rewrite-target: /
spec:
rules:
- host: happy.k8s.io
http:
paths:
- path: /echoserver
backend:
serviceName: echoserver-svc
servicePort: 8080
Run Code Online (Sandbox Code Playgroud)
当我运行命令“ kubectl get ing”时,我收到:
NAME HOSTS ADDRESS PORTS AGE
happy-ingress happy.k8s.io 80 14m
Run Code Online (Sandbox Code Playgroud)
我没有解决ADDRESS,也无法弄清楚问题出在哪里,因为所有Pod都在运行。您能给我提示一下这个问题可能是什么吗?
谢谢
Jam*_*_SO 12
入口问题特定于您的实施,所以让我只讨论没有负载均衡器的裸机 LAN 实施。
入口资源的关键验证点是它获取一个地址(毕竟,如果入口没有与之关联的地址,我应该点击什么?)所以如果你这样做
kubectl get ingress some-ingress
Run Code Online (Sandbox Code Playgroud)
一遍又一遍(给它 30 秒左右)但它从来没有显示过地址 - 现在怎么办?
在裸机 LAN 上存在一些问题点。首先,确保您的 Ingress资源可以找到您的 Ingress控制器- 因此(暂时搁置控制器规范)您的资源需要能够通过以下方式找到您的控制器:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-api-ingress
annotations:
kubernetes.io/ingress.class: nginx
Run Code Online (Sandbox Code Playgroud)
您的控制器有如下条目:
Labels: app.kubernetes.io/component=controller
app.kubernetes.io/instance=ingress-nginx
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=ingress-nginx
app.kubernetes.io/version=1.0.4
helm.sh/chart=ingress-nginx-4.0.6
Run Code Online (Sandbox Code Playgroud)
但现在让我们回退一步 - 您的控制器 - 它的设置是否适合您(在我的例子中)的裸机 LAN 实施?(云提供商使这一切变得非常简单,因此我为私有云社区中的朋友提供这个答案)
问题是,您需要在 Ingress控制器部署中将这一基本的 hostNetwork 设置设为 true。因此,不要使用基本的 yamil ( https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml ) - wget 它,并且修改它以设置部署规范模板的规范,以便 hostNetwork: true - 类似于(向下滚动到末尾):
# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
helm.sh/chart: ingress-nginx-4.0.6
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 1.0.4
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
revisionHistoryLimit: 10
minReadySeconds: 0
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
spec:
dnsPolicy: ClusterFirst
containers:
- name: controller
image: k8s.gcr.io/ingress-nginx/controller:v1.0.4@sha256:545cff00370f28363dad31e3b59a94ba377854d3a11f18988f5f9e56841ef9ef
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
args:
- /nginx-ingress-controller
- --election-id=ingress-controller-leader
- --controller-class=k8s.io/ingress-nginx
- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
runAsUser: 101
allowPrivilegeEscalation: true
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: LD_PRELOAD
value: /usr/local/lib/libmimalloc.so
livenessProbe:
failureThreshold: 5
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
ports:
- name: http
containerPort: 80
protocol: TCP
- name: https
containerPort: 443
protocol: TCP
- name: webhook
containerPort: 8443
protocol: TCP
volumeMounts:
- name: webhook-cert
mountPath: /usr/local/certificates/
readOnly: true
resources:
requests:
cpu: 100m
memory: 90Mi
nodeSelector:
kubernetes.io/os: linux
serviceAccountName: ingress-nginx
terminationGracePeriodSeconds: 300
hostNetwork: true
volumes:
- name: webhook-cert
secret:
secretName: ingress-nginx-admission
Run Code Online (Sandbox Code Playgroud)
部署它,然后设置您的入口资源,如上所述。
您的关键测试是:
最后说明:Ingress 在过去几年中发生了很大变化,教程经常提供未通过验证的示例 - 如果此答案已过时,请随时对此答案发表评论
Sha*_*uza 10
ingress addons创建入口规则之前,必须先通过命令启用。您还可以在执行任何其他命令之前启用它
$ minikube addons enable ingress
ingress was successfully enabled
Run Code Online (Sandbox Code Playgroud)
等到吊舱启动并运行。您可以通过执行以下命令来检查并等待类似的输出
kubectl get pods -n kube-system | grep nginx-ingress-controller
nginx-ingress-controller-5984b97644-jjng2 1/1 Running 2 1h
Run Code Online (Sandbox Code Playgroud)
因为Deployment您必须指定containerPort和并且Service必须指定http协议。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: echoserver-deploy
spec:
replicas: 2
selector:
matchLabels:
app: my-echo
template:
metadata:
labels:
app: my-echo
spec:
containers:
- name: my-echo
image: gcr.io/kubernetes-e2e-test-images/echoserver:2.1
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: echoserver-svc
spec:
selector:
app: my-echo
ports:
- protocol: TCP
port: 80
targetPort: 8080
name: http
Run Code Online (Sandbox Code Playgroud)
对于入口规则,将端口servicePort从8080 更改为默认的http端口80。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: happy-ingress
annotations:
INGRESS.kubernetes.io/rewrite-target: /
spec:
rules:
- host: happy.k8s.io
http:
paths:
- path: /echoserver
backend:
serviceName: echoserver-svc
servicePort: 80
Run Code Online (Sandbox Code Playgroud)
现在应用这些文件并创建您的Pod,服务和入口规则。请稍等片刻,这将花费一些时间来获取您的入口规则的地址。
现在,您可以使用minikube ip地址访问您的服务,但不能按主机名访问。为此,您必须在/etc/hosts文件中添加主机和相应的IP地址。因此/etc/hosts,请在您喜欢的编辑器中打开文件,然后在下面的行中添加minikube的实际IP地址
<minikube_ip> happy.k8s.io
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用主机名访问服务。验证以下命令
curl http://happy.k8s.io/echoserver
Run Code Online (Sandbox Code Playgroud)
正如官方文件所说:
因为 NodePort 服务没有得到定义分配的 LoadBalancerIP,NGINX Ingress 控制器不会更新它管理的 Ingress 对象的状态
您已经按照安装指南中的描述部署了 NGINX Ingress 控制器,所以您的 ADDRESS 为空是正常的!
相反,外部客户端必须将分配给 ingress-nginx 服务的 NodePort 附加到 HTTP 请求。
附:这个问题不是关于 minikube
您hostname happy.k8s.io应该解析为 nginx-ingress-controller 的实际 IP 地址,该地址指向负载均衡器的前端。
您可以检查集群在哪个 IP 下工作:
bash-3.2$ kubectl cluster-info
Kubernetes master is running at https://192.168.1.100:8443
KubeDNS is running at https://192.168.1.100:8443/api/v1/namespaces/kube-
system/services/kube-dns:dns/proxy
Run Code Online (Sandbox Code Playgroud)
使用以下命令测试集群的入口控制器curl
bash-3.2$ curl http://192.168.1.100:8080
default backend - 404
Run Code Online (Sandbox Code Playgroud)
最后,您应该将域条目添加到/etc/hosts:
192.168.1.100 happy.k8s.io
Run Code Online (Sandbox Code Playgroud)
我不知道这是否会有所帮助,但我遇到了同样的问题。我没有安装任何入口控制器或一些人在 Github 上所说的任何东西,我只是创建了一个入口,以便能够将我的子域指向不同的服务,起初我的入口没有 IP 地址(它是空的)。
NAME HOSTS ADDRESS PORTS AGE
ingress delivereo.tk,back.delivereo.tk 80 39s
Run Code Online (Sandbox Code Playgroud)
我认为这是因为我的前端应用程序和后端 api 的 2 个服务具有 LoadBalancer 的类型。我将其更改为 NodePort,因为它们现在不需要外部 ip,因为入口控制器将管理 url 的去向。
当我确实将我的服务类型更改为 NodePort 时,2 或 3 分钟后出现了 Ingress 的 IP 地址。当我将 Cloudflare DNS 指向新的 Ingress IP 时,我测试了我的子域并且它工作正常!
前
apiVersion: v1
kind: Service
metadata:
name: delivereotk
spec:
ports:
- port: 80
selector:
app: delivereotk
type: LoadBalancer
Run Code Online (Sandbox Code Playgroud)
后
apiVersion: v1
kind: Service
metadata:
name: delivereotk
spec:
ports:
- port: 80
selector:
app: delivereotk
type: NodePort
Run Code Online (Sandbox Code Playgroud)
入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
spec:
rules:
- host: delivereo.tk
http:
paths:
- backend:
serviceName: delivereotk
servicePort: 80
- host: back.delivereo.tk
http:
paths:
- backend:
serviceName: backdelivereotk
servicePort: 80
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17443 次 |
| 最近记录: |