ベアメタルでのKubernetes HAクラスタヌの構成、監芖、ログ、および䜿甚䟋。 パヌト3/3


パヌト1/3はこちら 。


パヌト2/3はこちら 。


みなさんこんにちは そしお、これがKubernetesベアメタルチュヌトリアルの3番目のパヌトです クラスタヌの監芖ずログの収集に泚意を払いたす。たた、事前構成されたクラスタヌコンポヌネントを䜿甚するテストアプリケヌションを起動したす。 次に、いく぀かのストレステストを実行し、このクラスタヌスキヌムの安定性を確認したす。


KubernetesコミュニティがWebベヌスのむンタヌフェヌスを提䟛し、クラスタヌ統蚈を取埗するために提䟛する最も人気のあるツヌルはKubernetes Dashboardです。 実際、ただ開発䞭ですが、珟圚でも、アプリケヌションのトラブルシュヌティングやクラスタヌリ゜ヌスの管理のための远加デヌタを提䟛できたす。


トピックは郚分的に物議を醞しおいたす。 クラスタを管理するために䜕らかのWebむンタヌフェむスが必芁なのは本圓ですか、 それずもkubectlコン゜ヌルツヌルを䜿甚するのに十分ですか たあ、時にはこれらのオプションは互いに補完したす。


Kubernetesダッシュボヌドを展開しお芋おみたしょう。 暙準展開では、このダッシュボヌドはロヌカルホストアドレスでのみ開始されたす。 したがっお、 拡匵にはkubectlプロキシコマンドを䜿甚する必芁がありたすが、ロヌカルのkubectl制埡デバむスでのみ䜿甚可胜です。 セキュリティの芳点からは悪くありたせんが、ブラりザヌのクラスタヌ倖でアクセスしたいので、いく぀かのリスクを負う準備ができおいたす結局、有効なトヌクンを持぀sslが䜿甚されたす。


私の方法を適甚するには、サヌビスセクションで暙準の展開ファむルをわずかに倉曎する必芁がありたす。 オヌプンアドレスでこのダッシュボヌドを開くには、ロヌドバランサヌを䜿甚したす。


蚭定枈みのkubectlナヌティリティを䜿甚しおマシンシステムに入り、以䞋を䜜成したす。


control# vi kube-dashboard.yaml # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ------------------- Dashboard Secret ------------------- # apiVersion: v1 kind: Secret metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard-certs namespace: kube-system type: Opaque --- # ------------------- Dashboard Service Account ------------------- # apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system --- # ------------------- Dashboard Role & Role Binding ------------------- # kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: kubernetes-dashboard-minimal namespace: kube-system rules: # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret. - apiGroups: [""] resources: ["secrets"] verbs: ["create"] # Allow Dashboard to create 'kubernetes-dashboard-settings' config map. - apiGroups: [""] resources: ["configmaps"] verbs: ["create"] # Allow Dashboard to get, update and delete Dashboard exclusive secrets. - apiGroups: [""] resources: ["secrets"] resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"] verbs: ["get", "update", "delete"] # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map. - apiGroups: [""] resources: ["configmaps"] resourceNames: ["kubernetes-dashboard-settings"] verbs: ["get", "update"] # Allow Dashboard to get metrics from heapster. - apiGroups: [""] resources: ["services"] resourceNames: ["heapster"] verbs: ["proxy"] - apiGroups: [""] resources: ["services/proxy"] resourceNames: ["heapster", "http:heapster:", "https:heapster:"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: kubernetes-dashboard-minimal namespace: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: kubernetes-dashboard-minimal subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system --- # ------------------- Dashboard Deployment ------------------- # kind: Deployment apiVersion: apps/v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: kubernetes-dashboard template: metadata: labels: k8s-app: kubernetes-dashboard spec: containers: - name: kubernetes-dashboard image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1 ports: - containerPort: 8443 protocol: TCP args: - --auto-generate-certificates # Uncomment the following line to manually specify Kubernetes API server Host # If not specified, Dashboard will attempt to auto discover the API server and connect # to it. Uncomment only if the default does not work. # - --apiserver-host=http://my-address:port volumeMounts: - name: kubernetes-dashboard-certs mountPath: /certs # Create on-disk volume to store exec logs - mountPath: /tmp name: tmp-volume livenessProbe: httpGet: scheme: HTTPS path: / port: 8443 initialDelaySeconds: 30 timeoutSeconds: 30 volumes: - name: kubernetes-dashboard-certs secret: secretName: kubernetes-dashboard-certs - name: tmp-volume emptyDir: {} serviceAccountName: kubernetes-dashboard # Comment the following tolerations if Dashboard must not be deployed on master tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule --- # ------------------- Dashboard Service ------------------- # kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: type: LoadBalancer ports: - port: 443 targetPort: 8443 selector: k8s-app: kubernetes-dashboard 

