分类 技术 下的文章

下载我们整理的 curl 备忘录。要在不使用图形界面的情况下从互联网上获取所需的信息,curl 是一种快速有效的方法。

curl 通常被视作一款非交互式 Web 浏览器,这意味着它能够从互联网上获取信息,并在你的终端中显示,或将其保存到文件中。从表面看,这是 Web 浏览器,类似 Firefox 或 Chromium 所做的工作,只是它们默认情况下会渲染信息,而 curl 会下载并显示原始信息。实际上,curl 命令可以做更多的事情,并且能够使用多种协议与服务器进行双向传输数据,这些协议包括 HTTP、FTP、SFTP、IMAP、POP3、LDAP、SMB、SMTP 等。对于普通终端用户来说,这是一个有用的工具;而对于系统管理员,这非常便捷;对于微服务和云开发人员来说,它是一个质量保证工具。

curl 被设计为在没有用户交互的情况下工作,因此与 Firefox 不同,你必须从头到尾考虑与在线数据的交互。例如,如果想要在 Firefox 中查看网页,你需要启动 Firefox 窗口。打开 Firefox 后,在地址栏或搜索引擎中输入要访问的网站。然后,导航到网站,然后单击要查看的页面。

对于 curl 来说也是如此,不同之处在于你需要一次执行所有操作:在启动 curl 的同时提供需要访问的互联网地址,并告诉它是否要将数据保存在终端或文件中。当你必须与需要身份验证的网站或 API 进行交互时,会变得有点复杂,但是一旦你学习了 curl 命令语法,它就会变得自然而然。为了帮助你掌握它,我们在一个方便的备忘录中收集了相关的语法信息。

使用 curl 下载文件

你可以通过提供指向特定 URL 的链接来使用 curl 命令下载文件。如果你提供的 URL 默认为 index.html,那么将下载此页面,并将下载的文件显示在终端屏幕上。你可以将数据通过管道传递到 lesstail 或任何其它命令:

$ curl "http://example.com" | tail -n 4
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div></body></html>

由于某些 URL 包含特殊字符,shell 通常会将其解释,因此最安全的做法用引号将 URL 包起来。

某些文件无法很好的在终端中转换显示。你可以使用 --remote-name 选项使文件根据服务器上的命名进行保存:

$ curl --remote-name "https://example.com/linux-distro.iso"
$ ls
linux-distro.iso

或者,你可以使用 --output 选项来命名你想要下载的内容:

curl "http://example.com/foo.html" --output bar.html

使用 curl 列出带有远程目录的内容

因为 curl 不是交互式的,所以很难浏览页面上的可下载元素。如果你要连接的远程服务器允许,可以使用 curl 来列出目录的内容:

$ curl --list-only "https://example.com/foo/"

继续中断下载

如果你正在下载一个非常大的文件,你可能会发现有时候必须中断下载。curl 非常智能,可以确定下载从何处中断并继续下载。这意味着,下一次当你下载一个 4GB 的 Linux 发行版的 ISO 出现问题时,就不必重新开始了。--continue-at 的语法有点不寻常:如果你知道下载中断时的字节数,你可以提供给 curl;否则,你可以使用单独的一个破折号(-)指示 curl 自动检测:

$ curl --remote-name --continue-at - "https://example.com/linux-distro.iso"

下载文件序列

如果你需要下载多个文件而不是一个大文件,那么 curl 可以帮助你解决这个问题。假设你知道要下载的文件的位置和文件名模式,则可以使用 curl 的序列标记:中括号里是整数范围的起点和终点。对于输出文件名,使用 #1 表示第一个变量:

$ curl "https://example.com/file_[1-4].webp" --output "file_#1.webp"

如果你需要使用其它变量来表示另一个序列,按照每个变量在命令中出现的顺序表示它们。例如,在这个命令中,#1 指目录 images_000images_009,而 #2 指目录 file_1.webpfile_4.webp

$ curl "https://example.com/images_00[0-9]/file_[1-4].webp" --output "file_#1-#2.webp"

从站点下载所有 PNG 文件

你也可以仅使用 curlgrep 进行一些基本的 Web 抓取操作,以找到想要下载的内容。例如,假设你需要下载与正在归档网页关联的所有图像,首先,下载引用了图像的页面。将页面内通过管道传输到 grep,搜索所需的图片类型(在此示例中为 PNG)。最后,创建一个 while 循环来构造下载 URL,并将文件保存到你的计算机:

$ curl https://example.com |\
grep --only-matching 'src="[^"]*.[png]"' |\
cut -d\" -f2 |\
while read i; do \
curl https://example.com/"${i}" -o "${i##*/}"; \
done

这只是一个示例,但它展示了 curl 与 Unix 管道和一些基本而巧妙的解析结合使用时是多么的灵活。

获取 HTML 头

用于数据交换的协议在计算机发送通信的数据包中嵌入了大量元数据。HTTP 头是数据初始部分的组件。在连接一个网站出现问题时,查看这些报文头(尤其是响应码)会有所帮助:

curl --head "https://example.com"
HTTP/2 200
accept-ranges: bytes
age: 485487
cache-control: max-age=604800
content-type: text/html; charset=UTF-8
date: Sun, 26 Apr 2020 09:02:09 GMT
etag: "3147526947"
expires: Sun, 03 May 2020 09:02:09 GMT
last-modified: Thu, 17 Oct 2019 07:18:26 GMT
server: ECS (sjc/4E76)
x-cache: HIT
content-length: 1256

快速失败

响应 200 通常是 HTTP 成功指示符,这是你与服务器连接时通常期望的结果。著名的 404 响应表示找不到页面,而 500 则表示服务器在处理请求时出现了错误。

要查看协商过程中发生了什么错误,添加 --show-error 选项:

$ curl --head --show-error "http://opensource.ga"

除非你可以访问要连接的服务器,否则这些问题将很难解决,但是 curl 通常会尽力连接你指定的地址。有时在网络上进行测试时,无休止的重试似乎只会浪费时间,因此你可以使用 --fail-early 选项来强制 curl 在失败时迅速退出:

curl --fail-early "http://opensource.ga"

由 3xx 响应指定的重定向查询

300 这个系列的响应更加灵活。具体来说,301 响应意味着一个 URL 已被永久移动到其它位置。对于网站管理员来说,重新定位内容并留下“痕迹”是一种常见的方式,这样访问旧地址的人们仍然可以找到它。默认情况下,curl 不会进行 301 重定向,但你可以使用 --localtion 选项使其继续进入 301 响应指向的目标:

$ curl "https://iana.org" | grep title
<title>301 Moved Permanently</title>
$ curl --location "https://iana.org"
<title>Internet Assigned Numbers Authority</title>

展开短网址

如果你想要在访问短网址之前先查看它们,那么 --location 选项非常有用。短网址对于有字符限制的社交网络(当然,如果你使用现代和开源的社交网络的话,这可能不是问题),或者对于用户不能复制粘贴长地址的印刷媒体来说是有用处的。但是,它们也可能存在风险,因为其目的地址本质上是隐藏的。通过结合使用 --head 选项仅查看 HTTP 头,--location 选项可以查看一个 URL 的最终地址,你可以查看一个短网址而无需加载其完整的资源:

$ curl --head --location "<https://bit.ly/2yDyS4T>"

下载我们的 curl 备忘录

一旦你开始考虑了将探索 web 由一条命令来完成,那么 curl 就成为一种快速有效的方式,可以从互联网上获取所需的信息,而无需麻烦图形界面。为了帮助你适应到工作流中,我们创建了一个 curl 备忘录,它包含常见的 curl 用法和语法,包括使用它查询 API 的概述。


via: https://opensource.com/article/20/5/curl-cheat-sheet

作者:Seth Kenlon 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Fedora Media Writer 是创建临场版 USB 以尝试 Linux 的方便方法。

Fedora Media Writer 是一个小巧、轻量、全面的工具,它简化了 Linux 的入门体验。它可以下载 Fedora 的 Workstation 或 Server 版本并写入到一个可以在任何系统上引导的 USB 驱动器上,使你无需将其安装到硬盘上就可以试用 Fedora Linux。

Media Writer 工具可以用来创建一个 临场体验的 Live 、可引导的 USB 驱动器。在你的平台上安装 Fedora Media Writer 应用后,你可以下载并烧录最新的 Fedora Workstation 或 Server 稳定版,也可以选择烧录你下载的任何其他镜像。而且它并不局限于英特尔 64 位设备。它还可以用于 ARM 设备,如树莓派,这些设备日益变得更加强大和有用。

 title=

安装 Fedora Media Writer

安装 Fedora Media Writer 有几种方式。你可以通过 GitHub 从源码编译、下载 MacOS 或 Windows 版本、使用 dnfyum 安装 RPM 包,或者以 Flatpak 的形式获得。

在 Fedora 上:

$ sudo dnf install mediawriter

最新版本请参见 GitHub 仓库的发布部分。

准备好你的媒体介质

首先,你需要一个 USB 驱动器来安装你的 Linux 操作系统。这就是 Fedora Media Writer 要烧录的设备。这个驱动器必须是空白或可擦除的,因为 该 USB 驱动器上的所有数据都会被删除。如果有任何数据,哪怕只是一个文件,如果你不想丢失,那么你必须在继续之前备份它!

确认你的 USB 驱动器是可擦除的之后,将它插入你的电脑并启动 Fedora Media Writer。

使用 Fedora Media Writer

当你启动 Fedora Media Writer 时,你会看到一个页面,提示你从互联网上获取一个可引导的镜像,或者从你的硬盘上加载一个自定义镜像。第一个选择是 Fedora 的最新版本。Workstation 版本适用于台式机和笔记本电脑,Server 版本适用于虚拟化、机架服务器或任何你想作为服务器运行的情况。

如果你选择了 Fedora 镜像,Media Writer 会下载一个光盘镜像(通常称为 “iso”,文件扩展名为 .iso),并将其保存到你的下载文件夹中,这样你就可以重复使用它来烧录另一个驱动器。

Select your image

另外还有 Fedora Spins,这是来自 Fedora 社区的镜像,它旨在满足小众的兴趣。例如,如果你是 MATE 桌面的粉丝,那么你会很高兴地发现 Media Writer 提供了 MATE spin。它有很多,所以请滚动查看所有的选择。如果你是 Linux 的新手,不要被吓到或感到困惑:这些额外的选项是为老用户准备的,这些用户除了默认的选项外,还发展出了自己的偏好,所以对你来说,只使用 Workstation 或 Server 选项就行,这取决于你是想把 Fedora 作为一个桌面还是作为一个服务器操作系统来运行。

如果你需要一个与你当前使用的 CPU 不同架构的镜像,从窗口右上角的下拉菜单中选择 CPU 架构。

如果你已经将镜像保存在硬盘上,请选择“Custom Image”选项,并选择你要烧录到 USB 的发行版的 .iso 文件。

写入 USB 驱动器

当你下载或选择了一个镜像,你必须确认你要将该镜像写入驱动器。

驱动器选择下拉菜单只显示了外部驱动器,所以你不会意外地覆盖自己的硬盘驱动器。这是 Fedora Media Writer 的一个重要功能,它比你在网上看到的许多手动说明要安全得多。然而,如果你的计算机上连接了多个外部驱动器,除了你想覆盖的那个,你应该将它们全部移除,以增加安全性。

选择你要安装镜像的驱动器,然后单击“Write to Disk”按钮。

 title=

稍等一会儿,镜像就会被写入到你的驱动器,然后可以看看 Don Watkins 对如何从 USB 驱动器启动到 Linux的出色介绍。

开始使用 Linux

Fedora Media Writer 是一种将 Fedora Workstation 或 Server,或任何 Linux 发行版烧录到 USB 驱动器的方法,因此你可以在安装它到设备上之前试用它。试试吧,并在评论中分享你的经验和问题。


via: https://opensource.com/article/20/10/fedora-media-writer

作者:Sumantro Mukherjee 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

将 Kubernetes 与 Ansible 结合实现云端自动化。此外,还可以参照我们的 Ansible 的 k8s 模块速查表。

Ansible 是实现自动化工作的优秀工具,而 Kubernetes 则是容器编排方面的利器,要是把两者结合起来,会有怎样的效果呢?正如你所猜测的,Ansible + Kubernetes 的确可以实现容器编排自动化。

Ansible 模块

实际上,Ansible 本身只是一个用于解释 YAML 文件的框架。它真正强大之处在于它丰富的模块,所谓 模块 module ,就是在 Ansible 剧本 playbook 中让你得以通过简单配置就能调用外部应用程序的一些工具。

Ansible 中有模块可以直接操作 Kubernetes,也有对一些相关组件(例如 DockerPodman)实现操作的模块。学习使用一个新模块的过程和学习新的终端命令、API 一样,可以先从文档中了解这个模块在调用的时候需要接受哪些参数,以及这些参数在外部应用程序中产生的具体作用。

访问 Kubernetes 集群

在使用 Ansible Kubernetes 模块之前,先要有能够访问 Kubernetes 集群的权限。在没有权限的情况下,可以尝试使用一个短期在线试用账号,但我们更推荐的是按照 Kubernetes 官网上的指引,或是参考 Braynt Son 《入门 Kubernetes》的教程安装 Minikube。Minikube 提供了一个单节点 Kubernetes 实例的安装过程,你可以像使用一个完整集群一样对其进行配置和交互。

在安装 Minikube 之前,你需要确保你的环境支持虚拟化并安装 libvirt,然后对 libvirt 用户组授权:

$ sudo dnf install libvirt
$ sudo systemctl start libvirtd
$ sudo usermod --append --groups libvirt `whoami`
$ newgrp libvirt

安装 Python 模块

为了能够在 Ansible 中使用 Kubernetes 相关的模块,你需要安装以下这些 Python 模块:

$ pip3.6 install kubernetes --user
$ pip3.6 install openshift --user

启动 Kubernetes

如果你使用的是 Minikube 而不是完整的 Kubernetes 集群,请使用 minikube 命令在本地创建一个最精简化的 Kubernetes 实例:

$ minikube start --driver=kvm2 --kvm-network default

然后等待 Minikube 完成初始化,这个过程所需的时间会因实际情况而异。

获取集群信息

集群启动以后,通过 cluster-info 选项就可以获取到集群相关信息了:

$ kubectl cluster-info
Kubernetes master is running at https://192.168.39.190:8443
KubeDNS is running at https://192.168.39.190:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

使用 k8s 模块

Ansible 使用 k8s 这个模块来实现对 Kubernetes 的操作,在剧本中使用 k8s 模块就可以对 Kuvernetes 对象进行管理。这个模块描述了 kubectl 命令的最终状态,例如对于以下这个使用 kubectl 创建新的命名空间的操作:

$ kubectl create namespace my-namespace

这是一个很简单的操作,而对这个操作的最终状态用 YAML 文件来描述是这样的:

- hosts: localhost
  tasks:
    - name: create namespace
      k8s:
        name: my-namespace
        api_version: v1
        kind: Namespace
        state: present

如果你使用的是 Minikube,那么主机名(hosts)应该定义为 localhost。需要注意的是,所使用的模块也定义了可用参数的语法(例如 api_versionkind 参数)。

在运行这个剧本之前,先通过 yamllint 命令验证是否有错误:

$ yamllint example.yaml

确保没有错误之后,运行剧本:

$ ansible-playbook ./example.yaml

可以验证新的命名空间是否已经被创建出来:

$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   37h
kube-node-lease   Active   37h
kube-public       Active   37h
kube-system       Active   37h
demo              Active   11h
my-namespace      Active   3s

使用 Podman 拉取容器镜像

容器是个 Linux 系统,几乎是最小化的,可以由 Kubernetes 管理。LXC 项目和 Docker 定义了大部分的容器规范。最近加入容器工具集的是 Podman,它不需要守护进程就可以运行,为此受到了很多用户的欢迎。

通过 Podman 可以从 Docker Hub 或者 Quay.io 等存储库拉取容器镜像。这一操作对应的 Ansible 语法也很简单,只需要将存储库网站提供的镜像路径写在剧本中的相应位置就可以了:

   - name: pull an image
      podman_image:
        name: quay.io/jitesoft/nginx

使用 yamllint 验证:

$ yamllint example.yaml

运行剧本:

$ ansible-playbook ./example.yaml
[WARNING]: provided hosts list is empty, only localhost is available.
Note that the implicit localhost does not match 'all'

PLAY [localhost] ************************

TASK [Gathering Facts] ************************
ok: [localhost]

TASK [create k8s namespace] ************************
ok: [localhost]

TASK [pull an image] ************************
changed: [localhost]

PLAY RECAP ************************
localhost: ok=3 changed=1 unreachable=0 failed=0
           skipped=0 rescued=0 ignored=0

使用 Ansible 实现部署

Ansible 除了可以执行小型维护任务以外,还可以通过剧本实现其它由 kubectl 实现的功能,因为两者的 YAML 文件之间只有少量的差异。在 Kubernetes 中使用的 YAML 文件只需要稍加改动,就可以在 Ansible 剧本中使用。例如下面这个用于使用 kubectl 命令部署 Web 服务器的 YAML 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-webserver
spec:
  selector:
    matchLabels:
      run: my-webserver
  replicas: 1
  template:
    metadata:
      labels:
        run: my-webserver
    spec:
      containers:
      - name: my-webserver
        image: nginx
        ports:
        - containerPort: 80

如果你对其中的参数比较熟悉,你只要把 YAML 文件中的大部分内容放到剧本中的 definition 部分,就可以在 Ansible 中使用了:

   - name: deploy a web server
      k8s:
        api_version: v1
        namespace: my-namespace
        definition:
          kind: Deployment
          metadata:
            labels:
              app: nginx
            name: nginx-deploy
          spec:
            replicas: 1
            selector:
              matchLabels:
                app: nginx
            template:
              metadata:
                labels:
                  app: nginx
              spec:
                containers:
                  - name: my-webserver
                    image: quay.io/jitesoft/nginx
                    ports:
                      - containerPort: 80
                        protocol: TCP

执行完成后,使用 kubectl 命令可以看到预期中的的 部署 deployment

$ kubectl -n my-namespace get pods
NAME                      READY  STATUS
nginx-deploy-7fdc9-t9wc2  1/1    Running

在云上使用模块

随着现在越来越多的开发和部署工作往云上转移的趋势,我们必须了解如何在云上实现自动化。其中 k8spodman_image 这两个模块只是云开发中的其中一小部分。你可以在你的工作流程中寻找一些需要自动化的任务,并学习如何使用 Ansible 让你在这些任务上事半功倍。


via: https://opensource.com/article/20/9/ansible-modules-kubernetes

作者:Seth Kenlon 选题:lujun9972 译者:HankChow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

作为云原生的核心产品,Kubernetes 提供的编排和管理功能,能轻松完成大规模容器部署,但 Kubernetes 自身的复杂性也导致众多企业一直徘徊于容器服务之外。据调查,只有不足 10% 的用户表示使用 Kubernetes 时没有遇到阻碍。

在 2019 年的一个关于容器技术的一个调查数据中,有 40% 的受访者表示计划采用容器。然而,据 UCloud 产品经理张鹏波透露说,在他们接触的用户当中,曾经在两年前表示有兴趣迁移到容器的用户,两年过去了,这些用户很多依旧“计划采用”容器服务。

这让我好奇其中发生了什么。让我们一起来探寻一下其中的症结,以及是否可以将复杂的 Kubernetes变得不复杂。

Kubernetes 复杂吗?

自从 2017 年,Kubernetes 在容器编排三强争霸赛中胜出后,就成为了容器编排领域的事实标准,极大的助推了容器技术在业界的发展。作为企业级的容器服务编排系统,Kubernetes 从技术上是现在、乃至未来的主流。

容器拥有很多优点,包括不可变环境、轻量级、快速启动等优势;而容器编排系统又在此基础上更进一步,提供了更加强大的功能,包括自动部署、快速扩容、故障自愈等等。

然而,在这一系列令人神往的优势和功能背后,Kubernetes 也相应的引入了更多的复杂性。这些复杂性体现在多个方面,比如说:

  • 首先是 Kubernetes 架构,本质上,Kubernetes 是用来管理分布式系统的平台。而一说到分布式,复杂性是不可避免的,管理分布式系统的平台自然也不例外。
  • 另外是容器支持的网络,Kubernetes 支持的网络类型很多。很多用户对于 Kubernetes 的网络非常疑惑或者说很纠结,当业务要迁移到 Kubernetes 时,选择什么类型的网络是一个难以抉择的问题。特别是在业务迁移上去之后又遇到一些问题的话,排查起来会非常麻烦,这给用户带来很大负担。
  • 最后还有就是各种各样 Kubernetes 组件的配置,这些都是用户将业务迁移到 Kubernetes 的障碍。

有什么解决方案吗?

如上所述,并不是每个用户都能尝到桃子的美味的,还有很多渴望迁移到容器环境的用户被拒之门外。

在这种情况下,全球各家云服务商,都纷纷推出自己的容器编排服务,在 Kubernetes上构建了自己的 Kubernetes发行版或定制产品。

而作为中国第一家公有云科创板上市公司,UCloud 利用在 UK8S 产品的技术沉淀,推出新的容器管理服务产品 Cube:两步即可部署容器化应用;采用无服务器形态,不需要再维护底层基础设施;按秒后付费,无需预留资源;降低企业部署云原生产品的学习和技术门槛。

为什么要推出 Cube?

在容器和 Kubernetes 如火如荼发展的同时,UCloud 发现,在他们的 UK8S 上线大概两年多的时间里,之前曾经想把业务迁到 Kubernetes 的用户。在两年后的今天,他们还是说这个话,说我很想上 Kubernetes,还需要你们来做技术交流。

UCloud 产品经理张鹏波说:

这让我们一度很困惑,我们一开始也做了一些尝试,比如说做了很多线下的培训、线上的交流,尝试去推动用户把他们的业务迁移到 UK8S 里面来。但是发现这个过程非常缓慢,我们没有办法控制和推动用户的迁移流程。很多公司的业务在快速发展,运维和研发是没有办法做架构上的调整的。

发现沟通、培训这条路实际上是走不通之后的。后来我们想,能不能换一条路,能不能基于 Kubernetes提供这样一个产品:这个产品只具有 Kubernetes 好处,掩盖了 Kubernetes 的复杂性,只提供类似于自动部署、快速扩容这样的特性,而用户不需要关心底层的 Kubernetes 架构,不需要再操心 Kubernetes 的网络了,也不需要去学习 Kubernetes 的各种 API 了。

Cube 的设计思路

沿着这个思路,UCloud 形成了自己的 Cube 产品。它的设计是从以下几个方面考虑的:

首先,Kubernetes 里面哪些功能是会经常会用到的,比如 Deployment 控制多副本容器组的管理, Job 控制任务型容器组,Service 做服务发现,PVC可以用来抽象使用块存储以及文件存储。这是 Kubernetes 最核心的一些功能。UCloud 在设计 Cube 的时候,希望将这些功能全部保留。这意味着整个 Cube 是基于 Kubernetes 来实现的。把这些复杂性全部屏蔽掉,用户不需要维护 Kubernetes 集群,不需要操心 Kubernetes 网络方案,而是由 Cube 提供一个最优网络方案,把容器的网络和虚拟机的网络扁平化。

其次,把业务迁移到 Kubernetes 的时候,把单体业务变成分布式业务、微服务的时候,用户一定需要考虑容器日志的统一收集、统一管理的问题。在 Cube 里面自动完成了日志的采集工作,集成了日志管理工作。另外,对容器环境的监控也是同样的道理,统一在 Cube 中完成。

当把这些产品全部集成到 Cube 里以后,Cube 是一个什么样的产品形态呢?

首先保证 Kubernetes 最核心的功能,用户能够在 Cube 里面创建 Kubernetes 常用的对象;另外 Cube 的产品形态应该是无服务器的形式;最后,Cube 引入了轻量级的虚拟化技术,实现了容器组与容器组之间虚拟机级别的隔离,这样好处是什么呢?

我们都知道容器的运行是共享使用宿主机的内核的,存在一定的安全风险,Cube 为每一个容器组实现了一层虚拟机的封装,可以使用户安全的运行容器;同时 UCloud 容器团队针对虚拟机的启动进行了深入优化,虚拟机启动速度最快只需要 125 毫秒。

Cube 的功能亮点

快速迁移

让我们横向对比一下,用户使用 Kubernetes 和 Cube 的流程上会有哪些区别。

左边是 Kubernetes,用户要把业务迁移到 Kubernetes,大概要经过这几个步骤:

  • 第一个步骤学习 Kubernetes,不仅仅是一个人,也可能不仅仅是一个团队,这个过程可能需要三个月到一年。
  • 搭建集群,考虑集群的参数配置、集群的维护工作。
  • 然后是做业务镜像。
  • 之后还要考虑了解 Kubernetes的 API 以及 Kubernetes 应用。
  • 最后才部署应用。

从 UCloud 观察到的情况来看,如果是对 Kubernetes非常熟悉的用户,这个过程可能要一两个月;但是如果对 Kubernetes 不熟悉,需要半年乃至一年。

使用 Cube 的话,就不再需要学习复杂的 Kubernetes知识了,和创建虚拟机一样在 Cube 里面创建一个应用,全部都是图形化的方式。所以,Cube 整个流程只有两步:

  • 制作镜像。
  • 在 Cube 的界面上直接部署应用就好了。

UCloud 产品经理张鹏波说,“我们有几个用户知道了 Cube 公测,公测以后第一天进行了解,第二天就把自己部署的业务迁移到 Cube 上来了,一天的时间就可以完成业务迁移的工作。”

成本降低

另外在成本方面,我们知道 Kubernetes 是一个大型的分布式集群,除了工作节点以外,还有管理节点。管理节点只是用来管理 Kubernetes 支持的应用,这部分开销实际上从企业角度来看是浪费的。对业务没有起到正向的作用,所以 Kubernetes 成本会比较高。

而对于 Cube,因为只需要为容器实例来付费,容器用了多少资源就付多少钱,不再考虑管理节点的开销、资源预留的问题。

更多的便利性

此外,还有一些其他针对 Kubernetes 自身的一些的改进。在 Cube 整个研发过程中,引入了一些亮点。

第一个是镜像预热,我们知道容器的启动速度其实很快的,基本一秒钟就能拉起来容器实例。但是这是热启动的情况,就是说工作节点上有这个镜像时,拉起来速度是很快的。而在冷启动的情况下,如果虚拟机上没有对应的镜像时,并且镜像非常大时,这个过程就非常缓慢了。我们遇到过最大的镜像有 20G 以上,容器的启动的时间就要花费几分钟。这样,容器本来说快速启动的优势就没有了,比虚拟机还慢了。所以,UCloud 在研发 Cube 的时候,使用了镜像预热的技术,把容器镜像变成 MBD 设备,在容器启动的时候,把它纳入到启动容器的节点上去,省去了镜像拉起的时间,让容器冷启动的时间从以前需要十几分钟变成现在只要几秒钟就拉起来了。

另外,因为 Kubernetes 是由谷歌开源的一项方案,很多理念和大部分企业更加超前一点。所以,在这种设计理念下,Kubernetes 每一个容器在重启以后,容器的 IP 就会变化。而我们知道很多传统的应用设计上是依赖于固定 IP 的,IP 一旦变化整个应用就会出现一些问题。很多用户都希望让容器重启后 IP 保持不变。这对于特别是有状态的服务尤为重要。所以,在 Cube 里面使用了 UCloud 的 EIP 功能,能够让用户容器重启时其 IP 保持不变。

最后,Cube 要兼容原有的运维习惯。传统上,虚拟机和 IDC 里面的物理机在使用体验上是没有什么差别的。有些用户之前业务部署在虚拟机,经常需要在出现问题的时候,直接登录到虚拟机里面去排错,查看一些日志。所以,为了兼容用户以前使用虚拟机的习惯,在 Cube 里面的容器也提供了登录功能,让用户在业务出现问题的时候,能够登录到容器里去快速排查问题。

结语

说实话,关于 Kubernetes 和各种发行版,我们也看过和研究过不少产品了,但是更多的是叶公好龙,没有将自己的应用迁移到 Kubernetes上的想法。一方面对着 Kubernetes 的各种先进特性馋涎欲滴,另外一方面却担心没有足够的精力面对全新的技术变化带来的挑战。

不过,今天看到 UCloud 的 Cube 产品,我决定要去亲自试试这个桃子的味道了。

在 Fedora 上使用 yum 仓库来获取最新的 ZFS 特性。

我是一名 Fedora Linux 用户,我每天都会运行 yum upgrade。虽然这个习惯使我能够运行所有最新的软件(Fedora 的四个基础之一的 “First” ,它也做到了),但它也会提醒 ZFS 存储平台和新内核之间的不兼容性。

作为一名开发者,有时我需要最新的 ZFS 分支的新特性。例如,ZFS 2.0.0 包含了一个令人兴奋的新功能,它大大提高了 ZVOL 同步性能,这对我这个 KVM 用户来说至关重要。但这意味着,如果我想使用 2.0.0 分支,我必须自己构建 ZFS。

起初,我只是在每次内核更新后从它的 Git 仓库中手动编译 ZFS。如果我忘记了,ZFS 就会在下次启动时无法被识别。幸运的是,我很快就学会了如何为 ZFS 设置动态内核模块支持 (DKMS)。然而,这个解决方案并不完美。首先,它没有利用强大的 yum 系统,而这个系统可以帮助解决依赖关系和升级。此外,使用 yum 在你自己的包和上游包之间进行切换是非常容易的。

在本文中,我将演示如何设置 yum 仓库来打包 ZFS。这个方案有两个步骤:

  1. 从 ZFS 的 Git 仓库中创建 RPM 包。
  2. 建立一个 yum 仓库来托管这些包。

创建 RPM 包

要创建 RPM 包,你需要安装 RPM 工具链。yum 提供了一个组来捆绑安装这些工具:

sudo dnf group install 'C Development Tools and Libraries' 'RPM Development Tools'

安装完这些之后,你必须从 ZFS Git 仓库中安装构建 ZFS 所需的所有包。这些包属于三个组:

  1. Autotools,用于从平台配置中生成构建文件。
  2. 用于构建 ZFS 内核和用户态工具的库。
  3. 构建 RPM 包的库。
sudo dnf install libtool autoconf automake gettext createrepo \
    libuuid-devel libblkid-devel openssl-devel libtirpc-devel \
    lz4-devel libzstd-devel zlib-devel \
    kernel-devel elfutils-libelf-devel \
    libaio-devel libattr-devel libudev-devel \
    python3-devel libffi-devel

现在你已经准备好创建你自己的包了。

构建 OpenZFS

OpenZFS 提供了优秀的基础设施。要构建它:

  1. git 克隆仓库,并切换到你希望使用的分支/标签。
  2. 运行 Autotools 生成一个 makefile。
  3. 运行 make rpm,如果一切正常,RPM 文件将被放置在 build 文件夹中。
$ git clone --branch=zfs-2.0.0-rc3 <https://github.com/openzfs/zfs.git> zfs
$ cd zfs
$ ./autogen.sh
$ ./configure
$ make rpm

建立一个 yum 仓库

yum 中,仓库是一个服务器或本地路径,包括元数据和 RPM 文件。用户设置一个 INI 配置文件,yum 命令会自动解析元数据并下载相应的软件包。

Fedora 提供了 createrepo 工具来设置 yum 仓库。首先,创建仓库,并将 ZFS 文件夹中的所有 RPM 文件复制到仓库中。然后运行 createrepo --update 将所有的包加入到元数据中。

$ sudo mkdir -p /var/lib/zfs.repo
$ sudo createrepo /var/lib/zfs.repo
$ sudo cp *.rpm /var/lib/zfs.repo/
$ sudo createrepo --update /var/lib/zfs.repo

/etc/yum.repos.d 中创建一个新的配置文件来包含仓库路径:

$ echo \
"[zfs-local]\\nname=ZFS Local\\nbaseurl=file:///var/lib/zfs.repo\\nenabled=1\\ngpgcheck=0" |\
sudo tee /etc/yum.repos.d/zfs-local.repo

$ sudo dnf --repo=zfs-local list available --refresh

终于完成了!你已经有了一个可以使用的 yum 仓库和 ZFS 包。现在你只需要安装它们。

$ sudo dnf install zfs
$ sudo /sbin/modprobe zfs

运行 sudo zfs version 来查看你的用户态和内核工具的版本。恭喜!你拥有了 Fedora 中的 ZFS


via: https://opensource.com/article/20/10/zfs-dnf

作者:Sheng Mao 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你被困在 Linux 终端,比如说在服务器上,如何从终端下载文件?

在 Linux 中是没有 download 命令的,但是有几个 Linux 命令可用于下载文件。

在这篇终端技巧中,你将学习两种在 Linux 中使用命令行下载文件的方法。

我在这里使用的是 Ubuntu,但除了安装,其余的命令同样适用于所有其他 Linux 发行版。

使用 wget 命令从 Linux 终端下载文件

wget 也许是 Linux 和类 UNIX 系统中使用最多的命令行下载管理器。你可以使用 wget 下载一个文件、多个文件、整个目录甚至整个网站。

wget 是非交互式的,可以轻松地在后台工作。这意味着你可以很容易地在脚本中使用它,甚至构建像 uGet 下载管理器这样的工具。

让我们看看如何使用 wget 从终端下载文件。

安装 wget

大多数 Linux 发行版都预装了 wget。它也可以在大多数发行版的仓库中找到,你可以使用发行版的包管理器轻松安装它。

在基于 Ubuntu 和 Debian 的发行版上,你可以使用 apt 包管理器命令:

sudo apt install wget

使用 wget 下载文件或网页

你只需要提供文件或网页的 URL。它将在你所在的目录下以原始名下载该文件。

wget URL

要下载多个文件,你必须将它们的 URL 保存在一个文本文件中,并将该文件作为输入提供给 wget,就像这样:

wget -i download_files.txt

用 wget 下载不同名字的文件

你会注意到,网页在 wget 中几乎总是以 index.html 的形式保存。为下载的文件提供自定义名称是个好主意。

你可以在下载时使用 -O (大写字母 O) 选项来提供输出文件名:

wget -O filename URL

用 wget 下载一个文件夹

假设你正在浏览一个 FTP 服务器,你需要下载整个目录,你可以使用递归选项 -r

wget -r ftp://server-address.com/directory

使用 wget 下载整个网站

是的,你完全可以做到这一点。你可以用 wget 镜像整个网站。我说的下载整个网站是指整个面向公众的网站结构。

虽然你可以直接使用镜像选项 -m,但最好加上:

  • –convert-links:链接将被转换,使内部链接指向下载的资源,而不是网站。
  • –page-requisites:下载额外的东西,如样式表,使页面在离线状态下看起来更好。
wget -m --convert-links --page-requisites website_address

额外提示:恢复未完成的下载

如果你因为某些原因按 CTRL-C 键中止了下载,你可以用选项 -c 恢复之前的下载:

wget -c

使用 curl 在 Linux 命令行中下载文件

wget 一样,curl 也是 Linux 终端中最常用的下载文件的命令之一。使用 curl 的方法有很多,但我在这里只关注简单的下载。

安装 curl

虽然 curl 并不是预装的,但在大多数发行版的官方仓库中都有。你可以使用你的发行版的包管理器来安装它。

在 Ubuntu 和其他基于 Debian 的发行版上安装 curl,请使用以下命令:

sudo apt install curl

使用 curl 下载文件或网页

如果你在使用 curl 命令时没有在 URL 中带任何选项,它就会读取文件并打印在终端上。

要在 Linux 终端中使用 curl 命令下载文件,你必须使用 -O(大写字母 O)选项:

curl -O URL

在 Linux 中,用 curl 下载多个文件是比较简单的。你只需要指定多个 URL 即可:

curl -O URL1 URL2 URL3

请记住,curl 不像 wget 那么简单。wget 可以将网页保存为 index.htmlcurl 却会抱怨远程文件没有网页的名字。你必须按照下一节的描述用一个自定义的名字来保存它。

用不同的名字下载文件

这可能会让人感到困惑,但如果要为下载的文件提供一个自定义的名称(而不是原始名称),你必须使用 -o(小写 O)选项:

curl -o filename URL

有些时候,curl 并不能像你期望的那样下载文件,你必须使用选项 -L(代表位置)来正确下载。这是因为有些时候,链接会重定向到其他链接,而使用选项 -L,它就会跟随最终的链接。

用 curl 暂停和恢复下载

wget 一样,你也可以用 curl-c 选项恢复暂停的下载:

curl -c URL

总结

和以往一样,在 Linux 中做同一件事有多种方法。从终端下载文件也不例外。

wgetcurl 只是 Linux 中最流行的两个下载文件的命令。还有更多这样的命令行工具。基于终端的网络浏览器,如 elinksw3m 等也可以用于在命令行下载文件。

就个人而言,对于一个简单的下载,我更喜欢使用 wget 而不是 curl。它更简单,也不会让你感到困惑,因为你可能很难理解为什么 curl 不能以预期的格式下载文件。

欢迎你的反馈和建议。


via: https://itsfoss.com/download-files-from-linux-terminal/

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出