
рднрд╛рдЧ 1/3 рдпрд╣рд╛рдБ
рднрд╛рдЧ 3/3 рдпрд╣рд╛рдБ
рдирдорд╕реНрдХрд╛рд░ рдФрд░ рд╡рд╛рдкрд╕ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! рдирдВрдЧреЗ рдзрд╛рддреБ рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓реЗрдЦ рдХрд╛ рдпрд╣ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд╣реИред рдкрд╣рд▓реЗ, рд╣рдордиреЗ Kubernetes HA рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдмрд╛рд╣рд░реА рд╡реЙрд░реНрдб, рдПрдХ рдорд╛рд╕реНрдЯрд░-рдорд╛рд╕реНрдЯрд░ рд╕реНрдХреАрдо рдФрд░ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдерд╛ред рдЦреИрд░, рдЕрдм рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рддрд╛рд╡рд░рдг рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рд▓реЗрдЦ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ - рдпрд╣ рдореЗрдЯрд▓рдПрд▓рдмреА рд╣реЛрдЧрд╛ред рд╣рдо рдЕрдкрдиреЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╡рд┐рддрд░рд┐рдд рдлрд╝рд╛рдЗрд▓ рднрдВрдбрд╛рд░рдг рдХреЛ рднреА рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд▓рдЧрд╛рддрд╛рд░ рд╡реЙрд▓реНрдпреВрдо рдХреЗ рд▓рд┐рдП рд╣рдо GlusterFS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░рд╛ рдХреНрд▓рд╕реНрдЯрд░ рдЖрд░реЗрдЦ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