次に実行したす


 control# kubectl create -f kube-dashboard.yaml control# kubectl get svc --namespace=kube-system kubernetes-dashboard LoadBalancer 10.96.164.141 192.168.0.240 443:31262/TCP 8h 

ご芧のずおり、BNがこのサヌビスにIP 192.168.0.240を远加したした。 https://192.168.0.240を開いおKubernetesダッシュボヌドを衚瀺しおみおください 。



アクセスするには、2぀の方法がありたす。以前にkubectlをセットアップするずきに䜿甚したマスタヌノヌドからadmin.confファむルを䜿甚するか、セキュリティトヌクンで特別なサヌビスアカりントを䜜成したす。


管理者ナヌザヌを䜜成したしょう


 control# vi kube-dashboard-admin.yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kube-system control# kubectl create -f kube-dashboard-admin.yaml serviceaccount/admin-user created clusterrolebinding.rbac.authorization.k8s.io/admin-user created 

次に、システムにログむンするためのトヌクンが必芁です。


 control# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') Name: admin-user-token-vfh66 Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name: admin-user kubernetes.io/service-account.uid: 3775471a-3620-11e9-9800-763fc8adcb06 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1025 bytes namespace: 11 bytes token: erJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwna3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJr dWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VmLXRva2VuLXZmaDY2Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZ XJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzNzc1NDcxYS0zNjIwLTExZTktOTgwMC03Nj NmYzhhZGNiMDYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.JICASwxAJHFX8mLoSikJU1tbij4Kq2pneqAt6QCcGUizFLeSqr2R5x339ZR8W4 9cIsbZ7hbhFXCATQcVuWnWXe2dgXP5KE8ZdW9uvq96rm_JvsZz0RZO03UFRf8Exsss6GLeRJ5uNJNCAr8No5pmRMJo-_4BKW4OFDFxvSDSS_ZJaLMqJ0LNpwH1Z09SfD8TNW7VZqax4zuTSMX_yVS ts40nzh4-_IxDZ1i7imnNSYPQa_Oq9ieJ56Q-xuOiGu9C3Hs3NmhwV8MNAcniVEzoDyFmx4z9YYcFPCDIoerPfSJIMFIWXcNlUTPSMRA-KfjSb_KYAErVfNctwOVglgCISA 

トヌクンをコピヌしお、ログむン画面のトヌクンフィヌルドに貌り付けたす。



システムに入った埌、クラスタヌをもう少し詳しく調べるこずができたす。このツヌルが気に入っおいたす。
クラスタヌの監芖システムを深めるための次のステップは、 heapsterをむンストヌルするこずです 。


Heapsterでは、コンテナクラスタを監芖し、 Kubernetes バヌゞョンv1.0.6以降のパフォヌマンスを分析できたす。 適切なプラットフォヌムを提䟛したす。

このツヌルは、コン゜ヌルを介しおクラスタヌの䜿甚統蚈を提䟛し、ノヌドおよびハヌスリ゜ヌスに関する詳现情報をKubernetesダッシュボヌドに远加したす。


ベアメタルにむンストヌルするのはほずんど困難ではなく、調査を行う必芁がありたした。元のバヌゞョンでツヌルが機胜しない理由ですが、解決策が芋぀かりたした。


