yq是一个轻量级的便携式命令行YAML处理器。该工具的目标是成为yaml文件处理方面的jq或sed。
安装
在MacOS上:
1 | brew install yq |
在Ubuntu和支持snap包的其他Linux发行版上:
1 | snap install yq |
在Ubuntu 16.04或更高版本上:
1 | sudo add-apt-repository ppa:rmescandon/yq |
或者,下载最新的二进制文件或者:
1 | go get gopkg.in/mikefarah/yq.v2 |
yq是一个轻量级的便携式命令行YAML处理器。该工具的目标是成为yaml文件处理方面的jq或sed。
在MacOS上:
1 | brew install yq |
在Ubuntu和支持snap包的其他Linux发行版上:
1 | snap install yq |
在Ubuntu 16.04或更高版本上:
1 | sudo add-apt-repository ppa:rmescandon/yq |
或者,下载最新的二进制文件或者:
1 | go get gopkg.in/mikefarah/yq.v2 |
我们都知道,在使用EclipseLink JPA操作数据库时,不可或缺的要配置persistence.xml文件,一个最基本的配置示例如下:
1 | <?xml version="1.0" encoding="UTF-8"?> |
那么问题来了,对于数据库的IP地址,端口号,用户名和密码这几个参数:
所以,有没有一种方法,可以在上面的配置文件里定义变量或默认值,然后根据实际环境获取变量的值取覆盖呢?
答案是有的。从查阅的资料看,我了解到有2种方法可以解决上面的问题。
通过Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME,properties)方法注入properties参数,该
https://dzone.com/articles/jpa-with-eclipselink-amp-mysql-using-java-configur
https://gist.github.com/baumato/3283f255b00094411110fc889be58aa5
我之前可以使用curl执行如下命令:
1 | https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1beta3/namespaces/default/ |
但在kubernetes 0.18.0中它提示“unauthorized”。奇怪的是,如果我使用外部IP地址(http://172.17.8.101:8080/api/v1beta3/namespaces/default/)是可以访问的。
在官方文档中我发现了这个:
显然,我没有在之前版本的Kubernetes中使用安全令牌。从那时起,我设计了一个比运行代理或在容器上安装golang更简单的解决方案。请参阅此示例,该示例从api获取当前容器的信息:
1 | KUBE_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) |
我还使用包含一个简单的二进制文件jq来解析json以用于bash脚本。
How do I access the Kubernetes api from within a pod container?
我在GKE上的Kubernetes中有以下rc控制器:
1 | apiVersion: v1 |
现在,如果我执行以下命令执行滚动更新,但没有重新拉镜像。为什么?
1 | kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b |
如果有如下定义,Kubernetes将会在Pod创建时拉取镜像(请参阅更新镜像文档):
:latest
imagePullPolicy: Always
如果你想每次都拉取镜像,这很好。但是,如果您想按需执行该操作:例如,如果您想使用some-public-image:latest,但只想在请求时手动提取新版本。你现在可以:
按需拉动没有好的解决方案。如果有变化,请评论,我会更新这个答案。
我正在寻找在DC / OS上运行Docker容器时是否使用Marathon和Chronos,Docker Swarm或Kubernetes的一些优缺点。
例如,何时使用Marathon / Chronos比使用Kubernetes更好,反之亦然?
现在我主要是进行实验,但希望我们在夏天之后开始在生产中使用这些服务之一。这可能会使Docker Swarm失去资格,因为我不确定它是否会在那时处于生产可用。
我喜欢Docker Swarm的原因是它本质上只是“Docker命令”,你不需要学习全新的东西。我们已经在使用docker-compose,它将与Docker Swarm一起开箱即用(至少在理论上),这将是一个很大的优势。我对Docker Swarm的主要关注是它是否涵盖了在生产中运行系统所需的所有用例。
我将尝试分解Mesos上每个容器编排框架的独特方面。
使用Docker Swarm,如果:
使用Kubernetes-Mesos,如果:
使用Marathon,如果:
使用Chronos,如果:
Marathon vs Kubernetes vs Docker Swarm on DC/OS with Docker containers
CloudFoundry / Diego的下一个版本将为Docker容器提供原生支持,这些容器将在多个主机[链接]之间进行编排。这听起来与Kubernetes非常相似。
当然,Kubernetes试图解决的问题更为通用,其中CloudFoundry更专注于应用程序开发。然而,对我来说,它听起来都朝着类似的方向发展,而CloudFoundry正在简单的业务流程之上添加更多功能。
所以,我想知道Kubernetes会比CloudFoundry增加更多有价值的用例吗?
作为CloudFoundry(过去)和Kubernetes(现在)的提交者,我可能有资格回答这个问题。
我喜欢将CloudFoundry称为“应用程序PaaS”,将Kubernetes称为“容器PaaS”,但鉴于两个项目都会随着时间的推移而在同一市场中竞争,因此区别相当微妙和流畅。
两者之间的区别在于CF有一个暂存层,它采用(12-factor)用户应用程序(例如jar或gem)和Heroku风格的buildpack(例如Java + Tomcat或Ruby)并生成一个Droplet(类似于Docker镜像)。CF不会将容器化接口暴露给用户,但Kubernetes会这样做。
CloudFoundry的主要受众是希望使用Heroku风格的buildpack部署12-factor无状态应用程序的企业应用程序开发人员。
Kubernetes的受众范围更广,包括无状态应用程序和提供自己容器的有状态服务开发人员。
这种区别可能在未来发生变化:
随着两个项目的成熟和竞争,它们的异同将发生变化。因此,请将以下特征进行比较。
CF和K8都有许多相似的功能,如容器化,命名空间,身份验证。
Kubernetes的竞争优势:
CloudFoundry的竞争优势:
[x] 这些功能不是Diego的一部分或包含在Lattice中。
CloudFoundry的竞争优势之一是它拥有成熟的部署引擎BOSH,可以实现核心CF组件的扩展,恢复和监控等功能。BOSH还支持许多具有可插拔云提供程序抽象的IaaS层。不幸的是,BOSH的学习曲线和部署配置管理是噩梦。(作为BOSH提交者,我想我可以准确地说出来。)
Kubernetes的部署抽象仍处于起步阶段。核心仓库中提供了多个目标环境,但它们并非全部正在运行,经过良好测试或得到主要开发人员的支持。这主要是成熟的事情。人们可能会期望这会随着时间的推移而改进并且会增加抽象。例如,DCOS上的Kubernetes允许使用单个命令将Kubernetes部署到现有DCOS群集。
Diego是CF的Droplet执行代理的重写。它最初是在Kubernetes宣布之前开发的,随着竞争格局的演变,它已经具有更多的功能范围。它的最初目标是生成droplets(用户应用程序 + CF buildpack)并在Warden(在Go中重写时重命名为Garden)容器中运行它们。自成立以来,它也被重新打包为Lattice,它有点像CloudFoundry-lite(虽然这个名字是由现有项目拍摄的)。出于这个原因,Lattice有点像玩具一样,因为它故意减少了用户的观众和范围,显然缺少使其达到“企业就绪”的功能。CF已经提供的功能。这部分是因为Lattice用于测试核心组件,而没有来自更复杂的CF的一些开销,但您也可以在内部高信任环境中使用Lattice,其中安全性和多租户不是那么重要。
值得一提的是,CloudFoundry和Warden(它的容器引擎)也早于Docker,差不多几年了。
另一方面,Kubernetes是一个相对较新的项目,由Google根据BORG和Omega多年的容器使用情况开发而成。Kubernetes可以被认为是谷歌的第三代容器编排,就像Diego是Pivotal / VMware的第三代容器编排一样(v1在VMware编写; v2在VMware与Pivotal Labs帮助; v3在Pivotal接管项目后)。
Kubernetes似乎都是将容器部署到集群云中。它似乎没有提及开发和临时环境(或类似环境)。
在开发期间,您希望尽可能接近生产环境并进行一些重要更改:
同样,人们可能希望在非公共环境进行持续集成。
Kubernetes是否支持这种开发环境,或者是必须构建的东西,希望在生产过程中它仍然可以工作?
更新(2016-07-15)
随着Kubernetes 1.3的发布,Minikube现在是在本地机器上运行Kubernetes进行开发的推荐方式。
How to create a local development environment for Kubernetes?
我很困惑Ingress和Load Balancer在Kubernetes中的角色。
据我所知,Ingress用于将来自互联网的传入流量映射到群集中运行的服务。
Load Balancer的作用是将流量转发到主机。在这方面,Ingress与Load Balancer有何不同?与Amazon ELB和ALB相比,kubernetes中的Load Balancer的概念是什么?
Load Balancer:kubernetes LoadBalancer是指向不在您的kubernetes集群中但存在于其他地方的外部负载均衡器的服务。假设您的pod可以从外部路由,它们可以与您的pod一起使用。Google和AWS本身就提供此功能。就Amazon而言,在AWS中运行时直接映射到ELB,kubernetes可以为部署的每个LoadBalancer服务自动配置和配置ELB实例。
Ingress:Ingress实际上只是将一组规则传递给正在监听它们的控制器。您可以部署一组Ingress规则,但除非您有可以处理它们的控制器,否则不会发生任何事情。如果配置为执行此操作,则LoadBalancer服务可以侦听Ingress规则。
您还可以创建NodePort服务,该服务在群集外部具有可外部路由的IP,但指向群集中存在的Pod。这可能是一个Ingress控制器。
Ingress Controller只是一个配置为解释入口规则的pod。nginx是kubernetes支持的最受欢迎的Ingress控制器之一。就亚马逊而言,ALB可用作Ingress控制器。
例如,这个nginx控制器能够获取你定义的入口规则并将它们转换为一个nginx.conf文件,它在它的pod中加载和启动。比如说你定义了一个Ingress如下:
1 | apiVersion: extensions/v1beta1 |
然后,如果您检查nginx控制器的pod,您将在/etc/nginx.conf
中看到定义的以下规则:
1 | server { |
Nginx刚刚创建了一条规则来路由http://kubernetes.foo.bar/app以指向群集中的服务appsvc。
示例介绍了如何在kubernetes集群中使用nginx ingress控制器。希望这可以帮助!
1 - 我正在阅读文档,我对措辞有点困惑。它说:
ClusterIP:在集群内部IP上公开服务。选择此值使服务只能从群集中访问。这是默认的ServiceType
NodePort:在每个Node的IP上公开静态端口(NodePort)服务。将自动创建NodePort服务到ClusterIP服务的路由。您可以通过请求
: 来从群集外部请求NodePort服务。 LoadBalancer:使用云提供商的负载均衡器在外部公开服务。将自动创建外部负载均衡器到NodePort和ClusterIP服务的路由。
NodePort服务类型是否仍然使用ClusterIP,而只是在不同的端口,该端口对外部客户端开放?那么在这种情况下,
或者,NodeIP是否是运行kubectl get nodes得到的IP,而不是用于ClusterIP的虚拟IP?
2 - 同样在以下链接的图表中:
http://kubernetes.io/images/docs/services-iptables-overview.svg
客户端在节点内是否有任何特殊原因?我认为在ClusterIP服务类型的情况下,它需要在Cluster内。如果为NodePort绘制一个类似的图表,那么把客户端画在Node和Cluster之外是否有效,或者我是否忽略了什么?
ClusterIP公开以下内容:
spec.clusterIp:spec.ports[*].port
您只能在群集内访问此服务。可以从spec.clusterIp端口访问它。如果设置了spec.ports [*].targetPort,它将从端口路由到targetPort。调用kubectl get services时获得的CLUSTER-IP是内部在集群内分配给此服务的IP。
NodePort公开以下内容:
<NodeIP>:spec.ports[*].nodePort
spec.clusterIp:spec.ports[*].port
如果通过nodePort的方式从节点的外部IP访问此服务,它会将请求路由到spec.clusterIp:spec.ports[*].port,然后将其路由到spec.ports [*].targetPort,如果设置。也可以使用与ClusterIP相同的方式访问此服务。
您的NodeIP是节点的外部IP地址。您无法从
LoadBalancer公开以下内容:
spec.loadBalancerIp:spec.ports[*].port
<NodeIP>:spec.ports[*].nodePort
spec.clusterIp:spec.ports[*].port
您可以从负载均衡器的IP地址访问此服务,该IP地址将您的请求路由到nodePort,而nodePort又将请求路由到clusterIP端口。您可以像访问NodePort或ClusterIP服务一样访问此服务。
What’s the difference between ClusterIP, NodePort and LoadBalancer service types in Kubernetes
我对所有这些都比较陌生,并且在尝试理解列出的这些技术时遇到了麻烦。
虽然,所有这些技术都试图解决不同的问题,但也有共同点。我想了解哪些是相同的,哪些是不同的。少数技术的组合很可能非常适合,如果是这样的话,他们是什么?
我列出了其中的一些以及问题,但如果有人详细列出所有问题并回答问题,那将会很棒。
Kubernetes vs Mesos:
Apache的Mesos和Google的Kubernetes有什么区别提供了很好的洞察力,但我无法理解为什么Kubernetes应该运行在Mesos之上。两个开源解决方案的结合更多的是什么?
Kubernetes vs Core-OS Fleet:
如果我使用kubernetes,是否需要Core-OS Fleet?
Docker-Swarm如何适应上述所有内容?
我认为Mesos和Kubernetes主要是为了解决运行集群应用程序的类似问题,他们有不同的历史和解决问题的不同方法。
Mesos将精力集中在非常通用的调度上,并插入多个不同的调度程序。这意味着它使Hadoop和Marathon等系统能够在同一个调度环境中共存。Mesos不太关注运行时容器。Mesos存在于对容器的广泛关注之前,并且已经重新更新以支持容器。
相比之下,Kubernetes从一开始就被设计成一个用于从容器构建分布式应用程序的环境。它包括用于复制和服务发现的原语作为核心原语,其中 - 在Mesos中是通过框架添加这些原语。Kubernetes的主要目标是构建,运行和管理分布式系统的系统。
Fleet是一个较低级别的任务分发者。它对于引导群集系统很有用,例如CoreOS使用它将kubernetes代理和二进制文件分发到群集中的计算机,以便启动kubernetes群集。它并不是真正意图解决相同的分布式应用程序开发问题,更像是集群的systemd / init.d / upstart。如果您运行kubernetes,则不需要它,您可以使用其他工具(例如Salt,Puppet,Ansible,Chef,…)来完成相同的二进制分发。
Swarm是Docker努力扩展现有的Docker API,使一组机器看起来像一个Docker API。从根本上说,我们在Google和其他地方的经验表明,节点API不足以支持群集API。你可以在这里看到一堆讨论:
https://github.com/docker/docker/pull/8859和这里:
https://github.com/docker/docker/issues/8781