分类 容器与云 下的文章

作为第 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中国 荣誉推出

资源配额控制应用的 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中国 荣誉推出

容器化是一项蓬勃发展的技术。在不久的将来,多达百分之七十五的全球组织可能会运行某种类型的容器化技术。由于广泛使用的技术更容易成为黑客攻击的目标,因此保护容器的安全就显得尤为重要。本文将演示如何使用 POSIX 权能 Capability 来保护 Podman 容器的安全。Podman 是 RHEL8 中默认的容器管理工具。

确定 Podman 容器的权限模式

容器以特权模式或无特权模式运行。在特权模式下,容器的 uid 0 被映射到宿主机的 uid 0。对于某些情况,无特权的容器缺乏对宿主机资源的充分访问能力。但不管其操作模式如何,包括 强制访问控制 Mandatory Access Control (MAC:如 apparmor、SELinux 等)、seccomp 过滤器、删除 权能 Capability 、命名空间等在内的技术有助于确保容器的安全。

要从容器外部确定特权模式:

$ podman inspect --format="{{.HostConfig.Privileged}}" <container id>

如果上面的命令返回 true,那么容器在特权模式下运行。如果返回 false,那么容器在非特权模式下运行。

要从容器内部确定特权模式:

$ ip link add dummy0 type dummy

如果该命令允许你创建一个接口,那么你运行的是一个特权容器,否则你运行的是一个非特权容器。

权能

命名空间隔离了容器的进程,使其无法任意访问宿主机的资源,也无法访问在同一宿主机上运行的其他容器的资源。然而,在特权容器内的进程仍然可以做一些事情,如改变 IP 路由表、跟踪任意进程和加载内核模块。 权能 Capability 允许人们对容器内的进程可以访问或更改的资源施加更细微的限制,即使容器在特权模式下运行也一样。权能还允许人们为无特权的容器分配它本来不会拥有的特权。

例如,如果要将 NET_ADMIN 功能添加到一个无特权的容器中,以便在容器内部创建一个网络接口,你可以用下面的参数运行 podman

[root@vm1 ~]# podman run -it --cap-add=NET_ADMIN centos
[root@b27fea33ccf1 /]# ip link add dummy0 type dummy
[root@b27fea33ccf1 /]# ip link

上面的命令演示了在一个无特权的容器中创建一个 dummy0 接口。如果没有 NET_ADMIN 权能,非特权容器将无法创建接口。上面的命令演示了如何将一个权能授予一个无特权的容器。

目前,大约有 39 种权能可以被授予或拒绝。特权容器默认会被授予许多权能。建议从特权容器中删除不需要的权能,以使其更加安全。

要从容器中删除所有权能:

$ podman run -it -d --name mycontainer --cap-drop=all centos

列出一个容器的权能:

$ podman exec -it 48f11d9fa512 capsh --print

上述命令显示没有向容器授予任何权能。

请参考 capabilities 手册页以获取完整的权能列表:

$ man capabilities

可以使用 capsh 命令来列出目前拥有的权能:

$ capsh --print

作为另一个例子,下面的命令演示了如何从容器中删除 NET_RAW 权能。如果没有 NET_RAW 权能,就不能从容器中 ping 互联网上的服务器。

$ podman run -it --name mycontainer1 --cap-drop=net_raw centos
>>> ping google.com (will output error, operation not permitted)

最后一个例子,如果你的容器只需要 SETUIDSETGID 权能,你可以删除所有权能,然后只重新添加这两个权能来实现这样的权限设置。

$ podman run -d --cap-drop=all --cap-add=setuid --cap-add=setgid fedora sleep 5 > /dev/null; pscap | grep sleep

上面的 pscap 命令会显示容器被授予的权能。

我希望你喜欢这个关于如何使用权能来保护 Podman 容器的简短探索。

谢谢!


via: https://fedoramagazine.org/podman-with-capabilities-on-fedora/

