2021年1月

作为第 1 部分的延续,本第 2 部分将介绍 Portainer 的其余功能。

监控 docker 容器镜像

root@linuxtechi ~}$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS   PORTS                             NAMES
9ab9aa72f015        ubuntu                "/bin/bash"         14 seconds ago      Exited (0) 12 seconds ago                  suspicious_shannon
305369d3b2bb        centos                "/bin/bash"         24 seconds ago      Exited (0) 22 seconds ago                  admiring_mestorf
9a669f3dc4f6        portainer/portainer   "/portainer"        7 minutes ago       Up 7 minutes   0.0.0.0:9000->9000/tcp      trusting_keller

包括 portainer(docker 容器镜像),所有已退出和当前正在运行的 docker 镜像都会显示出来。下面的 Portainer GUI 屏幕截图显示了相同的情况。

Docker_status

监视事件

单击 portainer 网页中的“Events”选项,如下所示。

基于 docker 容器活动生成和创建的各种事件将被提取并显示在此页面中.

Container-Events-Poratiner-GUI

现在检查并验证“Events”部分是如何工作的。创建一个新的 docker 容器镜像 redis,如下所述,在 docker 命令行检查状态:docker ps –a

root@linuxtechi ~}$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS         PORTS                    NAMES
cdbfbef59c31        redis                 "docker-entrypoint.s…"   About a minute ago   Up About a minute         6379/tcp                 angry_varahamihira
9ab9aa72f015        ubuntu                "/bin/bash"              10 minutes ago       Exited (0) 10 minutes ago                            suspicious_shannon
305369d3b2bb        centos                "/bin/bash"              11 minutes ago       Exited (0) 11 minutes ago                            admiring_mestorf
9a669f3dc4f6        portainer/portainer   "/portainer"             17 minutes ago       Up 17 minutes         0.0.0.0:9000->9000/tcp   trusting_keller

单击顶部的“Event List”刷新事件列表,

events_updated

现在事件的页面也更新了这个变化,

主机状态

下面是 portainer 显示主机状态的屏幕截图。这是一个简单的窗口。这显示了主机 Linux 机器的基本信息,如“CPU”、“主机名”、“操作系统信息”等。这个页面在不需要登录主机命令行的情况下提供了非常有用的信息,以便快速浏览。

Host-names-Portainer

Portainer 中的仪表板

到目前为止,我们已经在“Local”部分看到了基于 portainer 的各种特性。现在跳到所选 Docker 容器镜像的“Dashboard”部分。

在 Portainer 的网页中单击“EndPoint”选项时,会出现以下窗口:

End_Point_Settings

对于主机容器镜像,此仪表板有许多状态和选项。

Stacks

单击此选项可提供任何堆栈(如果有的话)的状态。因为这里没有堆栈,所以显示为零。

Images

单击此选项可提供主机中可用的容器镜像。此选项将显示所有活动和退出的容器镜像。

Docker-Container-Images-Portainer

例如,再创建一个“Nginx”容器并刷新此列表以查看更新:

root@linuxtechi ~}$  sudo docker run nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
27833a3ba0a5: Pull complete
ea005e36e544: Pull complete
d172c7f0578d: Pull complete
Digest: sha256:e71b1bf4281f25533cf15e6e5f9be4dac74d2328152edf7ecde23abc54e16c1c
Status: Downloaded newer image for nginx:latest

下面是刷新后的镜像界面:

Nginx_Image_creation

当 Nginx 镜像处于 stopped/killed 状态时,docker 的容器镜像会改变为 unused 状态。

:你可以看到这里所有的镜像的细节都非常清楚,比如内存使用,创建日期和时间。与命令行选项相比,从这里维护和监视容器将非常容易。

Networks

此选项用于网络操作。例如分配 IP 地址、创建子网、提供 IP 地址范围、访问控制(管理员和普通用户)。下面的窗口提供了各种可能选项的详细信息。根据你的需要,可以进一步去自行研究这些选项。

Conatiner-Network-Portainer

输入所有各种网络参数后,单击“create network”按钮即可创建网络。

Container

此选项将提供容器状态。此列表将提供有关活动的和未运行的容器状态的详细信息。此输出类似于 docker ps 命令选项。

Containers-Status-Portainer

在该窗口中,通过选中复选框并选择上述按钮可以根据需要控制容器停止和启动。一个例子如下:

例如,“CentOS”和“Ubuntu”容器都处于停止状态,现在可以通过选中复选框并点击“Start”按钮来启动它们。