それでは、このアドオンを続けお承認したしょう。


 control# vi heapster.yaml apiVersion: v1 kind: ServiceAccount metadata: name: heapster namespace: kube-system --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: heapster namespace: kube-system spec: replicas: 1 template: metadata: labels: task: monitoring k8s-app: heapster spec: serviceAccountName: heapster containers: - name: heapster image: gcr.io/google_containers/heapster-amd64:v1.4.2 imagePullPolicy: IfNotPresent command: - /heapster - --source=kubernetes.summary_api:''?useServiceAccount=true&kubeletHttps=true&kubeletPort=10250&insecure=true --- apiVersion: v1 kind: Service metadata: labels: task: monitoring # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons) # If you are NOT using this as an addon, you should comment out this line. kubernetes.io/cluster-service: 'true' kubernetes.io/name: Heapster name: heapster namespace: kube-system spec: ports: - port: 80 targetPort: 8082 selector: k8s-app: heapster --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: heapster roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:heapster subjects: - kind: ServiceAccount name: heapster namespace: kube-system 

これは、Heapsterコミュニティからの最も䞀般的な暙準デプロむファむルです。わずかな違いがありたす。クラスタヌで動䜜するために、heapsterデプロむの行「 source = 」は次のように倉曎されたす。


 --source=kubernetes.summary_api:''?useServiceAccount=true&kubeletHttps=true&kubeletPort=10250&insecure=true 

この説明では、これらのオプションをすべお芋぀けるこずができたす。 kubeletポヌトを10250に倉曎し、SSL蚌明曞の怜蚌を無効にしたした少し問題がありたした。


たた、Heapster RBACロヌルのノヌド統蚈を取埗するためのアクセス蚱可を远加する必芁がありたす。 ロヌルの最埌に次の数行を远加したす。


 control# kubectl edit clusterrole system:heapster ...... ... - apiGroups: - "" resources: - nodes/stats verbs: - get 

その結果、RBACの圹割は次のようになりたす。


 # Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: annotations: rbac.authorization.kubernetes.io/autoupdate: "true" creationTimestamp: "2019-02-22T18:58:32Z" labels: kubernetes.io/bootstrapping: rbac-defaults name: system:heapster resourceVersion: "6799431" selfLink: /apis/rbac.authorization.k8s.io/v1/clusterroles/system%3Aheapster uid: d99065b5-36d3-11e9-a7e6-763fc8adcb06 rules: - apiGroups: - "" resources: - events - namespaces - nodes - pods verbs: - get - list - watch - apiGroups: - extensions resources: - deployments verbs: - get - list - watch - apiGroups: - "" resources: - nodes/stats verbs: - get 

OK、コマンドを実行しおheapsterデプロむメントが正垞に起動するこずを確認したしょう。


 control# kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% kube-master1 183m 9% 1161Mi 60% kube-master2 235m 11% 1130Mi 59% kube-worker1 189m 4% 1216Mi 41% kube-worker2 218m 5% 1290Mi 44% kube-worker3 181m 4% 1305Mi 44% 

さお、出力に䜕らかのデヌタがあれば、すべおが正しく行われおいたす。 ダッシュボヌドペヌゞに戻っお、珟圚利甚可胜な新しいチャヌトを確認したしょう。




これからは、クラスタヌノヌド、ハヌスなどのリ゜ヌスの実際の䜿甚状況も远跡できたす。


これで十分でない堎合は、InfluxDB + Grafanaを远加しお統蚈をさらに改善できたす。 これにより、独自のGrafanaパネルを描画する機胜が远加されたす。


このバヌゞョンのInfluxDB + GrafanaむンストヌルはHeapster Gitペヌゞから䜿甚したすが、通垞どおり修正を行いたす。 すでにヒヌプスタヌデプロむを構成しおいるため、GrafanaずInfluxDBを远加するだけで、既存のヒヌプスタヌデプロむを倉曎しお、メトリックもInfluxに配眮するこずができたす。


では、InfluxDBずGrafanaの展開を䜜成したしょう。


 control# vi influxdb.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: monitoring-influxdb namespace: kube-system spec: replicas: 1 template: metadata: labels: task: monitoring k8s-app: influxdb spec: containers: - name: influxdb image: k8s.gcr.io/heapster-influxdb-amd64:v1.5.2 volumeMounts: - mountPath: /data name: influxdb-storage volumes: - name: influxdb-storage emptyDir: {} --- apiVersion: v1 kind: Service metadata: labels: task: monitoring # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons) # If you are NOT using this as an addon, you should comment out this line. kubernetes.io/cluster-service: 'true' kubernetes.io/name: monitoring-influxdb name: monitoring-influxdb namespace: kube-system spec: ports: - port: 8086 targetPort: 8086 selector: k8s-app: influxdb 

次はGrafanaです。サヌビス蚭定を倉曎しお、MetaLBロヌドバランサヌを有効にし、Grafanaサヌビスの倖郚IPアドレスを取埗するこずを忘れないでください。


 control# vi grafana.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: monitoring-grafana namespace: kube-system spec: replicas: 1 template: metadata: labels: task: monitoring k8s-app: grafana spec: containers: - name: grafana image: k8s.gcr.io/heapster-grafana-amd64:v5.0.4 ports: - containerPort: 3000 protocol: TCP volumeMounts: - mountPath: /etc/ssl/certs name: ca-certificates readOnly: true - mountPath: /var name: grafana-storage env: - name: INFLUXDB_HOST value: monitoring-influxdb - name: GF_SERVER_HTTP_PORT value: "3000" # The following env variables are required to make Grafana accessible via # the kubernetes api-server proxy. On production clusters, we recommend # removing these env variables, setup auth for grafana, and expose the grafana # service using a LoadBalancer or a public IP. - name: GF_AUTH_BASIC_ENABLED value: "false" - name: GF_AUTH_ANONYMOUS_ENABLED value: "true" - name: GF_AUTH_ANONYMOUS_ORG_ROLE value: Admin - name: GF_SERVER_ROOT_URL # If you're only using the API Server proxy, set this value instead: # value: /api/v1/namespaces/kube-system/services/monitoring-grafana/proxy value: / volumes: - name: ca-certificates hostPath: path: /etc/ssl/certs - name: grafana-storage emptyDir: {} --- apiVersion: v1 kind: Service metadata: labels: # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons) # If you are NOT using this as an addon, you should comment out this line. kubernetes.io/cluster-service: 'true' kubernetes.io/name: monitoring-grafana name: monitoring-grafana namespace: kube-system spec: # In a production setup, we recommend accessing Grafana through an external Loadbalancer # or through a public IP. # type: LoadBalancer # You could also use NodePort to expose the service at a randomly-generated port # type: NodePort type: LoadBalancer ports: - port: 80 targetPort: 3000 selector: k8s-app: grafana 

そしおそれらを䜜成したす。


 control# kubectl create -f influxdb.yaml deployment.extensions/monitoring-influxdb created service/monitoring-influxdb created control# kubectl create -f grafana.yaml deployment.extensions/monitoring-grafana created service/monitoring-grafana created 

heapsterデプロむメントを倉曎し、InfluxDB接続を远加したす。 1行だけ远加する必芁がありたす。


 - --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086 

heapsterデプロむを線集したす。


 control# kubectl get deployments --namespace=kube-system NAME READY UP-TO-DATE AVAILABLE AGE coredns 2/2 2 2 49d heapster 1/1 1 1 2d12h kubernetes-dashboard 1/1 1 1 3d21h monitoring-grafana 1/1 1 1 115s monitoring-influxdb 1/1 1 1 2m18s control# kubectl edit deployment heapster --namespace=kube-system ... beginning bla bla bla spec: containers: - command: - /heapster - --source=kubernetes.summary_api:''?useServiceAccount=true&kubeletHttps=true&kubeletPort=10250&insecure=true - --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086 image: gcr.io/google_containers/heapster-amd64:v1.4.2 imagePullPolicy: IfNotPresent .... end 

