蚊章汇 - Lee Carpenter
type: channel
link: https://linuxcn.bwsl.wang/author/1385/
description: Lee Carpenter
items: 用 k3s 轻松管理 SSL 证书
items: 使用 Traefik 引导 Kubernetes 流量
items: 使用 K3s 在树莓派上运行 Kubernetes 集群

用 k3s 轻松管理 SSL 证书
type: item
date: 2020-04-13T23:32:41+08:00
description: 如何在树莓派上使用 k3s 和 Let's Encrypt 来加密你的网站。在上一篇文章中，我们在 k3s 集群上部署了几个简单的网站。那些是未加密的网站。不错，它们可以工作，但是未加密的网站有点太过时了！如今，大多数网站都是加密的。在本文中，我们将安装 cert-manager 并将其用于在集群上以部署采用 TLS 加密的网站。这些网站不仅会被加密，而且还会使用有效的公共证书，这些证书会从 Let's Encrypt 自动获取和更新！让我们开始吧！准备要继续阅读本文，你将需要我们在上一篇文章中构建的 k3s 树莓派集群。另外，你需要拥有一个公用静态 IP 地址，并有一个可以为其创建 DNS 记录的域名。如果你有一个动态 DNS 提供程序为你提供域名，可能也行。但是，在本文中，我们使用静态 IP 和 CloudFlare 来手动创建 DNS 的 A 记录。我们在本文中创建配置文件时，如果你不想键入它们，则可以在此处进行下载。我们为什么使用 cert-manager？Traefik（在 k3s 预先捆绑了）实际上具有内置的 Let's Encrypt 支持，因此你可能想知道为什么我们要安装第三方软件包来做同样的事情。在撰写本文时，Traefik 中的 Let's Encrypt 支持检索证书并将其存储在文件中。而 cert-manager 会检索证书并将其存储在 Kubernetes 的 “ 机密信息 secret ” 中。我认为，“机密信息”可以简单地按名称引用，因此更易于使用。这就是我们在本文中使用 cert-manager 的主要原因。安装 cert-manager通常，我们只是遵循 cert-manager 的文档在 Kubernetes 上进行安装。但是，由于我们使用的是 ARM 体系结构，因此我们需要进行一些更改，以便我们可以完成这个操作。第一步是创建 cert-manager 命名空间。命名空间有助于将 cert-manager 的 Pod 排除在我们的默认命名空间之外，因此当我们使用自己的 Pod 执行 kubectl get pods 之类的操作时，我们不必看到它们。创建名称空间很简单：kubectl create namespace cert-manager安装说明会让你下载 cert-manager 的 YAML 配置文件并将其一步全部应用到你的集群。我们需要将其分为两个步骤，以便为基于 ARM 的树莓派修改文件。我们将下载文件并一步一步进行转换：curl -sL \ https://github.com/jetstack/cert-manager/releases/download/v0.11.0/cert-manager.yaml |\ sed -r 's/(image:.*):(v.*)$/\1-arm:\2/g' > cert-manager-arm.yaml这会下载配置文件，并将包含的所有 docker 镜像更新为 ARM 版本。来检查一下它做了什么：$ grep image: cert-manager-arm.yaml image: "quay.io/jetstack/cert-manager-cainjector-arm:v0.11.0" image: "quay.io/jetstack/cert-manager-controller-arm:v0.11.0" image: "quay.io/jetstack/cert-manager-webhook-arm:v0.11.0"如我们所见，三个镜像现在在镜像名称上添加了 -arm。现在我们有了正确的文件，我们只需将其应用于集群：kubectl apply -f cert-manager-arm.yaml这将安装 cert-manager 的全部。我们可以通过 kubectl --namespace cert-manager get pods 来检查安装何时完成，直到所有 Pod 都处于 Running 状态。这就完成了 cert-manager 的安装！Let's Encrypt 概述Let's Encrypt 的好处是，它免费为我们提供了经过公共验证的 TLS 证书！这意味着我们可以拥有一个完全有效的、可供任何人访问的 TLS 加密网站，这些家庭或业余的爱好活动挣不到钱，也无需自己掏腰包购买 TLS 证书！以及，当通过 cert-manager 使用 Let's Encrypt 的证书时，获得证书的整个过程是自动化的，证书的续订也是自动的！但它是如何工作的？下面是该过程的简化说明。我们（或代表我们的 cert-manager）向 Let's Encrypt 发出我们拥有的域名的证书请求。Let's Encrypt 通过使用 ACME DNS 或…