start_containers1

start_containers2

注意: 因为这两个都是 Linux 容器镜像,所以不会被启动。Portainer 尝试启动,但稍后又停止。试试启动“Nginx”,你会看到它变成了 running 状态。

start_containers3

Volume

参见本文章第一部分。

Portainer 中的设置选项

到目前为止,我们已经在“Local”部分看到了基于 portainer 的各种特性。现在跳到所选 Docker 容器图像的“Settings”部分。

在 Portainer 的网页中单击“Settings”选项时,可以使用以下的配置选项:

Extensions

这是一个简单的 Portainer CE 订阅程序。详细信息和用途可以从附加的窗口中看到。这主要用于维护相应版本的许可证和订阅。

Extensions

Users

此选项用于添加具有或不具有管理权限的“用户”。下面的示例提供了相同的示例。

在本例中输入你的想好的用户名比如“shashi”和你选择的密码,然后点击下面的“Create User”按钮。

create_user_portainer

create_user2_portainer

Internal-user-Portainer

类似地,可以通过选中复选框并点击 “remove” 按钮来删除刚刚创建的用户“shashi”。

user_remove_portainer

Endpoints

此选项用于端点终端管理。终端可以添加和删除,如附加窗口中所示。

Endpoint-Portainer-GUI

新终端“shashi”是使用如下所示的各种默认参数创建的,

Endpoint2-Portainer-GUI

类似地,可以通过单击复选框并单击移除按钮来移除此端点。

Registries

此选项用于注册管理。由于 docker hub 有各种镜像的注册,因此此功能可用于类似的目的。

Registry-Portainer-GUI

使用默认选项就可以创建“shashi-registry”。

Registry2-Portainer-GUI

同样,如果不需要了,就可以移除它。

Settings

此选项用于设置以下各种选项,

  • 设置快照间隔
  • 设置自定义徽标
  • 创建外部模板
  • 安全功能,如:为非管理员禁用和启用 bin 挂载,为非管理员禁用/启用权限,启用主机管理功能

下面的屏幕截图显示了出于演示目的启用和禁用的一些选项。一旦全部完成点击“保存设置”按钮保存所有这些选项。

Portainer-GUI-Settings

现在点开“Authentication settings”就会弹出 LDAP、Internal 和 OAuth(extension)选项,如下所示:

Authentication-Portainer-GUI-Settings

根据我们想要的环境安全特性级别,选择相应的选项。

以上就是本文的内容,我希望这些介绍 portainer 的文章能帮助你更有效地管理和监视容器。请分享你的反馈和意见。


via: https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-io-part-2/

作者:Shashidhar Soppin 选题:lujun9972 译者:Chao-zhi 校对:wxy

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

当你学习一门新的编程语言时,这个“猜数字”游戏是一个很好的入门程序。下面是如何用 C 语言来编写它。

我在小学时就开始 自学编程。我的第一个程序是在 Apple II 上编写的,但最终,我还是通过看书和编程练习学会了 C 语言。练习编程的最佳方法是编写示例程序,它能帮助你练习新知识。

在我学习一种新的编程语言时,我喜欢编写一个简单的“猜数字”游戏来练习。电脑从 1 到 100 中随机挑选一个数字,你必须通过猜测来算出来。在另一篇文章中,我展示了如何用 Bash 语言编写这个“猜数字”游戏,我的同事也写了一些文章,介绍如何用 JavaJulia 和其他计算机语言编写它。

“猜数字”游戏的伟大之处在于它践行了几个编程概念:如何使用变量、如何比较值、如何打印输出以及如何读取输入。

整个夏天,我录制了一个系列视频,教人们如何用 C 语言编写程序。从那以后,我听到了很多人都在跟着它学习 C 语言编程的消息。所以,我想接着用 C 语言写一个“猜数字”的游戏。

去取一个随机数

从写一个函数来选择一个随机数字来开始“猜数字”游戏。在编写函数时,优秀的程序员会尽量使它们具有灵活性,这样他们就可以重用它们来解决略有不同的问题。因此,与其硬编码函数来选择 1 到 100 之间的一个随机数,不如编写函数来选择 1 到某个整数 maxval 之间的一个随机数:

#include <stdio.h>
#include <sys/random.h>

int
randnum(int maxval)
{
  /* pick a random number from 1 to maxval */

  int randval;

  getrandom(&randval, sizeof(int), GRND_NONBLOCK);

  /* could be negative, so ensure it's positive */

  if (randval < 0) {
    return (-1 * randval % maxval + 1);
  }
  else {
    return (randval % maxval + 1);
  }
}