рд╕реАрдзреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреГрд╖реНрда рд╕реЗ MetalLB рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж:
MetalLB рдорд╛рдирдХ рд░реВрдЯрд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдирдВрдЧреЗ рдзрд╛рддреБ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдирдВрдЧреЗ рдзрд╛рддреБ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░реНрд╕ ( рд╕реЗрд╡рд╛ рдкреНрд░рдХрд╛рд░ рд▓реЛрдбрдмреЗрд▓рд░ ) рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред Kubernetes рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдиреЗрдЯрд╡рд░реНрдХ LB рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди IaaS рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ (GCP, AWS, Azure, рдЖрджрд┐) рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк IaaS (GCP, AWS, Azure, рдЗрддреНрдпрд╛рджрд┐) рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ LoadBalancer рдирд┐рд░реНрдорд╛рдг рдкрд░ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рдХреЗ рд▓рд┐рдП "рд╕реНрдЯреИрдВрдбрдмрд╛рдп" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рд╣реЗрдЧрд╛ред
рдмреАрдПрдо рд╕рд░реНрд╡рд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдкрд╛рд╕ рдЙрдирдХреЗ рдХреНрд▓рд╕реНрдЯрд░, NodePort рдФрд░ externalIPs рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛рддрд╛рдпрд╛рдд рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдХрдо рдкреНрд░рднрд╛рд╡реА рдЙрдкрдХрд░рдг рд╣реИрдВред рдЗрди рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рдЬреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдмреАрдПрдо рд╕рдореВрд╣реЛрдВ рдХреЛ рджреНрд╡рд┐рддреАрдп рд╢реНрд░реЗрдгреА рдХреЗ рдирд╛рдЧрд░рд┐рдХреЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
рдореЗрдЯрд▓рдПрд▓рдмреА рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдПрд▓рдмреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдХреЗ рдЗрд╕ рдЕрд╕рдВрддреБрд▓рди рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдЬреЛ рдорд╛рдирдХ рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреАрдПрдо рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдПрдВ рднреА рдЕрдзрд┐рдХрддрдо рдЧрддрд┐ рдкрд░ "рдмрд╕ рдХрд╛рдо" рдХрд░рддреА рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕реЗрд╡рд╛рдПрдВ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореЗрдЯрд▓рдмреАрдЯреА рдЯреАрдо рдХреЛ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рд╕реЗрдЯрдЕрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рдФрд░ рд╕реАрдзреА рд╣реИред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдЕрдкрдиреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП 192.168.0.0/24 рд╕рдмрдиреЗрдЯ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ред рдЕрдм рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдмрдиреЗрдЯ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рд▓реЗрдВред
рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП kubectl рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рд╛рде рдорд╢реАрди рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:
control# kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml
рдпрд╣ metallb-system
рдореЗрдВ metallb-system
рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рддреИрдирд╛рдд рдХрд░реЗрдЧрд╛ред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рднреА MetalLB рдШрдЯрдХ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
control# kubectl get pod --namespace=metallb-system NAME READY STATUS RESTARTS AGE controller-7cc9c87cfb-ctg7p 1/1 Running 0 5d3h speaker-82qb5 1/1 Running 0 5d3h speaker-h5jw7 1/1 Running 0 5d3h speaker-r2fcg 1/1 Running 0 5d3h
рдЕрдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдЯрд▓рдПрд▓рдмреА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рд▓реЗрдпрд░ 2 рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдиреНрдп рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдореЗрдЯрд▓рдПрд▓рдмреА рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВред
рд╣рдорд╛рд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рдмрдиреЗрдЯ рдХреЗ рдЪрдпрдирд┐рдд IP рд░реЗрдВрдЬ рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рднреА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ metallb-config.yaml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
control# vi metallb-config.yaml apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 192.168.0.240-192.168.0.250
рдФрд░ рдЗрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
control# kubectl apply -f metallb-config.yaml
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдмрд╛рдж рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░рдореИрдк рдХреЛ рдЬрд╛рдВрдЪреЗрдВ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ:
control# kubectl describe configmaps -n metallb-system control# kubectl edit configmap config -n metallb-system
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╕реНрдерд╛рдиреАрдп рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдирдЧреНрдиреЗрдХреНрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
control# vi nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 control# vi nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx spec: type: LoadBalancer selector: app: nginx ports: - port: 80 name: http
рдлрд┐рд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рддреИрдирд╛рддреА рдФрд░ Nginx рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдБ:
control# kubectl apply -f nginx-deployment.yaml control# kubectl apply -f nginx-service.yaml
рдФрд░ рдЕрдм - рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
control# kubectl get po NAME READY STATUS RESTARTS AGE nginx-deployment-6574bd76c-fxgxr 1/1 Running 0 19s nginx-deployment-6574bd76c-rp857 1/1 Running 0 19s nginx-deployment-6574bd76c-wgt9n 1/1 Running 0 19s control# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.100.226.110 192.168.0.240 80:31604/TCP 107s
3 Nginx рдкреЙрдбреНрд╕ рдмрдирд╛рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рддреИрдирд╛рддреА рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдерд╛ред Nginx рд╕реЗрд╡рд╛ рдЪрдХреНрд░реАрдп рд╕рдВрддреБрд▓рди рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрди рд╕рднреА рдкреЙрдбреНрд╕ рдкрд░ рдпрд╛рддрд╛рдпрд╛рдд рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдЧреАред рдФрд░ рдЖрдк рд╣рдорд╛рд░реЗ рдореЗрдЯрд▓рдПрд▓рдмреА рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдмрд╛рд╣рд░реА рдЖрдИрдкреА рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм IP рдПрдбреНрд░реЗрд╕ 192.168.0.240 рддрдХ рд░реЛрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЖрдкрдХреЛ Nginx index.html рдкреЗрдЬ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдФрд░ Nginx рд╕реЗрд╡рд╛ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦреЗрдВред
control# kubectl delete svc nginx service "nginx" deleted control# kubectl delete deployment nginx-deployment deployment.extensions "nginx-deployment" deleted
рдЦреИрд░, рдпрд╣ рд╕рдм MetalLB рдХреЗ рд╕рд╛рде рд╣реИ, рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ - рд╣рдо Kubernetes рд╡реЙрд▓реНрдпреВрдо рдХреЗ рд▓рд┐рдП GlusterFS рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред
2. рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕ рдкрд░ рд╣реЗрдХреЗрдЯреА рдХреЗ рд╕рд╛рде рдЧреНрд▓рд╕реНрдЯрд░рдлрд╝реЛрд░реНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЪреВрд▓реНрд╣реЗ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЗрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп рдмрдирд╛рдпрд╛ рдФрд░ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдХреЗ рдЕрдВрджрд░ рдХрд╛ рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ рдЦреЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ, рдиреЛрдбреНрд╕ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рддрд░рд┐рдд рднрдВрдбрд╛рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ, рд╡реЙрд▓реНрдпреВрдо рдХрдИ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдЪреБрдиреЗрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рдЖрдВрддрд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП GlusterFS рднрдВрдбрд╛рд░рдг рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рддрд░рд╣ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╕рднреА рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ GlusterFS рдХреЗ "рд╕рд┐рд╕реНрдЯрдо" рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рдмрд╕ GlusterFS рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ hostPath рдЬреИрд╕реЗ рд╡реЙрд▓реНрдпреВрдо рдмрдирд╛рдПред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирдпрд╛ рдЖрд╕рд╛рди рд╣реЗрдХреЗрдЯреА рдЙрдкрдХрд░рдг рд╣реИред
рд╣реЗрдХреЗрдЯреА рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдХреБрдЫ рд╢рдмреНрдж:
GlusterFS рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╡реЙрд▓реНрдпреВрдо рдкреНрд░рдмрдВрдзрди рд╕рдВрд░рдЪрдирд╛ред
рд╣реЗрдХреЗрдЯреА рдПрдХ рд░реЗрд╕реНрдЯрдлреБрд▓ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреНрд▓рд╕реНрдЯрд░рдПрдлрдПрд╕ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣реЗрдХреЗрдЯреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдУрдкрдирд╕реНрдЯреИрдХ рдордиреАрд▓рд╛, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕, рдФрд░ рдУрдкрдирд╢рд┐рдлреНрдЯ рдЬреИрд╕реА рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛рдПрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдЧреНрд▓рд╕реНрдЯрд░рдПрдлрдПрд╕ рд╡реЙрд▓реНрдпреВрдо рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреА рд╣реИрдВред рд╣реЗрдХреЗрдЯреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рд╕реНрдерд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдмреНрд▓реЙрдХ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рд╕реНрдерд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣реЗрдХреЗрддреА рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреНрд▓рд╕реНрдЯрд░рдПрдлрдПрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдЬреЛ рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдСрдирд▓рд╛рдЗрди рдлрд╛рдЗрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЧреНрд▓рд╕реНрдЯрд░ рдПрдлрдПрд╕ рдХреНрд▓рд╕реНрдЯрд░ред
рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЯреВрд▓ рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рдмрдбрд╝реЗ рдХреНрд▓рд╛рдЙрдб рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдХрд░реАрдм рд▓рд╛рдПрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рдЖрдк PersistentVolumeClaims рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдВрдЧреЗ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред
рдЖрдк GlusterFS рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рд╕реНрдЯрдо рд╣рд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдмрд╕ рдХреБрдЫ рдбрдореА рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рд╕рднреА рддреАрди рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕ рдкрд░ рдбрдореА рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдмрдирд╛рдПрдВ:
worker1-3# dd if=/dev/zero of=/home/gluster/image bs=1M count=10000
рдЖрдкрдХреЛ рд▓рдЧрднрдЧ 10 рдЬреАрдмреА рдХреА рдПрдХ рдлрд╛рдЗрд▓ рдорд┐рд▓реЗрдЧреАред рдлрд┐рд░ рд▓реЛрд╕реЗрдЯрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдЗрд╕реЗ рдЗрди рдиреЛрдбреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реВрдкрдмреИрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ:
worker1-3# losetup /dev/loop0 /home/gluster/image
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓реВрдкрдмреИрдХ рдбрд┐рд╡рд╛рдЗрд╕ 0 рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреЛрдИ рдЕрдиреНрдп рдирдВрдмрд░ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдореИрдВрдиреЗ рд╕рдордп рд▓рд┐рдпрд╛ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рд╣реЗрдХреЗрддреА рдареАрдХ рд╕реЗ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдордиреЗ dm_thin_pool рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рднреА рдХрд╛рдордХрд╛рдЬреА рдиреЛрдб рдкрд░ glusterfs-client рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИред
worker1-3# modprobe dm_thin_pool worker1-3# apt-get update && apt-get -y install glusterfs-client
рдЦреИрд░, рдЕрдм рдЖрдкрдХреЛ рд╕рднреА рдХрд╛рдордХрд╛рдЬреА рдиреЛрдбреНрд╕ рдкрд░ рдЙрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ / рд╣реЛрдо / рдЧреНрд▓рд╕реНрдЯрд░ / рдЗрдореЗрдЬ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ / рджреЗрд╡ / рд▓реВрдк 0 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рд╕рд┐рд╕реНрдЯрдореИрдб рд╕реЗрд╡рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦреЗрдВ рдЬреЛ рдЗрди рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рдмреВрдЯ рд╣реЛрдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрд╕реЗрдЯрдЕрдк рдФрд░ рдореЛрдбрдкреНрд░реЙрдм рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ред
worker1-3# vi /etc/systemd/system/loop_gluster.service [Unit] Description=Create the loopback device for GlusterFS DefaultDependencies=false Before=local-fs.target After=systemd-udev-settle.service Requires=systemd-udev-settle.service [Service] Type=oneshot ExecStart=/bin/bash -c "modprobe dm_thin_pool && [ -b /dev/loop0 ] || losetup /dev/loop0 /home/gluster/image" [Install] WantedBy=local-fs.target
рдФрд░ рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░реЗрдВ:
worker1-3# systemctl enable /etc/systemd/system/loop_gluster.service Created symlink /etc/systemd/system/local-fs.target.wants/loop_gluster.service тЖТ /etc/systemd/system/loop_gluster.service.
рддреИрдпрд╛рд░реА рдХрд╛ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЕрдкрдиреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ GlusterFS рдФрд░ Heketi рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рд╢рд╛рдВрдд рдЧрд╛рдЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдорд╛рдВрдб рдмрд╛рд╣рд░реА рдирд┐рдпрдВрддреНрд░рдг рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рднреА рдорд╛рд╕реНрдЯрд░ рдиреЛрдб рд╕реЗ рдмрд╣реБрдд рдЫреЛрдЯреЗ рдХрдорд╛рдВрдб рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ DaemonSet GlusterFS рдмрдирд╛рдПрдВ:
control# git clone https://github.com/heketi/heketi control# cd heketi/extras/kubernetes control# kubectl create -f glusterfs-daemonset.json
рдЕрдм рд╣рдо GlusterFS рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рддреАрди рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ; рдЙрдиреНрд╣реЗрдВ рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, GlusterFS рдкреЙрдбреНрд╕ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ:
control# kubectl label node worker1 storagenode=glusterfs control# kubectl label node worker2 storagenode=glusterfs control# kubectl label node worker3 storagenode=glusterfs control# kubectl get pod NAME READY STATUS RESTARTS AGE glusterfs-5dtdj 1/1 Running 0 1m6s glusterfs-hzdll 1/1 Running 0 1m9s glusterfs-p8r59 1/1 Running 0 2m1s
рдЕрдм рдПрдХ рд╣реЗрдХреЗрдЯреА рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдмрдирд╛рдПрдБ:
control# kubectl create -f heketi-service-account.json
рд╣рдо рдЗрд╕ рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рдЪрдордХрджрд╛рд░ рдлрд▓реА рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдирдП рдмрдирд╛рдП рдЧрдП рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреНрд▓рд╕реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдБ:
control# kubectl create clusterrolebinding heketi-gluster-admin --clusterrole=edit --serviceaccount=default:heketi-service-account
рдЕрдм рдПрдХ рдХреБрдмреЗрд░рдиреЗрдЯ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд╣реЗрдХреЗрдЯреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИ:
control# kubectl create secret generic heketi-config-secret --from-file=./heketi.json
рд╣реЗрдХреЗрддреА рдХреЗ рддрд╣рдд рдкрд╣рд▓рд╛ рд╕реНрд░реЛрдд рдмрдирд╛рдПрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗрдЯрдЕрдк рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╣рдЯрд╛рддреЗ рд╣реИрдВ:
control# kubectl create -f heketi-bootstrap.json service "deploy-heketi" created deployment "deploy-heketi" created control# kubectl get pod NAME READY STATUS RESTARTS AGE deploy-heketi-1211581626-2jotm 1/1 Running 0 2m glusterfs-5dtdj 1/1 Running 0 6m6s glusterfs-hzdll 1/1 Running 0 6m9s glusterfs-p8r59 1/1 Running 0 7m1s
рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╣реЗрдХреЗрдЯреА рд╕реЗрд╡рд╛ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдорд╛рд╕реНрдЯрд░ рдиреЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╡рд╣рд╛рдВ рд╣рдо рдХрдИ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдмрд╛рд╣рд░реА рдирд┐рдпрдВрддреНрд░рдг рдиреЛрдб рд╣рдорд╛рд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреЙрдбреНрд╕ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣реЗрдХреЗрдЯреА-рдХреНрд▓рд╛рдЗрдВрдЯ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдмрд┐рди рд╕рд┐рд╕реНрдЯрдо рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ:
master1# wget https://github.com/heketi/heketi/releases/download/v8.0.0/heketi-client-v8.0.0.linux.amd64.tar.gz master1# tar -xzvf ./heketi-client-v8.0.0.linux.amd64.tar.gz master1# cp ./heketi-client/bin/heketi-cli /usr/local/bin/ master1# heketi-cli heketi-cli v8.0.0
рдЕрдм рд╣реЗрдХреЗрдЯреА рдкреЙрдб рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ:
master1# kubectl --kubeconfig /etc/kubernetes/admin.conf describe pod deploy-heketi-1211581626-2jotm For me this pod have a 10.42.0.1 ip master1# curl http://10.42.0.1:57598/hello Handling connection for 57598 Hello from Heketi master1# export HEKETI_CLI_SERVER=http://10.42.0.1:57598
рдЖрдЗрдП рдЕрдм рд╣реЗрдХреЗрд╕реНрдЯрд┐ рдХреЛ рдЧреНрд▓рд╕реНрдЯрд░рдПрдлрдПрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдВ рдЬреЛ рдЗрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЗрд╕реЗ рдЯреЛрдкреЛрд▓реЙрдЬреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЯреЛрдкреЛрд▓реЙрдЬреА рдПрдХ JSON рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ GlusterFS рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдиреЛрдбреНрд╕, рдбрд┐рд╕реНрдХ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред
рдиреЛрдЯред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ hostnames/manage
рд╕рдЯреАрдХ рдирд╛рдо рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ kubectl get node
рдЕрдиреБрднрд╛рдЧ kubectl get node
, рдФрд░ рдпрд╣ рдХрд┐ hostnames/storage
рд╕реНрдЯреЛрд░реЗрдЬ рдиреЛрдбреНрд╕ рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рд╣реИред
master1:~/heketi-client# vi topology.json { "clusters": [ { "nodes": [ { "node": { "hostnames": { "manage": [ "worker1" ], "storage": [ "192.168.0.7" ] }, "zone": 1 }, "devices": [ "/dev/loop0" ] }, { "node": { "hostnames": { "manage": [ "worker2" ], "storage": [ "192.168.0.8" ] }, "zone": 1 }, "devices": [ "/dev/loop0" ] }, { "node": { "hostnames": { "manage": [ "worker3" ], "storage": [ "192.168.0.9" ] }, "zone": 1 }, "devices": [ "/dev/loop0" ] } ] } ] }
рдлрд┐рд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:
master1:~/heketi-client# heketi-cli topology load --json=topology.json Creating cluster ... ID: e83467d0074414e3f59d3350a93901ef Allowing file volumes on cluster. Allowing block volumes on cluster. Creating node worker1 ... ID: eea131d392b579a688a1c7e5a85e139c Adding device /dev/loop0 ... OK Creating node worker2 ... ID: 300ad5ff2e9476c3ba4ff69260afb234 Adding device /dev/loop0 ... OK Creating node worker3 ... ID: 94ca798385c1099c531c8ba3fcc9f061 Adding device /dev/loop0 ... OK
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╡реЙрд▓реНрдпреВрдо рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЗрдХреЗрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЯреАрдо рдХрд╛ рдирд╛рдо рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИред рдПрдХ рд╣реЗрдХреЗрдЯреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рднреА рдмрдирд╛рдПрдВ:
master1:~/heketi-client# heketi-cli setup-openshift-heketi-storage master1:~/heketi-client# kubectl --kubeconfig /etc/kubernetes/admin.conf create -f heketi-storage.json secret/heketi-storage-secret created endpoints/heketi-storage-endpoints created service/heketi-storage-endpoints created job.batch/heketi-storage-copy-job created
рдпреЗ рд╕рднреА рдХрдорд╛рдВрдб рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдорд╛рд╕реНрдЯрд░ рдиреЛрдб рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪрд▓реЛ рдирд┐рдпрдВрддреНрд░рдг рдиреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдЬрд╛рд░реА рд░рдЦреЗрдВ; рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЕрдВрддрд┐рдо рдЪрд▓ рд░рд╣реЗ рдХрдорд╛рдВрдб рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
control# kubectl get pod NAME READY STATUS RESTARTS AGE glusterfs-5dtdj 1/1 Running 0 39h glusterfs-hzdll 1/1 Running 0 39h glusterfs-p8r59 1/1 Running 0 39h heketi-storage-copy-job-txkql 0/1 Completed 0 69s
рдФрд░ рд╣реЗрдХреЗрдЯреА-рд╕реНрдЯреЛрд░реЗрдЬ-рдХреЙрдкреА-рдЬреЙрдм рдХрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдкрдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕ рдкрд░ рдХреЛрдИ рд╕реНрдерд╛рдкрд┐рдд рдЧреНрд▓рд╕реНрдЯрд░рдлрд╝рд┐рд╢-рдХреНрд▓рд╛рдЗрдВрдЯ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред
рд╣реЗрддрдХреА рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдереЛрдбрд╝реА рд╕рдлрд╛рдИ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:
control# kubectl delete all,service,jobs,deployment,secret --selector="deploy-heketi"
рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ, рд╣рдореЗрдВ рд╣реЗрдХреЗрдЯреА рдХреА рдПрдХ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдкреНрд░рддрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
control# cd ./heketi/extras/kubernetes control:~/heketi/extras/kubernetes# kubectl create -f heketi-deployment.json secret/heketi-db-backup created service/heketi created deployment.extensions/heketi created control# kubectl get pod NAME READY STATUS RESTARTS AGE glusterfs-5dtdj 1/1 Running 0 39h glusterfs-hzdll 1/1 Running 0 39h glusterfs-p8r59 1/1 Running 0 39h heketi-b8c5f6554-knp7t 1/1 Running 0 22m
рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдкрдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕ рдкрд░ рдХреЛрдИ рд╕реНрдерд╛рдкрд┐рдд рдЧреНрд▓рд╕реНрдЯрд░рдлрд╝рд┐рд╢-рдХреНрд▓рд╛рдЗрдВрдЯ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдФрд░ рд╣рдо рд▓рдЧрднрдЧ рдкреВрд░реЗ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ, рдЕрдм рд╣реЗрдХреЗрдЯреА рдбреЗрдЯрд╛рдмреЗрд╕ рдЧреНрд▓рд╕реНрдЯрд░рдПрдлрдПрд╕ рд╡реЙрд▓реНрдпреВрдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ рд╣реЗрдХреЗрдЯреА рдЪреВрд▓реНрд╣рд╛ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ рд░реАрд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдЧрддрд┐рд╢реАрд▓ рд╕рдВрд╕рд╛рдзрди рдЖрд╡рдВрдЯрди рдХреЗ рд╕рд╛рде GlusterFS рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ StorageClass рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЧреНрд▓рд╕реНрдЯрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ (рд╣реЗрдХреЗрдЯреА-рд╕реНрдЯреЛрд░реЗрдЬ-рдПрдВрдбрдкреЙрдЗрдВрдЯ) рдХреЗ рд░реВрдк рдореЗрдВ StorageClass рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
control# kubectl get endpoints NAME ENDPOINTS AGE heketi 10.42.0.2:8080 2d16h ....... ... ..
рдЕрдм рдХреБрдЫ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдБ:
control# vi storage-class.yml apiVersion: storage.k8s.io/v1beta1 kind: StorageClass metadata: name: slow provisioner: kubernetes.io/glusterfs parameters: resturl: "http://10.42.0.2:8080" control# vi test-pvc.yml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: gluster1 annotations: volume.beta.kubernetes.io/storage-class: "slow" spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
рдХрдХреНрд╖рд╛ рдФрд░ рдкреАрд╡реАрд╕реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
control# kubectl create -f storage-class.yaml storageclass "slow" created control# kubectl get storageclass NAME PROVISIONER AGE slow kubernetes.io/glusterfs 2d8h control# kubectl create -f test-pvc.yaml persistentvolumeclaim "gluster1" created control# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE gluster1 Bound pvc-27f733cd-1c77-11e9-bb07-7efe6b0e6fa5 1Gi RWO slow 2d8h
рд╣рдо рдкреАрд╡реА рд╡реЙрд▓реНрдпреВрдо рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
control# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-27f733cd-1c77-11e9-bb07-7efe6b0e6fa5 1Gi RWO Delete Bound default/gluster1 slow 2d8h
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ PersistentVolumeClaim рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ GlusterFS рд╡реЙрд▓реНрдпреВрдо рд╣реИ, рдФрд░ рд╣рдо рдХрд┐рд╕реА рднреА рд╕рдмрдкреНрд▓реЙрдЯ рдореЗрдВ рдЗрд╕ рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Nginx рдХреЗ рддрд╣рдд рдПрдХ рд╕рд░рд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ:
control# vi nginx-test.yml apiVersion: v1 kind: Pod metadata: name: nginx-pod1 labels: name: nginx-pod1 spec: containers: - name: nginx-pod1 image: gcr.io/google_containers/nginx-slim:0.8 ports: - name: web containerPort: 80 volumeMounts: - name: gluster-vol1 mountPath: /usr/share/nginx/html volumes: - name: gluster-vol1 persistentVolumeClaim: claimName: gluster1 control# kubectl create -f nginx-test.yaml pod "nginx-pod1" created
рдХреЗ рддрд╣рдд рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░реЗрдВ (рдХреБрдЫ рдорд┐рдирдЯ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ):
control# kubectl get pods NAME READY STATUS RESTARTS AGE glusterfs-5dtdj 1/1 Running 0 4d10h glusterfs-hzdll 1/1 Running 0 4d10h glusterfs-p8r59 1/1 Running 0 4d10h heketi-b8c5f6554-knp7t 1/1 Running 0 2d18h nginx-pod1 1/1 Running 0 47h
рдЕрдм рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЬрд╛рдПрдБ рдФрд░ index.html рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
control# kubectl exec -ti nginx-pod1 /bin/sh # cd /usr/share/nginx/html # echo 'Hello there from GlusterFS pod !!!' > index.html # ls index.html # exit
рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдорд╛рд╕реНрдЯрд░ рдиреЛрдб рд╕реЗ рдЪреВрд▓реНрд╣рд╛ рдФрд░ рдХрд░реНрд▓ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдЖрдИрдкреА рдкрддреЗ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
master1# curl 10.40.0.1 Hello there from GlusterFS pod !!!
рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ, рд╣рдо рдмрд╕ рдЕрдкрдиреА рдирдИ рд▓рдЧрд╛рддрд╛рд░ рдорд╛рддреНрд░рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред
рдирдП GlusterFS рдХреНрд▓рд╕реНрдЯрд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдХрдорд╛рдВрдб рд╣реИрдВ: heketi-cli cluster list
рдФрд░ heketi-cli volume list
ред рдпрджрд┐ рд╣реЗрдХреЗрдЯреА-рдХреНрд▓рд┐ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдиреЛрдб рдорд╛рд╕реНрдЯрд░ 1 рд╣реИ ред
master1# heketi-cli cluster list Clusters: Id:e83467d0074414e3f59d3350a93901ef [file][block] master1# heketi-cli volume list Id:6fdb7fef361c82154a94736c8f9aa53e Cluster:e83467d0074414e3f59d3350a93901ef Name:vol_6fdb7fef361c82154a94736c8f9aa53e Id:c6b69bd991b960f314f679afa4ad9644 Cluster:e83467d0074414e3f59d3350a93901ef Name:heketidbstorage
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдордиреЗ рдлрд╝рд╛рдЗрд▓ рднрдВрдбрд╛рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдВрддрд░рд┐рдХ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░рд╛ рдХреНрд▓рд╕реНрдЯрд░ рдЕрдм рдкрд░рд┐рдЪрд╛рд▓рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд░реАрдм рд╣реИред
рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рднреА рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред
рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд░рд╣реЗрдВ рдФрд░ рд╕рднреА рдмреЗрд╣рддрд░реАрди!