Slide 1

Slide 1 text

mackerel-container-agentΛ༻͍ͨ ϚϧνςφϯτKubernetesͷ ϞχλϦϯά

Slide 2

Slide 2 text

ൃද಺༰ • ࣗݾ঺հ • ͜Ε·Ͱͷ؂ࢹͱ͜Ε͔Βͷ؂ࢹ • Ϛϧνςφϯτkubernetesͷߏ੒ʹ͍ͭͯ • σϓϩΠํ๏ͷ঺հ SideCarͰར༻͢Δ৔߹ MutatingAdmissionWebhookΛར༻ͨ͠৔߹ ServiceCatalog (TSB)Λར༻ͨ͠৔߹ • ·ͱΊ

Slide 3

Slide 3 text

ࣗݾ঺հ • ໊લɿޙ౻ ल৴ • ॴଐɿٕज़ຊ෦ PrivateCloud ։ൃνʔϜ • ग़਎ɿେ෼ • ܦྺɿ - ( 2014 / 04 ~ ) SIerʹ৽ଔೖࣾ - ( 2016 / 09 ~ ) ݱࡏͷձࣾʹத్ೖࣾ • ۀ຿ɿPrivateCloudʹ͍ͭͯॾʑ

Slide 4

Slide 4 text

͜Ε·Ͱͷ؂ࢹͱ͜Ε͔Βͷ؂ࢹ αʔϏεͷ଍ճΓ 
 ݹ͘͸શͯ෺ཧαʔόͷ্ʹ৐͍ͬͯͨ 2013೥ࠒ͔ΒϓϥΠϕʔτΫϥ΢υͷఏڙ͢ΔԾ૝αʔό΁Ҡߦ
 ਺೥લ͔ΒɺAWS΍GCPͷ༷ͳύϒϦοΫΫϥ΢υ΁ͷҠߦ΋ਐΜͰ͍Δ ࠷ۙʹͳͬͯɺαʔϏεͷίϯςφԽ͕ਐΉΑ͏ʹͳ͖ͬͯͨ ෺ཧαʔό ίϯςφ Ծ૝αʔό
 (OpenStack) Ծ૝αʔό
 (಺੡Ϋϥ΢υ)

Slide 5

Slide 5 text

͜Ε·Ͱͷ؂ࢹͱ͜Ε͔Βͷ؂ࢹ αʔϏεͷ؂ࢹ
 ݹ͘͸monɺNagiosɺMunin গ͠ਐΉͱZabbixɺSensu͕ൺֱతΑ͘࢖ΘΕ͍ͯͨ ͦͷޙɺࣗલͰ࣋ͭͷ͸ਏ͍ͱ͍͏ྲྀΕ͔Β MackerelɺDatadogʹ୅ද͞ΕΔSaaS΁ͷҠߦ͕࠷ۙͷྲྀΕ ෺ཧαʔό ίϯςφ Ծ૝αʔό
 (OpenStack) Ծ૝αʔό
 (಺੡Ϋϥ΢υ) mon
 Nagios
 Munin ??? Mackerel
 Datadog Zabbix
 Sensu

Slide 6

Slide 6 text

͜Ε·Ͱͷ؂ࢹͱ͜Ε͔Βͷ؂ࢹ ৽͍͠σʔληϯλ
 2019೥3݄ʹΦʔϓϯ OpenStackΛ༻͍ͨԾ૝Խج൫ʹՃ͑ͯ
 ϚϧνςφϯτͷϚωʔδυKubernetesΛఏڙ Ծ૝Ϛγϯͷ؂ࢹαʔϏεͱͯ͠MackerelΛ࠾༻ ෺ཧαʔό ίϯςφ Ծ૝αʔό
 (OpenStack) Ծ૝αʔό
 (಺੡Ϋϥ΢υ) mon
 Nagios
 Munin ??? Mackerel
 Datadog Zabbix
 Sensu

Slide 7

Slide 7 text

͜Ε·Ͱͷ؂ࢹͱ͜Ε͔Βͷ؂ࢹ ίϯςφ؀ڥͷ؂ࢹ
 ίϯςφ؀ڥͷ؂ࢹαʔϏεͱͯ͠MackerelΛ࠾༻ ࠾༻ཧ༝ 1. Ծ૝αʔόͱίϯςφΛಉ͡πʔϧͰ؂ࢹ͢Δ͜ͱ͕Մೳ 2. طଘͷϓϥάΠϯͷྲྀ༻͕Մೳ ෺ཧαʔό ίϯςφ Ծ૝αʔό
 (OpenStack) Ծ૝αʔό
 (಺੡Ϋϥ΢υ) mon
 Nagios
 Munin Mackerel Container Agent Mackerel
 Datadog Zabbix
 Sensu

Slide 8

Slide 8 text

Ϛϧνςφϯτkubernetesͷߏ੒ • Kubernetes (OpenShift) on OpenStack on Kubernetes Pod VM Pod Pod

Slide 9

Slide 9 text

Ϛϧνςφϯτkubernetesͷߏ੒ • Kubernetes (OpenShift) on OpenStack on Kubernetes Pod VM Pod Pod ຊ೔ͷൃදείʔϓ͸
 ίί

Slide 10

Slide 10 text

Ϛϧνςφϯτkubernetesͷߏ੒ → OKDͷུ֓ਤ • ུ֓ Master × 5 Etcd × 5 Route × 10 Node × ͍ͬͺ͍ Master Route(HAproxy) okd-node001(8core/48GB) Master Master Master okd-node002 Route(HAproxy) Etcd Etcd Etcd Etcd Etcd Prj-2
 pod1 Prj-1
 pod1 Prj-1
 pod2 Prj-3
 pod1 Prj-2
 pod2 Prj-4
 pod1

Slide 11

Slide 11 text

mackerelಋೖͷHOW TO okd-node001(8core/48GB) Prj-2
 pod1 Prj-1
 pod1 Prj-1
 pod2 ͜͜ʹͲ͏΍ͬͯmackrel-container-agentΛ
 ಋೖ͢Δʁʁ

Slide 12

Slide 12 text

mackerelಋೖͷHOW TO • manifestʹsidecarΛهࡌͯ͠ߦ͏σϓϩΠ • ७ਮͳํ๏ • MutatingAdmissionWebhookΛར༻ͨ͠σϓϩΠ • istioͰͷenvoyͷinjectionͱಉ͡Α͏ͳํ๏ • TemplateΛར༻ͨ͠σϓϩΠ • OpenShiftͷtemplateػೳΛར༻ͨ͠ํ๏

Slide 13

Slide 13 text

mackerelಋೖͷHOW TO manifestʹsidecarΛهࡌͯ͠ߦ͏σϓϩΠ

Slide 14

Slide 14 text

manifestʹsidecarΛهࡌͯ͠σϓϩΠ • ಉҰPod಺ʹίϯςφΛ૬৐Γͤ͞Δํ๏ • kubernetesͷsidecarΛར༻ͨ͠σϓϩΠͰ͕͢
 ΋ͪΖΜOpenShiftͰ΋࢖͑·͢

Slide 15

Slide 15 text

manifestʹsidecarΛهࡌͯ͠σϓϩΠ containers: - name: service-container-main ɹɾ ɹɾ ɹɾ - name: mackerel-container-agent spec.template.spec.containers

Slide 16

Slide 16 text

Secret apikey: "YOUR_MACKEREL_APIKEY" roles: - "mackerelmeetup:database" ignoreContainer: '\Amackerel-container-agent\z' mackerel.yaml Create Secret $ oc create secret generic mackerel-config --from-file=./mackerel.yaml secret/mackerel-config created apikeyΛsecretʹͯ͠ઃఆྨ͸configmapͰ͋ͯΔ͜ͱ΋Ͱ͖Δ͕ɺ secretͱconfigmapΛ؅ཧ͢Δͷ͸໘౗ͳͨΊɺઃఆϑΝΠϧΛؙʑSecretʹͨ͠

Slide 17

Slide 17 text

DeploymentConfig (spec.template.spec.containers[].env[]) - name: MACKEREL_KUBERNETES_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace MACKEREL_KUBERNETES_NAMESPACE MACKEREL_KUBERNETES_POD_NAME - name: MACKEREL_KUBERNETES_POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name

Slide 18

Slide 18 text