该函数使用 Linux 的系统调用 getrandom 来生成一系列随机数。你可以在手册页中了解关于这个系统调用的更多信息,但请注意,getrandom 将用随机的 0 和 1 填充变量。这意味着最终值可以是正的,也可以是负的,因此你需要在之后进行测试,以确保 randnum 函数的结果是正值。

编写程序

你可以用这个函数来写你的“猜数字”程序:

#include <stdio.h>
#include <sys/random.h>
 
int
randnum(int maxval)
{
  ...
}

int
main(void)
{
  int number;
  int guess;

  number = randnum(100);

  puts("Guess a number between 1 and 100");

  do {
    scanf("%d", &guess);

    if (guess < number) {
      puts("Too low");
    }
    else if (guess > number) {
      puts("Too high");
    }
  } while (guess != number);

  puts("That's right!");

  return 0;
}

程序首先使用 randnum 函数从 1 到 100 之间选择一个随机数。在向用户输出一个提示后,程序进入一个 do-while 循环,以便用户可以猜测数字。

在循环的每次迭代中,程序测试用户的猜测的数值。如果用户的猜测小于随机数,程序将输出“Too low”,如果猜测大于随机数,程序将输出“Too high”。循环继续,直到用户的猜测与随机数相同。

当循环退出时,程序输出 “That's right!”,然后立即结束:

$ gcc -o guess -Wall guess.c

$ ./guess
Guess a number between 1 and 100
50
Too high
30
Too low
40
Too low
45
Too high
42
Too low
43
Too low
44
That's right!

尝试动手

在学习一门新的编程语言时,这个“猜数字”游戏是一个很好的入门程序,因为它以一种非常直接的方式练习了几个常见的编程概念。通过用不同的编程语言实现这个简单的游戏,你可以演示一些核心概念,并比较每种语言的细节。

你有最喜欢的编程语言吗?你会如何用它来编写“猜数字”游戏呢?关注本系列文章,查看你可能感兴趣的其他编程语言的示例。


via: https://opensource.com/article/21/1/learn-c

作者:Jim Hall 选题:lujun9972 译者:qfzy1233 校对:wxy

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

在 Linux 命令行进行打印的内容比单单一个 lp 命令多得多,让我们来看一些可用选项。

Sherry

Linux 命令行打印很容易。你可以使用 lp 命令来请求打印,并使用 lpq 命令来查看队列中有哪些打印作业,但是当你要双面打印或使用纵向模式时,这些会变得有些复杂。你可能还需要做很多其他事情,例如打印多份文档副本或取消打印作业。让我们来看看一些选项,当你从命令行打印时,如何让你的打印输出看起来如你所愿。

显示打印机配置

要从命令行查看打印机设置,请使用 lpoptions 命令。 输出应如下所示:

$ lpoptions
copies=1 device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50 job-sheets=none,none marker-change-time=1553023232 marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 marker-levels=18,62,62,63 marker-names='Black\ Cartridge\ HP\ CC530A,Cyan\ Cartridge\ HP\ CC531A,Magenta\ Cartridge\ HP\ CC533A,Yellow\ Cartridge\ HP\ CC532A' marker-types=toner,toner,toner,toner number-up=1 printer-commands=none printer-info='HP Color LaserJet CP2025dn (F47468)' printer-is-accepting-jobs=true printer-is-shared=true printer-is-temporary=false printer-location printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' printer-state=3 printer-state-change-time=1553023232 printer-state-reasons=none printer-type=167964 printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn sides=one-sided

如果将其空格转换为回车符,输出可能会更人性化,请注意列出了多少设置选项。

注意:在下面的输出中,一些行被重新链接,以使输出更具可读性。

$ lpoptions | tr " " '\n'
copies=1
device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/
finishings=3
job-cancel-after=10800
job-hold-until=no-hold
job-priority=50
job-sheets=none,none
marker-change-time=1553023232
marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00
marker-levels=18,62,62,63
marker-names='Black\ Cartridge\ HP\ CC530A,
Cyan\ Cartridge\ HP\ CC531A,
Magenta\ Cartridge\ HP\ CC533A,
Yellow\ Cartridge\ HP\ CC532A'
marker-types=toner,toner,toner,toner
number-up=1
printer-commands=none
printer-info='HP Color LaserJet CP2025dn (F47468)'
printer-is-accepting-jobs=true
printer-is-shared=true
printer-is-temporary=false
printer-location
printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7'
printer-state=3
printer-state-change-time=1553023232
printer-state-reasons=none
printer-type=167964
printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn
sides=one-sided

