在MacOS Docker for Mac(Edge)的K8s中部署Nginx-Ingress及本地访问问题
问题1:NodePort正常工作后,还需要执行port-forward吗?
兄弟,看你贴的kubectl get services输出,你的NodePort已经完全配置到位了——ingress controller的80端口映射到了宿主机的32706,443映射到32253。这种情况下完全没必要再做port-forward操作!
NodePort的核心作用就是把集群内部的服务端口暴露到宿主机(你的Mac)上,你直接用localhost:32706或者localhost:32253就能访问到ingress controller了。port-forward只是用来临时暴露单个Pod或服务的工具,现在NodePort已经满足了你的访问需求,多此一举反而会增加不必要的复杂度。
你提供的
kubectl get services输出参考:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d my-release-nginx-ingress-controller NodePort 10.105.64.135 <none> 80:32706/TCP,443:32253/TCP 10m my-release-nginx-ingress-default-backend ClusterIP 10.98.230.24 <none> 80/TCP 10m
问题2:Docker for Mac(Edge)上用Helm安装的Nginx Ingress能不能本地运行?怎么访问?
当然可以本地运行!Docker for Mac Edge版本对Kubernetes的支持已经非常完善,你用Helm安装的流程也完全没问题,下面给你两种具体的访问方式:
方式一:用已配置好的NodePort访问
这就是你当前采用的方式,直接在浏览器输入http://localhost:32706或者https://localhost:32253就能打到ingress controller。不过要注意,你得先创建对应的Ingress资源来路由你的业务服务,否则会返回默认backend的页面。你可以参考官方提供的示例Ingress模板,把serviceName换成你自己的服务名,servicePort改成对应的端口即可。
方式二:LoadBalancer类型的访问(若想切换回去)
你第一次安装时,ingress controller是LoadBalancer类型,EXTERNAL-IP显示<pending>——别担心,Docker for Mac Edge版本会自动把LoadBalancer服务映射到localhost,只是需要等一小会儿让集群完成配置。你可以用命令kubectl --namespace default get services -o wide -w washing-jackal-nginx-ingress-controller实时监控状态,等EXTERNAL-IP变成localhost或具体IP后,直接用这个IP+80/443端口访问就行。
额外提示:用域名访问更便捷
如果不想每次都输入端口,你可以在Ingress资源里设置一个本地域名(比如local.myapp.com),然后修改Mac上的/etc/hosts文件,把这个域名指向127.0.0.1,这样就能直接用http://local.myapp.com访问你的服务,体验和线上环境更接近。
你提供的安装步骤与输出参考:
安装命令:helm install stable/nginx-ingress
安装输出:NAME: washing-jackal LAST DEPLOYED: Thu Jan 18 12:57:40 2018 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/ConfigMap NAME DATA AGE washing-jackal-nginx-ingress-controller 1 1s ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE washing-jackal-nginx-ingress-controller LoadBalancer 10.105.122.1 <pending> 80:31494/TCP,443:32136/TCP 1s washing-jackal-nginx-ingress-default-backend ClusterIP 10.103.189.14 <none> 80/TCP 1s ==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE washing-jackal-nginx-ingress-controller 1 1 1 0 0s washing-jackal-nginx-ingress-default-backend 1 1 1 0 0s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE washing-jackal-nginx-ingress-controller-5b4d86c948-xxlrt 0/1 ContainerCreating 0 0s washing-jackal-nginx-ingress-default-backend-57947f94c6-h4sz6 0/1 ContainerCreating 0 0s NOTES: The nginx-ingress controller has been installed. It may take a few minutes for the LoadBalancer IP to be available. You can watch the status by running 'kubectl --namespace default get services -o wide -w washing-jackal-nginx-ingress-controller' An example Ingress that makes use of the controller: apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx name: example namespace: foo spec: rules: - host: www.example.com http: paths: - backend: serviceName: exampleService servicePort: 80 path: / # This section is only required if TLS is to be enabled for the Ingress tls: - hosts: - www.example.com secretName: example-tls If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided: apiVersion: v1 kind: Secret metadata: name: example-tls namespace: foo data: tls.crt: <base64 encoded cert> tls.key: <base64 encoded key> type: kubernetes.io/tls
内容的提问来源于stack exchange,提问作者Chris G.

