找回密码
 注册
7月份EDA365直播计划
查看: 15|回复: 0

使用 OAM 定义与管理 Kubernetes 内置 Workload

[复制链接]

该用户从未签到

发表于 2020-6-30 11:46 | 显示全部楼层 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 fish1352 于 2020-6-30 11:49 编辑
' {5 Z0 j* M0 V9 G: J4 M- ]# J$ T) H7 D
/ I: q( V) A  f  u3 h2 ~* e1 @
1 [: Z: D; K0 e: U$ N" h4 k
  ]4 m3 ~# U# S4 x/ g* q 大家都知道,应用开放模型 Open Application Model(OAM) 将应用的工作负载(Workload)分为三种 —— 核心型、标准型和扩展型,这三者的主要区别在于一个 OAM 平台对于具体某一类工作负载进行实现的自由度不同。其中,OAM 社区中目前唯一一个核心工作负载是 Containerized Workload,它用来描述一个基于容器的工作负载,可以理解为是 Kubernetes Deployment 的简化版(去掉了 PodSecurityPolicy 等大量与业务研发无关的字段)。. B; j' E* F8 T8 S9 m9 S) V

: Q$ l+ U- x, l+ D3 C 不过,很多读者可能会有疑问:对于 Kubernetes 内置的工作负载 OAM 是否还能直接支持呢?
/ S& @  x9 j5 B0 ]9 Q/ G) ^5 ?# k) E* r' g$ g
答案当然是肯定的,而且这是 OAM 作为 Kubernetes 原生的应用定义模型的默认能力。, b/ c5 T. `$ f# g

  j3 A* Y4 s. E4 Z3 ~, N 下面,本文就以 Deployment 为例,介绍如何使用 OAM 基于 Kubernetes 的内置工作负载来定义和管理云原生应用。$ ^9 D/ ~- L+ y9 q- Y
1 O  E6 D0 |6 x, `( V7 }; f
示例准备
  H* y5 W, T$ p; \- ?7 `6 j: j. C' K- D7 e& S& C2 w. b
基于 GitHub FoodTrucks (旧金山美味街边小吃地图应用)项目,构建镜像 zzxwill/foodtrucks-web:0.1.1,加上依赖的 Elasticsearch 镜像,在默认情况下,它的 Deployment 描述文件 food-truck-deployment.yaml 如下所示:3 T* p9 ~4 C8 \
6 a! q6 t4 l# R: M4 i' `
apiVersion: apps/v1
; n' q9 f% }8 E) k: q5 W
/ H2 I) O: f0 [ kind: Deployment
: e: O: d  l3 \, U
) J( c: z+ m5 j% z) e6 q/ Q metadata:
+ h8 U# _  J# z
. y& ~# U$ d% P0 T- l/ x4 F% b name: food-trucks-deployment0 }: {9 {, ~( V  u
! ^% b4 M  G% R# U& @0 r2 p
labels:" N6 t! `; p1 D$ _
7 t( c2 G3 C7 j& s
app: food-trucks# {' Q5 {, l( w# l

& N3 T9 Y( U5 H5 R spec:
7 a! |* H/ v2 w2 e. {: i
5 p7 J6 C- [% `5 _ selector:
+ O+ Z( `/ }' A4 U+ }6 z2 f* C  A7 ]' B/ p( D" H/ o$ T7 G$ i
matchLabels:
' c* y9 e/ P) D8 i- c
+ z* N8 F  |: [9 ~. s app: food-trucks
2 Q8 ?) g. X1 P& }1 Z. k/ s3 ~
" Q9 r3 F# I- i( h# o5 D template:
& G6 N4 O0 D/ v$ F- P& P. r8 Q) C' Q3 J8 `; y
metadata:
. L9 A2 `, i& F* n0 P8 U8 p, O: e* Q* H5 @- X! o  i
labels:
+ p5 `. h: n/ A- P/ z/ I) e5 X4 {8 ^: P+ w0 }
app: food-trucks4 q! y0 v$ ?# k3 C5 y

1 d0 j. o5 u# O9 b spec:: N2 U6 U9 u' @. ~' b- M
4 u9 w$ |$ X' ]% N# ~
containers:
% V# {+ i% {. J6 @8 q6 f) |" H4 Q, ]8 s$ q8 `7 j8 [: d& y; M
- name: food-trucks-web( h: g0 K, d4 ^) N  K  x

' |4 Q, Z% B( ?% R* p8 M; H! p image: zzxwill/foodtrucks-web:0.1.11 c$ [, h8 M1 P7 T! X& ~

* h8 h0 M" \5 [7 V3 _" K( A  E" ] env:' |; o. w. y7 t2 i
' R2 S6 i$ Q' ?
- name: discovery.type
$ z, f4 @' n* Z+ J/ y) `
& C$ S) Y7 [: P' @3 j6 f value: single-node) O+ l4 w" d( R5 X9 `
" L- A/ H3 |0 {$ o0 E* l
ports:
: z1 L; m$ H. u5 \9 W2 a1 g8 o9 [, H  b% r' m. n3 J% _
- containerPort: 5000
% W$ b8 P. R  v9 Q" `# y! A$ [- M  T+ ?
- name: es: C# P* \4 [% N2 w

! j4 S4 V3 {( W) B/ I+ v5 z+ V- e2 [ image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
0 b: S$ X) }; z' R0 i5 R& ]$ u* M2 r7 @" }
ports:
4 L+ u7 `/ {- a" @/ ]3 c( w7 h. H1 v7 ^! e" d# _" j8 o: C* k7 U9 \. h! F
- containerPort: 92002 x; D& z' ?0 u& p# F# Q- ]6 T
# D) F( E7 N2 W  z" a, Q6 \8 @
- containerPort: 9300/ H: p" \; H9 a1 N
- y1 Q6 ^0 v$ T* o7 D5 w1 U
如果将上述 yaml 文件提交到 Kubernetes 集群,通过 port-forward 可以通过浏览器查看效果:
3 B5 D4 l7 u; J( V2 {! `1 J1 @
, J) @) M" @* c, f

7 H' k4 b! N  R5 ?: e. P9 H: r+ t, y# a
! V8 k7 [' A  z# V; Q8 Q# u2 v 定义 Component 与 Workload0 w! R& _0 J) s2 P2 V+ L% l; e% U

, K$ h2 D/ F  i3 f0 `2 I4 v 在 OAM 中, 一个应用是由多个 Component(组件)构成的,而一个 Component 里的核心字段,就是 Workload(工作负载)。
: W- P! F0 E# c! T3 `. a6 L+ l9 _* K9 c( V

1 [4 q1 E. q- N% @+ m
7 X; R. B% J( P 所以说,像 Kubernetes Deployment、StatefulSet 等内置的工作负载,其实天生就可以被定义为 OAM Component 中的 Workload。比如下面这个 sample-deployment-component.yaml 文件,可以看到,.spec.workload 的内容,就是一个 Deployment,也就是 food-truck-deployment.yaml 里定义的 Deployment。! O; K" E6 m0 t
: T; `2 M9 {, M& |) s5 X
( a$ x8 G  }3 ^+ ^1 |" r, }+ o
3 X8 B. P) s5 [! O
接下来,我们就将上述 OAM Component 提交到 Kubernetes 集群验证一下。% n/ i+ l6 H: V: |
9 c! F% ^) M/ p: b5 i; l# O
部署这个应用
9 ~7 f( }6 Y  h! R: W- O+ B" Y; e* q2 `% M
在 OAM 中,我们需要编写一个应用配置 ApplicationConfiguration 来组织所有的 OAM Component。由于只有一个 Component,本例中的 sample-applicationconfiguration.yaml 非常简单,如下所示:
6 q8 q. u  I( i# f, k0 J6 r) L6 o; f
apiVersion: core.oam.dev/v1alpha2
) }2 |3 }) V# n2 Q% `
( \% R0 k, k" b$ U1 Y5 K kind: ApplicationConfiguration1 A6 `4 f1 E6 m  p2 Q: R

" n  Z0 E; e6 g; @ metadata:% @: j+ F( S! G/ f
; ^$ x: ~; B6 k3 |; I- M! B! t
name: example-deployment-appconfig6 k, b) M' G; J3 r7 g% y
8 Q) d/ B8 a. P/ i4 R; A# F% a6 C( j
spec:
7 |, o+ d; d9 v' s* @
# o7 G% R0 @( W3 J1 {3 y( W components:. R" K* s& K6 `: |0 G
% G2 I3 b- M1 C0 Y. I! u( ~
- componentName: example-deployment$ A1 I4 Y# E, ^! g; S' G

% f6 G% o( y2 Y4 g1 U: c1 y) O 提交 OAM Component 和 ApplicationConfiguration YAML 文件给 Kubernetes:
0 I: p5 {: g6 ?0 ^8 y
( s# ^: I! S  u ? kubectl apply -f sample-deployment-component.yaml4 @% v. i3 ^7 D+ u0 _
0 W  v  I! t2 w& C6 G0 l
component.core.oam.dev/example-deployment created
6 F3 e) t0 U' v- Q7 x& I  c9 j4 j6 d/ A3 p
? kubectl apply -f sample-applicationconfiguration.yaml" H. C0 d! q1 N6 A3 Z

/ ^# D6 _' n! O applicationconfiguration.core.oam.dev/example-deployment-appconfig created
# n* j# ?, A% ?' B  a# a# P% C7 t9 B% N) E7 y$ V6 O
不过,如果这个时候你查看 example-deployment-appconfig 的执行情况,会发现如下报错:
9 T& X& r+ a, P5 J
1 U% [- R' C6 X; a1 Y; v ? kubectl describe applicationconfiguration example-deployment-appconfig* N+ L) |3 V1 U. G
7 z/ k+ k$ w. S8 G8 [( y
Name: example-deployment-appconfig- e- A: R( T. d' f2 G
6 `% m+ n$ H* j* J- r7 _
Status:
; U+ a& x" f1 p0 I) `
# Y- o/ [9 \! N! ]8 ] Conditions:
9 X9 C7 }) B0 s% R
5 R: k) @$ J6 b; p# d- r Message: cannot apply components: cannot apply workload "food-trucks-deployment": cannot get object: deployments.apps "food-trucks-deployment" is forbidden: User "system:serviceaccount:crossplane-system:crossplane" cannot get resource "deployments" in API group "apps" in the namespace "default"& |. \4 u% }( g3 Q& Q4 E; B
4 k7 x2 j* R8 G: E
Reason: Encountered an error during resource reconciliation
2 e* U$ A3 ]- u5 T9 A% x# d8 A. O" ]% j: D$ ?$ U
这是因为 OAM 的 Kubernetes 插件权限不足导致的,所以不要忘记设置合理的 ClusterRole 和 ClusterRoleBinding。
* S& M! V* u$ J1 M0 ?1 G8 O+ X5 [3 B% _: k
! s4 y( {0 O+ }' Y/ @! a$ i 提交如下的授权文件 rbac.yaml,ApplicationConfiguration 可以执行成功。% m( ?/ p6 H+ B: W8 n+ Z( }
) K: J1 I+ \" U* P
apiVersion: rbac.authorization.k8s.io/v1
, }$ _- O* e9 Z  Z
" l# ~! I: O% T5 x. Z; A kind: ClusterRole
* c9 S! s; J, V8 R
2 q7 u% [8 p( U/ R$ f metadata:
0 {) \  P, K; d% I
* B# t  j- I% _5 ~/ A6 x name: deployment-clusterrole-poc( d$ @5 ]8 r+ P# C% v
6 i4 ?! S& i4 B3 A7 M" B! C
rules:! D+ U; o8 S- A6 S5 H) W! G
* z! K2 T7 C! o8 X" s; W% Z  I
- apiGroups:5 y8 i6 y9 w" r4 l$ d- A
$ J; Y; D1 \1 A; f! C9 s" i
- apps9 g/ r; [3 ?  O3 X0 p3 b

& p7 t/ A. k5 i resources:
+ x$ N) x$ P, I- [+ o! v2 R8 [9 q6 v2 p# s2 c
- deployments
' w" \+ r4 t: N) i& D& k: @
. @# V2 l% ?* [ verbs:
! k, c8 k( S; H* j7 N7 z- F" b; G# \9 L/ E! |, r, b) s
- "*"  L! Z7 W' ^# ?% j4 Y

: ~+ O' n' a7 U$ Y ---  T8 ~: _! C4 i9 L9 U* I
2 z4 D$ c3 ^$ x5 ^
apiVersion: rbac.authorization.k8s.io/v13 l& j  b6 n9 |; T  [. X+ e7 x  H* ^& j7 t
/ o! X" K. |6 N0 _
kind: ClusterRoleBinding9 ?; n* _, e2 R4 C: k0 ]( a" K

% D& o. n& [' q metadata:
( C& D& M5 B) D- H* i; z
2 i4 ~. L1 A) |. @7 D2 U# l  I2 d name: oam-food-trucks, m7 r$ T! @, u2 R1 C
) w# W3 c* O3 i4 X
roleRef:
  `. c& i  n% i% x( r. S
4 L7 o( q& ]* w' g- N  N apiGroup: rbac.authorization.k8s.io
$ d2 ~" R3 R# }0 B6 i9 h) a2 y. W# ?9 [5 R$ k
kind: ClusterRole; I4 s/ V0 c( k' a4 D$ f3 W
- s; q* r6 R2 s# f! R
name: deployment-clusterrole-poc
2 {. u; i0 ]/ _( r. Q
2 K1 n3 s  Y% n! t subjects:
. g7 a  n5 S4 U# J
( z* J$ S0 \; u- L. i# N - kind: ServiceAccount* ?. ?5 ?# M. q" |0 D0 {. R

, N4 a7 @" m5 g namespace: crossplane-system" B- P: W& l" d& }4 I/ `( l
, y5 R/ |) O7 w4 \/ z
name: crossplane
% ]" e- l, T1 _+ @/ h1 Q/ T7 g6 ]+ U* b
继续查看 deployments,并设置端口转发:
' |. Z, ^7 ?1 D) v: q- a; z9 M. [. p) r: q. T
? kubectl get deployments9 q. I  h- b7 G& f

5 ]2 J1 _! P% }. X( P. x! q  G% s) F NAME READY UP-TO-DATE AVAILABLE AGE
+ |* Q6 J+ N/ B1 Q& E4 i6 E) S, o( m7 p3 V, j( K  a
food-trucks-deployment 1/1 1 1 2m20s
* ^" a! n/ J6 M7 R8 Y( @) h
. w  |. N) Z6 I* S0 [' [" b; f ? kubectl port-forward deployment/food-trucks-deployment 5000:5000& w3 Y* b9 C7 z4 @

" m3 F9 ]& ~5 S6 J8 J Forwarding from 127.0.0.1:5000 -> 50000 a6 r6 G3 v7 ?

5 q* Z3 j" Y4 c! f1 A* P" o Forwarding from [::1]:5000 -> 5000
8 H3 }$ _1 e# {# H) S
% W$ s  {+ ~2 n; R6 W. r1 T Handling connection for 5000
8 R' F  {$ K' F5 V4 h. ^- H0 {- A! \4 F/ t5 A
Handling connection for 5000" y0 H. z& B- v! ], k

4 Y' Z: h5 |* K 通过 http://127.0.0.1:5000 就可以在旧金山美味街边小吃地图里找到汉堡包的店了:
' `4 Q' B$ f' P6 u, F
( u3 [5 G' S! _9 O; V
- A# u  ]$ B( o9 v- R# m

' M& J+ K( s* l: n# y! v 什么时候使用 Deployment ?5 [# n, G3 @: \$ \4 h& N, [/ G
, b. d: u1 D/ [. c" }
看到这里,大家可能会有另一个疑问,那么我什么时候该使用 Deployment、什么时候该使用 ContainerizedWorkload 来作为 OAM 的工作负载呢?
; H3 N" `+ v! O$ Z; d
/ j  c/ t" e4 b( y" W 其实,Deployment 和 ContainerizedWorkload 的主要区别,在于抽象程度不同。$ a. N+ j" G' T9 W* p5 e

: H$ N& k4 ~9 M! C 简单说,如果你的用户希望看到一个极简的、没有一些”乱七八糟“字段的 Deployment 的话;或者,你希望对你的用户屏蔽掉 Deployment 里面与用户无关的字段(比如:不想允许研发自行设置 PodSecurityPolicy),那你就应该给用户暴露 ContainerizedWorkload。这时候,这个工作负载需要的运维操作和策略,则是由另一个 OAM 对象 Traits(运维特征) 来定义的,比如 ManualScalerTrait。这种“关注点分离”的做法,也是 OAM 提倡的最佳实践。
+ K) w" D1 k( j' Z( X7 s, k* }: h
- I2 D& h) A% |6 N+ a" Y* j5 Q 反之,如果你的用户对 Deployment 里的各种运维、安全相关的字段并不排斥,你也不需要对用户屏蔽掉这些字段,那你大可以直接暴露 Deployment 出去。这个工作负载需要的其他运维能力,依然可以通过 OAM Traits 来提供。# v& }- y  K) \8 {: [' C$ A
, `' h, _0 h4 J" L2 Z9 M8 n' \
为什么使用 OAM Component 来定义应用?2 G$ e; _( a8 V+ _
# j2 w$ I# f" a0 i+ D
你有可能还有另外一个疑问,既然 OAM Component 里面的 Workload 就是 Kubernetes 里的各种 API 对象,那么使用 OAM 模型来定义应用又有哪些好处呢?: H* L# S- T( ~+ d8 u
- I. }) i# u/ Q3 `3 ]6 q* x: o
这就要说到 OAM 带来的好处了,相信大家在基于 Kubernetes 构建应用平台的时候,一定遇到过一系列的难题,比如依赖管理、版本控制、灰度发布等等,另一方面,应用平台为了跟云资源结合起来,纯粹使用 K8s 原生的 Workload 是做不到的。$ [( k; m3 K% h4 Z
1 m( Y; d5 W( O- I: g5 a, L8 [: O
而通过 OAM ,你不仅可以将云资源与应用统一描述,OAM 实现框架还将帮你解决了依赖管理、版本控制、灰度发布等一系列难题。这些我们将在后续的文章中为大家介绍。
& o1 H+ U3 V1 Z( c+ U' s
% K7 G( J/ F1 n6 \ : P5 |/ o2 Z( p2 l+ B4 t, c

1 W+ }6 |6 `- e2 S" [" _  e『本文转载自网络,版权归原作者所有,如有侵权请联系删除』
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号 )

GMT+8, 2020-7-5 14:54 , Processed in 0.078125 second(s), 21 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19925233282

快速回复 返回顶部 返回列表