使用 -v 选项时,lpinfo 命令将列出驱动程序和相关信息:

$ lpinfo -v
network ipp
network https
network socket
network beh
direct hp
network lpd
file cups-brf:/
network ipps
network http
direct hpfax
network dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ <== printer
network socket://192.168.0.23 <== printer IP

lpoptions 命令将显示默认打印机的设置。使用 -p 选项指定其中一个可用打印机代号:

$ lpoptions -p LaserJet

lpstat -p 命令显示打印机的状态,而 lpstat -p -d 列出可用打印机列表。

$ lpstat -p -d
printer Color-LaserJet-CP2025dn is idle. enabled since Tue 19 Mar 2019 05:07:45 PM EDT
system default destination: Color-LaserJet-CP2025dn

非常有用的命令

要在默认打印机上打印文档,只需使用 lp 命令,后跟要打印的文件名即可。 如果文件名包含空格(在 Linux 系统上很少见),请将该名称放在引号中或开始输入文件名并按 Tab 键调用空格的转义标志(如下面的第二个示例所示)。

$ lp "never leave home angry"
$ lp never\ leave\ home\ angry

lpq 命令显示打印队列:

$ lpq
Color-LaserJet-CP2025dn is ready and printing
Rank Owner Job File(s) Total Size
active shs 234 agenda 2048 bytes

使用 -n 选项时,lp 命令可用来指定所需打印输出的份数:

$ lp -n 11 agenda

要取消打印作业,可以使用 cancellprm 命令。如果没来得及执行,则可能会看到以下信息:

$ cancel 229
cancel: cancel-job failed: Job #229 is already completed - can't cancel.

双面打印

要以双面模式打印,你可以在 lp 命令中使用 sides 选项,该选项不但表示了在纸张的正反面进行打印,还表示了从纸张的哪个边开始打印。这个设置代表了你期望以双面纵向文档的正常方式打印。

$ lp -o sides=two-sided-long-edge Notes.pdf

如果要所有文档以双面模式打印,则可以使用 lpoptions 命令更改 sides 设置以修改 lp 的设置。

$ lpoptions -o sides=two-sided-short-edge

要恢复为单面打印,可以使用如下命令:

$ lpoptions -o sides=one-sided

横向打印

要以横向模式打印,可以在 lp 命令中使用 landscape 选项。

$ lp -o landscape penguin.jpg

CUPS(Unix 通用打印系统)

Linux 系统上使用的打印系统是基于标准的开源打印系统,称为 CUPS,原意是 Unix 通用打印系统 Common Unix Printing System 。 它允许计算机充当打印服务器。


via: https://www.networkworld.com/article/3373502/printing-from-the-linux-command-line.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:stevenzdg988 校对:wxy

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

在你作为 Linux 系统管理员的职业生涯中,你可以使用 Secure Shell(SSH)远程访问 Linux 服务器或桌面系统。很有可能,你已经使用过了。在某些情况下,你会通过 SSH 一次性登录多个 Linux 服务器。实际上,SSH 很可能是 Linux 工具箱中最常用的工具之一。因此,你会希望操作尽可能高效。对于许多系统管理员来说,没有什么比命令行更有效的了。但是,有些用户确实更喜欢 GUI 工具,尤其是从一台桌面台式机远程连接到服务器上工作时。

如果你碰巧喜欢 GUI 工具,那么你肯定想了解一下 Linux 上的一些出色的 SSH 图形界面工具。将其与独特的终端窗口相结合,可以从同一窗口远程访问多台计算机,你便拥有了高效工作所需的一切。让我们看以下这三个工具,找出其中一个(或多个)是否完全适合你的需求。

我将在 Elementary OS 上演示这些工具,但是大多数流行的发行版都可以使用它们。

PuTTY

只要是久经沙场的人都知道 PuTTY。 实际上,PuTTY 是从 Windows 环境通过 SSH 连接到 Linux 服务器的事实标准工具。但是 PuTTY 不仅适用于 Windows。实际上,从其标准存储库中,PuTTY 也可以安装到 Linux 上。 PuTTY 的功能列表包括:

  • 保存会话
  • 通过 IP 地址或主机名链接
  • 定义备用 SSH 端口
  • 链接类型定义
  • 日志记录
  • 键盘、响铃、外观、连接等选项
  • 本地和远程隧道配置
  • 支持代理
  • 支持X11 隧道

PuTTY GUI 主要是一种保存 SSH 会话的方式,因此,你可以更轻松地管理那些你需要不断远程登录、登出的各种 Linux 服务器和桌面台式机。从 PuTTY 连接到 Linux 服务器后,你将拥有一个可以运行的终端窗口。此时,你可能会问自己,为什么不只在终端窗口中工作?对于某些人来说,保存会话的便捷性确实使 PuTTY 值得使用。

在 Linux 上安装 PuTTY 很简单。例如,你可以在基于 Debian 的发行版上执行命令:

sudo apt-get install -y putty

安装后,你可以从桌面菜单运行 PuTTY GUI 或执行命令 putty。在“ PuTTY 配置 PuTTY Configuration ” 窗口(图 1)中,在 “ 主机名(或 IP 地址) HostName (or IP address) ”位置键入主机名或 IP 地址,配置 端口 Port ”(如果不是默认值 22),从“ 连接类型 Connection type ”中选择 “SSH” ,然后单击“ 打开 Open ”。

 title=

图 1:PuTTY 连接配置窗口。

建立连接后,系统将提示你输入远程服务器上的用户凭据(图 2)。

 title=

图 2:使用 PuTTY 登录到远程服务器。

要保存会话(以便不必总是键入远程服务器信息),填写 IP 地址(或主机名),配置端口和连接类型,然后(在单击 “ 打开 Open ” 之前),在 “ 保存会话 Saved Sessions ” 顶部文本区域中键入链接的名称,然后单击 “ 保存 Save ”。 这样将保存此会话的配置。若要连接到已保存的会话,请从 “ 已保存的会话 Saved Sessions ” 窗口中选择它,单击 “ 加载 Load ”,然后单击 “ 打开 Open ”。 然后,系统将提示你输入远程服务器上的远程凭据登录远程服务器。

EasySSH

尽管 EasySSH 没有提供 PuTTY 中提供的大量配置选项,但是(顾名思义)它非常易于使用。 EasySSH 的最佳功能之一是提供标签式界面,因此你可以打开多个 SSH 连接并在它们之间快速切换。 EasySSH 的功能包括:

  • 分组(你可以将选项卡分组以获得更高效的体验)。
  • 保存用户名/密码。
  • 外观选项。
  • 支持本地和远程隧道。

在 Linux 桌面上安装 EasySSH 很简单,因为可以通过 flatpak 安装该应用程序(这意味着你必须在系统上安装 Flatpak )。 安装 flatpak 后,使用以下命令添加 EasySSH :

sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

sudo flatpak install flathub com.github.muriloventuroso.easyssh

使用以下命令运行 EasySSH :

flatpak run com.github.muriloventuroso.easyssh

你可以在其中单击左上角的 “+” 按钮打开 EasySSH 应用程序。 在出现的窗口(图 3)中,根据需要配置 SSH 连接。

 title=

图 3:在 EasySSH 中添加连接很简单。

添加连接后,它将显示在主窗口的左侧导航中(图 4)。

 title=

图 4:EasySSH 主窗口。

要在 EasySSH 中连接到远程服务器,请从左侧导航中选择它,然后单击 “ 连接 Connect ” 按钮(图 5)。

 title=

图 5:使用 EasySSH 连接到远程服务器。

EasySSH 的一个注意事项是你必须在连接配置中保存用户名和密码(否则连接将失败)。这意味着有权访问运行 EasySSH 的桌面的任何人都可以在不知道密码的情况下远程访问你的服务器。因此,你必须始终记得在外出时锁定桌面屏幕(并确保使用强密码)。你最不希望的就是避免服务器受到不必要的登录攻击。

Terminator

Terminator 实际上不是 SSH GUI。相反,Terminator 的功能是作为一个单一窗口,使你可以一次运行多个终端(甚至一组终端)。实际上,你可以打开 Terminator,将窗口垂直和水平拆分(直到拥有所需的所有终端),然后通过标准 SSH 命令连接到所有远程 Linux 服务器(图 6)。

 title=

图 6:Terminator 分为三个不同的窗口,每个窗口都连接到不同的 Linux 服务器。

要安装 Terminator,请执行以下命令:

sudo apt-get install -y terminator