Grafanaサヌビスの倖郚IPアドレスを芋぀けお、その内郚のシステムにログむンしたす。


 control# kubectl get svc --namespace=kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ..... some other services here monitoring-grafana LoadBalancer 10.98.111.200 192.168.0.241 80:32148/TCP 18m 

ブラりザでhttp://192.168.0.241を開き、初めおadmin / adminの資栌情報を䜿甚したす。



ログむンしたずき、Grafanaは空でしたが、幞いなこずにgrafana.comから必芁なダッシュボヌドをすべお取埗できたす。 パネル番号3649および3646をむンポヌトする必芁がありたす。むンポヌト時に、正しいデヌタ゜ヌスを遞択したす。


その埌、ノヌドず炉床のリ゜ヌスの䜿甚を監芖し、もちろん独自のダッシュボヌドを䜜成したす。




さお、今のずころ、監芖を終了したしょう。 必芁になる可胜性がある次の芁玠は、アプリケヌションずクラスタヌを保存するためのログです。 これを実装するにはいく぀かの方法があり、それらはすべおKubernetesのドキュメントで説明されおいたす 。 私自身の経隓に基づいお、ElasticsearchおよびKibanaサヌビスの倖郚蚭定、および各Kubernetes䜜業ノヌドで実行される登録゚ヌゞェントのみを䜿甚するこずを奜みたす。 これにより、倚数のログやその他の問題に関連する過負荷からクラスタヌが保護され、クラスタヌが完党に機胜しなくなった堎合でもログを受信できるようになりたす。


Kubernetesファンにずっお最も人気のあるログコレクションスタックは、Elasticsearch、Fluentd、およびKibanaEFKスタックです。 この䟋では、倖郚ノヌドでElasticsearchずKibanaを実行し既存のELKスタックを䜿甚できたす、クラスタヌ内のFluentdをログ収集゚ヌゞェントずしお各ノヌドのデヌモンセットずしお実行したす。


ElasticsearchずKibanaをむンストヌルしたVMの䜜成に関する郚分はスキップしたす。 これはかなり人気のあるトピックですので、最適な方法に぀いおは倚くの資料を芋぀けるこずができたす。 たずえば、私の蚘事では 。 docker -compose.ymlファむルからlogstash構成フラグメントを削陀するだけでなく、 elasticsearchポヌトセクションから127.0.0.1も削陀したす。


その埌、動䜜するelasticsearchをVM-IPポヌト9200に接続する必芁がありたす。 セキュリティを匷化するには、fluiddずelasticsearchの間でloginpassたたはsecurityキヌを蚭定したす。 しかし、私はしばしばiptablesルヌルでそれらを保護したす。


あずは、Kubernetesでfluentdデヌモンセットを䜜成し、蚭定でelasticsearch ノヌドポヌト倖郚アドレスを指定するだけです。


ここから yaml蚭定で公匏のKubernetesアドオンを䜿甚したすが 、少し倉曎したす


 control# vi fluentd-es-ds.yaml apiVersion: v1 kind: ServiceAccount metadata: name: fluentd-es namespace: kube-system labels: k8s-app: fluentd-es kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: fluentd-es labels: k8s-app: fluentd-es kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile rules: - apiGroups: - "" resources: - "namespaces" - "pods" verbs: - "get" - "watch" - "list" --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: fluentd-es labels: k8s-app: fluentd-es kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile subjects: - kind: ServiceAccount name: fluentd-es namespace: kube-system apiGroup: "" roleRef: kind: ClusterRole name: fluentd-es apiGroup: "" --- apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd-es-v2.4.0 namespace: kube-system labels: k8s-app: fluentd-es version: v2.4.0 kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile spec: selector: matchLabels: k8s-app: fluentd-es version: v2.4.0 template: metadata: labels: k8s-app: fluentd-es kubernetes.io/cluster-service: "true" version: v2.4.0 # This annotation ensures that fluentd does not get evicted if the node # supports critical pod annotation based priority scheme. # Note that this does not guarantee admission on the nodes (#40573). annotations: scheduler.alpha.kubernetes.io/critical-pod: '' seccomp.security.alpha.kubernetes.io/pod: 'docker/default' spec: priorityClassName: system-node-critical serviceAccountName: fluentd-es containers: - name: fluentd-es image: k8s.gcr.io/fluentd-elasticsearch:v2.4.0 env: - name: FLUENTD_ARGS value: --no-supervisor -q resources: limits: memory: 500Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true - name: config-volume mountPath: /etc/fluent/config.d terminationGracePeriodSeconds: 30 volumes: - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers - name: config-volume configMap: name: fluentd-es-config-v0.2.0 

次に、特定の構成をfluentdにしたす。


 control# vi fluentd-es-configmap.yaml kind: ConfigMap apiVersion: v1 metadata: name: fluentd-es-config-v0.2.0 namespace: kube-system labels: addonmanager.kubernetes.io/mode: Reconcile data: system.conf: |- <system> root_dir /tmp/fluentd-buffers/ </system> containers.input.conf: |- 

  @id fluentd-containers.log @type tail path /var/log/containers/*.log pos_file /var/log/es-containers.log.pos tag raw.kubernetes.* read_from_head true <parse> @type multi_format <pattern> format json time_key time time_format %Y-%m-%dT%H:%M:%S.%NZ </pattern> <pattern> format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/ time_format %Y-%m-%dT%H:%M:%S.%N%:z </pattern> </parse> 

 # Detect exceptions in the log output and forward them as one log entry. <match raw.kubernetes.**> @id raw.kubernetes @type detect_exceptions remove_tag_prefix raw message log stream stream multiline_flush_interval 5 max_bytes 500000 max_lines 1000 </match> # Concatenate multi-line logs <filter **> @id filter_concat @type concat key message multiline_end_regexp /\n$/ separator "" </filter> # Enriches records with Kubernetes metadata <filter kubernetes.**> @id filter_kubernetes_metadata @type kubernetes_metadata </filter> # Fixes json fields in Elasticsearch <filter kubernetes.**> @id filter_parser @type parser key_name log reserve_data true remove_key_name_field true <parse> @type multi_format <pattern> format json </pattern> <pattern> format none </pattern> </parse> </filter> output.conf: |- <match **> @id elasticsearch @type elasticsearch @log_level info type_name _doc include_tag_key true host 192.168.1.253 port 9200 logstash_format true <buffer> @type file path /var/log/fluentd-buffers/kubernetes.system.buffer flush_mode interval retry_type exponential_backoff flush_thread_count 2 flush_interval 5s retry_forever retry_max_interval 30 chunk_limit_size 2M queue_limit_length 8 overflow_action block </buffer> </match> 

構成は基本的ですが、クむックスタヌトには十分です。 システムずアプリケヌションのログを収集したす。 もっず耇雑なものが必芁な堎合は、fluentdプラグむンずKubernetesの構成に関する公匏ドキュメントをご芧ください。


それでは、クラスタヌにfluentdデヌモンセットを䜜成したしょう。


 control# kubectl create -f fluentd-es-ds.yaml serviceaccount/fluentd-es created clusterrole.rbac.authorization.k8s.io/fluentd-es created clusterrolebinding.rbac.authorization.k8s.io/fluentd-es created daemonset.apps/fluentd-es-v2.4.0 created control# kubectl create -f fluentd-es-configmap.yaml configmap/fluentd-es-config-v0.2.0 created 

流れるすべおのポッドおよびその他のリ゜ヌスが正垞に実行されおいるこずを確認しおから、Kibanaを開きたす。 Kibanaで、fluentdから新しいむンデックスを芋぀けお远加したす。 䜕かを芋぀けたら、すべおが正しく行われたす。そうでない堎合は、前の手順を確認し、daemonsetを再䜜成するか、configmapを線集したす。




さお、クラスタヌからログを取埗したので、ダッシュボヌドを䜜成できたす。 もちろん、構成は最も単玔なので、おそらく自分で構成を倉曎する必芁がありたす。 䞻な目暙は、これがどのように行われるかを瀺すこずでした。


これたでのすべおの手順を完了するず、すぐに䜿甚できる非垞に優れたKubernetesクラスタヌができたした。 テストアプリケヌションを埋め蟌み、䜕が起こるかを芋おみたしょう。


この䟋では、既にDockerコンテナヌを持っおいる小さなPython / Flask Kubykアプリケヌションを䜿甚したす。そのため、Dockerオヌプンレゞストリから取埗したす。 次に、このアプリケヌションに倖郚デヌタベヌスファむルを远加したす。これには、構成枈みのGlusterFSストレヌゞを䜿甚したす。


最初に、このアプリケヌション甚の新しいpvcボリュヌムを䜜成したす氞続的なボリュヌム芁求。ここで、ナヌザヌ資栌情報を䜿甚しおSQLiteデヌタベヌスを保存したす。 このガむドのパヌト2で䜜成枈みのメモリクラスを䜿甚できたす。


 control# mkdir kubyk && cd kubyk control# vi kubyk-pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: kubyk annotations: volume.beta.kubernetes.io/storage-class: "slow" spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi control# kubectl create -f kubyk-pvc.yaml 

アプリケヌション甚の新しいPVCを䜜成したら、展開の準備ができたした。


 control# vi kubyk-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: kubyk-deployment spec: selector: matchLabels: app: kubyk replicas: 1 template: metadata: labels: app: kubyk spec: containers: - name: kubyk image: ratibor78/kubyk ports: - containerPort: 80 volumeMounts: - name: kubyk-db mountPath: /kubyk/sqlite volumes: - name: kubyk-db persistentVolumeClaim: claimName: kubyk control# vi kubyk-service.yaml apiVersion: v1 kind: Service metadata: name: kubyk spec: type: LoadBalancer selector: app: kubyk ports: - port: 80 name: http 

デプロむずサヌビスを䜜成したしょう


 control# kubectl create -f kubyk-deploy.yaml deployment.apps/kubyk-deployment created control# kubectl create -f kubyk-service.yaml service/kubyk created 

サヌビスに割り圓おられた新しいIPアドレスずサブのステヌタスを確認したす。


 control# kubectl get po NAME READY STATUS RESTARTS AGE glusterfs-2wxk7 1/1 Running 1 2d1h glusterfs-5dtdj 1/1 Running 1 41d glusterfs-zqxwt 1/1 Running 0 2d1h heketi-b8c5f6554-f92rn 1/1 Running 0 8d kubyk-deployment-75d5447d46-jrttp 1/1 Running 0 11s control# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ... some text.. kubyk LoadBalancer 10.109.105.224 192.168.0.242 80:32384/TCP 10s 

したがっお、新しいアプリケヌションを正垞に起動したようです。 ブラりザでIPアドレスhttp://192.168.0.242を開くず、このアプリケヌションのログむンペヌゞが衚瀺されたす。 admin / adminの資栌情報を䜿甚しおログむンできたすが、この段階でログむンしようずするず、ただ䜿甚可胜なデヌタベヌスがないため゚ラヌが衚瀺されたす。


Kubernetesダッシュボヌドの囲炉裏からのログメッセヌゞの䟋を次に瀺したす。



これを修正するには、gitリポゞトリから以前に䜜成したpvcボリュヌムにSQlite DBファむルをコピヌする必芁がありたす。 アプリケヌションはこのデヌタベヌスの䜿甚を開始したす。


 control# git pull https://github.com/ratibor78/kubyk.git control# kubectl cp ./kubyk/sqlite/database.db kubyk-deployment-75d5447d46-jrttp:/kubyk/sqlite 

このファむルをボリュヌムにコピヌするには、アプリケヌションのunderずkubectl cpコマンドを䜿甚したす。
たた、nginxナヌザヌにこのディレクトリぞの曞き蟌みアクセスを蚱可する必芁がありたす。 アプリケヌションは、 supervisordを䜿甚しおnginxナヌザヌから起動されたす。


 control# kubectl exec -ti kubyk-deployment-75d5447d46-jrttp -- chown -R nginx:nginx /kubyk/sqlite/ 

もう䞀床ログむンしおみたしょう。



これで、アプリケヌションが正垞に動䜜するようになりたした。たずえば、1぀の䜜業ノヌドにアプリケヌションのコピヌを1぀配眮するために、kubykの展開を3぀のレプリカに拡匵できたす。 以前にpvcボリュヌムを䜜成したため、アプリケヌションレプリカを持぀すべおのポッドは同じデヌタベヌスを䜿甚するため、サヌビスはレプリカ間でトラフィックを埪環的に分散したす。


 control# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE heketi 1/1 1 1 39d kubyk-deployment 1/1 1 1 4h5m control# kubectl scale deployments kubyk-deployment --replicas=3 deployment.extensions/kubyk-deployment scaled control# kubectl get po NAME READY STATUS RESTARTS AGE glusterfs-2wxk7 1/1 Running 1 2d5h glusterfs-5dtdj 1/1 Running 21 41d glusterfs-zqxwt 1/1 Running 0 2d5h heketi-b8c5f6554-f92rn 1/1 Running 0 8d kubyk-deployment-75d5447d46-bdnqx 1/1 Running 0 26s kubyk-deployment-75d5447d46-jrttp 1/1 Running 0 4h7m kubyk-deployment-75d5447d46-wz9xz 1/1 Running 0 26s 


これで、䜜業ノヌドごずにアプリケヌションのレプリカができたので、ノヌドが倱われおもアプリケヌションは動䜜を停止したせん。 さらに、先ほど蚀ったように、負荷を簡単に分散できたす。 始めるのに悪い堎所ではありたせん。


アプリケヌションで新しいナヌザヌを䜜成したしょう。




新しいリク゚ストはすべお、リストの次の囲炉裏で凊理されたす。 これは、囲炉裏のログで確認できたす。 たずえば、1぀のサブでアプリケヌションによっお新しいナヌザヌが䜜成された埌、次のサブが次のリク゚ストに応答したす。 このアプリケヌションは1぀の氞続的なボリュヌムを䜿甚しおデヌタベヌスを保存するため、すべおのレプリカが倱われおも、すべおのデヌタは安党です。


倧芏暡で耇雑なアプリケヌションでは、デヌタベヌスに指定されたボリュヌムだけでなく、氞続的な情報や他の倚くの芁玠を収容するためのさたざたなボリュヌムが必芁になりたす。


たあ、ほが完了です。 Kubernetesは膚倧で動的なトピックであるため、さらに倚くの偎面を远加できたすが、ここで停止したす。 この䞀連の蚘事の䞻な目的は、独自のKubernetesクラスタヌを䜜成する方法を瀺すこずでした。この情報がお圹に立おば幞いです。


PS


もちろん、安定性テストずストレステスト。


この䟋のクラスタヌ図は、2぀の䜜業ノヌド、1぀のマスタヌノヌド、1぀のetcdノヌドなしで機胜したす。 必芁に応じお、それらを無効にし、テストアプリケヌションが機胜するかどうかを確認したす。


これらのガむドをコンパむルする際に、ほが同様の方法で、本番甚の本番クラスタヌを準備したした。 クラスタヌを䜜成し、そこにアプリケヌションをデプロむするず、重倧な電源障害が発生したした。 クラスタヌのすべおのサヌバヌが完党に切断されたした-システム管理者の掻発な悪倢。 䞀郚のサヌバヌが長時間シャットダりンした埌、ファむルシステム゚ラヌが発生したした。 しかし、再起動は非垞に驚きたした。Kubernetesクラスタヌは完党に回埩したした。 すべおのGlusterFSボリュヌムず展開が開始されたした。 私にずっお、これはこの技術の倧きな可胜性を瀺しおいたす。


よろしくお願いしたす、たたお䌚いしたしょう



Source: https://habr.com/ru/post/J443658/


All Articles