无法从外部访问入口控制器NodePort

时间:2020-02-20 09:00:27

标签: kubernetes kubernetes-ingress

我有一个由3个虚拟机组成的集群,上面安装了kubernetes,并部署了一些我想从外部访问的Pod和服务(例如,我的本地PC)

我已按照本教程https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal来安装我的入口控制器。 我已经创建了NodePort类型的服务。 我创建了一个看起来像这样的入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
      kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: my.service.com
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 9090

kubectl get svc myservice给我:

NAME        TYPE       CLUSTER-IP        EXTERNAL-IP   PORT(S)          AGE
myservice   NodePort   xxx.xxx.xxx.xxx   <none>        9090:31220/TCP   47m

kubectl get ingress test-ingress给了我

NAME            HOSTS            ADDRESS          PORTS   AGE
test-ingress    my.service.com   xx.xxx.xxx.xxx   80      49m

在我的本地计算机上,我已经添加到/ etc / hosts,我已将入口的ip地址映射到名称my.service.com。 当我尝试ping my.service.com或直接ip时,我去请求超时100%数据包丢失。 我试图通过Web浏览器访问服务可视界面,但它也不起作用。

如何进一步调查为什么无法从集群外部访问服务?

3 个答案:

答案 0 :(得分:3)

您的防火墙可能存在问题。检查防火墙规则是否阻止外部访问该端口。

此外,您还应该在部署入口控制器时从创建的服务的NodePort访问服务。

还可以编辑您的入口,并为private IServiceProvider MockIServiceProviderForStaticResourceExtension(params KeyValuePair<object, object>[] resources) { Mock<IServiceProvider> serviceProviderMock = new Mock<IServiceProvider>(MockBehavior.Strict); Mock<IXamlSchemaContextProvider> xamlSchemaContextProviderMock = new Mock<IXamlSchemaContextProvider>(MockBehavior.Strict); Mock<IAmbientProvider> ambientProviderMock = new Mock<IAmbientProvider>(MockBehavior.Strict); Mock<XamlSchemaContext> xamlSchemaContextMock = new Mock<XamlSchemaContext>(MockBehavior.Strict); xamlSchemaContextMock.Setup(xsc => xsc.GetXamlType(It.IsAny<Type>())).Returns((Func<Type, XamlType>)(t => GetXamlTypeForType(t, xamlSchemaContextMock.Object))); ambientProviderMock.Setup(ap => ap.GetAllAmbientValues(null, false, It.IsAny<IEnumerable<XamlType>>(), It.IsAny<XamlMember[]>())).Returns((Func<IEnumerable<XamlType>, bool, IEnumerable<XamlType>, XamlMember[], IEnumerable<AmbientPropertyValue>>)GetAllAmbientValuesImplementation); xamlSchemaContextProviderMock.Setup(xscp => xscp.SchemaContext).Returns(xamlSchemaContextMock.Object); serviceProviderMock.Setup(s => s.GetService(typeof(IXamlSchemaContextProvider))).Returns(xamlSchemaContextProviderMock.Object); serviceProviderMock.Setup(s => s.GetService(typeof(IAmbientProvider))).Returns(ambientProviderMock.Object); serviceProviderMock.Setup(s => s.GetService(It.IsNotIn(typeof(IXamlSchemaContextProvider), typeof(IAmbientProvider)))).Returns(null); return serviceProviderMock.Object; IEnumerable<AmbientPropertyValue> GetAllAmbientValuesImplementation(IEnumerable<XamlType> ceilingTypes, bool searchLiveStackOnly, IEnumerable<XamlType> types, params XamlMember[] properties) { Mock<ResourceDictionary> resourceDictionaryMock = new Mock<ResourceDictionary>(MockBehavior.Strict); resourceDictionaryMock.Protected().Setup("OnGettingValue", false, ItExpr.Is<object>(o => resources.Any(kvp => kvp.Key.Equals(o))), ItExpr.Ref<object>.IsAny, ItExpr.Ref<bool>.IsAny).CallBase(); foreach (KeyValuePair<object, object> kvp in resources) { resourceDictionaryMock.Object.Add(kvp.Key, kvp.Value); } Mock<AmbientPropertyValue> ambientPropertyValueMock = new Mock<AmbientPropertyValue>(MockBehavior.Strict, null, resourceDictionaryMock.Object); return new List<AmbientPropertyValue> { ambientPropertyValueMock.Object }; } XamlType GetXamlTypeForType(Type t, XamlSchemaContext xamlSchemaContext) { Mock<XamlType> xamlTypeMock = new Mock<XamlType>(MockBehavior.Strict, t, xamlSchemaContext); xamlTypeMock.Protected().Setup<XamlMember>("LookupMember", true, "Resources", false).Returns((Func<string, bool, XamlMember>)LookupMemberImplementation); xamlTypeMock.Protected().Setup<XamlMember>("LookupMember", true, "BasedOn", false).Returns((Func<string, bool, XamlMember>)LookupMemberImplementation); xamlTypeMock.Setup(xt => xt.ToString()).CallBase(); return xamlTypeMock.Object; XamlMember LookupMemberImplementation(string name, bool skipReadOnlyCheck) { Mock<PropertyInfo> propertyInfoMock = new Mock<PropertyInfo>(MockBehavior.Strict); propertyInfoMock.Setup(pi => pi.Name).Returns(name); propertyInfoMock.Setup(pi => pi.DeclaringType).Returns(t); Mock<XamlMember> xamlMemberMock = new Mock<XamlMember>(MockBehavior.Strict, propertyInfoMock.Object, xamlSchemaContext); xamlMemberMock.Setup(xm => xm.ToString()).CallBase(); return xamlMemberMock.Object; } } } 添加带有自签名证书的tls和hosts属性

my.service.com

答案 1 :(得分:1)

ping不能使用Kubernetes服务IP。

用于服务的IP是虚拟IP,因此无法ping通。
要测试您的进入,您应该尝试使用curl来获得服务。

答案 2 :(得分:1)

您应该能够将主机标头设置为www.my.service.com

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If ComboBox1.SelectedIndex >= 0 Then  'Make sure something from dropdown selected

        Dim connString As String = String.Format("Database='{0}';Data Source='{1}';User Id=root;", GetODBCValue(ComboBox1.SelectedItem, "Database"), GetODBCValue(ComboBox1.SelectedItem, "Server"))

    End If
End Sub

Private Function GetODBCValue(ByVal ODBCName As String, ByVal ValueName As String) As String

    Dim reg As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software")
    reg = reg.OpenSubKey("ODBC")
    reg = reg.OpenSubKey("ODBC.INI")
    reg = reg.OpenSubKey(ODBCName)
    Return reg.GetValue(ValueName)

End Function