GVKun编程网logo

使用Secrets输入密码时无法连接到Kubernetes中的mysql pod(拒绝访问)

15

针对使用Secrets输入密码时无法连接到Kubernetes中的mysqlpod和拒绝访问这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展centos7下kubernetes(9。kube

针对使用Secrets输入密码时无法连接到Kubernetes中的mysql pod拒绝访问这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展centos7下kubernetes(9。kubernetes中用label控制pod得位置)、GitLab CI运行程序无法连接到Kubernetes中的unix:///var/run/docker.sock、Kubernetes as Database: 使用kubesql查询kubernetes资源、kubernetes Pod无法(通过服务)连接到自身,只能连接到其他Pod容器等相关知识,希望可以帮助到你。

本文目录一览:

使用Secrets输入密码时无法连接到Kubernetes中的mysql pod(拒绝访问)

使用Secrets输入密码时无法连接到Kubernetes中的mysql pod(拒绝访问)

我尝试在Kubernetes中设置一个mysql数据库。我配置了一个ConfigMap来存储数据库名称和一个Secret,其中包含根密码,用户和用户密码。

之后,当我尝试连接到数据库时(在mysql cli的容器内部以及IntelliJ
Database工具的外部),我得到一个“错误1045(28000):用户’testadm’@’localhost’的访问被拒绝(使用密码:是)”错误。

我的kubernetes.yaml文件:

apiVersion: v1kind: ConfigMapmetadata:  name: dbdata:  mysql-database: database---apiVersion: v1kind: Secretmetadata:   name: db-credentialstype: Opaquedata:  mysql-root-password: VGVzdDEyMzQK # Test1234  mysql-user: dGVzdGFkbQo= # testadm  mysql-password: VGVzdDEyMzQK # Test1234---apiVersion: apps/v1beta1kind: Deploymentmetadata:  name: mysqlspec:  replicas: 1  strategy:    type: Recreate  template:    metadata:      labels:        app: mysql    spec:      containers:        - name: mysql          image: mysql:5.7          ports:            - containerPort: 3306          env:            - name: MYSQL_DATABASE              valueFrom:                configMapKeyRef:                  name: db                  key: mysql-database            - name: MYSQL_ROOT_PASSWORD              valueFrom:                secretKeyRef:                  name: db-credentials                  key: mysql-root-password            - name: MYSQL_USER              valueFrom:                secretKeyRef:                  name: db-credentials                  key: mysql-user            - name: MYSQL_PASSWORD              valueFrom:                secretKeyRef:                  name: db-credentials                  key: mysql-password

如果我直接像下面那样设置密码,则连接成功 在容器内部和外部进行!

env:  - name: MYSQL_ROOT_PASSWORD    value: Test1234

如果检查容器内的env变量,则无法发现这两种方法之间的差异。

使用秘密中存储的密码是否需要其他格式?我还尝试将值放在数据字典中,如下所示:

data:  mysql-root-password: "VGVzdDEyMzQK"

版本信息

Docker 17.06.0-ceMinikube 0.21.0Kubectl Server 1.7.0Kubectl Client 1.7.3

答案1

小编典典

您可以使用此yaml文件。

apiVersion: v1kind: Secretmetadata:   name: db-credentialstype: Opaquedata:  mysql-password: VGVzdDEyMzQ=  mysql-root-password: VGVzdDEyMzQ=  mysql-user: dGVzdGFkbQ==

centos7下kubernetes(9。kubernetes中用label控制pod得位置)

centos7下kubernetes(9。kubernetes中用label控制pod得位置)

Kubernetes通过label实现将pod运行在指定得node上。

默认配置下,Schesuler将pod调度到所有可用得node,有时候我们希望将pod部署到指定得node,比如将有大量磁盘I/O得pod部署到配置了SSD得node;或者pod需要GPU,需要运行在配置了GPU得节点上

label是key-value对,各种资源都可以设置label,灵活添加各种自定义得属性;

可以执行如下命令设置node得label

kubectl label node k8snode2  disktype=ssd

通过  kubectl get node --show-labels   查看node得label

 

 

node有了distktype得自定义label,接下来就可以将pod部署到K8S-node1,编辑nginx.yml

在pod模板的spec里通过nodeSelector指定将此pod部署到具有label disktype=ssd的node上。

 

 

重新部署deployment,并查看pod

pod已经按照预期运行在node2上面了

 

 

如果要删除node上的label,执行如下命令

 

kubectl label node k8snode2 disktype-

 

但是如果在部署deployment,pod依然会运行在node2上面,需要在nginx1.yml中将

 

 nodeSelector:
        disktype: ssd

删除,然后再通过kubectl apply -f进行重新部署,K8s会将原来的pod删除并调度和运行新的pod

 

GitLab CI运行程序无法连接到Kubernetes中的unix:///var/run/docker.sock

GitLab CI运行程序无法连接到Kubernetes中的unix:///var/run/docker.sock

如何解决GitLab CI运行程序无法连接到Kubernetes中的unix:///var/run/docker.sock?

不需要使用此:

DOCKER_DRIVER: overlay

因为似乎不支持OVERLAY,所以svc-0容器无法启动它:

$ kubectl logs -f `kubectl get pod |awk ''/^runner/{print $1}''` -c svc-0
time="2017-03-20T11:19:01.954769661Z" level=warning msg="[!] DON''T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON''T KNow WHAT YOU''RE DOING [!]"
time="2017-03-20T11:19:01.955720778Z" level=info msg="libcontainerd: new containerd process, pid: 20"
time="2017-03-20T11:19:02.958659668Z" level=error msg="''overlay'' not found as a supported filesystem on this host. Please ensure kernel is new enough and has overlay support loaded."

另外,添加export DOCKER_HOST="tcp://localhost:2375"到docker-build:

 docker-build:
  stage: package
  script:
  - export DOCKER_HOST="tcp://localhost:2375"
  - docker build -t gitlab.my.com/group/app .
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN gitlab.my.com/group/app
  - docker push gitlab.my.com/group/app

解决方法

GitLab在kubernetes集群中运行。Runner无法使用构建工件构建docker映像。我已经尝试了几种方法来解决此问题,但是没有运气。以下是一些配置摘要:

.gitlab-ci.yml

image: docker:latest
services:
  - docker:dind

variables:
  DOCKER_DRIVER: overlay

stages:
  - build
  - package
  - deploy

maven-build:
  image: maven:3-jdk-8
  stage: build
  script: "mvn package -B --settings settings.xml"
  artifacts:
    paths:
      - target/*.jar

docker-build:
  stage: package
  script:
  - docker build -t gitlab.my.com/group/app .
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN gitlab.my.com/group/app
  - docker push gitlab.my.com/group/app

config.toml

concurrent = 1
check_interval = 0

[[runners]]
  name = "app"
  url = "https://gitlab.my.com/ci"
  token = "xxxxxxxx"
  executor = "kubernetes"
  [runners.kubernetes]
    privileged = true
    disable_cache = true

打包阶段日志:

running with gitlab-ci-multi-runner 1.11.1 (a67a225)
  on app runner (6265c5)
Using Kubernetes namespace: default
Using Kubernetes executor with image docker:latest ...
Waiting for pod default/runner-6265c5-project-4-concurrent-0h9lg9 to be running,status is Pending
Waiting for pod default/runner-6265c5-project-4-concurrent-0h9lg9 to be running,status is Pending
Running on runner-6265c5-project-4-concurrent-0h9lg9 via gitlab-runner-3748496643-k31tf...
Cloning repository...
Cloning into ''/group/app''...
Checking out 10d5a680 as master...
Skipping Git submodules setup
Downloading artifacts for maven-build (61)...
Downloading artifacts from coordinator... ok        id=61 responseStatus=200 OK token=ciihgfd3W
$ docker build -t gitlab.my.com/group/app .
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
ERROR: Job failed: error executing remote command: command terminated with non-zero exit code: Error executing in Docker Container: 1

我究竟做错了什么?

Kubernetes as Database: 使用kubesql查询kubernetes资源

Kubernetes as Database: 使用kubesql查询kubernetes资源

写在前面

kubectl虽然查询单个的kubernetes资源或者列表都已经比较方便,但是进行更为多个资源的联合查询(比如pod和node),以及查询结果的二次处理方面却是kubectl无法胜任的。所以一直以来,我都有想法将kubernetes作为数据库进行查询。在去年,我开发了第二个版本的kubesql。相关信息在https://xuxinkun.github.io/2019/03/11/kubesql/,代码留存在https://github.com/xuxinkun/kubesql/tree/python。这个版本较之我最早的spark离线方式已经有所改观,但是无法应对中型、甚至较小规模的集群,性能上存在较大问题。部署上也较为繁杂,且不够稳定,有一些bug(会异常退出)。而且对于label等字段都无法处理,可用性较差。我总起来不满意,但是一直没时间去重构。直到最近,听了关于presto的一个分享,我感觉重构的机会来了。

这一次kubesql完全抛弃了原有的架构,基于presto进行开发。这里摘抄一段presto的简介:presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。Presto的设计和编写完全是为了解决像Facebook这样规模的商业数据仓库的交互式分析和处理速度的问题。presto具有丰富的插件接口,可以极为便捷的对接外部存储系统。

考虑使用presto的主要原因是避免了SQL查询引擎的逻辑耦合到kubesql中,同时其稳定和高性能保证了查询的效率。这样kubesql的主要逻辑专注于获取k8s的resource变化,以及将resource转化为关系型数据的逻辑上。

kubesql使用

重构后的kubesql开源项目地址在https://github.com/xuxinkun/kubesql。

先介绍下如何部署和使用。部署方式目前主要使用docker部署,很快会支持k8s的部署方式。

部署前需要获取kubeconfig。假设kubeconfig位于/root/.kube/config路径下,则只要一条命令即可运行。

docker run -it -d --name kubesql -v /root/.kube/config:/home/presto/config xuxinkun/kubesql:latest

如果桥接网络不能通k8s api,则可以使用物理机网络,加入--net=host参数即可。注意presto端口使用8080,可能会有端口冲突。

而后就可以进行使用了。使用命令为

docker exec -it kubesql presto --server localhost:8080 --catalog kubesql --schema kubesql

这时自动进入交互式查询模式,即可进行使用了。目前已经支持了pods和nodes两种资源的查询,对应为三张表,nodes,pods和containers(container是从pod中拆出来的,具体原因见下文原理一节)。

三张表支持的列参见https://github.com/xuxinkun/kubesql/blob/master/docs/table.md。

presto支持一些内置的函数,可以用这些函数来丰富查询。https://prestodb.io/docs/current/functions.html。

这里我举一些使用kubesql查询的例子。

比如想要查询每个pod的cpu资源情况(requests和limits)。

presto:kubesql> select pods.namespace,pods.name,sum("requests.cpu") as "requests.cpu" ,sum("limits.cpu") as "limits.cpu" from pods,containers where pods.uid = containers.uid group by pods.namespace,pods.name
     namespace     |                 name                 | requests.cpu | limits.cpu 
-------------------+--------------------------------------+--------------+------------
 rongqi-test-01    | rongqi-test-01-202005151652391759    |          0.8 |        8.0 
 ljq-nopassword-18 | ljq-nopassword-18-202005211645264618 |          0.1 |        1.0 

又比如我想要查询每个node上剩余可以分配的cpu情况(用node上allocatable.cpu减去node上所有pod的requests.cpu的总和)

presto:kubesql> select nodes.name, nodes."allocatable.cpu" - podnodecpu."requests.cpu" from nodes, (select pods.nodename,sum("requests.cpu") as "requests.cpu" from pods,containers where pods.uid = containers.uid group by pods.nodename) as podnodecpu where nodes.name = podnodecpu.nodename;
    name     |       _col1        
-------------+--------------------
 10.11.12.29 | 50.918000000000006 
 10.11.12.30 |             58.788 
 10.11.12.32 | 57.303000000000004 
 10.11.12.34 |  33.33799999999999 
 10.11.12.33 | 43.022999999999996 

再比如需要查询所有所有2020-05-12后创建的pod。

presto:kube> select name, namespace,creationTimestamp from pods where creationTimestamp > date(''2020-05-12'') order by creationTimestamp desc;
                         name                         |        namespace        |    creationTimestamp    
------------------------------------------------------+-------------------------+-------------------------
 kube-api-webhook-controller-manager-7fd78ddd75-sf5j6 | kube-api-webhook-system | 2020-05-13 07:56:27.000 

还可以根据标签来查询,查询所有标签的appid是springboot,且尚未调度成功的pod。以及计数。

标签appid在pods表里则会有一列,列名为"labels.appid",使用该列作为条件来删选pod。

presto:kubesql> select namespace,name,phase from pods where phase = ''Pending'' and "labels.appid" = ''springboot'';
     namespace      |     name     |  phase  
--------------------+--------------+---------
 springboot-test-rd | v6ynsy3f73jn | Pending 
 springboot-test-rd | mu4zktenmttp | Pending 
 springboot-test-rd | n0yvpxxyvk4u | Pending 
 springboot-test-rd | dd2mh6ovkjll | Pending 
 springboot-test-rd | hd7b0ffuqrjo | Pending
 
 presto:kubesql> select count(*) from pods where phase = ''Pending'' and "labels.appid" = ''springboot'';
  _col0 
 -------
      5 

kubesql原理

kubesql的架构如图所示:

kubesql-arc

kubesql里主要有三个模块部分:

  • kubesql-watcher: 监听k8s api pod和node的变化。并将pod和node的结构化数据转化为关系型数据(以Map的方式进行保存)。
  • kubecache: 用于缓存pod和node的数据。
  • kubesql-connector: 作为presto的connector,接受来自presto的调用,通过kubecache查询列信息和对应数据,并返回给presto关于列和数据的信息。

其中最主要的部分是kubesql-connector。presto插件开发指南可以参考https://prestodb.io/docs/current/develop.html。我没有选择从零开始,而是基于已有的localfile插件https://github.com/prestodb/presto/tree/0.234.2/presto-local-file进行的开发。如何进行presto的插件开发,后面我再写文章来解读。

由于所有数据都缓存在内存中,因此几乎无磁盘需求。但是也需要根据集群的规模来提供较大的内存。

以pod数据为例,pod中主要数据分成三部分,metadata,spec和status。

metadata中比较难以处理的部分是label和annotation。我将label这个map进行展平,每个key都作为一列。比如

labels:
    app: mysql
    owner: xxx

我使用labels作为前缀,拼合labels里面的key作为列名。从而得到两条数据为:

labels.app: mysql
labels.owner: xxx

对于pod A存在app的label但是pod B并没有该标签,则对于pod B来说,该列labels.app的值则为null。

类似的annotations也是类似的处理方式。从而让annotations也就可以成为可以用于筛选pod的条件了。

对于spec来说,最大的困难在于containers的处理。因为一个pod里面可能有若干个containers,因此我直接将containers作为一张新的表。同时在containers表里增加一个uid的列,用来表明该行数据来自于哪个pod。containers里面的字段也对应都加入到containers表中。containers中比较重要的关于资源的如request和limit,我直接使用requests.作为前缀,拼合resource作为列名。比如requests.cpurequests.memory等。这里cpu的单独处理为double类型,单位为核,比如100m这里会转化为0.1。内存等则为bigint,单位为B。

对于status中,比较难于处理的是conditions和containerStatus。conditions是一个列表,但是每个condition的type不相同。因此我将type作为前缀,用来生成conditon的列名。比如:

  conditions:
  - lastProbeTime: null
    lastTransitionTime: 2020-04-22T09:03:10Z
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: 2020-04-22T09:03:10Z
    status: "True"
    type: ContainersReady

那么在pod表中,我对应可以得到这些列:

Column Type Extra Comment
containersready.lastprobetime timestamp
containersready.lasttransitiontime timestamp
containersready.message varchar
containersready.reason varchar
containersready.status varchar
ready.lastprobetime timestamp
ready.lasttransitiontime timestamp
ready.message varchar
ready.reason varchar
ready.status varchar

这样我就可以通过"ready.status" = "True" 来筛选condition里type为ready且status为True的pod了。

containerStatus因为与containers一一对应,因此我将containerStatus合并到containers表里,并且根据container name一一对应起来。

后记

本次重构后kubesql我直接发布为1.0.0版本,并且已经在日常使用了。且借助于内存和presto的高性能,我测试过5万pod的集群,查询时间为毫秒级。目前暂未发现明显的bug。大家有发现bug或者新的feature也可以提issue给我。我后期也会再维护该项目。

因为目前只有pods和nodes资源,相对于k8s庞大的资源来说,还只是冰山一角。但是增加每个资源要加入相当数量的代码。我也在考虑如何使用openapi的swagger描述来自动生成代码。

部署上现在是用docker来部署,马上也会增加kubernetes的部署方式,这样会更加便捷。

同时我在考虑,在未来,让presto的每个worker负责一个集群的cache。这样一个presto集群可以查询所有的k8s集群的信息。该功能还需要再做设计和考虑。

kubernetes Pod无法(通过服务)连接到自身,只能连接到其他Pod容器

kubernetes Pod无法(通过服务)连接到自身,只能连接到其他Pod容器

如何解决kubernetes Pod无法(通过服务)连接到自身,只能连接到其他Pod容器?

感谢所有在GitHub上提供帮助的人。 解决方法如下:

tanen01评论于2月4日在k8s v1.1.7稳定版中看到了相同的问题

问题发生于:

kube-proxy --proxy-mode=iptables

一旦我将其更改为:

           --proxy-mode=userspace

(也是默认值),然后它将再次起作用。

因此,如果遇到这种情况,请--proxy-mode在启动时尝试将其关闭kube-proxy

解决方法

我有一个kubernetes单节点设置(请参阅https://coreos.com/kubernetes/docs/latest/kubernetes-
on-vagrant-single.html)

我有一个服务和一个创建吊舱的复制控制器。这些Pod需要连接到同一服务中的其他Pod(注意:这最终是使我可以使mongo运行带有副本集(非localhost),但是此简单示例演示了mongo的问题)。

当我从任何节点连接到服务时,它将(按预期方式)分发到其中一个Pod。这将一直工作到负载平衡到自身(我所在的容器)为止。然后它无法连接。

抱歉,很冗长,但是我将附加所有文件,以便您可以在此小示例中看到我的工作。

Dockerfile:

FROM ubuntu
MAINTAINER Eric H
RUN apt-get update; apt-get install netcat
EXPOSE 8080
COPY ./entry.sh /
ENTRYPOINT ["/entry.sh"]

这是入口

#!/bin/bash
# wait for a connection,then tell them who we are 
while : ; do 
    echo "hello,the date=`date`; my host=`hostname`" | nc -l 8080 
    sleep .5
done

建立dockerfile

docker build -t echoserver .

标记并上传到我的k8s集群的注册表

docker tag -f echoserver:latest 127.0.0.1:5000/echoserver:latest
docker push 127.0.0.1:5000/echoserver:latest

这是我的复制控制器

apiVersion: v1
kind: ReplicationController
metadata:
  labels:
    role: echo-server
    app: echo
  name: echo-server-1
spec:
  replicas: 3
  template:
    metadata:
      labels:
        entity: echo-server-1
        role: echo-server
        app: echo
    spec:
      containers:
      - 
        image: 127.0.0.1:5000/echoserver:latest
        name: echo-server-1

        ports:
          - containerPort: 8080

最后,这是我的服务

kind: Service
metadata:
  labels:
    app: echo
    role: echo-server
    name: echo-server-1
  name: echo-server-1
spec:
  selector:
    entity: echo-server-1
    role: echo-server
  ports:
    - port: 8080
      targetPort: 8080

创建我的服务 kubectl create -f echo.service.yaml

创建我的rc kubectl create -f echo.controller.yaml

获取我的POD

kubectl get po
NAME                  READY     STATUS    RESTARTS   AGE
echo-server-1-jp0aj   1/1       Running   0          39m
echo-server-1-shoz0   1/1       Running   0          39m
echo-server-1-y9bv2   1/1       Running   0          39m

获取服务IP

kubectl get svc
NAME            CLUSTER_IP   EXTERNAL_IP   PORT(S)    SELECTOR                                AGE
echo-server-1   10.3.0.246   <none>        8080/TCP   entity=echo-server-1,role=echo-server   39m

进入其中一个豆荚 kubectl exec -t -i echo-server-1-jp0aj /bin/bash

现在多次连接到该服务…它将为我提供所有Pod的应用程序消息,除了到达其自身时会挂起。

root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello,the date=Mon Jan 11 22:02:38 UTC 2016; my host=echo-server-1-y9bv2
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
^C
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello,the date=Mon Jan 11 22:02:43 UTC 2016; my host=echo-server-1-shoz0
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
^C
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello,the date=Mon Jan 11 22:31:19 UTC 2016; my host=echo-server-1-y9bv2
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello,the date=Mon Jan 11 22:31:23 UTC 2016; my host=echo-server-1-shoz0
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello,the date=Mon Jan 11 22:31:26 UTC 2016; my host=echo-server-1-y9bv2
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello,the date=Mon Jan 11 22:31:27 UTC 2016; my host=echo-server-1-shoz0
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080

如何配置事物,以便服务的所有成员都可以连接到所有其他成员,包括自身?

关于使用Secrets输入密码时无法连接到Kubernetes中的mysql pod拒绝访问的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于centos7下kubernetes(9。kubernetes中用label控制pod得位置)、GitLab CI运行程序无法连接到Kubernetes中的unix:///var/run/docker.sock、Kubernetes as Database: 使用kubesql查询kubernetes资源、kubernetes Pod无法(通过服务)连接到自身,只能连接到其他Pod容器的相关知识,请在本站寻找。

本文标签: