GVKun编程网logo

我对比了三家云厂商的新年促销,总结了 3 个购买的秘诀(各大云厂商云产品对比)

10

想了解我对比了三家云厂商的新年促销,总结了3个购买的秘诀的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于各大云厂商云产品对比的相关问题,此外,我们还将为您介绍关于.NET程序崩溃了怎么抓Du

想了解我对比了三家云厂商的新年促销,总结了 3 个购买的秘诀的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于各大云厂商云产品对比的相关问题,此外,我们还将为您介绍关于.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案、Kubernetns LB方案:无需云厂商的动态DNS和负载均衡、NAS 厂商的简单总结、php获取当前页面完整真实的url地址的方法,包括带参数的,总结了三种方法的新知识。

本文目录一览:

我对比了三家云厂商的新年促销,总结了 3 个购买的秘诀(各大云厂商云产品对比)

我对比了三家云厂商的新年促销,总结了 3 个购买的秘诀(各大云厂商云产品对比)

3 月 5 日,随着腾讯云新春采购节一声炮响,这次几家云厂商的促销活动也终于揭开了 “预热” 的面纱,明码标价开门迎客。作为一个常年做采购比价的人,我认认真真学习了阿里云、腾讯云和华为云三家国内知名云厂商的活动,总结如下:

阿里云:我品牌好套路多,不跟你正面比折扣

腾讯云:我有钱我玩秒杀,看你怎么跟我拼价格

华为云:我有手机我有技术,买满就送您随意

当然,上面只是用玩笑表达了我的一些想法,阿里云这次的促销活动明显跟去年双 11 和双 12 不同,不玩拼团不玩推荐送不只针对新用户,买满多少给你返券,折扣力度在 5 折左右,确实在价格上比较没有竞争力,但这次,阿里把他们全线的服务器都拿了出来,包括以前不参加活动的 C5 和 G5,也可能是在活动策略上的一种尝试。腾讯云看起来跟去年的玩法差不多,秒杀大概率不会像去年那样出现神车(比如 2 核 8G 3 年 1500 这种),但是云产品会场的服务器价格也相对比较低。华为云这次也没再玩拼团和推荐送,划分了新用户专区,服务器的折扣力度较大。

废话说了那么多,其实我知道你们最关心的是最终到手价,别急,产品要在同一个层面上才能相提并论对不对,我选了阿里云的 Sn1ne、腾讯云的 S3 和华为云的 S3/Sn3 进行对比,如果你对这三款产品有兴趣,不妨看看我总结的三条建议。

一、如果你想买 1 年的服务器,我推荐你买华为云

 

 

华为云

腾讯云

阿里云

规格(带宽)

周期

S3

S2

Sn1ne

1 核 1G(1M)

1 年

232.56

262.50

 

1 核 2G(1M)

1 年

376.56

447.72

 

2 核 4G(1M)

1 年

664.56

909.30

1530

4 核 8G(1M)

1 年

1212.12

1773.00

3663

8 核 16G(5M)

1 年

3858.84

2864.40

5026

16 核 32G(5M)

1 年

7145.28

13464.00

14528

这上面的价格是套餐价,有部分是新用户专享的价格,比如华为云的 2 核 4G,阿里云的 2 核 4G,这样一对比,除了 8 核 16G 以外,华为云 1 年的价格可以说是非常吸引了。

二、如果你想购买三年,我推荐你购买腾讯云

 

 

腾讯云

华为云

规格(带宽)

周期

S2

S3

1C1G(1M)

3 年

562

930

1C2G(1M)

3 年

959

1506

2C4G(1M)

3 年

1948

2658

4C8G(1M)

3 年

3900

4848

8C16G(5M)

3 年

6751

11576

16C32G(5M)

3 年

33048

21435

阿里云比较少卖 3 年的,所以这里主要还是展示腾讯云和华为云的,腾讯云的 3 年打折打到了 2 折左右,折扣力度很深。不过其实一次性购买 3 年的云主机也未必是个明智的选择,云服务这几年发展越来越迅猛,算力也越来越强,无法想象用三年前的服务器会是什么样的,所以虽然价格便宜,但是各位朋友们需要谨慎啊。

三、如果你是阿里云的新用户,想买阿里云,我推荐你参加阿里云另一个活动

说实话,阿里云这次的开年 Hi 购价格真的没有什么优势,我发现他们在线还有另外一个活动,叫 <高性能云服务器特惠>,里面卖的竟然比开年促销还便宜,比如说 2 核 4G 云服务器,在这个活动里卖 1368,在开年要卖 1530。

 

