
рднрд╛рдЧ 1/3 рдпрд╣рд╛рдБ ред
рднрд╛рдЧ 2/3 рдпрд╣рд╛рдБ ред
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдФрд░ рдпрд╣рд╛рдБ рдирдВрдЧреЗ рдзрд╛рддреБ рдЧрд╛рдЗрдб рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХрд╛ рддреАрд╕рд░рд╛ рднрд╛рдЧ рд╣реИ! рдореИрдВ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рд▓реЙрдЧ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛, рд╣рдо рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреНрд▓рд╕реНрдЯрд░ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднреА рд▓реЙрдиреНрдЪ рдХрд░реЗрдВрдЧреЗред рдлрд┐рд░ рд╣рдо рдХрдИ рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдпреЛрдЬрдирд╛ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред
рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рд╡реЗрдм-рдЖрдзрд╛рд░рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдЖрдБрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрдкрдХрд░рдг рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдбреИрд╢рдмреЛрд░реНрдб рд╣реИ ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрднреА рднреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рднреА рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдирд┐рд╡рд╛рд░рдг рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рд╖рдп рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдХреБрдмреЗрдХреЗрд▓ рдХрдВрд╕реЛрд▓ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ? рдЦреИрд░, рдХрднреА-рдХрднреА рдпреЗ рд╡рд┐рдХрд▓реНрдк рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдкреВрд░рдХ рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдЕрдкрдиреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдбреИрд╢рдмреЛрд░реНрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВред рдПрдХ рдорд╛рдирдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд╕рд╛рде, рдпрд╣ рдбреИрд╢рдмреЛрд░реНрдб рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рд╣реЛрд╕реНрдЯ рдкрддреЗ рдкрд░ рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдкрдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП kubectl рдкреНрд░реЙрдХреНрд╕реА рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЖрдкрдХреЗ рд╕реНрдерд╛рдиреАрдп kubectl рдирд┐рдпрдВрддреНрд░рдг рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реИред рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдмрд╛рд╣рд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛ, рдФрд░ рдореИрдВ рдХреБрдЫ рдЬреЛрдЦрд┐рдо рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдХ рдкреНрд░рднрд╛рд╡реА рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдПрд╕рдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдореЗрд░реА рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реЗрд╡рд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдорд╛рдирдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдбреИрд╢рдмреЛрд░реНрдб рдХреЛ рдПрдХ рдЦреБрд▓реЗ рдкрддреЗ рдкрд░ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП 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
рдареАрдХ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдмреАрдПрди рдиреЗ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдЖрдИрдкреА 192.168.0.240 рдЬреЛрдбрд╝рд╛ред рдЕрдм рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдбреИрд╢рдмреЛрд░реНрдб рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП https://192.168.0.240 рдЦреЛрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ ред

рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ 2 рддрд░реАрдХреЗ рд╣реИрдВ: рд╣рдорд╛рд░реЗ рдорд╛рд╕реНрдЯрд░ рдиреЛрдб рд╕реЗ admin.conf
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ рдкрд╣рд▓реЗ kubectl рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдерд╛, рдпрд╛ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВред
рдЖрдЗрдП рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдБ:
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
рдЯреЛрдХрди рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рд▓реЙрдЧрд┐рди рд╕реНрдХреНрд░реАрди рдкрд░ рдЯреЛрдХрди рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВред

рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдореБрдЭреЗ рдпрд╣ рдЙрдкрдХрд░рдг рдкрд╕рдВрдж рд╣реИред
рд╣рдорд╛рд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЧрд╣рд░рд╛ рдХрд░рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЕрдЧрд▓рд╛ рдХрджрдо рд╣реИрдкрд╕реНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ ред
рд╣реЗрдкрд░рд╕реНрдЯрд░ рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ (рд╕рдВрд╕реНрдХрд░рдг v1.0.6 рдФрд░ рдЙрдЪреНрдЪрддрд░) рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреБрдХреНрдд рдордВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЙрдкрдХрд░рдг рдХрдВрд╕реЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдЙрдкрдпреЛрдЧ рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдбреИрд╢рдмреЛрд░реНрдб рдкрд░ рдиреЛрдб рдФрд░ рдЪреВрд▓реНрд╣рд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдирдВрдЧреЗ рдзрд╛рддреБ рдкрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдереЛрдбрд╝реА рдХрдард┐рдирд╛рдИ рд╣реЛрддреА рд╣реИ, рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА: рдЙрдкрдХрд░рдг рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ред
рддреЛ рдЪрд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдРрдб рдХреЛ рдПрдВрдбреЛрд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ:
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
рдпрд╣ рд╣реИрдкрд╕реНрдЯрд░ рд╕рдореБрджрд╛рдп рдХреА рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдХреЗрд╡рд▓ рдереЛрдбрд╝реЗ рд╕реЗ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде: рдпрд╣ рд╣рдорд╛рд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣реИрдкрд░рд╕реНрдЯрд░ рддреИрдирд╛рддреА рдореЗрдВ рд▓рд╛рдЗрди " рд╕реНрд░реЛрдд = " рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИ:
--source=kubernetes.summary_api:''?useServiceAccount=true&kubeletHttps=true&kubeletPort=10250&insecure=true
рдЗрд╕ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЖрдкрдХреЛ рдпреЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓реЗрдВрдЧреЗред рдореИрдВрдиреЗ рдХреНрдпреВрдмрд▓реЗрдЯ рдкреЛрд░реНрдЯ рдХреЛ 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
рдареАрдХ рд╣реИ, рдЕрдм рдЪрд▓рд┐рдП рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣реЗрд▓реНрдкрд░ рдХреА рддреИрдирд╛рддреА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╢реБрд░реВ рдХреА рдЧрдИ рд╣реИред
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 рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЧреНрд░реЗрдлрд╛рдирд╛ рдкреИрдирд▓реЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рд╣рдо Heapster Git рдкреГрд╖реНрда рд╕реЗ InfluxDB + Grafana рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЪреВрдБрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдирд╛рдд рд╣реИрд╕реНрдЯрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ Grafana рдФрд░ InfluxDB рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдореМрдЬреВрджрд╛ heapster рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡рд╣ Influx рдореЗрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рднреА рдбрд╛рд▓ рд╕рдХреЗред
рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдЗрдиреНрдлреНрд▓рдХреНрд╕рдбреАрдмреА рдФрд░ рдЧреНрд░реЗрдлрд╛рдирд╛ рддреИрдирд╛рддреА рдмрдирд╛рдПрдВ:
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
рдЕрдЧрд▓рд╛ рдЕрдк рдЧреНрд░реЗрдлрд╛рдирд╛ рд╣реИ, рдФрд░ рдореЗрдЯрд╛рд▓рд╛ рд▓реЛрдб рд▓реЛрдбрд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдФрд░ рдЧреНрд░реЗрдлрд╛рдирд╛ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рдЖрдИрдкреА рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓рдирд╛ рди рднреВрд▓реЗрдВред
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
рдпрд╣ рд╕рдордп рд╣реИ рдХрд┐ рд╣реЗрд▓реНрдкрд░ рдХреА рддреИрдирд╛рддреА рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕рдореЗрдВ рдЗрдиреНрдлреНрд▓рдХреНрд╕рдбреАрдмреА рдХрдиреЗрдХреНрд╢рди рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдП; рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086
рд╣рдерд┐рдпрд╛рд░ рддреИрдирд╛рдд рддреИрдирд╛рдд рдХрд░реЗрдВ:
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 рдЦреЛрд▓реЗрдВ, рдкрд╣рд▓реА рдмрд╛рд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

рдЬрдм рдореИрдВрдиреЗ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛, рддреЛ рдореЗрд░рд╛ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдЦрд╛рд▓реА рдерд╛, рд▓реЗрдХрд┐рди, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо grafana.com рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреИрд╢рдмреЛрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдкреИрдирд▓ рдирдВрдмрд░ 3649 рдФрд░ 3646 рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп, рд╕рд╣реА рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдиреЛрдбреНрд╕ рдФрд░ рдЪреВрд▓реНрд╣рд╛ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреВрдареЗ рдбреИрд╢рдмреЛрд░реНрдб рдмрдирд╛рдПрдВред


рдЦреИрд░, рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ; рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрддреНрд╡ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рд╡реЗ рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рд╣реИрдВред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рд╕рднреА рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрднрд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдПрд▓рд╛рд╕реНрдЯрд┐рд╕рд░реНрдЪ рдФрд░ рдХрд┐рдмрд╛рдирд╛ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░реА рдкреНрд░рддрд┐рд╖реНрдард╛рдиреЛрдВ, рд╕рд╛рде рд╣реА рдХреЗрд╡рд▓ рдкрдВрдЬреАрдХрд░рдг рдПрдЬреЗрдВрдЯреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдпрд╣ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЙрдЧ рдФрд░ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдУрд╡рд░рд▓реЛрдб рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд░рдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛, рдФрд░ рд▓реЙрдЧ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рднрд▓реЗ рд╣реА рдХреНрд▓рд╕реНрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реЛред
рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд▓реЙрдЧ рд╕рдВрдЧреНрд░рд╣ рд╕реНрдЯреИрдХ рдПрд▓рд┐рдЯрд┐рдХреНрд╕ рдЦреЛрдЬ, рдлреНрд▓реБрдПрдВрдЯ рдФрд░ рдХрд┐рдмрд╛рдирд╛ (рдИрдПрдлрдХреЗ рд╕реНрдЯреИрдХ) рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рдмрд╛рд╣рд░реА рдиреЛрдб (рдЖрдк рдореМрдЬреВрджрд╛ ELK рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдкрд░ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдФрд░ рдХрд┐рдмрд╛рдирд╛ рдЪрд▓рд╛рдПрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд▓реЙрдЧ рдиреЛрдб рдПрдЬреЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдлреНрд▓реБрдПрдВрдЯ рдХреЛ рдбреЗрдореЛрдВрд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдПрдВрдЧреЗред
рдореИрдВ рдПрд▓реАрдореИрдЯрд┐рдХреНрд╕ рдФрд░ рдХрд┐рдмрд╛рдирд╛ рдкреНрд░рддрд┐рд╖реНрдард╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реАрдПрдо рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛; рдпрд╣ рдПрдХ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд┐рд╖рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕рд╛рдордЧреНрд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд▓реЗрдЦ рдореЗрдВ ред рдмрд╕ docker -compose.yml рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реНрд░реЗрдЧреНрдореЗрдВрдЯ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдВ, рдФрд░ рдЗрд▓рд╛рд╕реНрдЯрд┐рд╕рд░реНрдЪ рдкреЛрд░реНрдЯреНрд╕ рдЕрдиреБрднрд╛рдЧ рд╕реЗ 127.0.0.1 рднреА рдирд┐рдХрд╛рд▓реЗрдВред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЗ рдкрд╛рд╕ VM-IP рдкреЛрд░реНрдЯ: 9200 рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧрд┐рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ: рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдХреЗ рдмреАрдЪ рдкрд╛рд╕ рдпрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреБрдВрдЬреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЕрдХреНрд╕рд░ рдЙрдиреНрд╣реЗрдВ iptables рдирд┐рдпрдореЛрдВ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрддрд╛ рд╣реВрдВред
рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ, рд╡рд╣ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдПрдХ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдбреЗрдореЛрдВрд╕реЗрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдиреЛрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдмрд╛рд╣рд░реА рдкрддрд╛ред
рд╣рдо рдорд╛рдореВрд▓реА рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдпрдорд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдРрдб-рдСрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
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
рдлрд┐рд░ рд╣рдо рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ:
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>
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рд╛рдердорд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ; рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЧ рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдк рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рд╣рдорд╛рд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдбреЗрдореЛрдВрд╕реЗрдЯ рдмрдирд╛рдПрдБ:
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
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рднреА рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдлрд▓реА рдФрд░ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рдлрд┐рд░ рдХрд┐рдмрд╛рдирд╛ рдЦреЛрд▓реЗрдВред рдХрд┐рдмрд╛рдирд╛ рдореЗрдВ, рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдПрдХ рдирдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдЦреЛрдЬреЗрдВ рдФрд░ рдЬреЛрдбрд╝реЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдкрд┐рдЫрд▓реЗ рдЪрд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдбреЗрдореЛрдВрд╕реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:


рдЦреИрд░, рдЕрдм рдЬрдм рд╣рдо рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗ рд▓реЙрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЛрдИ рднреА рдбреИрд╢рдмреЛрд░реНрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдерд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд┐рдЫрд▓реЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛, рддреИрдпрд╛рд░-рд╕реЗ-рдЙрдкрдпреЛрдЧ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред рдЗрд╕рдореЗрдВ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдЫреЛрдЯреЗ рдкрд╛рдпрдерди / рдлреНрд▓рд╛рд╕реНрдХ рдХреБрдмрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдбреЙрдХ рдУрдкрди рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕реЗ рд▓реЗрдВред рдЕрдм рд╣рдо рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВрдЧреЗ - рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП GlusterFS рднрдВрдбрд╛рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рд╕реНрдерд╛рдпреА рд╡реЙрд▓реНрдпреВрдо рдЕрдиреБрд░реЛрдз) рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреАрд╡реАрд╕реА рд╡реЙрд▓реНрдпреВрдо рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗ рд╕рд╛рде 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
рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреАрд╡реАрд╕реА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
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
рд╕реЗрд╡рд╛ рдХреЛ рд╕реМрдВрдкреЗ рдЧрдП рдирдП рдЖрдИрдкреА рдкрддреЗ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рдЙрдк рдХреА рд╕реНрдерд┐рддрд┐:
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
рдЗрд╕рд▓рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рд╣реИ; рдЕрдЧрд░ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЖрдИрдкреА рдПрдбреНрд░реЗрд╕ http://192.168.0.242 рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд▓реЙрдЧрд┐рди рдкреЗрдЬ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╣рдо рдЗрд╕ рдЪрд░рдг рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЕрднреА рддрдХ рдХреЛрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред
рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ рдЪреВрд▓реНрд╣рд╛ рд╕реЗ рд▓реЙрдЧ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореЗрд░реЗ git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ SQlite DB рдлрд╛рдЗрд▓ рдХреЛ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдкреАрд╡реАрд╕реА рд╡реЙрд▓реНрдпреВрдо рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред
control# git pull https://github.com/ratibor78/kubyk.git control# kubectl cp ./kubyk/sqlite/database.db kubyk-deployment-75d5447d46-jrttp:/kubyk/sqlite
рд╣рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╡реЙрд▓реНрдпреВрдо рдкрд░ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ kubectl cp рдХрдорд╛рдВрдб рдХреЗ рддрд╣рдд рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ nginx рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓рд┐рдЦрдирд╛ рднреА рджреЗрдирд╛ рд╣реЛрдЧрд╛; рдореЗрд░реЗ рдЖрд╡реЗрджрди рдХреА рджреЗрдЦрд░реЗрдЦ рдХреЗ рд▓рд┐рдП nginx рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
control# kubectl exec -ti kubyk-deployment-75d5447d46-jrttp -- chown -R nginx:nginx /kubyk/sqlite/
рдЖрдЗрдП рдлрд┐рд░ рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

рдорд╣рд╛рди, рдЕрдм рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдХреБрдмреЗрдХ рдХреА рддреИрдирд╛рддреА рдХреЛ 3 рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛рд░реНрдп рдиреЛрдб рдореЗрдВ рдЖрд╡реЗрджрди рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдкреАрд╡реАрд╕реА рд╡реЙрд▓реНрдпреВрдо рдмрдирд╛рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рд╕рднреА рдкреЙрдбреНрд╕ рдПрдХ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕реЗрд╡рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкрд░рд┐рдкрддреНрд░ рдлреИрд╢рди рдореЗрдВ рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдпрд╛рддрд╛рдпрд╛рдд рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдЧреАред
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

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдкреНрд░рддрд┐рдХреГрддрд┐рдпрд╛рдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рдиреЛрдб рдЦреЛ рджреЗрддрд╛ рд╣реИ рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рд▓реЛрдб рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреБрд░реА рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред
рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдВ:


рд╕рднреА рдирдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реВрдЪреА рдореЗрдВ рдЕрдЧрд▓реЗ рдЪреВрд▓реНрд╣рд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдЪреВрд▓реНрд╣реЛрдВ рдХреЗ рд▓реЙрдЧ рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрдк рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрдЧрд▓рд╛ рдЙрдк рдЕрдЧрд▓рд╛ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдирд┐рд░рдВрддрд░ рдорд╛рддреНрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╕рднреА рдбреЗрдЯрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдВрдЧреЗ рднрд▓реЗ рд╣реА рд╕рднреА рдкреНрд░рддрд┐рдХреГрддрд┐рдпрд╛рдВ рдЦреЛ рдЧрдИ рд╣реЛрдВред
рдмрдбрд╝реЗ рдФрд░ рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рди рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡реЙрд▓реНрдпреВрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдмрд▓реНрдХрд┐ рд▓рдЧрд╛рддрд╛рд░ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдХрдИ рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВред
рдЦреИрд░, рд╣рдо рд▓рдЧрднрдЧ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред рдЖрдк рдХрдИ рдФрд░ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдмреЗрд░рдиреЗрдЯ рдПрдХ рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рд╖рдп рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╣рд╛рдВ рд░реБрдХреЗрдВрдЧреЗред рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдерд╛ рдХрд┐ рдЕрдкрдиреЗ рдХреБрдмреЗрд░рдиреЗрдЯ рд╕рдореВрд╣ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ, рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдереАред
рдкреБрдирд╢реНрдЪ
рд╕реНрдерд┐рд░рддрд╛ рдкрд░реАрдХреНрд╖рдг рдФрд░ рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдЖрд░реЗрдЦ 2 рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕, 1 рдорд╛рд╕реНрдЯрд░ рдиреЛрдбреНрд╕, рдФрд░ 1 etcd рдиреЛрдбреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ред
рдЗрди рдЧрд╛рдЗрдбреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ, рдореИрдВрдиреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдкрд╛рджрди рдХреНрд▓рд╕реНрдЯрд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред рдПрдХ рдмрд╛рд░, рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдмрдирд╛рдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдПрдХ рдмрдбрд╝реА рдмрд┐рдЬрд▓реА рд╡рд┐рдлрд▓рддрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛; рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рднреА рд╕рд░реНрд╡рд░ рдХрд╛рдЯ рджрд┐рдП рдЧрдП рдереЗ - рд╕рд┐рд╕реНрдЯрдо рдПрдбрдорд┐рдирд┐рд╕реНрдЯреНрд░реЗрдЯрд░ рдХрд╛ рдПрдХ рдмреБрд░рд╛ рд╕рдкрдирд╛ред рдХреБрдЫ рд╕рд░реНрд╡рд░ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрди рдкрд░ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реБрдИрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рд▓реЙрдиреНрдЪ рдиреЗ рдореБрдЭреЗ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд┐рдпрд╛: рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реЛ рдЧрдпрд╛ред рд╕рднреА GlusterFS рд╡реЙрд▓реНрдпреВрдо рдФрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдереЗред рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрдХрдиреАрдХ рдХреА рдорд╣рд╛рди рдХреНрд╖рдорддрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реИред
рдСрд▓ рдж рдмреЗрд╕реНрдЯ рдФрд░, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ, рдЬрд▓реНрдж рд╣реА рдорд┐рд▓реЗрдВрдЧреЗ!