使用 Traefik 引导 Kubernetes 流量
type: item
date: 2020-04-07T18:35:24+08:00
description: 将流量引入 Kubernetes 树莓派集群的分步指南。在本文中，我们将部署几个简单的网站，并学习如何使用 Traefik 将来自外部世界的流量引入到我们的集群中。之后，我们还将学习如何删除 Kubernetes 资源。让我们开始吧！准备要继续阅读本文，你只需要我们在上一篇文章中构建的 k3s 树莓派集群。由于你的集群将从网络上拉取镜像，因此该集群需要能够访问互联网。出于解释目的，本文将显示一些配置文件和示例 HTML 文件。所有示例文件都可以在此处下载。部署一个简单的网站之前，我们使用 kubectl 进行了直接部署。但是，这不是典型的部署方法。一般情况都会使用 YAML 配置文件，这也是我们要在本文中使用的配置文件。我们将从顶部开始，并以自顶向下的方式创建该配置文件。部署配置首先是部署配置。配置如下所示，并在下面进行说明。我通常以 Kubernetes 文档中的示例为起点，然后根据需要对其进行修改。例如，下面的配置是复制了部署文档中的示例后修改的。创建一个文件 mysite.yaml，其内容如下：apiVersion: apps/v1 kind: Deployment metadata: name: mysite-nginx labels: app: mysite-nginx spec: replicas: 1 selector: matchLabels: app: mysite-nginx template: metadata: labels: app: mysite-nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80其中大部分是样板。重要的部分，我们会将该部署命名为 mysite-nginx，并为其加上同名的 app 标签。我们指定了一个 副本 replica ，这意味着将只创建一个 Pod。我们还指定了一个容器，我们将其命名为 nginx。我们将 镜像 image 指定为 nginx。这意味着在部署时，k3s 将从 DockerHub 下载 nginx 镜像并从中创建一个 Pod。最后，我们指定了 容器端口 containerPort 为 80，这只意味着在容器内部 Pod 会监听 80 端口。我在上面强调了“在容器内部”，因为这是一个重要的区别。由于我们是按容器配置的，因此只能在容器内部访问它，并且进一步将其限制为内部网络。这对于允许多个容器在同一容器端口上监听所是必要的。换句话说，通过这种配置，其他一些 Pod 也可以在其容器端口 80 上侦听，并且不会与此容器冲突。为了提供对该 Pod 的正式访问权限，我们需要一个 服务 service 配置。服务配置在 Kubernetes 中， 服务 service 是一种抽象。它提供了一种访问 Pod 或 Pod 集合的方法。当连接到服务时，服务会路由到单个 Pod，或者如果定义了多个 Pod 副本，会通过负载均衡路由到多个 Pod。可以在同一配置文件中指定该服务，这就是我们将在此处要做的。用 --- 分隔配置区域，将以下内容添加到 mysite.yaml 中：--- apiVersion: v1 kind: Service metadata: name: mysite-nginx-service spec: selector: app: mysite-nginx ports: - protocol: TCP port: 80在此配置中，我们将服务命名为 mysite-nginx-service。我们提供了一个 选择器 selector ：app: mysite-nginx。这是服务选择其路由到的应用程序容器的方式。请记住，我们为容器提供了 app 标签：mysite-nginx 。这就是服务用来查找我们的容器的方式。最后，我们指定服务协议为 TCP，在端口 80 上监听。入口配置 入口 Ingress 配置指定了如何将流量从集群外部传递到集群内部的服务。请记住，k3s 预先配置了 Traefik 作为入口控制器。因此，我们将编写特定于 Traefik 的入口配置。将以下内容添加到 mysite.yaml 中（不要忘了用 --- 分隔）：--- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: mysite-nginx-ingress annotations: kubernetes.io/ingress.class: "traefik" spec: rules: - http: paths: - path: / backend: serviceName: mysite-nginx-se…

