Istio阻止与MySQL的连接

时间:2018-12-27 15:01:05

标签: kubernetes istio

我想为Kubernetes部署java petstore。为了实现这一点,我有 2个简单的部署。第一个是 java网络应用,第二个是 MySQL数据库

禁用istio时,应用程序与数据库之间的连接运行良好。
不幸的是,在注入istio sidecar时,两个之间的通信停止了。

这是Web应用程序的部署文件:

ETS$emissions

然后是mySql数据库的部署文件:

year sector      UNemissions          ETSemissions
2015 Energy      2                    10
2013 Energy      1                    5
2015 Chemicals   4                    20
2015 Metal       6                    30
2010 Metal       3                    15

最后,来自网络应用的错误日志尝试连接到数据库:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jpetstoreweb
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: jpetstoreweb
      annotations:
        sidecar.istio.io/inject: "true"
    spec:
      containers:
      - name: jpetstoreweb
        image: wingardiumleviosa/petstore:v7
        env:
          - name: VERSION
            value: "1"
          - name: DB_URL
            value: "jpetstoredb-service"
          - name: DB_PORT
            value: "3306"
          - name: DB_NAME
            value: "jpetstore"
          - name: DB_USERNAME
            value: "jpetstore"
          - name: DB_PASSWORD
            value: "foobar"
        ports:
        - containerPort: 9080
        readinessProbe:
          httpGet:
            path: /
            port: 9080
          initialDelaySeconds: 10
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: jpetstoreweb-service
spec:
  selector:
    app: jpetstoreweb
  ports:
  - port: 80
    targetPort: 9080
---

提取:apiVersion: extensions/v1beta1 kind: Deployment metadata: name: jpetstoredb spec: replicas: 1 template: metadata: labels: app: jpetstoredb annotations: sidecar.istio.io/inject: "true" spec: containers: - name: jpetstoredb image: wingardiumleviosa/petstoredb:v1 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "foobar" - name: MYSQL_DATABASE value: "jpetstore" - name: MYSQL_USER value: "jpetstore" - name: MYSQL_PASSWORD value: "foobar" --- apiVersion: v1 kind: Service metadata: name: jpetstoredb-service spec: selector: app: jpetstoredb ports: - port: 3306 targetPort: 3306


其他信息:

1)我可以使用CURL从Web应用程序容器中卷曲数据库,并且可以正确回答。

2)我用Cilium代替了Calico

3)我使用HELM安装了Istio

4)Kubernetes安装在裸机上(没有云提供商)

5)Exception thrown by application class 'org.springframework.web.servlet.FrameworkServlet.processRequest:488' org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Communication link failure: java.io.EOFException, underlying cause: null ** BEGIN NESTED EXCEPTION ** java.io.EOFException STACKTRACE: java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1395) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:1539) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1930) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1168) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1279) at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1225) at com.mysql.jdbc.Connection.execSQL(Connection.java:2278) at com.mysql.jdbc.Connection.execSQL(Connection.java:2237) at com.mysql.jdbc.Connection.execSQL(Connection.java:2218) at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:548) at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:331) at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:317) at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:221) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:350) at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:261) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at com.sun.proxy.$Proxy28.getCategory(Unknown Source) at org.springframework.samples.jpetstore.web.spring.ViewCategoryController.handleRequest(ViewCategoryController.java:31) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:874) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:808) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431) at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1255) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:743) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:440) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:182) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:93) at com.ibm.ws.security.jaspi.JaspiServletFilter.doFilter(JaspiServletFilter.java:56) at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:201) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:90) at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:996) at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1134) at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1005) at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:75) at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:927) at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:279) at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:1023) at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.wrapHandlerAndExecute(HttpDispatcherLink.java:417) at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.ready(HttpDispatcherLink.java:376) at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:532) at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleNewRequest(HttpInboundLink.java:466) at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.processRequest(HttpInboundLink.java:331) at com.ibm.ws.http.channel.internal.inbound.HttpICLReadCallback.complete(HttpICLReadCallback.java:70) at com.ibm.ws.tcpchannel.internal.WorkQueueManager.requestComplete(WorkQueueManager.java:501) at com.ibm.ws.tcpchannel.internal.WorkQueueManager.attemptIO(WorkQueueManager.java:571) at com.ibm.ws.tcpchannel.internal.WorkQueueManager.workerRun(WorkQueueManager.java:926) at com.ibm.ws.tcpchannel.internal.WorkQueueManager$Worker.run(WorkQueueManager.java:1015) at com.ibm.ws.threading.internal.ExecutorServiceImpl$RunnableWrapper.run(ExecutorServiceImpl.java:232) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1160) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.lang.Thread.run(Thread.java:812) ** END NESTED EXCEPTION ** at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:488) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431) at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 所有istio pod都在运行

6)Could not open JDBC Connection for transaction所有cilium pod都在运行

7)使用kubectl get pods -n istio-system注入Istio。如果我使用其他方法,则Istio不会将自身注入Web窗格(但是适用于DB窗格,上帝知道原因)

8)DB pod总是很高兴并且运作良好

9)WebApp容器内的istio-proxy容器的日志:kubectl get pods -n kube-system

kubectl apply -f <(~/istio-1.0.5/bin/istioctl kube-inject -f ~/jpetstore.yaml) -n foo

...

kubectl logs jpetstoreweb-84c7d8964-s642k istio-proxy -n myns

10)使用Istio 1.0.5和kubernetes 1.13.0

欢迎所有创意者;-)
谢谢

1 个答案:

答案 0 :(得分:2)

因此 Istio 1.0.5 MySQL

JDBC 确实存在问题

临时解决方案是通过以下方式删除网格资源:

kubectl delete meshpolicies.authentication.istio.io default

here和引用this所述。

(仅供参考:在部署petstore应用之前,我删除了资源。)


Istio 1.1.1 起,FAQ

中有更多有关此问题的数据