好了,就总结这么多了,欢迎大家一起讨论,一起找省钱买服务器的办法。

.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案

.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案

一:背景

1. 讲故事

最近几天接到了几个crash的求助,可能这几个朋友没玩过怎么去生成dump,只能手把手教,感觉也不是一个办法,所以有必要总结一下,后续再有朋友咨询的话,我就可以把这篇文章丢过去了,好了,我大概总结了下面三种方式:

  • procdump -e
  • procdump -> AEDebug
  • Windows Error Reporting

老读者应该知道,我一直都推崇 procdump 去搞定这些事情,毕竟它是一款可跨平台抓取的强大灵巧工具。

二: 实现可测试案例

从 dump 样本来看,web类的程序是最多的,所以这里我就以 Asp.NET MVC 5 作为案例,在 RouteConfig 类中我使用一个Timer不断的抛出异常,目的就是把 w3wp 进程给弄挂掉,参考代码如下:


    public class RouteConfig
    {
        public static Timer timer;
        public static void RegisterRoutes(RouteCollection routes)
        {
            timer = new Timer(new TimerCallback(m =>
            {
                var r = 10 / Convert.ToInt32("0");
            }), null, 60000, 5000);

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

对了,肯定有朋友问:为什么不在 Action 中抛异常,这是因为 Http管道 会把这种异常包装成 http 500,所以就达不到 crash 的效果了。

接下来把程序部署到 IIS 上并运行,可以清楚的看到 Windows 事件查看器 中成功的记录到了崩溃信息,如下图所示:

三: 3种抓取方式解析

1. 使用 procdump -e

这种方式简单但不太稳定,因为有几个朋友告诉我,procdump在抓取的过程中报错了,原因是进程已退出,不管怎么说这个要看你运气了哈,这里的 -eexception 的简写,具体可参见官方文档: https://docs.microsoft.com/zh...


-e    Write a dump when the process encounters an unhandled exception. Include the 1 to create dump on first chance exceptions.

完整的参考命令如下:


C:\Windows\system32>procdump -e -ma -w w3wp E:\test

ProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

Waiting for process named w3wp...

...

Press Ctrl-C to end monitoring without terminating the process.

[21:12:08] Exception: 04242420
[21:12:08] Exception: E0434352.CLR
[21:12:09] Exception: E0434352.CLR
[21:12:09] Exception: E0434352.CLR
[21:12:09] Exception: E0434352.CLR
[21:12:09] Exception: E0434352.CLR
[21:12:09] Exception: E0434352.CLR
[21:12:14] Exception: C0000094.INT_DIVIDE_BY_ZERO
[21:12:14] Unhandled: C0000094.INT_DIVIDE_BY_ZERO
[21:12:14] Dump 1 initiated: E:\test\w3wp.exe_210525_211214.dmp
[21:12:14] Dump 1 writing: Estimated dump file size is 326 MB.
[21:12:15] Dump 1 complete: 326 MB written in 1.2 seconds
[21:12:15] Dump count reached.

从输出信息看已经成功抓取了 dump 文件,如果你的机器有多个 w3wp,可以将其替换成 pid,参考命令如下:


C:\Windows\system32>procdump -e -ma 9320 E:\test

2. 将 procdump 作为 AeDebug 的默认调试器

它的大概运作原理是:当程序出现了未处理异常,此时会激活操作系统的 Win32 unhandled exception filter,这个过滤器会调用注册表中 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug 节点配置的调试器,也就是我的 Procdump,要将 procdump 送到注册表的 AeDebug 节点,可以使用 -i 进行注册。


-i    Install ProcDump as the AeDebug postmortem debugger. Only -ma, -mp, -d and -r are supported as additional options.

完整参考命令如下:


C:\Windows\system32>procdump -ma -i E:\test

ProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

Set to:
  HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
    (REG_SZ) Auto     = 1
    (REG_SZ) Debugger = "C:\xcode\soft\Procdump\procdump.exe" -accepteula -ma -j "E:\test" %ld %ld %p

Set to:
  HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
    (REG_SZ) Auto     = 1
    (REG_SZ) Debugger = "C:\xcode\soft\Procdump\procdump.exe" -accepteula -ma -j "E:\test" %ld %ld %p

ProcDump is now set as the Just-in-time (AeDebug) debugger.

从输出信息看已经成功将其送入到注册表了,接下来可以打开 注册表编辑器 去验证。

最后就是把 web 跑起来,1min之后就会成功的看到 E:\test 下的 dump 文件啦,截图如下:

从图中看有2个dump,具体为什么是2个我就不管了,就怕不生成。

3. 借助 Windows Error Reporting 生成

它的大概运作原理是借助 windows 自带的 Windows Error Reporting 服务去帮助我们生成程序的 crash dump,要实现的话,必须开启这个服务并且在注册表中配置好你要抓取的exe程序,配置起来有点繁琐,这里有一个bat脚本,直接运行即可,简单粗暴。


SET DMPPATH=E:\test
SC CONFIG WerSvc START= AUTO
NET START WerSvc
ECHO 启用完成
 
REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger /f
REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger /f
 
REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger /f
REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger /f
 
ECHO 删除完成
 
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe"  /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe"  /t REG_SZ  /v DumpFolder /d   %DMPPATH% /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe"  /t REG_DWORD   /v DumpCount /d  2 /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe"  /t REG_DWORD   /v DumpType /d  2 /f
 
ECHO 启用完成
 
PAUSE 

有3个参数需要简单解释一下。

  • DumpFolder: dump的存放路径
  • DumpCount: 最多保留几个 dump 文件
  • DumpType: 0:Custom dump. 1:Mini dump. 2:Full dump

bat执行完成后,可以到注册表中验证一下。

接下来把web跑起来,1min之后你就会看到生成的dump文件了,截图如下:

三:总结

对于抓取程序crash的dump,这三种方式基本上就可以做到万无一失,总结完后,对你对我都是节省宝贵的时间。

更多高质量干货:参见我的 GitHub: dotnetfly

Kubernetns LB方案:无需云厂商的动态DNS和负载均衡

Kubernetns LB方案:无需云厂商的动态DNS和负载均衡

 

本文转载自微信公众号「新钛云服」,作者祝祥 翻译 。转载本文请联系新钛云服公众号。 

我们经常谈论托管Kubernetes或在云中运行的Kubernetes,但我们也在非云的环境(例如VMware或裸机服务器)上运行Kubernetes。

您可能还会听到很多有关云供应商集成的经典案例:您可以获取无密码凭据来访问托管服务,无需手动干预即可配置云负载均衡器,自动创建DNS条目等。

在本地运行时,通常无法使用这些集成功能,除非您使用的是受支持的云平台(如 OpenStack)。那么当在裸机或VM上运行时,如何获得Cloud Native环境的自动化优势?

所以让我们一步一步去看我们所想实现的功能。

本文中使用的所有清单均可在github项目中(https://github.com/clusterfrak-dynamics/gitops-template)获取。

GitOps

与往常一样,我们使用GitOps和FluxCD将我们的资源部署到集群中,无论它们是在云上还是在本地。你可以参考跟多我们关于Flux的文章。

首先,您可以使用我们的GitOps模板,并根据需要对其进行自定义。kubectl如果更合适,您也可以直接部署清单 。

以下让我们深入研究我们的组件。

负载均衡

在云上运行kubernetns时,通常可以立即使用Load Balancer。在裸机或VM上运行时,负载均衡器保持pending不可用状态。

因此,首先,我们希望我们的服务类型LoadBalancer不处于pending不可用状态,并且能够在需要时提供动态负载平衡器,而无需手动配置haproxy或其他类似的服务。

Metallb可以提供两种模式的虚拟负载均衡器的实现:

  • BGP协议

  • ARP

后者更简单,因为它可以在几乎任何二层网络上工作,而无需进一步配置。

在ARP模式下,Metallb的配置非常简单。您只需要给它提供一些可以使用的IP就可以了。

配置清单可在此处或官方文件中找到。要配置所需的IP地址,可以使用ConfigMap完成。

Metallb-config.yaml:

apiVersion: v1 
kind: ConfigMap 
Metadata: 
  namespace: Metallb-system 
  name: config 
data: 
  config: | 
    address-pools: 
    - name: default 
      protocol: layer2 
      addresses: 
      - 10.10.39.200-10.10.39.220

您还需要生成一个密钥来加密Metallb组件通信,您可以使用以下脚本来生成Kubernetes secret yaml:

kubectl create secret generic -n Metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)" -o yaml --dry-run=client > Metallb-secret.yaml

部署完所有内容后,您应该在Metallb-system namespace内看到相应的pods :

NAME                          READY   STATUS    RESTARTS   AGE 
controller-57f648cb96-tvr9q   1/1     Running   0          2d1h 
speaker-7rd8p                 1/1     Running   0          2d1h 
speaker-7t7rg                 1/1     Running   0          2d1h 
speaker-8qm2t                 1/1     Running   0          2d1h 
speaker-bks4s                 1/1     Running   0          2d1h 
speaker-cz6bc                 1/1     Running   0          2d1h 
speaker-h8b54                 1/1     Running   0          2d1h 
speaker-j6bss                 1/1     Running   0          2d1h 
speaker-phvv7                 1/1     Running   0          2d1h 
speaker-wdwjc                 1/1     Running   0          2d1h 
speaker-xj25p                 1/1     Running   0          2d1h

现在,我们准备测试负载均衡器。为此,我们直接进入下一个主题。

Ingress controller

在云上运行时,除了经典的4层负载均衡器以外,您有时还可以在GCP和AWS上获得7层负载均衡器(例如,应用程序负载均衡器)。但是它们的功能有限,而且成本效益不高,而且您经常需要一个ingress controller来管理来自Kubernetes集群的流量。

这个ingress controller通常通过服务类型为LoadBalancer在外部发布。这就是为什么我们以前的Metallb部署会派上用场。

第一个也是最常用的ingress controller之一是nginx-ingress,它可以轻松地与Helm一起部署。

由于我们将Flux与Helm Operator结合使用,因此根据我们使用的Helm,您可以参考以下values.yaml配置:

因为我们将Flux与Helm Operator结合使用,所以我们使用了一个Helm Release 的版本,您可以从中得到values.yaml,以下展示了我们的配置:

apiVersion: helm.fluxcd.io/v1 
kind: HelmRelease 
Metadata: 
  name: nginx-ingress 
  namespace: nginx-ingress 
spec: 
  releaseName: nginx-ingress 
  chart: 
    repository: https://kubernetes-charts.storage.googleapis.com 
    version: 1.36.3 
    name: nginx-ingress 
  values: 
    controller: 
      publishService: 
        enabled: true 
      kind: "DaemonSet" 
      service: 
        enabled: true 
        externalTrafficPolicy: Local 
      daemonset: 
        hostPorts: 
          http: 80 
          https: 443 
    defaultBackend: 
      replicaCount: 2 
    podSecurityPolicy: 
      enabled: true

没有什么特别之处,我们使用的是DaemonSet,默认情况下是使用的服务类型为LoadBalancer。

如果我们检查新部署的版本:

$ kubectl -n nginx-ingress get helmreleases.helm.fluxcd.io 
NAME            RELEASE         PHASE       STATUS     MESSAGE                                                                       AGE 
nginx-ingress   nginx-ingress   Succeeded   deployed   Release was successful for Helm release 'nginx-ingress' in 'nginx-ingress'.   2d1h 
 
or 
 
$ helm -n nginx-ingress ls 
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION 
nginx-ingress   nginx-ingress   2               2020-05-12 15:06:25.832403094 +0000 UTC deployed        nginx-ingress-1.36.3    0.30.0 
 
$ kubectl -n nginx-ingress get svc 
NAME                            TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE 
nginx-ingress-controller        LoadBalancer   10.108.113.212   10.10.39.200   80:31465/TCP,443:30976/TCP   2d1h 
nginx-ingress-default-backend   ClusterIP      10.102.217.148   <none>         80/TCP

我们可以看到,我们的服务是LoadBalancer类型,外部IP是我们在之前Metallb的ConfigMap中定义的。

让我们创建一个demo namespace并检查创建ingress时的行为:

$ kubectl create namespace demo 
--- 
apiVersion: apps/v1 
kind: Deployment 
Metadata: 
  labels: 
    app: Nginx 
  name: Nginx 
  namespace: demo 
spec: 
  selector: 
    matchLabels: 
      app: Nginx 
  template: 
    Metadata: 
      labels: 
        app: Nginx 
    spec: 
      containers: 
      - image: Nginx 
        name: Nginx 
--- 
apiVersion: v1 
kind: Service 
Metadata: 
  labels: 
    app: Nginx 
  name: Nginx 
  namespace: demo 
spec: 
  ports: 
  - port: 80 
    protocol: TCP 
    targetPort: 80 
  selector: 
    app: Nginx 
--- 
apiVersion: networking.k8s.io/v1beta1 
kind: Ingress 
Metadata: 
  annotations: 
    kubernetes.io/ingress.class: Nginx 
  name: Nginx 
  namespace: demo 
spec: 
  rules: 
  - host: Nginx.test.org 
    http: 
      paths: 
      - backend: 
          serviceName: Nginx 
          servicePort: 80

nginx-ingress 能够在默认情况下发布服务,这意味着它可以向ingress对象报告负载平衡器IP地址:

$ kubectl -n demo get ingress 
 
NAME    CLASS    HOSTS            ADDRESS        PORTS     AGE 
Nginx   <none>   Nginx.test.org   10.10.39.200   80, 443   47h

我们可以看到,LoadBalancer IP地址已嵌入到ingress中。这是能够使用external DNS的要求之一,这也是我们的下一个主题。

External DNS

现在我们已经有了4层负载平衡器(Metallb),它们可以将流量传送到群集中的7层负载平衡器(nginx-ingress),我们如何动态管理DNS?一个常用的工具是 external-dns(https://github.com/kubernetes-sigs/external-dns)使Kubernetes Services和Ingress与DNS平台保持同步。

如果您正在使用一种广泛使用的DNS平台(AWS Route53或 Google Cloud DNS),这将非常简单易用。External DNS还支持其他DNS供应商,但是如果您没有使用直接支持的DNS供应商,您可能就会比较麻烦。

比方说,您的本地DNS由Active Directory管理,因为External DNS无法直接写入Active Directory DNS,所以最终导致DNS解析不可用。

那么我们如何才能获得动态DNS功能呢?当然,你可以使用一个通配符DNS记录并将其指向到nginx-ingress负载平衡器IP,这是一种方法。如果您只使用一个LoadBalancer作为集群的入口,但如果您希望使用HTTP或其他类型LoadBalancer服务以外的协议,则仍需要手动更新一些DNS记录。

另一个解决方案是为您的群集指定DNS zone。

External DNS支持coredns作为后端,因此我们可以将active directory的DNS Zone指派给Kubernetes中运行的coredns服务器。

注意事项

听起来很简单,但是当深入研究external-dns/coredns部分时,我们注意到与External DNS一起使用的coredns唯一受支持的后端是Etcd。所以我们需要一个Etcd集群。您可能还注意到readme依赖于etcd-operator,它现在已被弃用,而且它也不不支持加密与etcd的通信。

我们发布了最新指南。首先,我们将使用Cilium的etcd-operator来配置3个节点的etcd集群并生成TLS。

Etcd operator

首先,我们应用etcd的 Custom Resource DeFinition:(https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/):

--- 
apiVersion: apiextensions.k8s.io/v1beta1 
kind: CustomresourceDeFinition 
Metadata: 
  name: etcdclusters.etcd.database.coreos.com 
spec: 
  additionalPrinterColumns: 
  - JSONPath: .Metadata.creationTimestamp 
    description: 'CreationTimestamp is a timestamp representing the server time when 
      this object was created. It is not guaranteed to be set in happens-before order 
      across separate operations. Clients may not set this value. It is represented 
      in RFC3339 form and is in UTC. Populated by the system. Read-only. Null for 
      lists. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#Metadata' 
    name: Age 
    type: date 
  group: etcd.database.coreos.com 
  names: 
    kind: Etcdcluster 
    listKind: EtcdclusterList 
    plural: etcdclusters 
    shortNames: 
    - etcd 
    singular: etcdcluster 
  scope: Namespaced 
  version: v1beta2 
  versions: 
  - name: v1beta2 
    served: true 
    storage: true

然后我们可以部署Etcd operator。

很快我们就可以得到etcd pod和secrets了:

$ kubectl -n external-dns get pods 
 
NAME                                    READY   STATUS    RESTARTS   AGE 
cilium-etcd-mnphzk2tjl                  1/1     Running   0          2d1h 
cilium-etcd-operator-55d89bbff7-cw8rc   1/1     Running   0          2d1h 
cilium-etcd-tsxm5rsckj                  1/1     Running   0          2d1h 
cilium-etcd-wtnqt22ssg                  1/1     Running   0          2d1h 
etcd-operator-6c57fff6f5-g92pc          1/1     Running   0          2d1h 
 
$ kubectl -n external-dns get secrets 
NAME                                 TYPE                                  DATA   AGE 
cilium-etcd-client-tls               Opaque                                3      2d1h 
cilium-etcd-operator-token-zmjcl     kubernetes.io/service-account-token   3      2d1h 
cilium-etcd-peer-tls                 Opaque                                3      2d1h 
cilium-etcd-sa-token-5dhtn           kubernetes.io/service-account-token   3      2d1h 
cilium-etcd-secrets                  Opaque                                3      2d1h 
cilium-etcd-server-tls               Opaque                                3      2d1h

coredns

然后,我们可以使用官方Helm chat部署coredns 。

就像以前一样,我们的资源是*HelmRelease*(https://github.com/clusterfrak-dynamics/gitops-template/blob/master/flux/resources/external-dns/coredns.yaml)。如果需要values.yaml,您可以从中获取:

apiVersion: helm.fluxcd.io/v1 
kind: HelmRelease 
Metadata: 
  name: coredns 
  namespace: external-dns 
spec: 
  releaseName: coredns 
  chart: 
    repository: https://kubernetes-charts.storage.googleapis.com 
    version: 1.10.1 
    name: coredns 
  values: 
    serviceType: "NodePort" 
    replicaCount: 2 
    serviceAccount: 
      create: true 
    rbac: 
      pspEnable: true 
    isClusterService: false 
    extraSecrets: 
    - name: cilium-etcd-client-tls 
      mountPath: /etc/coredns/tls/etcd 
    servers: 
      - zones: 
        - zone: . 
        port: 53 
        plugins: 
        - name: errors 
        - name: health 
          configBlock: |- 
            lameduck 5s 
        - name: ready 
        - name: prometheus 
          parameters: 0.0.0.0:9153 
        - name: forward 
          parameters: . /etc/resolv.conf 
        - name: cache 
          parameters: 30 
        - name: loop 
        - name: reload 
        - name: loadbalance 
        - name: etcd 
          parameters: test.org 
          configBlock: |- 
            stubzones 
            path /skydns 
            endpoint https://cilium-etcd-client.external-dns.svc:2379 
            tls /etc/coredns/tls/etcd/etcd-client.crt /etc/coredns/tls/etcd/etcd-client.key /etc/coredns/tls/etcd/etcd-client-ca.crt

重要的几行如下:

extraSecrets: 
- name: cilium-etcd-client-tls 
  mountPath: /etc/coredns/tls/etcd 
 
and 
 
- name: etcd 
  parameters: test.org 
  configBlock: |- 
    stubzones 
    path /skydns 
    endpoint https://cilium-etcd-client.external-dns.svc:2379 
    tls /etc/coredns/tls/etcd/etcd-client.crt /etc/coredns/tls/etcd/etcd-client.key /etc/coredns/tls/etcd/etcd-client-ca.crt

我们正在安装并使用etcd secret与etcd进行TLS通信。

External DNS

最后,我们可以打包并安装external DNS。和往常一样,我们将使用官方的Helm chat(https://github.com/helm/charts/tree/master/stable/external-dns)和HelmRelease(https://github.com/clusterfrak-dynamics/gitops-template/blob/master/flux/resources/external-dns/external-dns.yaml):

apiVersion: helm.fluxcd.io/v1 
kind: HelmRelease 
Metadata: 
  name: external-dns 
  namespace: external-dns 
spec: 
  releaseName: external-dns 
  chart: 
    repository: https://charts.bitnami.com/bitnami 
    version: 2.22.4 
    name: external-dns 
  values: 
    provider: coredns 
    policy: sync 
    coredns: 
      etcdEndpoints: "https://cilium-etcd-client.external-dns.svc:2379" 
      etcdTLS: 
        enabled: true 
        secretName: "cilium-etcd-client-tls" 
        caFilename: "etcd-client-ca.crt" 
        certFilename: "etcd-client.crt" 
        keyFilename: "etcd-client.key"

这里,与以前一样,我们提供了etcd TLS的secret名称和路径,以确保通信安全,并且我们启用了coredns。

这是我们的最终external-dns namespace:

$ kubectl -n external-dns get svc 
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                     AGE 
cilium-etcd          ClusterIP   None           <none>        2379/TCP,2380/TCP           2d2h 
cilium-etcd-client   ClusterIP   10.105.37.25   <none>        2379/TCP                    2d2h 
coredns-coredns      NodePort    10.99.62.135   <none>        53:31071/UDP,53:30396/TCP   2d1h 
external-dns         ClusterIP   10.103.88.97   <none>        7979/TCP                    2d1h 
 
$ kubectl -n external-dns get pods 
NAME                                    READY   STATUS    RESTARTS   AGE 
cilium-etcd-mnphzk2tjl                  1/1     Running   0          2d2h 
cilium-etcd-operator-55d89bbff7-cw8rc   1/1     Running   0          2d2h 
cilium-etcd-tsxm5rsckj                  1/1     Running   0          2d2h 
cilium-etcd-wtnqt22ssg                  1/1     Running   0          2d2h 
coredns-coredns-5c86dd5979-866s2        1/1     Running   0          2d 
coredns-coredns-5c86dd5979-vq86w        1/1     Running   0          2d 
etcd-operator-6c57fff6f5-g92pc          1/1     Running   0          2d2h 
external-dns-96d9fbc64-j22pf            1/1     Running   0          2d1h

如果您回头看一下我们的ingress:

--- 
apiVersion: networking.k8s.io/v1beta1 
kind: Ingress 
Metadata: 
  annotations: 
    kubernetes.io/ingress.class: Nginx 
  name: Nginx 
  namespace: demo 
spec: 
  rules: 
  - host: Nginx.test.org 
    http: 
      paths: 
      - backend: 
          serviceName: Nginx 
          servicePort: 80 
$ kubectl -n demo get ingress 
 
NAME    CLASS    HOSTS            ADDRESS        PORTS     AGE 
Nginx   <none>   Nginx.test.org   10.10.39.200   80, 443   2d

让我们检查此ingress是否已被external dns接收并插入etcd数据库:

$ kubectl -n external-dns logs -f external-dns-96d9fbc64-j22pf 
time="2020-05-12T15:23:52Z" level=info msg="Add/set key /skydns/org/test/Nginx/4781436c to Host=10.10.39.200, Text=\"heritage=external-dns,external-dns/owner=default,external-dns/resource=ingress/demo/Nginx\", TTL=0"

External DNS似乎正在发挥作用。现在,让我们看看是否可以直接从coredns解析查询,因为它应该是从同一etcd服务器读取的。

coredns正在监听NodePort服务,这意味着我们可以查询该服务上的任何节点NodePort:

$ kubectl -n external-dns get svc coredns-coredns 
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                     AGE 
coredns-coredns      NodePort    10.99.62.135   <none>        53:31071/UDP,53:30396/TCP   2d1h

53/UDP端口映射到端口31071/UDP。让我们选择一个随机节点:

NAME STATUS   ROLES    AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME 
m1   Ready    master   15d   v1.18.2   10.10.40.10    <none>        Ubuntu 18.04.3 LTS   4.15.0-99-generic   containerd://1.3.4 
n1   Ready    <none>   15d   v1.18.2   10.10.40.110   <none>        Ubuntu 18.04.3 LTS   4.15.0-99-generic   containerd://1.3.4 
n2   Ready    <none>   15d   v1.18.2   10.10.40.120   <none>        Ubuntu 18.04.3 LTS   4.15.0-74-generic   containerd://1.3.4

并尝试使用以下方式进行DNS查询dig:

root@inf-k8s-epi-m5:~# dig -p 31071 Nginx.test.org @10.10.40.120 
 
; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> -p 31071 Nginx.test.org @10.10.40.120 
;; global options: +cmd 
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61245 
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 
;; WARNING: recursion requested but not available 
 
;; OPT PSEUDOSECTION: 
; ednS: version: 0, flags:; udp: 4096 
; COOKIE: ef8ff2732b2dc6fd (echoed) 
;; QUESTION SECTION: 
;Nginx.test.org.                        IN      A 
 
;; ANSWER SECTION: 
Nginx.test.org.         30      IN      A       10.10.39.200 
 
;; Query time: 2 msec 
;; SERVER: 10.10.40.120#31071(10.10.40.120) 
;; WHEN: Thu May 14 16:26:07 UTC 2020 
;; MSG SIZE  rcvd: 85

我们可以看到coredns正在使用MetalLB负载均衡器IP进行回复。

快速启动并运行

在本指南中,我们配置了coredns,External DNS,Nginx Ingress和MetalLB,以提供与Cloud架构一样的动态体验。如果您想快速入门,请查看我们的Flux github仓库地址,其中包含用于此演示的所有清单以及更多内容(https://github.com/clusterfrak-dynamics/gitops-template/tree/master/flux)。

原文:https://particule.io/en/blog/k8s-no-cloud/

【编辑推荐】

  1. DNS解析域名:发现域名和IP不一致,访问了该域名会发生什么

  2. [张彬Linux]企业十大应用-实战dnsmasq

  3. 使用DNS over TLS

  4. 使用PowerDNS轻松配置DNS名称服务器

  5. 在Linux上挖掘DNS应答中的秘密

武晓燕 TEL:(010)68476606】

NAS 厂商的简单总结

NAS 厂商的简单总结

NAS (Network Attached Storage): 中文称作"网络存储器"。

按照国家或区域分类
1、中国台湾
(1) QNAP(威联通):
 a) 基本情况: 成立于2004-4; 员工人数: 700+人(2013); 资本额:2.5亿人民币.
 b) 家用及小型办公室:TS-x70Pro、TS-x69L、TS-x21、TS-x20、TS-x12系列 
 
(2) Synology(群晖科技): 营业额 2.5 亿美元 (2013)
 a) 基本情况: 创立于2000
 b) 家用产品: DS414j、DS414slim、DS214se、DS213air、DS213j、DS115j、DS112j、EDS14
 c) 群晖科技操作系统 DiskStation Manager: 网页界面的直觉式操作系统,可帮助用户管理存于 Synology DiskStation 和 RackStation 里的文件、照片、音乐、视频以及其他重要内容。DiskStation Manager 可实现的不仅是存储资料,用户还可以自行设置应用程序与选择所需要的服务,更加地丰富生活并提高工作效率。
 
2、日本
(1) Buffalo(巴法络): 销售额 10 亿美元
 a) 日商美禄可集团成立于1975,是日本最大的计算机外设产品提供商,其计算机外设品牌BUFFALO,2003为拓展中国市场,于上海成立办事处,协助建立BUFFALO国际品牌形象。
 b) 家用产品: 单盘位、双盘位、多盘位 LinkStation 系列 
 c) 在日本的市场份额: 60% 左右
 
(2) I-O DATA
 a) 名字源于输入/输出(Input/Output), 株式会社 I-O DATA 机器成立于1976
 b) 网络存储: HDL-GXW 系列网络硬盘 HDL-GT/GTR 系列网络硬盘 HDL-GTR2U 系列网络硬盘 HDL2-G 系列网络硬盘。
 c) 在日本的市场份额: 40% 左右

3、美国
(1) Seagate(希捷):
 a) 基本情况: 成立于1979,全球最大的硬盘、磁盘和读写磁头制造商,总部位于美国加州司各特谷市。
 
(2) WD (Western Digital,西部数据):
 a) 基本情况: Western Digital 于 2015-10-21 宣布以 190 亿美元收购 SanDisk;SanDisk 是全球最大闪存制造商之一, U盘和相机储存卡很多都出自 SanDisk。
 b) 家用产品: My Cloud (个人云存储设备)  

(3) NETGEAR (美国网件):
 a) 基本情况: 成立于 1996-1, 全球领先的企业网络解决方案,及数字家庭网络应用倡导者,2002正式进军中国市场。
 

php获取当前页面完整真实的url地址的方法,包括带参数的,总结了三种方法

php获取当前页面完整真实的url地址的方法,包括带参数的,总结了三种方法

01 function GetCurUrl(){
02     if(isset($_SERVER[''REQUEST_URI''])){
03         $url=$_SERVER[''REQUEST_URI''];
04     }else{
05         if(isset($_SERVER[''argv''])){
06             $url=$_SERVER[''PHP_SELF''].''?''.$_SERVER[''argv''][0];
07         }else{
08             $url=$_SERVER[''PHP_SELF''].''?''.$_SERVER[''QUERY_STRING''];
09         }
10     }
11     return urlencode($url);//注意这里给编码了
12 }

第二种方法(据说织梦用的就是这种方法):

 

 

01 //获得当前的脚本网址
02 function GetCurUrl(){
03     if(!empty($_SERVER[''REQUEST_URI''])){
04         $scriptName=$_SERVER[''REQUEST_URI''];
05         $nowurl=$scriptName;
06     }else{
07         $scriptName=$_SERVER[''PHP_SELF''];
08         if(empty($_SERVER[''QUERY_STRING''])){
09             $nowurl=$scriptName;
10         }else{
11             $nowurl=$scriptName.''?''.$_SERVER[''QUERY_STRING''];
12         }
13     }
14     return $nowurl;
15 }

第三种方法(推荐):

 

 

01 //php获取当前访问的完整url地址
02 function GetCurUrl(){
03     $url=''http://'';
04     if(isset($_SERVER[''HTTPS''])&&$_SERVER[''HTTPS'']==''on''){
05         $url=''https://'';
06     }
07     if($_SERVER[''SERVER_PORT'']!=''80''){
08         $url.=$_SERVER[''SERVER_NAME''].'':''.$_SERVER[''SERVER_PORT''].$_SERVER[''REQUEST_URI''];
09     }else{
10         $url.=$_SERVER[''SERVER_NAME''].$_SERVER[''REQUEST_URI''];
11     }
12     return $url;
13 }

今天关于我对比了三家云厂商的新年促销,总结了 3 个购买的秘诀各大云厂商云产品对比的介绍到此结束,谢谢您的阅读,有关.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案、Kubernetns LB方案:无需云厂商的动态DNS和负载均衡、NAS 厂商的简单总结、php获取当前页面完整真实的url地址的方法,包括带参数的,总结了三种方法等更多相关知识的信息可以在本站进行查询。

本文标签: