Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

⚫ ⚫ ⚫

Slide 3

Slide 3 text

⚫ ⚫ ⚫

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

⚫ ⚫ ⚫

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

⚫ ⚫

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

type Reconciler interface { // コントローラのReconcile処理の実装 // 受け取ったRequestの内容に応じてリソースの作成や削除などの処理をおこなう // 処理の結果に応じてResultとerrorを返す Reconcile(context.Context, Request) (Result, error) } type Request struct { // コントローラが対象とするKubernetesオブジェクトのNamespaceとName types.NamespacedName } type Result struct { // コントローラにReconcileを再実行するように指示する Requeue bool // コントローラに指定した時間が経過した後にReconcileを再実行するように指示する RequeueAfter time.Duration }

Slide 10

Slide 10 text

⚫ ⚫ ⚫ ⚫

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

⚫ ⚫ ⚫ ⚫ ⚫ ⚫ 😫

Slide 13

Slide 13 text

func (r *reconciler) reconcileXxxx(ctx context.Context) error { result, err := ctrl.CreateOrUpdate(ctx, r.Client, res, func() error { // リソースの更新処理を実行 }) if err != nil { return err } if result != controllerutil.OperationResultNone { err = r.updateStatus() if err != nil { return err } } return nil }

Slide 14

Slide 14 text

⚫ 😊

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

ss, err := p.GatherStatus(ctx) if err != nil { return false, err } if err := p.updateStatus(ctx, ss); err != nil { return false, err } switch ss.State { case StateCloning: // 省略 return redo, nil case StateRestoring: return false, nil case StateHealthy, StateDegraded: // 省略 return false, nil case StateFailed: // 省略 return true, nil

Slide 17

Slide 17 text

⚫ ⚫ ⚫ 😫

Slide 18

Slide 18 text

⚫ ⚫ ⚫ ⚫ 😊

Slide 19

Slide 19 text

_, err := ctrl.CreateOrUpdate(ctx, r.Client, certificate, func() error { // 省略 } if err != nil { return ctrl.Result{}, err } secret := &corev1.Secret{} err = r.Get(ctx, key, secret) if err != nil { if apierrors.IsNotFound(err) { return ctrl.Result{ RequeueAfter: 10 * time.Second, }, nil } return ctrl.Result{}, err } // 次の処理を実行

Slide 20

Slide 20 text

⚫ ⚫ ⚫

Slide 21

Slide 21 text

⚫ ⚫ ⚫ ⚫

Slide 22

Slide 22 text

⚫ ⚫ ⚫ ⚫ ⚫ 😫

Slide 23

Slide 23 text

😊

Slide 24

Slide 24 text

⚫ ⚫

Slide 25

Slide 25 text

⚫ ⚫ ⚫ ⚫

Slide 26

Slide 26 text

⚫ ⚫

Slide 27

Slide 27 text

⚫ ⚫ ⚫

Slide 28

Slide 28 text

⚫ ⚫ ⚫ 😫

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

⚫ 😊

Slide 32

Slide 32 text

apiVersion: v1 kind: Pod metadata: managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:labels: f:v1.controller: {} manager: my-controller operation: Update

Slide 33

Slide 33 text

svc := corev1apply.Service(svcName, mdView.Namespace). WithSpec(corev1apply.ServiceSpec(). // 省略 ) obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(svc) if err != nil { return err } patch := &unstructured.Unstructured{ Object: obj, } var current corev1.Service err = r.Get(ctx, client.ObjectKey{Namespace: mdView.Namespace, Name: svcName}, &current) if err != nil && !errors.IsNotFound(err) { return err } currentSvc, err := corev1apply.ExtractService(&current, constants.ControllerName) if err != nil { return err } if equality.Semantic.DeepEqual(svc, currentSvc) { return nil } err = r.Patch(ctx, patch, client.Apply, &client.PatchOptions{ FieldManager: constants.ControllerName, Force: pointer.Bool(true), })

Slide 34

Slide 34 text

⚫ ⚫ 😫

Slide 35

Slide 35 text

⚫ ⚫ ⚫ ⚫ ⚫ ⚫ ⚫ 😊

Slide 36

Slide 36 text

⚫ ⚫ ⚫ ⚫

Slide 37

Slide 37 text

⚫ ⚫ ⚫ ⚫ 😫

Slide 38

Slide 38 text

⚫ ⚫ ⚫ 😊

Slide 39

Slide 39 text

⚫ ⚫ ⚫ ⚫

Slide 40

Slide 40 text

⚫ ⚫ ⚫ ⚫

Slide 41

Slide 41 text