作者:shiwanibiradar 选题:lujun9972 译者:geekpi 校对:wxy

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

设置一个本地开发环境,或者直接用这些工具尝试容器编排平台。

Kubernetes 是一个开源的容器编排平台。它由 Google 开发,为自动化部署、扩展和管理容器化应用提供了一个开源系统。虽然大多数人在云环境中运行 Kubernetes,但在本地运行 Kubernetes 集群不仅是可能的,它还至少有两个好处:

  • 在决定使用 Kubernetes 作为主要平台部署应用之前,你可以快速试用它。
  • 在将任何东西推送到公共云之前,你可以将其设置为本地开发环境,从而实现开发环境和生产环境之间的分离。

无论你的情况如何,将本地 Kubernetes 环境设置为你的开发环境都是推荐的选择,因为这种设置可以创建一个安全而敏捷的应用部署流程。

幸运的是,有多个平台可以让你尝试在本地运行 Kubernetes,它们都是开源的,并且都是 Apache 2.0 许可。

  • Minikube 的主要目标是成为本地 Kubernetes 应用开发的最佳工具,并支持所有适合的 Kubernetes 特性。
  • kind 使用 Docker 容器“节点”运行本地 Kubernetes 集群。
  • CodeReady Containers(CRC)用来管理为测试和开发目的优化的本地 OpenShift 4.x 集群。
  • Minishift 通过在虚拟机 (VM) 内运行单节点的 OpenShift 集群,帮助你在本地运行 OpenShift 3.x 集群。

Minikube

 title=

Minikube 是在本地计算机上运行 Kubernetes 环境的最知名、最流行的选择。无论你使用什么操作系统,Minikube 的文档都会为你提供一个简单的安装指南。一般来说,安装 Minikube 只需运行两条命令:

$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-PLATFORM-amd64
$ sudo install minikube-PLATFORM-amd64 /usr/local/bin/minikube

Minikube 可在 Linux、macOS 或 Windows 上快速设置本地 Kubernetes 集群,其功能如下:

  • 支持最新的 Kubernetes 版本(包括 6 个以前的小版本)
  • 跨平台(Linux、macOS、Windows)
  • 以虚拟机、容器或裸机的形式部署
  • 支持多个容器运行时(CRI-O、containerd、Docker)
  • 用于快速推送镜像的 Docker API 端点
  • 负载均衡器、文件系统挂载、FeatureGates 和其他高级功能
  • 用于轻松安装 Kubernetes 应用的附加组件

因为 Minikube 是一个开源项目,你可以对它的源代码做贡献。

kind

 title=

kind 的开发者将其描述为“一个使用 Docker 容器‘节点’运行本地 Kubernetes 集群的工具”。它是为测试 Kubernetes 而设计的,但也可能用于本地开发或持续集成。

kind 支持:

  • 多节点(包括高可用性)集群
  • 从源码构建 Kubernetes 版本
  • Make/Bash/Docker 或 Bazel,以及预发布构建
  • Linux、MacOS 和 Windows

此外,kind 是一个经过云原生计算基金会(CNCF)认证的 Kubernetes 合规安装程序。因为它是开源的,你可以在它的 GitHub 仓库中找到 kind 的源码

CodeReady Container (CRC)

 title=

如果你想在本地尝试最新版本的 OpenShift,可以尝试红帽的 CodeReady Containers (CRC)。CRC 将一个最小的 OpenShift 4.x 集群带到你的本地计算机上,为开发和测试目的提供一个最小的环境。CRC 主要针对开发者的桌面使用。

你可以在 GitHub 上找到 CodeReady Container 的源码,也是在 Apache 2.0 许可下提供的。

Minishift

 title=

Minishift 项目帮助你在本地用 OKD 在虚拟机内的单节点 OpenShift 集群运行一个版本的 OpenShift。你可以用它来尝试 OpenShift,或者在你的本地主机上为云开发。

