Kubernetes Operatorを試した
試したものはPrometheusのOperatorです。
Kubernetes Operatorとは
OperatorはKubernetesに特化したアプリケーションです。Custom Controllerとして実装されています。
Operatorはアプリケーションのデプロイとスケーリングのノウハウをカプセル化しています。
何がうれしいのか
PrometheusやDBといったステートフルなアプリケーションをデプロイやスケーリングさせようとするといくつかの手順を踏まえて行う必要があります。
こういった単純な運用では扱うことが困難なアプリケーションの運用手順をCustom Controllerに持たせることで楽に運用できる仕組みです。
試してみる
Docker for MacのKubernetes環境で試しました。
Prometheus Operator
Prometheus OperatorのDeploymentと権限として必要なClusterRoleBinding,ClusterRole,ServiceAccountです。
このDeploymentがPrometheusによる監視が希望通りに動作しているかをチェックする存在です。
prometheus-operator.yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator app.kubernetes.io/version: v0.34.0 name: prometheus-operator roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus-operator subjects: - kind: ServiceAccount name: prometheus-operator namespace: default --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator app.kubernetes.io/version: v0.34.0 name: prometheus-operator rules: - apiGroups: - apiextensions.k8s.io resources: - customresourcedefinitions verbs: - '*' - apiGroups: - monitoring.coreos.com resources: - alertmanagers - prometheuses - prometheuses/finalizers - alertmanagers/finalizers - servicemonitors - podmonitors - prometheusrules verbs: - '*' - apiGroups: - apps resources: - statefulsets verbs: - '*' - apiGroups: - "" resources: - configmaps - secrets verbs: - '*' - apiGroups: - "" resources: - pods verbs: - list - delete - apiGroups: - "" resources: - services - services/finalizers - endpoints verbs: - get - create - update - delete - apiGroups: - "" resources: - nodes verbs: - list - watch - apiGroups: - "" resources: - namespaces verbs: - get - list - watch --- apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator app.kubernetes.io/version: v0.34.0 name: prometheus-operator namespace: default spec: replicas: 1 selector: matchLabels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator template: metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator app.kubernetes.io/version: v0.34.0 spec: containers: - args: - --kubelet-service=kube-system/kubelet - --logtostderr=true - --config-reloader-image=quay.io/coreos/configmap-reload:v0.0.1 - --prometheus-config-reloader=quay.io/coreos/prometheus-config-reloader:v0.34.0 image: quay.io/coreos/prometheus-operator:v0.34.0 name: prometheus-operator ports: - containerPort: 8080 name: http resources: limits: cpu: 200m memory: 200Mi requests: cpu: 100m memory: 100Mi securityContext: allowPrivilegeEscalation: false nodeSelector: beta.kubernetes.io/os: linux securityContext: runAsNonRoot: true runAsUser: 65534 serviceAccountName: prometheus-operator --- apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator app.kubernetes.io/version: v0.34.0 name: prometheus-operator namespace: default --- apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator app.kubernetes.io/version: v0.34.0 name: prometheus-operator namespace: default spec: clusterIP: None ports: - name: http port: 8080 targetPort: http selector: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator
$ kubectl apply -f prometheus-operator.yaml
監視対象アプリ
監視する対象のアプリをデプロイします。
example-app.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: example-app spec: replicas: 3 selector: matchLabels: app: example-app template: metadata: labels: app: example-app spec: containers: - name: example-app image: fabxc/instrumented_app ports: - name: web containerPort: 8080 --- kind: Service apiVersion: v1 metadata: name: example-app labels: app: example-app spec: selector: app: example-app ports: - name: web port: 8080
$ kubectl apply -f example-app.yaml
ServiceMonitor
ServiceMonitorリソースで監視対象を決めることで、Prometheusの監視対象を設定できます。
ServiceMonitorはその名の通り、Serviceリソースの監視を行うことができます。
そのほかにPod単位で監視可能なPodMonitorがあります。
service-monitor.yaml
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: example-app labels: team: frontend spec: selector: matchLabels: app: example-app endpoints: - port: web
$ kubectl apply -f service-monitor.yaml
Prometheus本体のデプロイ
Prometheusの設定です。
PrometheusリソースでServiceMonitorと関連付けています。
権限として必要なClusterRoleBinding,ClusterRole,ServiceAccountを設定しています。
prometheus.yaml
apiVersion: v1 kind: ServiceAccount metadata: name: prometheus --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: prometheus rules: - apiGroups: [""] resources: - nodes - services - endpoints - pods verbs: ["get", "list", "watch"] - apiGroups: [""] resources: - configmaps verbs: ["get"] - nonResourceURLs: ["/metrics"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: prometheus roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus subjects: - kind: ServiceAccount name: prometheus namespace: default --- apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata: name: prometheus spec: serviceAccountName: prometheus serviceMonitorSelector: matchLabels: team: frontend resources: requests: memory: 400Mi enableAdminAPI: false --- apiVersion: v1 kind: Service metadata: name: prometheus spec: type: NodePort ports: - name: web nodePort: 30900 port: 9090 protocol: TCP targetPort: web selector: prometheus: prometheus
$ kubectl apply -f prometheus.yaml
Prometheusの動作確認
ブラウザでPrometheusのServiceのポートを指定してローカルで表示するとPrometheusの画面が表示できます。
まとめ
Operatorというフレームワークのもとで、多くのアプリケーションが公開されています。
Helmでも似たようにKubernetes上で動作するアプリケーションがパッケージ管理されています。
ただ利用する場合には設定値を決める必要があるので手軽に利用したいというケースには不向きです。
Prometheusなどのアプリケーションを手軽にセットアップしたい場合にはOperatorを使うと良いと思います。