- name: MACKEREL_KUBERNETES_KUBELET_HOST valueFrom: fieldRef: apiVersion: v1 fieldPath: status.hostIP MACKEREL_KUBERNETES_KUBELET_HOST MACKEREL_CONTAINER_PLATFORM - name: MACKEREL_CONTAINER_PLATFORM value: kubernetes MACKEREL_KUBERNETES_KUBELET_READ_ONLY_PORT - name: MACKEREL_KUBERNETES_KUBELET_READ_ONLY_PORT value: 10255 DeploymentConfig (spec.template.spec.containers[].env[])

Slide 19

Slide 19 text

- name: MACKEREL_AGENT_CONFIG value: /etc/mackerel/mackerel.yaml MACKEREL_AGENT_CONFIG DeploymentConfig (spec.template.spec.containers[].env[]) DeploymentConfig (spec.template.spec.containers[].env[])

Slide 20

Slide 20 text

volumeMounts: - mountPath: /etc/mackerel/ name: config DeploymentConfig (spec.template.spec.containers[])

Slide 21

Slide 21 text

- name: config secret: defaultMode: 420 secretName: mackerel-config DeploymentConfig (spec.template.spec.volumes[])

Slide 22

Slide 22 text

manifestʹsidecarΛهࡌͯ͠σϓϩΠ • ར఺ • ࣗ༝౓͕ߴ͍ → resource΍image౳ͷࢦఆ͕Ͱ͖Δ • ܽ఺ • okdͷmanifestͷॻ͖ํΛ஌͍ͬͯΔඞཁ͕͋Δ
 (kubernetesͱҰ෦ҟͳΔՕॴ͕ଘࡏ͢Δ)

Slide 23

Slide 23 text

mackerelಋೖͷHOW TO MutatingAdmissionWebhookΛར༻ͨ͠σϓϩΠ

Slide 24

Slide 24 text

MutatingAdmissionWebhookΛར༻ͨ͠σϓϩΠ • Πϝʔδతʹ͸istioʹ͓͚Δenvoyͷ஫ೖͱಉ͡ํ๏ • annotationʹkey/valueΛ౉ͯ͠ɺͦΕΛϑοΫͯ͠ɺ
 mackerel-container-agentΛೖΕΔsidecarͷઃఆΛࠩ͠ࠐΉ • mackrel-pluginɺapikey͸ϢʔβຖʹҟͳΔͷͰɺ
 annotationͰsecret໊Λࢦఆ

Slide 25

Slide 25 text

Secret apikey: "YOUR_MACKEREL_APIKEY" roles: - "mackerelmeetup:database" ignoreContainer: '\Amackerel-container-agent\z' mackerel.yaml Create Secret $ oc create secret generic mackerel-config --from-file=./mackerel.yaml secret/mackerel-config created

Slide 26

Slide 26 text

spec: replicas: 1 template: metadata: annotations: mackerel-sidecar-injector.cycloud.io/inject: "yes" mackerel-sidecar-injector.cycloud.io/secret: "mackerel-conf-secret" labels: app: sleep spec: containers: ɹɹɹ - name: service-container-main MutatingAdmissionWebhookΛར༻ͨ͠σϓϩΠ spec.template.metadata.annotationsʹ߲໨Λ௥Ճ
 mackerel-sidecar-injector.cycloud.io/inject → inject͢Δ৔߹͸yes mackerel-sidecar-injector.cycloud.io/secret → mackrel-container-agentʹ͋ͯΔsecretΛࢦఆ

Slide 27

Slide 27 text

MutatingAdmissionWebhookΛར༻ͨ͠σϓϩΠ • ར఺ • Ϣʔβ͸annotationͱsecretΛ௥Ճ͢Ε͹ྑ͍ • ܽ఺ • sidecarͷઃఆΛॻ͘৔߹ʹൺ΂ࣗ༝౓͸ˣ
 (resourceઃఆ΍Πϝʔδࢦఆ౳)

Slide 28

Slide 28 text

mackerelಋೖͷHOW TO TemplateΛར༻ͨ͠σϓϩΠ

Slide 29

Slide 29 text

