如何使用k3OS和Argo进行自动化边缘部署?

云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


前 言

随着Kubernetes生态系统的发展,新的技术正在被开发出来,以实现更广泛的应用和用例。3 7 [ d边缘计算的发展推动了对其中一些技术的需求,以实现将Kubernetes部署到网络边缘资源受限的基础设施上。在这篇文章中,我们将向你介绍一种将k3OS部署到边缘的方法。你可以使用这种方法将你的边缘机自动注册到Rancher实例中作为控制平面。我们还将讨论自动部署到物理机的一些好p O S x z , 4处。

k3OS于2019年4月由业界S z t 应用最为广泛的Kubernetes管理平台创建者Ranchv H . s @ L }er Labs(以下简称Rancher)推出,它是一个轻量的、专注于边缘的Kubernetes操作系统,同时也是业界首个Kubernetes操作系统。它与K3s打包,使得应用程序能够轻松地部署到资源受限的环境中,如部署在边缘设备上。

虽然k3OS仍处于起步阶段,但它已经通过了实战测试,并被用于各种生产环境中。为了充分掌握边缘计算的全部优势,你需要在你部署的基础设施上尽可能地节省空间。

Argo简介

Argo是云原生计算基金会(CNCF)的一个项目,旨在减轻在容器原生环境中运行计算密集型工作负载的一些痛苦。子项目Argo workflow是一个开源的z 9 b + F Q % H ?容器原生workflow引擎,用9 q } 5 t % | x 5于协调Kubernetes中的并行job。它以Kub, ) 9 (ernB d ! Q u l [etes自定义资源(CRD)的形式实现,本质上是Kubernetes API的扩展。

通过Argo workflow,我们可以定义workflow,其中的每一步都是一个容器,并将多步工作流建模为任务序列,或使用有向无环图(DAG)捕获任务之间的依赖关系。这在自动化部署和配置边缘原生服务时非常有用。我们将在本次M ; [demo的8 a y |后面看到Argo Workflows的许多方面将会发挥作用N - 0 ; 3 | g 6

Ste0 / 3 ` B Sp 1 设置一个demo环境

为了模拟一个工作边缘站点,我们需要在本地虚拟机上启动k3OS,然后使用Argo工作流呼叫到远程Rancher实例。在本节中,我们将:

  • 下载k3OS iso
  • 部署Rancher
  • 安装Argo Workflows

设置本地VM(边缘端)

安装VirtualBox不在本次演示的范围内,因此默认你已经安装完成。然后,我们将其Y _ 9 X t =启动并完成设置虚拟机和附加k3OS iso的初始过程。完成之后,我们将启动机器并看到介绍屏幕:

如何使用k3OS和Argo进行自动化边缘部署?

此时c 6 R { F K o ` ,我们将打开一个terminal并添加k3OS VM4 D w K 6到我们的config.yaml文件。我们可以使用这个方便的帮忙脚本:

Pull k3OS credentO l ,ials
get_vm() {
gsed -i '/127.0.0.1/d' ~/.ssh/k* k O e x w { unown_hosts
scp -P 3022 rancher@127.0.0.1:/etc/rancher/k3s/k3s.yaml ~/.kube/currenS k l At_k3os_vm.yaml
sed 's/6443/4443/g' ~/.kube/curre~ 6 ! Gnt_k3os_vm.yaml > ~D y $ 7 4 Z ) p E/.8 J ) M u Q a Qkube/current_k3os_master.yaml
export KUBECONFIG=~/.kub_ _ - S B u y =e/current_k3os_master.yaml
rm ~/.kube/current_k3. * Y / n h q V wos_vm.yaml
}

请注意:需要转发3022和4443端口

我们成功拉取.kubeconfig文件之后,我们应该准备好部署控制平面。

- u N Q | j ,署Rancher(云端)

要部署Rancher到云端环境,请执行以下步骤:

  • Clone或下载该仓库(https://W # U 6 egithub.com/rancher/quickstart)到本地文件夹
  • 选择一个云提供商并导航到提供商的文件夹中
  • 将terraform.tfvars.exam9 1 [ ~ A ?ple复制或重命名5 Z g c q X v为terraform.tfvars并填入所+ } e k @ s d r T有必要的变量
  • 运行terrafh X S x Z 3 A horm init& o =
  • 运行g : X q g + vteb J q c ` trraform apply

配置完成之后,Terraform将输出连接到RancherQ 6 3 e p B 2 C服务器的URL。还会生成两套Kubernetes配置:

Apply complete! Resources: 16 added, 0 changed, 0 destroyed.
Outputs:
rancher_node_ip = xx.xx.xx.xh ] / [ p # ?x
ra z R 5 U } & # 1ncher_server_url = https://xx-xx-xx-xx.nip.io
workload_node_ip = yy.yy.yy.yy

kube_config_server.yaml包含了访问支持Rancher server的RKE集群的凭D 0 P证, kube_config_workload.ya{ V @ Wml包含了访问配置工作负载集群的凭证。

有关每个云提供商的更多详情,请参阅 repo 中各自文件夹中的文档。

Step 2 安装Argo WoH T 5 n N w nrkflow

安装Argo CLI:

你可以从Argo release页面下载最新的Argo CLI:

https://github.com/argopl + G J % v o O Yroj/argo/releases

安装controller:

在这一步中,3 N g d V D 2我们将安装Argo Workflows,通过workflow CRD扩展Kubernetes API。这将允许我们将多个“job”依次链在一起。安装Argo Workflows就像切换到k3OS集群并运行一样简单:

kubectl create namespace argo
ku` i 7bectl apply -n argo -f https://raw.githubusercontent.com/argopro^ 8 S * y P | ;j/argo/stable/manifests/install.yaml

请注意:在GKE上,你可能需要授予你的账户创建新集群角色的能力。

kubectl create clusterrol+ h  ! ) b 4 / Febinding YOURNAME-cluster-admin-, ( J { J ; Q u xbinding --] 9 G y S O ,clusterrole=cluster-admin --user=YOUREMAIL@gmail.com

Step 3 配置服务账户以运行workflows

角色、角色绑定以及ServiceAccount

为了让Argo支持工件、输出、访问secre$ 3 ` * F S t Ft等功能,它需要使用Ku{ 5 h ! ! 9 u B Abernetes API与Kubernetes资源进行通信。为了做到这一点,Argo使用ServR U 2iceAccounY | t Ot来验证自己与Kubernetes API的X 7 . *关系。你可以通过Y J B使用RoleBinding将一个Role绑定到ServiceAccount上,指定Argo使用的u g = 7 = & ] DServiceAccount是哪个Role(即哪个权限)。

然后,在n r ? ] l M i L提交workflow时,指定Argo使用哪个ServiceAs J r 4 + pcK 3 Ycount:

argo submit --serviceaccount <name>

当没有提供ServiceAccount时,ArgoL ; k w { p将使用运行的命名空间的默认ServiceAccount,默认情况下它的权限几乎总是不够的。

授予管理员权限

在本次demo中,我们将授予defaultServiceAccount管理员权限(即我们将绑定adm1 g O a ! C Q iinRL . [ d s Uole到当前命名空间的defaultSer& d Y . 8viceAccount中):

kubectl create rolebinding default-admin --clusterrole=admin --serviceaccount=argoK Y / E C # l:default -n argo

请注意:这将向命令运行h s r k b l .的命名空间中的default ServiceAccount授予管理权限,因此你将只能在制作RoleBinding的命名空间中运行workflows。

Step 4 运行workflow

从这里,你可以通过CLI以多种方式提交Argo workflowD U [ k x L u 8 R

argo submit -n argo --watF [ m P - Dch https:/k y P M $ z p ~ `/raw.githubusercontQ V D O 3 / r 6 Gent.com/argoproj/argo/master/exam? 6 G ` k  3 d 1ples7  . u r |/helloZ ~ v-woj X  g ` Mrld.yaml
argo submit -n argo --watch https://raw.githubusercontR .  A c $ B g ;ent.com/argoproj/argo/master/e$ 1 + e = i $ q &xamples/coinflip.yaml
argo submit -n argo --watch https://raw.githubuF t 5 a @ ; F Z gsercont; D t i 8 W {enp G R o ut.com/arg| e ~  g _ ;oproj/argo/master/examples/loo] W : : o #ps-maps.yaml
argo list -n argo
argo get x3 a 1 p G $ [ f kxx-workflow-g x { Vname-xxx -n argo
arg+  2 / H o 6o logs xxx-pod-name-xxx -n argo #from get co) = v u P y R 5mmand above

你也能使用kubectl直接创建Workflow,但是Argo C3 V } Q Z { + kLI会提供诸如YAML验证、workflow可视化、参数传递、重试以及重新提交、暂停和恢复等额外的功能b @ 1 T

kubectl create -n arg; T } Y : x W To -f https://raw.githubuserconl Z I Ptent.com/argopD L i , z | broj/argo/master/examples/hello-5 V R 5 X o ] jworld.yaml
kubectl get wf -n argo
kubec; f 8 A 3 P z / _tl get wf hello-world-xxx -n argo
kubectl geV t q t -t po -n argo --selectob * &r=workflows.argoproj.io/workflow=hello-world-xxx
kubm q F B 5ectl logs hello-world-yyy -c main -n argo

所以,我们创建一个workflow.yaml文件并把这里的内容全部加进去:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata: . H V d ^ R
name: clusterw  U e 1-up
spec:
serviceAce 0 G x @ S c o pcountNam6 t 1 # 4 te: argo-s@ k derviceaccount
entrypoint: main
templates:
- name: main
steps:
- - name: rancher-dance
template: rancher-dance
- name: rancher-dance
inputs:
artifacts:
- name: kubectl
path: /bin/kuc N x e Ubectl
mo: O S 4 /de: 0755
h% 9 6 b 0 s ]  .ttp:
url:~ f o 2 F w _ x ? https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/linux/amd64/kubectl
container:
image: giantswarm/tiny-tools:3.11 o 9 z x a a J n0
command:
- /bin/sh
- -c
-; Y $ 1 S H c b |
echo "Log in to Rancher"
LOGIN_RESPONSE=$(curl -s "https://$RANC1 } n / G ZHER_URB 8 h - P zI/v3-public/localProviders/local?action=login" \
-H 'cont^ ? Uent-tyV p 2pe: applico u ( 0 F } K v gation/jsonc A m l a R i ~ j' \
--data-binary '{"username":"'$RANCH0 / CER_USER'","pass~ 4 i P Dword":- c ~ N #"'$RANCHER_PASS'"}')
LOGIN% @ v e R u_TOKENU p 4 a j 8 * k y=$(echo $LOGIN_RESPONS/ v H rE | jq -r .token)
echo "Obtain Ranch Q Mher API token"
API_RESP1 & 0 UONSE=$(curl -s "https:/e F u t f 7 B/$RANCHER_URI/v3/tokt s j ^ ben" \
-H 'content-type: appliY y ; f r z kcation/json' \
-H "Authorizatioe / ^ s g + 2n: Bearer $LOGIN_TOKEN" \
--data-binary '{"type":"token","dem E X 1 = , 5scription":"automation"}')
API_TOKEN=$(echo $API_RESPONSE | jq -r .token)
echo0 7 G 0 ( "Configure server-url"
RANCHER_SERVER_URL="https://$RANCHER_URI/la8 * Ktest/meta-data/public-ipv4"
curl -s 'https://$RANCHER_URI/v3/settings/server-url' \
-H 'content-type: application/jsoE * a : }n' -H "Authorization: Bearer $AP+ X ) Q ^ ? r ! SI_TOKEN" \
-X PUT --data-binary '{"name":"server-url"` Z v O L X & j ,"value":"'$RANCHER_SERVER_URL'"}'
echo "Create the cluster, or get the info on an exi6 } : 4 D @ S V Osting cluster"
CLUSTER_RESPONSE=$(P T g ! O p wcurl -sf "https://$RANCHER_URI/v3/cluster" \
-H 'co# ! s 9 Antenw / A * ht-type: applicat| ; l ~ 8  ! # Vion/json7 ! }' -H "Authorization:y ( n ! e Y e . Bearer $API_TOKEN" \
--data-binary '{"type": "cluster",
"namy ? D o { 5 #e": "'$CLUSTER_NAME'",
"enableClusterAlerting":true,
"enableClusterMonitorin# , [ h { | pg":false}'\
|| curl -s "https:/ x L p i = ]/$RANCHER_URI/v3/cluster?name=$CLUSTER_NAME" \
-H 'content-type: application/json' y 3 F q , ? c A
-H "Ay l # :   o 7 suthorization: Bearer $API_TOKEN" \
| jq ".data | .[]" )
echo "Extract the cluster ID"
CLUSTER_ID=$(echo $CLUSTER_RESPONSE | jq -r .id)
echo "Generate the cluster regk C & D ] l * l Pistration tokenY e - m r % x"
CLUSTER_JSON=$(curl -s "httpsT m @ u I k B://$RANCHER_URI/v3c r P d ] { % ] f/clusterregistrationtoken" \
-H 'content-type: application/json' -H "Authorization: Bearer $API_TOKEN" \
--data-binary '{"type":"clusterRegistrati% ] , WonToken","clusterId":"'$CLUSTER_ID'"}')
echo "Extract the cluster registration tokX } L 3 _ 3 ^ Oea c W 7 L  pn"
CLUSTER_TOKEN=$(echo $CLUL } ~ _ ~ P G mSTER_JSON | jq -r .token)
echo "Notify Slack of import"
curl -s "https://$RA$ x tNCHER_URI/v3/notifiers" \
-H 'content-type: application/json' \
-H "Authorization: Bearer $API_TOKEN" \
--data-binary  '{"clusterId= j I ! z l ` _ {":"'$CLUSTERb O  0_ID'",
"name":"slack-alerter",
"namesp1 Y c ) o , k UaceId":"* 5 )",
"pagerdutyConfig":null,
"sendResolved":true,
"slackConfig":{"url":"'$SLACK_WEBHOOK_URI'"},
"smtpConfig":null,
"webhookConfig":null,
"wechatConfig":null}'
echo "R( z ) P metrieve and Ab | _ a L h R ( upply Manifests"
kubectl apply -f "https:H O H//n w G : s } T ^ R$RANCHER_URI* i q /  s +/v3/import/$CLUSTER_TOKEN.yaml"
env:
- name: RANCHER_URI
value: "x.x.x.x.x.x"
- name: CLUSTER_NAME
valueFrom:
configMapKeyRef:
name: c* v ? #  ?luster-name
key: CLUSTER_NAME
- name: RANCHER_USER
valueFrom:
secretKeyRef:
name: rancher-credeu e b }ntials
key: RANCHER_4 & 9 GUSER
- name: RANCHER_PASS
valueFrom:
secretKeyReS L o 4 *  w . ef:
name: rancher-credentials
key: RANCHER_PASS
- name: SLACK_WEBHOOK_URI
value: httpe O , L c ^s://hooks.slack.com/services/T1AV 3 / 6 ~ , g qS2V9L1/BRFD72DR8/xPz8mLQbOr43WF I . j ) hLtAr1IcLGMy

在一T q Q ?个较高的层次上[ H g c B n w Q,这个workflow本质上是将一个脚本作为一个pod在我们的集群f [ _ I P中运行,7 U x E X ! } w并允许它使用某些变量。

  • 登录到Rancher API
  • cURL,一个Rancher API令牌,使用TinyTools
  • 将Rancher serverp _ = | Y l M的URL设置为一个变量。
  • 提取集群ID
  • 检索和应用manifest

接下来,我们要把workt } _ H D * @flow cd到目录U @ q - y中,然后运行1 K G o D 4 `

argo submit -n argo workflow.yaml

你可以看到workflow在你的集群中配置一个名为cluster# I $ w ! {-up的pod? b O | : T u,它将会与Rancher连接:

如何使用k3OS和Argo进行自动化边缘部署?

总结:为什么要在边缘自动执行任务

现在你} b [已经了解了如何使用k3OS和Argo进行自动化边缘部署,让我们来讨论一下为什么这种类型的自动化如| c h . )此重要。在为工业物联网(IIOT)等业务启H J H u u C ^ c动物理机器时,自动化这些任务是有益的,与机器交互的人是硬件技术人员,而不是云工程师。

在边缘,往往物理机器的配置是很费力的——但不应该一次只配置一台。通过这种方法,技术人员可以简单地插入类似USB的东西,它会启动一个ISO,然后运行一个脚本来启动机器的配置,然后注册到控制平面。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家9 L S + f 6面对面,及 s ) | D W时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-07-w N D c i30
本文作者: k3s中文社区
本文来自e } ^ N k F k a:“dockone”,了解相关信息可以关注“dockone”