安装后,从桌面菜单或用命令 terminator 打开该工具。打开窗口后,你可以在 Terminator 内部右键单击,然后选择 “ 水平分割 Split Horizontally ” 或 “ 垂直分割 Split Vertically ”。继续拆分终端,直到你打开所需的终端为止,然后开始远程管理这些服务器。使用 Terminator 的注意事项是它不是标准的 SSH GUI 工具,因为它不会保存你的会话或使你可以快速访问这些服务器。换句话说,你将始终必须手动登录到远程 Linux 服务器。但是,能够并行查看远程 Secure Shell 会话确实使管理多个远程计算机变得容易得多。

少而精的选择

Linux 没有多少可用的 SSH GUI 工具。为什么呢?因为大多数管理员更喜欢简单地打开终端窗口,并使用标准命令行工具来远程访问服务器。但是,如果需要 GUI 工具,则有两个可靠的选择,和一个使登录多台计算机稍微容易一些的终端。尽管对于那些寻找 SSH GUI 工具的人来说只有少数选择,但是可用的那些肯定值得你花时间,根据需要尝试其中之一。


via: https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux

作者:Jack Wallen 选题:lujun9972 译者:stevenzdg988 校对:wxy

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

Atom 是一个全面的环境,可以完成从基本到复杂的任务,适合从初学者到老用户。

 title=

现在漂亮的开源文本编辑器很常见,有 Adobe 的 Brackets、微软的 VSCode 和 GitHub 的 Atom。这些似乎都提供了类似的体验:现代化的界面、易于安装的插件,以及背后的一个大厂商支持。而且它们其实都很不错。那么 Atom 与其他超现代的文本编辑器有什么不同呢?与经典的老式编辑器如 VimEmacs 有何区别呢?

 title=

我用过很多文本编辑器,并且经过反思,我不得不承认,所有的文本编辑器基本上都差不多。在判断一个编辑器的功效时,只要它能做一件事:编辑文字,就能满足 80% 的要求。另外的 20% 则是额外的便利、额外的小玩意和花哨的功能。它们是很好的东西,但几乎不是必不可少的。

不过我经常回到 Atom,因为作为一个开源的用户,只要我愿意,我就可以奢侈地有很多应用使用。以下是我喜欢 Atom 的原因。

新手友好

我最喜欢 Atom 的一点是,它让人感觉很“正常”。我可以把 Atom 安装在任何人的电脑上,他们很快就可以开始输入了。没有新的键盘快捷键需要学习,没有严重偏离用户界面的惯例。如果我花几分钟时间向他们展示一些应用的强大功能,那么他们很快就会有能力安装新的插件,发现他们喜欢的有用功能。

它的独特之处在于让人感到与众不同,但又足够“安全”,足以让人相信(也确实如此)他们可以使用它。这是一条很难走的路线,但 Atom 做到了,我很欣赏它。

强大的扩展

当你启动应用就已经满足了大多数需求时,开源文本编辑器的一个主要“卖点”就是它的扩展。我习惯使用的编辑器是 GNU Emacs,它的扩展功能多到令人瞠目结舌,可以提供从电子邮件客户端到视频游戏的所有功能。要做到这一点很难,老实说,我还没有看到其它能做到的编辑器。不过这说明了扩展是多么重要,而 Atom 有一套不错的插件。

有一些扩展可以为语言和格式添加语法高亮、添加动态格式检查、以及集成调试器、运行时环境、视频和音乐播放器控件等等。实际上,你可以让 Atom 成为你桌面的控制中心,你很少需要离开它。

语言和语法支持

我是 Docbook 的忠实粉丝。顺便说一下,也是它的简化前端 Asciidoc 的粉丝。当我评估一个编辑器时,Docbook 模式和 Asciidoc 支持是我的两个主要指标。虽然对 XML 的支持比较常见,但与特定模式的集成可能是一个高难度的任务,而且 Asciidoc 相对小众。Atom 的社区为我最喜欢的格式提供了很好的支持。

当然,我已经提到了 Atom 一般来说有很好的扩展,但无论你在输入什么语言,语法高亮都是一个重要的功能。再次感谢充满活力的社区,在 Atom 的软件包仓库中,丰富的语法高亮选项的是它的优点之一。

简单定制主题

Atom 让你制作自己的风格就像设计网站的风格一样简单,所以如果你会使用 CSS,你可以制作你自己的 Atom 主题。要创建你自己的主题,找到 软件包 Package 菜单。如果你没有看到 软件包 Package 菜单,先按 Alt 键,露出顶部菜单栏。在 软件包 Package 菜单中,将鼠标悬停在 软件包生成器 Package Generator 上,然后选择 Generate Atom Syntax Theme 生成 Atom 语法主题 。这将打开一个新的项目,默认名为 “my-theme-syntax”。你可以把它命名为任何你想要的名字,但根据 Atom 惯例,它应该以 -syntax 结尾。