Template ? • Pod Templateͱ͸શ͘ҧ͏΋ͷ • TemplateΛఆ͓ٛͯ͘͠ͱɺ
 ࣗ਎ͷϓϩδΣΫτͰར༻Ͱ͖Δݖݶ಺ͰσϓϩΠͳͲΛ
 ઃఆ͢Δ͜ͱ͕Մೳ • Global template libaraly഑Լɺ
 ·ͨ͸projectʹΞοϓϩʔυ͍ͯ͠Δͱը໘͔ΒϙνϙνͰ
 σϓϩΠͳͲΛߦ͑Δ(CLI΋ར༻Մೳ)

Slide 30

Slide 30 text

Template ? DBϢʔβͱ͔ύεϫʔυͱ͔ઃఆ஋ΛೖΕΔ ී௨ͷDBͱͯ͠ར༻Ͱ͖Δ

Slide 31

Slide 31 text

TemplateΛར༻ͨ͠σϓϩΠ ೚ҙͷςϯϓϨʔτΛΫϦοΫ

Slide 32

Slide 32 text

TemplateΛར༻ͨ͠σϓϩΠ ֤ύϥϝʔλʹରͯ͠೚ҙͷઃఆ஋ΛೖΕΔ Add to Project : mackerel-meetup13
 mackerel Api Token : XXXXXXXXXXXXXXXX
 
 mackerel service : mackerelmeetup
 mackerel role : database

Slide 33

Slide 33 text

TemplateΛར༻ͨ͠σϓϩΠ createΛԡ͢

Slide 34

Slide 34 text

TemplateΛར༻ͨ͠σϓϩΠ ग़དྷ্͕Γ·Ͱ଴ͭ

Slide 35

Slide 35 text

TemplateΛར༻ͨ͠σϓϩΠ

Slide 36

Slide 36 text

TemplateΛར༻ͨ͠σϓϩΠ

Slide 37

Slide 37 text

TemplateΛར༻ͨ͠σϓϩΠ

Slide 38

Slide 38 text

Templateઃఆํ๏ apiVersion: template.openshift.io/v1 kind: template labels: messages: metadata: objects: parameters: mackerel-middle-template.yaml

Slide 39

Slide 39 text

Templateઃఆํ๏ apiVersion: template.openshift.io/v1 kind: template labels: messages: metadata: objects: parameters: mackerel-middle-template.yaml

Slide 40

Slide 40 text

Templateઃఆํ๏ messages: ɹɹςϯϓϨʔτͰϢʔβ͕ࢦఆͨ͠஋ΛݟͤͨΓ͢Δ͜ͱ͕Ͱ͖Δ metadata: ɹɹmetadata.annotationͰtemplateͷσΟεϓϨΠ໊΍iconͷࢦఆ͕Ͱ͖Δ (༻ҙ͞Ε͍ͯͳ͍iconʹ͍ͭͯ͸ผ్༻ҙ͢Δඞཁ͋Γ)

Slide 41

Slide 41 text

Templateઃఆํ๏ apiVersion: template.openshift.io/v1 kind: template labels: messages: metadata: objects: parameters: mackerel-middle-template.yaml

Slide 42

Slide 42 text

Templateઃఆํ๏ parameters: ɹɹϢʔβ͕ೖΕΔ஋Λઃఆ͢Δ߲໨ parameters: - description: Mackerel Api Token displayName: mackerel Api Token name: MACKEREL_API_KEY required: true - description: Maximum amount of memory the container can use. displayName: Memory Limit name: MEMORY_LIMIT required: true value: 512Mi - description: Username for MySQL user that will be used for accessing the database. displayName: MySQL Connection Username from: user[A-Z0-9]{3} generate: expression name: MYSQL_USER required: true

Slide 43

Slide 43 text

Templateઃఆํ๏ apiVersion: template.openshift.io/v1 kind: template labels: messages: metadata: objects: parameters: mackerel-middle-template.yaml

Slide 44

Slide 44 text

Templateઃఆํ๏ objects: ɹɹ࣮ࡍʹσϓϩΠ͢ΔmanifestΛهࡌ͢Δ
 ɹɹ(mackerel-container-agent΋sidecarͱͯ͜͜͠ʹهࡌ͞Ε͍ͯΔ) objects: - apiVersion: v1 kind: Secret metadata: annotations: template.openshift.io/expose-apitoken: '{.data[''mackerel-api-key'']}' template.openshift.io/expose-database_name: '{.data[''database-name'']}' template.openshift.io/expose-password: '{.data[''database-password'']}' template.openshift.io/expose-username: '{.data[''database-user'']}' name: ${DATABASE_SERVICE_NAME} stringData: database-name: ${MYSQL_DATABASE} database-password: ${MYSQL_PASSWORD} database-user: ${MYSQL_USER} mackerel-api-key: ${MACKEREL_API_KEY} - apiVersion: v1 kind: DeploymentConfig metadata: annotations: template.alpha.openshift.io/wait-for-ready: "true" name: ${DATABASE_SERVICE_NAME} spec: replicas: 1 selector: name: ${DATABASE_SERVICE_NAME} strategy: type: Recreate template: metadata: labels: name: ${DATABASE_SERVICE_NAME} spec: containers: - name: mackerel-container-agent

Slide 45

Slide 45 text

Templateઃఆํ๏ objects: ɹɹ࣮ࡍʹσϓϩΠ͢ΔmanifestΛهࡌ͢Δ
 ɹɹ(mackerel-container-agent΋sidecarͱͯ͜͜͠ʹهࡌ͞Ε͍ͯΔ) objects: - apiVersion: v1 kind: Secret metadata: annotations: template.openshift.io/expose-apitoken: '{.data[''mackerel-api-key'']}' template.openshift.io/expose-database_name: '{.data[''database-name'']}' template.openshift.io/expose-password: '{.data[''database-password'']}' template.openshift.io/expose-username: '{.data[''database-user'']}' name: ${DATABASE_SERVICE_NAME} stringData: database-name: ${MYSQL_DATABASE} database-password: ${MYSQL_PASSWORD} database-user: ${MYSQL_USER} mackerel-api-key: ${MACKEREL_API_KEY} - apiVersion: v1 kind: DeploymentConfig metadata: annotations: template.alpha.openshift.io/wait-for-ready: "true" name: ${DATABASE_SERVICE_NAME} spec: replicas: 1 selector: name: ${DATABASE_SERVICE_NAME} strategy: type: Recreate template: metadata: labels: name: ${DATABASE_SERVICE_NAME} spec: containers: - name: mackerel-container-agent Secret DeploymentConfig

Slide 46

Slide 46 text

Templateઃఆํ๏ ઃఆ൓ө
 (൓ө·Ͱগ͕͔͔࣌ؒ͠Γ·͢) $ oc create -f ${template-manifest}.yaml -n openshift

Slide 47

Slide 47 text

TemplateΛར༻ͨ͠σϓϩΠ • ར఺ • Ϣʔβ͸σϓϩΠ࣌΋͸΍manifestΛશ͘ॻ͔ͳͯ͘΋ྑ͍
 ྫ) ը໘ϙνϙνͰDBͳͲΛ࡞੒
 ɹ mackerel dashboardʹࣗಈͰొ࿥ • ܽ఺ • ࣗ༝౓͸΄΅̌

Slide 48

Slide 48 text

OpenShiftΛར༻͍ͯ͠Δํ΁ͷ஫ҙࣄ߲ σϑΥͰΠϯετʔϧ͢Δ৔߹
 ReadOnlyPort͕ઃఆ͞Εͳ͍ͷͰɺར༻͢Δ৔߹͸ઃఆ͍ͯͩ͘͠͞
 (/etc/origin/node/node-config.yaml) kubeletArguments: read-only-port: - '10255' bootstrap-kubeconfig: - /etc/origin/node/bootstrap.kubeconfig cert-dir: - /etc/origin/node/certificates cloud-config: - /etc/origin/cloudprovider/openstack.conf

Slide 49

Slide 49 text

·ͱΊ - mackerel-container-agentͷಋೖ͸γϯϓϧͰָ - ϢʔβϨϕϧ΍໨తʹ͋ͬͨΧελϚΠζ͕ߦ͑Δ - طଘͷplugin͕࢖͑ͯخ͍͠ - plugin͕ೖͬͨίϯςφΠϝʔδΛԿଔެࣜͰ༻ҙ͍͚ͯͨͩ͠Δͱm(_ _)m - MutatingAdmissionWebhookΛ༻ҙ͍͚ͯͨͩ͠Δͱm(_ _)m

Slide 50

Slide 50 text

Thank you for listening.