和这个列表中的其他工具一样,Minishift 也是开源的,你可以在 GitHub 上访问它的源码

为人服务的 Kubernetes

正如你所看到的,有几种方法可以在本地环境中试用 Kubernetes。我有遗漏么?欢迎留言提问或提出建议。


via: https://opensource.com/article/20/11/run-kubernetes-locally

作者:Bryant Son 选题: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中国 荣誉推出

随着 Fedora 32 的发布,Docker 的普通用户面临着一个小挑战。在编写本文时,Fedora 32 不支持 Docker。虽然还有其他选择,例如 PodmanBuildah,但是对于许多现有用户而言,现在切换可能不是最佳时机。因此,本文可以帮助你在 Fedora 32 上设置 Docker 环境。

步骤 0:消除冲突

此步骤适用于从 Fedora 30 或 31 升级的任何用户。如果全新安装的 Fedora 32,那么可以跳到步骤 1。

删除 docker 及其所有相关组件:

sudo dnf remove docker-*
sudo dnf config-manager --disable docker-*

步骤 1:系统准备

在 Fedora 的最后两个版本中,操作系统已迁移到两项新技术: CGroups 和用于防火墙的 NFTables。尽管这些新技术的详细信息不在本教程的讨论范围之内,但是令人遗憾的是,Docker 还不支持这些新技术。因此,你必须进行一些更改才能在 Fedora 上使用 Docker。

启用旧的 CGroups

Fedora 仍然支持 CGroups 的先前实现,可以使用以下命令启用它:

sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"

在防火墙中将 Docker 列入白名单

为了让 Docker 具有网络访问权限,需要两个命令:

sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
sudo firewall-cmd --permanent --zone=FedoraWorkstation --add-masquerade

第一个命令将 Docker 接口添加到受信任的环境,它允许 Docker 建立远程连接。第二个命令将允许 Docker 建立本地连接。当有多个 Docker 容器作为开发环境时,这特别有用。

步骤 2:安装 Moby

Moby 是 Docker 的开源白牌版本。它基于相同的代码,但不带商标。它包含在 Fedora 的主仓库中,因此很容易安装:

sudo dnf install moby-engine docker-compose

这将安装 moby-enginedocker-composecontainerd 和其他一些相关的库。安装完成后,你必须启用系统级守护程序才能运行 Docker:

sudo systemctl enable docker

步骤 3:重新启动并测试

为了确保正确处理所有系统和设置,你现在必须重启计算机:

sudo systemctl reboot

之后,你可以使用 Docker hello-world 包来验证安装:

sudo docker run hello-world

除非遇到问题,不然你就会看到来自 Docker 的问候!

以管理员身份运行

可选地,你现在还可以将用户添加到 Docker 的组帐户中,以便无需输入 sudo 即可启动 Docker 镜像:

sudo groupadd docker
sudo usermod -aG docker $USER

注销并登录以使更改生效。如果以管理员权限运行容器的想法让你有所顾虑,那么你应该研究 Podman。

总结

从现在起,Docker 将按照你的习惯工作,包括 docker-compose 和所有与 docker 相关的工具。不要忘记查看官方文档,这在很多情况下可以为你提供帮助。

Fedora 32 上 Docker 的当前状态并不理想。缺少官方软件包可能会困扰一些人,有一个上游问题对此进行了讨论。对 CGroupsNFTables 缺少支持更多是技术问题,但是你可以查看它们在其公共问题上的进展。

这些指导应可以让你就像什么都没有发生一样继续工作。如果这不能满足你的需求,请不要忘记到 Moby 或 Docker Github 页面去寻求解决你的技术问题,或者看看 Podman,长期来看,它可能会更加强大。


via: https://fedoramagazine.org/docker-and-fedora-32/

作者:Kevin "Eonfge" Degeling 选题:lujun9972 译者:geekpi 校对:wxy

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