在你的新主题项目中,找到这些文件:base.lesscolors.lesssyntax-variables.less。这些文件定义了当语法激活时,特殊的关键字,甚至是背景和前景的颜色是如何显示的。因为它们都是从一个通用模板中继承的值,所以很容易修改。比如说:

// Syntax styles

.syntax--comment {
  color: @light-gray;
}

.syntax--keyword {
  color: @purple;

  &.syntax--control {
    color: @purple;
  }

  &.syntax--operator {
    color: @syntax-text-color;
  }

  &.syntax--other.syntax--special-method {
    color: @blue;
  }

  &.syntax--other.syntax--unit {
    color: @orange;
  }
}

以两个破折号结尾的值,如 .syntax--keyword,是语法高亮引擎识别的对象。当然,如果你想进一步开发你的自定义设置,你甚至可以创建你自己的语法定义(尽管这比 CSS 主题更费劲)。在 flight-manual.atom.io 上可以阅读所有关于修改 Atom 的方法。

灵活的工作流

Atom 有很多功能,默认情况下仅激活其中一部分。这意味着你可以决定你喜欢的工作方式,是否激活新的扩展并使用它们从根本上改变 Atom,还是只打开 Atom 的偏好并进行小的调整。你可以用 Atom 来写一本小说,也可以用它来写 Python 代码或技术文档或其他任何东西。

即使是它的 Git 集成也没有坚持让你使用可能会想到的显而易见的仓库(Github 赞助了 Atom)。它没有任何限制,而且它对每个人都同样有用,不管受众是谁。

安装

在 Linux、Windows 和 macOS 上,你可以 从它的网站安装 Atom

另外,在 Linux 上,你可以从 Flathub 中,以 Flatpak 安装 Atom。

如果你想自己构建 Atom,你也可以 从 Github 上的源码编译它

尝试 Atom

Atom 可以成为你的下一个文本编辑器、记事本和 IDE。它易于使用、易于配置、易于扩展,并提供了良好的用户体验。今天就下载 Atom,试试吧。


via: https://opensource.com/article/20/12/atom

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

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

资源配额控制应用的 CPU 或内存使用情况,防止资源被过量使用或被抢占。

 title=

当 Kubernetes 集群运行过一段时间或者在被开发者大量使用后,Kubernetes 资源(例如 CPU 和内存)的控制的问题就会显现出来。而在大多情况下只有集群出问题后,我们才会意识到资源控制的重要性。

Kubernetes 部署过程如果没有能充分考虑到将来的扩展性,资源类问题将会非常常见,此类问题与集群的管理和部署团队的经验有关。

如果不加以合理控制,一个暴力的应用或者开发者可能影响到共享该集群的所有业务,大家因此会相互埋怨、指责并保护性地抢占资源。这对于集群管理和开发人员都是非常难以处理的场景。

在 Kubernetes 环境中控制应用的计算资源使用有多种方式。大部分情况下,我们可以使用“资源控制”和“限制范围”。注意存储管理不在我们讨论范围之内,存储管理可以通过 持久卷 Persistent Volume 件,以实现针对不同的存储控制需求。

资源配额是一种控制 Kubernetes 计算资源的方法。本文告诉你如何使用该功能来管理开发人员行为并控制应用的资源使用。

什么是资源配额

简而言之,资源配额 提供了限制每个命名空间资源消耗的约束条件,它们只能在命名空间级别上应用,这意味着它们可以应用于计算资源,并限制命名空间内的对象数量。

Kubernetes资源配额通过 ResourceQuota 对象来为每个命名空间设置资源配额,对以下对象类型的 CPU 和内存进行限制:

  • 吊舱 Pod
  • 服务 Service
  • 机密信息 Secret
  • 持久卷断言 Persistent Volume Claim (PVC)
  • 配置映射 ConfigMap

Kubernetes 通过 requestlimit 两个参数对 CPU 和内存进行限制(参考 LimitRange 文档)。前者表示容器最小被保证资源,后者表示容器最大可用资源。实际上最大可用资源还受限于其它容器的实际使用情况。

下一张图片解释了配额中 requestlimit 的区别:

 title=

下面我们就通过一个例子来说明如何设置资源配额来创建约束,将应用程序限制在某些资源上,它还展示了实现资源配额以获得对 Kubernetes 的控制的有用性。

准备环境