使用 K3s 在树莓派上运行 Kubernetes 集群
type: item
date: 2020-03-29T20:18:00+08:00
description: 跟随接下来的介绍，自己搭建一个三节点的 Kubernetes 集群。我对在树莓派上搭建 Kubernetes 集群已经感兴趣很长时间了，只要照着网上的教程，我可以在由三个树莓派组成的集群中搭建一套 Kubernetes 并正常运行。但在这种情况下，主节点上的内存和 CPU 资源捉襟见肘，执行 Kubernetes 任务的时候往往性能不佳，想要升级 Kubernetes 就更不可能了。这个时候，我非常激动地发现了 K3s 这个项目。K3s 被誉为在可用于资源受限环境下的轻量级 Kubernetes，它还针对 ARM 处理器做出了优化，这让 Kubernetes 集群可以在树莓派上运行得更好。在下文中，我们将会使用 K3s 来创建一个 Kubernetes 集群。准备要按照本文介绍的方式创建 Kubernetes 集群，首先需要准备：至少一个树莓派（包括 SD 卡和电源）网线将所有树莓派连接到一起的交换机或路由器我们会通过在线安装的方式安装 K3s，因此还需要可以连接到互联网。集群概览在这个集群里，我们会使用三个树莓派。其中一个树莓派作为主节点，我们将它命名为 kmaster，并为其分配一个静态 IP 192.168.0.50（注：假设使用的私有网段是 192.168.0.0/24），而另外两个树莓派作为工作节点，分别命名为 knode1 和 knode2，也分别分配 192.168.0.51 和 192.168.0.52 两个 IP 地址。当然，如果你实际的网络布局和上面不同，只要将文中所提及到的 IP 替换成你实际可用的 IP 就可以了。为了不需要通过 IP 来引用某一个节点，我们将每个节点的主机名记录到 PC 的 /etc/hosts 文件当中：echo -e "192.168.0.50\tkmaster" | sudo tee -a /etc/hosts echo -e "192.168.0.51\tknode1" | sudo tee -a /etc/hosts echo -e "192.168.0.52\tknode2" | sudo tee -a /etc/hosts部署主节点我们首先部署主节点。最开始的步骤当然是使用镜像安装最新的 Raspbian，这个步骤可以参考我的另一篇文章，在这里就不展开介绍了。在安装完成之后，启动 SSH 服务，将主机名设置为 kmaster，然后分配静态 IP 192.168.0.50。在主节点上安装 Raspbian 完成后，启动树莓派并通过 ssh 连接上去：ssh pi@kmaster在主节点上执行以下命令安装 K3s：curl -sfL https://get.k3s.io | sh -等到命令跑完以后，一个单节点集群就已经运行起来了。让我们检查一下，还在这个树莓派上执行：sudo kubectl get nodes就会看到这样的输出：NAME STATUS ROLES AGE VERSION kmaster Ready master 2m13s v1.14.3-k3s.1获取 连接令牌 join token 之后我们需要部署工作节点。在工作节点上安装 K3s 的时候，会需要用到连接令牌，它放置在主节点的文件系统上。首先把连接令牌保存出来以便后续使用：sudo cat /var/lib/rancher/k3s/server/node-token部署工作节点通过 SD 卡在每个作为工作节点的树莓派上安装 Raspbian。在这里，我们把其中一个树莓派的主机名设置为 knode1，为其分配 IP 地址 192.168.0.51，另一个树莓派的主机名设置为 knode2，分配 IP 地址 192.168.0.52。接下来就可以安装 K3s 了。启动主机名为 knode1 的树莓派，通过 ssh 连接上去：ssh pi@knode1在这个树莓派上，安装 K3s 的过程和之前差不多，但需要另外加上一些参数，表示它是一个工作节点，需要连接到一个已有的集群上：curl -sfL http://get.k3s.io | K3S_URL=https://192.168.0.50:6443 \ K3S_TOKEN=刚才保存下来的连接令牌 sh -K3S_TOKEN 的值需要替换成刚才保存下来的实际的连接令牌。完成之后，在主机名为 knode2 的树莓派上重复这个安装过程。通过 PC 访问集群现在如果我们想要查看或者更改集群，都必须 ssh 到集群的主节点才能使用 kubectl，这是比较麻烦的。因此我们会将 kubectl 放到 PC 上使用。首先，在主节点上获取一些必要的配置信息，ssh 到 kmaster 上执行：sudo cat /etc/rancher/k3s/k3s.yaml复制上面命令的…