认证Authentication 在认证方面,K8s提供了如下的认证方式: HTTPS证书认证: 基于CA根证书签名的双向数字认证方式,比如k8s运维人员通过kubectl访问API Server 但是K8s并没有相应的资源对象或者API来支持常规的个人用户。拥有K8s集群的CA证书签名的有效证书,个人用户就可以访问K8s集群了。 · RBAC(Role-Based Access Control):基于角色的访问控制,它是目前K8s默认的授权策略。 2 Node授权 Node授权策略用于对kubelet发出的请求进行访问控制,与用户的应用授权无关,属于K8s自身安全的增强功能。 在K8s 1.7中,由于Node授权器实现了相同的目的,因此不再支持system:nodes组与system:node角色的自动绑定,从而有利于对secret 和configmap访问的附加限制。
本篇的内容主要是介绍如何配置网络,使得能够在外部网络访问集群。 Service,读者可以查看官方文档的资料:https://kubernetes.io/zh/docs/concepts/services-networking/service/ Service 是 k8s 在 k8s 中,每个 pod 都有自己的 ip 地址,而且 Service 可以为一组 pod 提供相同的 DNS ,使得多个 pod 之间可以相互通讯,k8s 可以在这些 pod 之间进行负载均衡。 Service 外部服务类型 k8s 中可以将一个 Service 暴露到集群外部,外界可以通过 ip 访问这个 Service。 这时已经可以直接通过外网访问 Service 中的服务了。
在K8S中,同一个命名空间(namespace)下的服务之间调用,之间通过服务名(service name)调用即可。 遇到这种情况,我们就需要跨命名空间访问,K8S 对service 提供了四种不同的类型,针对这个问题我们选用 ExternalName 类型的 service 即可。 k8s service 分为四种类型 分别为: ClusterIp(默认类型,每个Node分配一个集群内部的Ip,内部可以互相访问,外部无法访问集群内部) NodePort(基于ClusterIp,另外在每个 Node上开放一个端口,可以从所有的位置访问这个地址) LoadBalance(基于NodePort,并且有云服务商在外部创建了一个负载均衡层,将流量导入到对应Port。 {NAMESPACE_NAME}.svc.cluster.local这样的格式,访问目标 namespace 下的服务。
Share,来尝试搭建一套做大数据计算时候经常碰到的一种场景: K8S 化的 Spark Job 和 HDFS 交互。 Share 中有作者分享的几个 github 地址,非常有用,分别是本地部署一个 Kerberized HDFS,以及部署 Spark Pi 作业,当然了 Keytab 是在 HDFS 上的,因此需要访问到 可以看到 K8S 集群的一些信息,这里最主要是要记得 master 的地址。然后顺便安装换一下 K8S dashboard。 ? 访问 HDFS 的集群的机器都需要一个叫做 Keytab 的一个东西,也就是说,Spark Job 需要传入 Keytab 才可以读写 HDFS。 Spark on K8S 访问上,其实没太多的 trick,都集中在 Kerberos 认证的问题上,往往是 token 过期,造成无法访问,至于 long-running 还是 short-running
如果您已经运行了 Deployment 并创建了一个 Service,但是当您尝试访问它时没有得到响应,希望这份文档能帮助您找出问题所在。 Service工作逻辑 为了完成本次演练的目的,我们先运行几个 Pod $ kubectl run hostnames --image=k8s.gcr.io/serve_hostname \ 这是一个有时会被遗忘的步骤,也是第一件要检查的事情; 那么,如果我试图访问一个不存在的 Service,会发生什么呢? : "default", "selfLink": "/api/v1/namespaces/default/services/hostnames", "uid": "428c8b6c 访问日志取决于您的 Node 操作系统。在某些操作系统是一个文件,如 /var/log/messages kube-proxy.log,而其他操作系统使用 journalctl 访问日志。
如果您已经运行了 Deployment 并创建了一个 Service,但是当您尝试访问它时没有得到响应,希望这份文档能帮助您找出问题所在。 Service工作逻辑 image.png 为了完成本次演练的目的,我们先运行几个 Pod $ kubectl run hostnames --image=k8s.gcr.io/serve_hostname 这是一个有时会被遗忘的步骤,也是第一件要检查的事情; 那么,如果我试图访问一个不存在的 Service,会发生什么呢? "default", "selfLink": "/api/v1/namespaces/default/services/hostnames", "uid": "428c8b6c 访问日志取决于您的 Node 操作系统。在某些操作系统是一个文件,如 /var/log/messages kube-proxy.log,而其他操作系统使用 journalctl 访问日志。
tomcat8 manager页面限制IP访问 配置tomcat8/webapps/manager/META-INF/context.xml <Context antiResourceLocking="
如何访问 pod 元数据 我们在 pod 中运行容器的时候,是否也会有想要获取当前 pod 的环境信息呢? 咱们写的 yaml 清单写的很简单,实际上部署之后, k8s 会给我们补充在 yaml 清单中没有写的字段,那么我们的 pod 环境信息和容器的元数据如何传递到容器中呢? 是不是也是通过获取这些 k8s 默认给我填写的字段呢? 环境中查看一下 kubernetes 服务的 ip ,我们可以这样来访问 在容器中访问 kubernetes 这是因为没有证书,我们需要导入证书和 token , 这样才能正确的访问到 ApiServer 之前我们查看过默认的 k8s 挂载的位置,/var/run/secrets/kubernetes.io/serviceaccount 这里面有 命名空间,证书,token 这个时候,我们访问 k8s
而在这时它们会访问同一个队列,所以为了减少窃取任务线程和被窃取任务线程之间的竞争,通常会使用双端队列,被窃取任务线程永远从双端队列的头部拿任务执行,而窃取任务的线程永远从双端队列的尾部拿任务执行。 用看forkjion的眼光来看ParallelStreams 上文中已经提到了在Java 8引入了自动并行化的概念。 自动并行化也被运用在Java 8新添加的Stream API中。 对于列表中的元素的操作都会以并行的方式执行。 可能有很多朋友在jdk7用future配合countDownLatch自己实现的这个功能,但是jdk8的朋友基本都会用上面的实现方式,那么自信深究一下究竟自己用future实现的这个功能和利用jdk8的 正如我们上面那个列子的情况分析得知,lambda的执行并不是瞬间完成的,所有使用parallel streams的程序都有可能成为阻塞程序的源头,并且在执行过程中程序中的其他部分将无法访问这些workers
集群内访问apiVersion: v1kind: Servicemetadata: name: test-k8sspec: selector: app: test-k8s type: ClusterIP 服务的默认类型是 ClusterIP ,只能在集群内部访问,我们可以进入到 Pod 里面访问: kubectl exec -it pod-name -- bash curl http://test-k8s :8080如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用): kubectl port-forward service/test-k8s 8888:80802. 集群外访问apiVersion: v1kind: Servicemetadata: name: test-k8sspec: selector: app: test-k8s # 默认 ClusterIP 集群内可访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用) type: NodePort ports: - port: 8080
在Kubernetes中,提供了Service和Ingress两种对象来实现应用间访问或外部对集群应用访问,这两种对象在实际的工作中会时长使用,非常重要的对象。 通过地址重写,我们可以实现诸如访问a.com/foo 重写到a.com,访问a.com/foo重写到a.com/foo/bar,需要注意的是重写后的地址需要是能真实访问到资源的地址,不然重写也没什么意义 如果我们把地址配置成可以访问的IP,则可以访问。 有时候访问量太大,可以通过在ingress进行限速,配置如下: apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-limit Ingress进行访问。
Docker启动Redis容器,步骤很简单,和启动mysql容器是一样的:Docker启动mysql。不过有个点需要注意,这里提醒一下:
kubernetes/monitoring/new/kube-dashboard-v2.0.yaml 启动 kubectl proxy 显示:Starting to serve on 127.0.0.1:8001 访问 证书生成两种方式 x509证书crt文件的创建办法 截取k8s的证书 mkdir certs & certs/ grep 'client-certificate-data' ~/.kube/config
而在这时它们会访问同一个队列,所以为了减少窃取任务线程和被窃取任务线程之间的竞争,通常会使用双端队列,被窃取任务线程永远从双端队列的头部拿任务执行,而窃取任务的线程永远从双端队列的尾部拿任务执行。 用看forkjion的眼光来看ParallelStreams 上文中已经提到了在Java 8引入了自动并行化的概念。 自动并行化也被运用在Java 8新添加的Stream API中。 对于列表中的元素的操作都会以并行的方式执行。 可能有很多朋友在jdk7用future配合countDownLatch自己实现的这个功能,但是jdk8的朋友基本都会用上面的实现方式,那么自信深究一下究竟自己用future实现的这个功能和利用jdk8的 正如我们上面那个列子的情况分析得知,lambda的执行并不是瞬间完成的,所有使用parallel streams的程序都有可能成为阻塞程序的源头,并且在执行过程中程序中的其他部分将无法访问这些workers
找到configurationOverrides,下图两个黄框中的内容原本是注释的,请删除注释符号,另外,如果您之前设置过跨网络访问kafka,就能理解下面写入K8S宿主机IP的原因了: ? 查看服务:kubectl get services -n kafka-test,如下图红框所示,通过宿主机IP:31090、宿主机IP:31091、宿主机IP:31092即可从外部访问kafka: zookeeper release: kafka 执行命令:kubectl apply -f zookeeper-nodeport-svc.yaml 查看服务,发现已经可以通过宿主机IP:32181访问 验证kafka服务 找一台电脑安装kafka包,就能通过里面自带的命令远程连接和操作K8S的kafka了: 访问kafka官网:http://kafka.apache.org/downloads ,刚才确定了 8. 再打开一个窗口,执行命令查看消费者group: .
个人更建议 使用 redigo库 来操作redis数据,参考我的另一篇文章使用 redigo 访问 redis。
一、常用的授权插件 本文:主要讲述k8s的rabc授权机制和测试案例 Node:节点认证 ABAC:基于属性的访问控制 RBAC:基于角色的访问控制 Webhook:基于HTTP回调机制 二、RBAC控制 img img 1、RBAC 主要的功能是提供基于角色(Role)的访问控制许可(permission) 解释: 让一个用户扮演一个角色(Role),而角色(Role)拥有某些操作的权限,那么这么用户就拥有了该角色的操作权限 default名称空间的pods资源,但不能访问service资源。 可以访问 kube-system 名称空间的资源, 也不能访问 kube-system 名称空间 service资源。 default 名称空间的资源,而不能访问其他名称空间的资源。
生产环境,有时候开发需要权限去看k8s某个namespace下的pod的运行状态,或者其它的运行信息(ELK或其它组件并不能完全覆盖这种场景,或者特地引入kubesphere这套组件也太重了),这种情况我们要如何高效解决 具体点就是: 1、在k8s上namespace创建不同的rbac(只开放出list watch这类的只读权限),并把配置文件捞出来 2、在jumpserver上单独开一个ecs,安装kubectl,并创建多个账号 ,对应k8s的不同namespace 3、在ecs上,切到不同的账号下,将step1的配置文件写到到对应的kubectl的配置里 4、研发可以自助在jumpserver上申请权限(申请主机权限--->申请某个用户权限 主要是k8s上的只读账号的rbac的yaml文件贴一下。 - describe - logs - list # cat 3-readonly.rolebinding-ns1.yaml apiVersion: rbac.authorization.k8s.io
在访问Tomcat8的时候已经在tomcat-users.xml中配置了 <role rolename="manager-gui"/> <role rolename="manager-script
那么,我们如果通过反射去访问属性和方法呢? ---- ---- 【访问属性】 我们可以通过getField和getDeclaredField这两种方法来访问属性,它们之间的差异如下所示: getField 只能获取public的,包括从父类继承来的字段 (注:这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true)) ---- 【访问方法】 我们可以通过getMethod和getDeclaredMethod 这两种方法来访问方法,它们之间的差异点参照getField和getDeclaredField。 ---- 【访问非public的属性和方法】 如果我们需要访问非public的属性和方法,我们需要为Field或Method实例设置setAccessible(true),否则无法进行访问。