首先你需要一个 Kubernetes 环境。以下是我使用 Kubernetes 环境:

  • Minikube v1.14.2
  • Fedora 33 操作系统
  • 互联网接入

如果你想在 Linux 机器上通过 Minikube 搭建 Kubernetes 测试环境,可以参考 Bryant Son 的《Minikube 入门》 一文。Window 或者 macOS 用户可以参考这篇文章

设置资源配额

这里我们仅展示 CPU 配额设置步骤,配置内存配额或两者的组合与之类似。

在生产环境中,CPU 是最需要被控制的资源,尤其是在多应用的场景下特别需要注意防止某些应用消耗太多 CPU 而影响到其它应用。

首先我们创建一个命名空间,在其中设置 CPU 配额:

$ kubectl create namespace quota-test
namespace/quota-test created

准备 cpu-quota.yaml 文件,内容如下:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: test-cpu-quota
spec:
  hard:
    requests.cpu: "100m"  
    limits.cpu: "200m"

应用 CPU 配额到 Kubernetes 集群:

$ kubectl apply -f cpu-qouta.yaml
resourcequota/test-cpu-quota created

使用 kubectl describe 检查配额配置情况:

$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name:         test-cpu-quota
Namespace:    quota-test
Resource      Used  Hard
--------      ----  ----
limits.cpu    0     200m
requests.cpu  0     100m

Used resources 列中显示了当前情况,该列值会随着 吊舱 Pod 的部署而变化。

下面是我们来验证限额管理的场景。我们将在同一命名空间下部署三个不同的吊舱,为它们配置以不同的资源限制如下:

  • PodA:第一个被实例化,使用 50% 可用 CPU 资源
  • PodB:第二个被实例化,使用其余 50% 可用 CPU 资源
  • PodC:没有可用 CPU 资源,因此不会被部署

部署吊舱

PodA:

$ kubectl create -n quota-test -f - << EOF
apiVersion: v1
kind: Pod
metadata:
  name: poda
spec:
  containers:
  - name: quota-test
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
    resources:
      requests:
        cpu: "50m"
      limits:
        cpu: "100m"
  restartPolicy: Never
EOF

部署 PodA 后,再次查看配额描述信息中的 Used CPU 信息:

$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name:         test-cpu-quota
Namespace:    quota-test
Resource      Used  Hard
--------      ----  ----
limits.cpu    100m  200m
requests.cpu  50m   100m

PodB:

$ kubectl create -n quota-test -f - << EOF
apiVersion: v1
kind: Pod
metadata:
  name: podb
spec:
  containers:
  - name: quota-test
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
    resources:
      requests:
        cpu: "50m"
      limits:
        cpu: "100m"
  restartPolicy: Never
EOF

再次查看 CPU 资源使用,此时 PodB 启动后 CPU 限制已经达到上限:

$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name:         test-cpu-quota
Namespace:    quota-test
Resource      Used  Hard
--------      ----  ----
limits.cpu    200m  200m
requests.cpu  100m  100m

PodC:

试着创建 PodC,此时 CPU 配额已经被 PodA 和 PodB 用尽:

$ kubectl create -n quota-test -f - << EOF
apiVersion: v1
kind: Pod
metadata:
  name: podc
spec:
  containers:
  - name: quota-test
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
    resources:
      requests:
        cpu: "5m"
      limits:
        cpu: "10m"
  restartPolicy: Never
EOF

正我们期望,第三个 Pod 无法被启动,配额限制了吊舱的创建:

Error from server (Forbidden): error when creating "STDIN": pods "podc" is forbidden: exceeded quota: test-cpu-quota, requested: limits.cpu=10m,requests.cpu=5m, used: limits.cpu=200m,requests.cpu=100m, limited: limits.cpu=200m,requests.cpu=100m

如我们的例子所示,定义合理的资源配额限制开发者行为对 Kubernetes 管理十分重要。

清理

删除刚才创建的命名空间 quota-test:

$ kubectl delete -n quota-test

规划资源配额

Kubernetes 中提供多种方式来控制资源的抢占和使用,合理的规划和配置配额、限制范围和其它原生参数对保持集群的稳定性十分必要。

你应该十分谨慎地控制计算资源的资源配额,特别是关键业务的生产应用环境。

在规划资源配额时,开发人员的参与很重要,需要他们预估并给出最合理的资源使用值。


via: https://opensource.com/article/20/12/kubernetes-resource-quotas

作者:Mike Calizo 选题:lujun9972 译者:larryzju 校对:wxy

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