Kubernetes 是什么

Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
Kubernetes 在设计结构上定义了一系列的构建模块,其目的是为了提供一个可以部署、维护和扩展应用程序的机制,组成 Kubernetes 的组件设计概念为松耦合可扩展的,这样可以使之满足多种不同的工作负载。可扩展性在很大程度上由 Kubernetes

API 提供,此 API 主要被作为扩展的内部组件以及 Kubernetes 上运行的容器来使用。

Kubernetes 主要由以下几个核心组件组成:

  • etcd  保存了整个集群的状态
  • apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
  • controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
  • scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
  • kubelet 负责维护容器的生命周期,同时也负责 Volume和网络的管理
  • Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI)
  • kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡

除了核心组件,还有一些推荐的 Add-ons:

  • kube-dns 负责为整个集群提供 DNS 服务
  • Ingress Controller 为服务提供外网入口
  • Heapster 提供资源监控
  • Dashboard 提供 GUI
  • Federation 提供跨可用区的集群
  • Fluentd-elasticsearch 提供集群日志采集、存储与查询

Kubernetes 和数据库

数据库容器化是最近的一大热点,那么 Kubernetes 能为数据库带来什么好处呢?

  • 故障恢复: Kubernetes 提供故障恢复的功能,数据库应用如果宕掉,Kubernetes 可以将其自动重启,或者将数据库实例迁移到集群中其他节点上
  • 存储管理: Kubernetes 提供了丰富的存储接入方案,数据库应用能透明地使用不同类型的存储系统
  • 负载均衡: Kubernetes Service 提供负载均衡功能,能将外部访问平摊给不同的数据库实例副本上
  • 水平拓展: Kubernetes 可以根据当前数据库集群的资源利用率情况,缩放副本数目,从而提升资源的利用率

目前很多数据库,如:MySQL,MongoDB 和 TiDB 在 Kubernetes 集群中都能运行很良好。

Nebula Graph在Kubernetes中的实践

Nebula Graph 是一个分布式的开源图数据库,主要组件有:Query Engine 的 graphd,数据存储的 storaged,和元数据的 meted。在 Kubernetes 实践过程中,它主要给图数据库 Nebula Graph 带来了以下的好处:

  • Kubernetes 能分摊 nebula graphd,metad 和 storaged 不副本之间的负载。graphd,metad 和 storaged 可以通过 Kubernetes 的域名服务自动发现彼此。
  • 通过 storageclass,pvc 和 pv 可以屏蔽底层存储细节,无论使用本地卷还是云盘,Kubernetes 均可以屏蔽这些细节。
  • 通过 Kubernetes 可以在几秒内成功部署一套 Nebula 集群,Kubernetes 也可以无感知地实现 Nebula 集群的升级。
  • Nebula 集群通过 Kubernetes 可以做到自我恢复,单体副本 crash,Kubernetes 可以重新将其拉起,无需运维人员介入。
  • Kubernetes 可以根据当前 Nebula 集群的资源利用率情况水平伸缩 Nebula 集群,从而提供集群的性能。

下面来讲解下具体的实践内容。

集群部署

硬件和软件要求

这里主要罗列下本文部署涉及到的机器、操作系统参数

  • 操作系统使用的 CentOS-7.6.1810 x86_64
  • 虚拟机配置
    • 4 CPU
    • 8G 内存
    • 50G 系统盘
    • 50G 数据盘A
    • 50G 数据盘B
  • Kubernetes 集群版本 v1.16
  • Nebula 版本为 v1.0.0-rc3
  • 使用本地 PV 作为数据存储

kubernetes 集群规划

以下为集群清单

服务器 IP nebula 实例 role
192.168.0.1 k8s-master
192.168.0.2 graphd, metad-0, storaged-0 k8s-slave
192.168.0.3 graphd, metad-1, storaged-1 k8s-slave
192.168.0.4 graphd, metad-2, storaged-2 k8s-slave

Kubernetes 待部署组件

  • 安装 Helm
  • 准备本地磁盘,并安装本地卷插件
  • 安装 nebula 集群
  • 安装 ingress-controller

安装 Helm

Helm 是 Kubernetes 集群上的包管理工具,类似 CentOS 上的 yum,Ubuntu 上的 apt-get。使用 Helm 可以极大地降低使用 Kubernetes 部署应用的门槛。由于本篇文章不做 Helm 详细介绍,有兴趣的小伙伴可自行阅读《Helm 入门指南》

下载安装Helm

使用下面命令在终端执行即可安装 Helm

  1. [root@nebula ~]# wget https://get.helm.sh/helm-v3.0.1-linux-amd64.tar.gz
  2. [root@nebula ~]# tar -zxvf helm/helm-v3.0.1-linux-amd64.tgz
  3. [root@nebula ~]# mv linux-amd64/helm /usr/bin/helm
  4. [root@nebula ~]# chmod +x /usr/bin/helm

查看 Helm 版本

执行 helm version 命令即可查看对应的 Helm 版本,以文本为例,以下为输出结果:

  1. version.BuildInfo{
  2. Version:"v3.0.1",
  3. GitCommit:"7c22ef9ce89e0ebeb7125ba2ebf7d421f3e82ffa",
  4. GitTreeState:"clean",
  5. GoVersion:"go1.13.4"
  6. }

设置本地磁盘

在每台机器上做如下配置

创建 mount 目录

  1. [root@nebula ~]# sudo mkdir -p /mnt/disks

格式化数据盘

  1. [root@nebula ~]# sudo mkfs.ext4 /dev/diskA
  2. [root@nebula ~]# sudo mkfs.ext4 /dev/diskB

挂载数据盘

  1. [root@nebula ~]# DISKA_UUID=$(blkid -s UUID -o value /dev/diskA)
  2. [root@nebula ~]# DISKB_UUID=$(blkid -s UUID -o value /dev/diskB)
  3. [root@nebula ~]# sudo mkdir /mnt/disks/$DISKA_UUID
  4. [root@nebula ~]# sudo mkdir /mnt/disks/$DISKB_UUID
  5. [root@nebula ~]# sudo mount -t ext4 /dev/diskA /mnt/disks/$DISKA_UUID
  6. [root@nebula ~]# sudo mount -t ext4 /dev/diskB /mnt/disks/$DISKB_UUID
  7. [root@nebula ~]# echo UUID=`sudo blkid -s UUID -o value /dev/diskA` /mnt/disks/$DISKA_UUID ext4 defaults 0 2 | sudo tee -a /etc/fstab
  8. [root@nebula ~]# echo UUID=`sudo blkid -s UUID -o value /dev/diskB` /mnt/disks/$DISKB_UUID ext4 defaults 0 2 | sudo tee -a /etc/fstab

部署本地卷插件

  1. [root@nebula ~]# curl https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner/archive/v2.3.3.zip
  2. [root@nebula ~]# unzip v2.3.3.zip

修改 v2.3.3/helm/provisioner/values.yaml

  1. #
  2. # Common options.
  3. #
  4. common:
  5. #
  6. # Defines whether to generate service account and role bindings.
  7. #
  8. rbac: true
  9. #
  10. # Defines the namespace where provisioner runs
  11. #
  12. namespace: default
  13. #
  14. # Defines whether to create provisioner namespace
  15. #
  16. createNamespace: false
  17. #
  18. # Beta PV.NodeAffinity field is used by default. If running against pre-1.10
  19. # k8s version, the `useAlphaAPI` flag must be enabled in the configMap.
  20. #
  21. useAlphaAPI: false
  22. #
  23. # Indicates if PVs should be dependents of the owner Node.
  24. #
  25. setPVOwnerRef: false
  26. #
  27. # Provisioner clean volumes in process by default. If set to true, provisioner
  28. # will use Jobs to clean.
  29. #
  30. useJobForCleaning: false
  31. #
  32. # Provisioner name contains Node.UID by default. If set to true, the provisioner
  33. # name will only use Node.Name.
  34. #
  35. useNodeNameOnly: false
  36. #
  37. # Resync period in reflectors will be random between minResyncPeriod and
  38. # 2*minResyncPeriod. Default: 5m0s.
  39. #
  40. #minResyncPeriod: 5m0s
  41. #
  42. # Defines the name of configmap used by Provisioner
  43. #
  44. configMapName: "local-provisioner-config"
  45. #
  46. # Enables or disables Pod Security Policy creation and binding
  47. #
  48. podSecurityPolicy: false
  49. #
  50. # Configure storage classes.
  51. #
  52. classes:
  53. - name: fast-disks # Defines name of storage classe.
  54. # Path on the host where local volumes of this storage class are mounted
  55. # under.
  56. hostDir: /mnt/fast-disks
  57. # Optionally specify mount path of local volumes. By default, we use same
  58. # path as hostDir in container.
  59. # mountDir: /mnt/fast-disks
  60. # The volume mode of created PersistentVolume object. Default to Filesystem
  61. # if not specified.
  62. volumeMode: Filesystem
  63. # Filesystem type to mount.
  64. # It applies only when the source path is a block device,
  65. # and desire volume mode is Filesystem.
  66. # Must be a filesystem type supported by the host operating system.
  67. fsType: ext4
  68. blockCleanerCommand:
  69. # Do a quick reset of the block device during its cleanup.
  70. # - "/scripts/quick_reset.sh"
  71. # or use dd to zero out block dev in two iterations by uncommenting these lines
  72. # - "/scripts/dd_zero.sh"
  73. # - "2"
  74. # or run shred utility for 2 iteration.s
  75. - "/scripts/shred.sh"
  76. - "2"
  77. # or blkdiscard utility by uncommenting the line below.
  78. # - "/scripts/blkdiscard.sh"
  79. # Uncomment to create storage class object with default configuration.
  80. # storageClass: true
  81. # Uncomment to create storage class object and configure it.
  82. # storageClass:
  83. # reclaimPolicy: Delete # Available reclaim policies: Delete/Retain, defaults: Delete.
  84. # isDefaultClass: true # set as default class
  85. #
  86. # Configure DaemonSet for provisioner.
  87. #
  88. daemonset:
  89. #
  90. # Defines the name of a Provisioner
  91. #
  92. name: "local-volume-provisioner"
  93. #
  94. # Defines Provisioner's image name including container registry.
  95. #
  96. image: quay.io/external_storage/local-volume-provisioner:v2.3.3
  97. #
  98. # Defines Image download policy, see kubernetes documentation for available values.
  99. #
  100. #imagePullPolicy: Always
  101. #
  102. # Defines a name of the service account which Provisioner will use to communicate with API server.
  103. #
  104. serviceAccount: local-storage-admin
  105. #
  106. # Defines a name of the Pod Priority Class to use with the Provisioner DaemonSet
  107. #
  108. # Note that if you want to make it critical, specify "system-cluster-critical"
  109. # or "system-node-critical" and deploy in kube-system namespace.
  110. # Ref: https://k8s.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#marking-pod-as-critical
  111. #
  112. #priorityClassName: system-node-critical
  113. # If configured, nodeSelector will add a nodeSelector field to the DaemonSet PodSpec.
  114. #
  115. # NodeSelector constraint for local-volume-provisioner scheduling to nodes.
  116. # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
  117. nodeSelector: {}
  118. #
  119. # If configured KubeConfigEnv will (optionally) specify the location of kubeconfig file on the node.
  120. # kubeConfigEnv: KUBECONFIG
  121. #
  122. # List of node labels to be copied to the PVs created by the provisioner in a format:
  123. #
  124. # nodeLabels:
  125. # - failure-domain.beta.kubernetes.io/zone
  126. # - failure-domain.beta.kubernetes.io/region
  127. #
  128. # If configured, tolerations will add a toleration field to the DaemonSet PodSpec.
  129. #
  130. # Node tolerations for local-volume-provisioner scheduling to nodes with taints.
  131. # Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
  132. tolerations: []
  133. #
  134. # If configured, resources will set the requests/limits field to the Daemonset PodSpec.
  135. # Ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
  136. resources: {}
  137. #
  138. # Configure Prometheus monitoring
  139. #
  140. prometheus:
  141. operator:
  142. ## Are you using Prometheus Operator?
  143. enabled: false
  144. serviceMonitor:
  145. ## Interval at which Prometheus scrapes the provisioner
  146. interval: 10s
  147. # Namespace Prometheus is installed in
  148. namespace: monitoring
  149. ## Defaults to whats used if you follow CoreOS [Prometheus Install Instructions](https://github.com/coreos/prometheus-operator/tree/master/helm#tldr)
  150. ## [Prometheus Selector Label](https://github.com/coreos/prometheus-operator/blob/master/helm/prometheus/templates/prometheus.yaml#L65)
  151. ## [Kube Prometheus Selector Label](https://github.com/coreos/prometheus-operator/blob/master/helm/kube-prometheus/values.yaml#L298)
  152. selector:
  153. prometheus: kube-prometheus

hostDir: /mnt/fast-disks 改成hostDir: /mnt/disks
# storageClass: true 改成 storageClass: true
然后执行:

  1. #安装
  2. [root@nebula ~]# helm install local-static-provisioner v2.3.3/helm/provisioner
  3. #查看local-static-provisioner部署情况
  4. [root@nebula ~]# helm list

部署 nebula 集群

下载 nebula helm-chart 包

  1. # 下载nebula
  2. [root@nebula ~]# wget https://github.com/vesoft-inc/nebula/archive/master.zip
  3. # 解压
  4. [root@nebula ~]# unzip master.zip

设置 Kubernetes slave 节点

下面是 Kubernetes 节点列表,我们需要设置 slave 节点的调度标签。可以将 192.168.0.2192.168.0.3192.168.0.4 打上 nebula: "yes" 的标签。

服务器 IP kubernetes roles nodeName
192.168.0.1 master 192.168.0.1
192.168.0.2 worker 192.168.0.2
192.168.0.3 worker 192.168.0.3
192.168.0.4 worker 192.168.0.4

具体操作如下:

  1. [root@nebula ~]# kubectl label node 192.168.0.2 nebula="yes" --overwrite
  2. [root@nebula ~]# kubectl label node 192.168.0.3 nebula="yes" --overwrite
  3. [root@nebula ~]# kubectl label node 192.168.0.4 nebula="yes" --overwrite

调整 nebula helm chart 默认的 values 值

nebula helm-chart 包目录如下:

  1. master/kubernetes/
  2. └── helm
  3. ├── Chart.yaml
  4. ├── templates
  5.    ├── configmap.yaml
  6.    ├── deployment.yaml
  7.    ├── _helpers.tpl
  8.    ├── ingress-configmap.yaml\
  9.    ├── NOTES.txt
  10.    ├── pdb.yaml
  11.    ├── service.yaml
  12.    └── statefulset.yaml
  13. └── values.yaml
  14. 2 directories, 10 files

我们需要调整 master/kubernetes/values.yaml  里面的 MetadHosts 的值,将这个 IP List 替换本环境的 3 个 k8s worker 的 ip。

  1. MetadHosts:
  2. - 192.168.0.2:44500
  3. - 192.168.0.3:44500
  4. - 192.168.0.4:44500

通过 helm 安装 nebula

  1. # 安装
  2. [root@nebula ~]# helm install nebula master/kubernetes/helm
  3. # 查看
  4. [root@nebula ~]# helm status nebula
  5. # 查看k8s集群上nebula部署情况
  6. [root@nebula ~]# kubectl get pod | grep nebula
  7. nebula-graphd-579d89c958-g2j2c 1/1 Running 0 1m
  8. nebula-graphd-579d89c958-p7829 1/1 Running 0 1m
  9. nebula-graphd-579d89c958-q74zx 1/1 Running 0 1m
  10. nebula-metad-0 1/1 Running 0 1m
  11. nebula-metad-1 1/1 Running 0 1m
  12. nebula-metad-2 1/1 Running 0 1m
  13. nebula-storaged-0 1/1 Running 0 1m
  14. nebula-storaged-1 1/1 Running 0 1m
  15. nebula-storaged-2 1/1 Running 0 1m

部署 Ingress-controller

Ingress-controller 是 Kubernetes 的一个 Add-Ons。Kubernetes 通过 ingress-controller 将 Kubernetes 内部署的服务暴露给外部用户访问。Ingress-controller 还提供负载均衡的功能,可以将外部访问流量平摊给 k8s 中应用的不同的副本。

选择一个节点部署 Ingress-controller

  1. [root@nebula ~]# kubectl get node
  2. NAME STATUS ROLES AGE VERSION
  3. 192.168.0.1 Ready master 82d v1.16.1
  4. 192.168.0.2 Ready <none> 82d v1.16.1
  5. 192.168.0.3 Ready <none> 82d v1.16.1
  6. 192.168.0.4 Ready <none> 82d v1.16.1
  7. [root@nebula ~]# kubectl label node 192.168.0.4 ingress=yes

编写 ingress-nginx.yaml 部署文件

  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4. name: ingress-nginx
  5. labels:
  6. app.kubernetes.io/name: ingress-nginx
  7. app.kubernetes.io/part-of: ingress-nginx
  8. ---
  9. kind: ConfigMap
  10. apiVersion: v1
  11. metadata:
  12. name: nginx-configuration
  13. namespace: ingress-nginx
  14. labels:
  15. app.kubernetes.io/name: ingress-nginx
  16. app.kubernetes.io/part-of: ingress-nginx
  17. ---
  18. kind: ConfigMap
  19. apiVersion: v1
  20. metadata:
  21. name: tcp-services
  22. namespace: ingress-nginx
  23. labels:
  24. app.kubernetes.io/name: ingress-nginx
  25. app.kubernetes.io/part-of: ingress-nginx
  26. ---
  27. kind: ConfigMap
  28. apiVersion: v1
  29. metadata:
  30. name: udp-services
  31. namespace: ingress-nginx
  32. labels:
  33. app.kubernetes.io/name: ingress-nginx
  34. app.kubernetes.io/part-of: ingress-nginx
  35. ---
  36. apiVersion: v1
  37. kind: ServiceAccount
  38. metadata:
  39. name: nginx-ingress-serviceaccount
  40. namespace: ingress-nginx
  41. labels:
  42. app.kubernetes.io/name: ingress-nginx
  43. app.kubernetes.io/part-of: ingress-nginx
  44. ---
  45. apiVersion: rbac.authorization.k8s.io/v1beta1
  46. kind: ClusterRole
  47. metadata:
  48. name: nginx-ingress-clusterrole
  49. labels:
  50. app.kubernetes.io/name: ingress-nginx
  51. app.kubernetes.io/part-of: ingress-nginx
  52. rules:
  53. - apiGroups:
  54. - ""
  55. resources:
  56. - configmaps
  57. - endpoints
  58. - nodes
  59. - pods
  60. - secrets
  61. verbs:
  62. - list
  63. - watch
  64. - apiGroups:
  65. - ""
  66. resources:
  67. - nodes
  68. verbs:
  69. - get
  70. - apiGroups:
  71. - ""
  72. resources:
  73. - services
  74. verbs:
  75. - get
  76. - list
  77. - watch
  78. - apiGroups:
  79. - "extensions"
  80. - "networking.k8s.io"
  81. resources:
  82. - ingresses
  83. verbs:
  84. - get
  85. - list
  86. - watch
  87. - apiGroups:
  88. - ""
  89. resources:
  90. - events
  91. verbs:
  92. - create
  93. - patch
  94. - apiGroups:
  95. - "extensions"
  96. - "networking.k8s.io"
  97. resources:
  98. - ingresses/status
  99. verbs:
  100. - update
  101. ---
  102. apiVersion: rbac.authorization.k8s.io/v1beta1
  103. kind: Role
  104. metadata:
  105. name: nginx-ingress-role
  106. namespace: ingress-nginx
  107. labels:
  108. app.kubernetes.io/name: ingress-nginx
  109. app.kubernetes.io/part-of: ingress-nginx
  110. rules:
  111. - apiGroups:
  112. - ""
  113. resources:
  114. - configmaps
  115. - pods
  116. - secrets
  117. - namespaces
  118. verbs:
  119. - get
  120. - apiGroups:
  121. - ""
  122. resources:
  123. - configmaps
  124. resourceNames:
  125. # Defaults to "<election-id>-<ingress-class>"
  126. # Here: "<ingress-controller-leader>-<nginx>"
  127. # This has to be adapted if you change either parameter
  128. # when launching the nginx-ingress-controller.
  129. - "ingress-controller-leader-nginx"
  130. verbs:
  131. - get
  132. - update
  133. - apiGroups:
  134. - ""
  135. resources:
  136. - configmaps
  137. verbs:
  138. - create
  139. - apiGroups:
  140. - ""
  141. resources:
  142. - endpoints
  143. verbs:
  144. - get
  145. ---
  146. apiVersion: rbac.authorization.k8s.io/v1beta1
  147. kind: RoleBinding
  148. metadata:
  149. name: nginx-ingress-role-nisa-binding
  150. namespace: ingress-nginx
  151. labels:
  152. app.kubernetes.io/name: ingress-nginx
  153. app.kubernetes.io/part-of: ingress-nginx
  154. roleRef:
  155. apiGroup: rbac.authorization.k8s.io
  156. kind: Role
  157. name: nginx-ingress-role
  158. subjects:
  159. - kind: ServiceAccount
  160. name: nginx-ingress-serviceaccount
  161. namespace: ingress-nginx
  162. ---
  163. apiVersion: rbac.authorization.k8s.io/v1beta1
  164. kind: ClusterRoleBinding
  165. metadata:
  166. name: nginx-ingress-clusterrole-nisa-binding
  167. labels:
  168. app.kubernetes.io/name: ingress-nginx
  169. app.kubernetes.io/part-of: ingress-nginx
  170. roleRef:
  171. apiGroup: rbac.authorization.k8s.io
  172. kind: ClusterRole
  173. name: nginx-ingress-clusterrole
  174. subjects:
  175. - kind: ServiceAccount
  176. name: nginx-ingress-serviceaccount
  177. namespace: ingress-nginx
  178. ---
  179. apiVersion: apps/v1
  180. kind: DaemonSet
  181. metadata:
  182. name: nginx-ingress-controller
  183. namespace: ingress-nginx
  184. labels:
  185. app.kubernetes.io/name: ingress-nginx
  186. app.kubernetes.io/part-of: ingress-nginx
  187. spec:
  188. selector:
  189. matchLabels:
  190. app.kubernetes.io/name: ingress-nginx
  191. app.kubernetes.io/part-of: ingress-nginx
  192. template:
  193. metadata:
  194. labels:
  195. app.kubernetes.io/name: ingress-nginx
  196. app.kubernetes.io/part-of: ingress-nginx
  197. annotations:
  198. prometheus.io/port: "10254"
  199. prometheus.io/scrape: "true"
  200. spec:
  201. hostNetwork: true
  202. tolerations:
  203. - key: "node-role.kubernetes.io/master"
  204. operator: "Exists"
  205. effect: "NoSchedule"
  206. affinity:
  207. podAntiAffinity:
  208. requiredDuringSchedulingIgnoredDuringExecution:
  209. - labelSelector:
  210. matchExpressions:
  211. - key: app.kubernetes.io/name
  212. operator: In
  213. values:
  214. - ingress-nginx
  215. topologyKey: "ingress-nginx.kubernetes.io/master"
  216. nodeSelector:
  217. ingress: "yes"
  218. serviceAccountName: nginx-ingress-serviceaccount
  219. containers:
  220. - name: nginx-ingress-controller
  221. image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller-amd64:0.26.1
  222. args:
  223. - /nginx-ingress-controller
  224. - --configmap=$(POD_NAMESPACE)/nginx-configuration
  225. - --tcp-services-configmap=default/graphd-services
  226. - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
  227. - --publish-service=$(POD_NAMESPACE)/ingress-nginx
  228. - --annotations-prefix=nginx.ingress.kubernetes.io
  229. - --http-port=8000
  230. securityContext:
  231. allowPrivilegeEscalation: true
  232. capabilities:
  233. drop:
  234. - ALL
  235. add:
  236. - NET_BIND_SERVICE
  237. # www-data -> 33
  238. runAsUser: 33
  239. env:
  240. - name: POD_NAME
  241. valueFrom:
  242. fieldRef:
  243. fieldPath: metadata.name
  244. - name: POD_NAMESPACE
  245. valueFrom:
  246. fieldRef:
  247. fieldPath: metadata.namespace
  248. ports:
  249. - name: http
  250. containerPort: 80
  251. - name: https
  252. containerPort: 443
  253. livenessProbe:
  254. failureThreshold: 3
  255. httpGet:
  256. path: /healthz
  257. port: 10254
  258. scheme: HTTP
  259. initialDelaySeconds: 10
  260. periodSeconds: 10
  261. successThreshold: 1
  262. timeoutSeconds: 10
  263. readinessProbe:
  264. failureThreshold: 3
  265. httpGet:
  266. path: /healthz
  267. port: 10254
  268. scheme: HTTP
  269. periodSeconds: 10
  270. successThreshold: 1
  271. timeoutSeconds: 10

部署 ingress-nginx

  1. # 部署
  2. [root@nebula ~]# kubectl create -f ingress-nginx.yaml
  3. # 查看部署情况
  4. [root@nebula ~]# kubectl get pod -n ingress-nginx
  5. NAME READY STATUS RESTARTS AGE
  6. nginx-ingress-controller-mmms7 1/1 Running 2 1m

访问 nebula 集群

查看 ingress-nginx 所在的节点:

  1. [root@nebula ~]# kubectl get node -l ingress=yes -owide
  2. NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
  3. 192.168.0.4 Ready <none> 1d v1.16.1 192.168.0.4 <none> CentOS Linux 7 (Core) 7.6.1810.el7.x86_64 docker://19.3.3

访问 nebula 集群:

  1. [root@nebula ~]# docker run --rm -ti --net=host vesoft/nebula-console:nightly --addr=192.168.0.4 --port=3699

FAQ

如何搭建一套 Kubernetes 集群?

搭建高可用的 Kubernetes 可以参考社区文档:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

你也可以通过 minikube 搭建本地的 Kubernetes 集群,参考文档:https://kubernetes.io/docs/setup/learning-environment/minikube/

如何调整 nebula 集群的部署参数?

在使用 helm install 时,使用 --set 可以设置部署参数,从而覆盖掉 helm chart 中 values.yaml 中的变量。参考文档:https://helm.sh/docs/intro/using_helm/

如何查看 nebula 集群状况?

使用kubectl get pod | grep nebula命令,或者直接在 Kubernetes dashboard 上查看 nebula 集群的运行状况。

如何使用其他类型的存储?

参考文档:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

参考资料

附录

Kubernetes 部署 Nebula 图数据库集群的更多相关文章

  1. kubernetes部署Percona XtraDB Cluster集群

    PXC介绍 全称percona-xtradb-cluster,提供了MySQL高可用的一种实现方法.PXC集群以节点组成(推荐至少3节点,便于故障恢复),每个节点都是基于常规的 MySQL Serve ...

  2. Kubernetes 部署 Nacos 1.4 集群

    文章转载自:http://www.mydlq.club/article/104/ 系统环境: Nacos 版本:1.4.1 Mysql 版本:8.0.19 Kubernetes 版本:1.20.1 一 ...

  3. Kubernetes部署SpringCloud(一) Eureka 集群,解决unavailable-replicas,available-replicas条件

    环境 k8s master: 1个 k8s node: 3个 三个eureka 指定node启动,并且使用network=host 完整pom.xml <?xml version="1 ...

  4. mycat数据库集群系列之数据库多实例安装

    mycat数据库集群系列之数据库多实例安装 最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据 ...

  5. k8s集群部署之环境介绍与etcd数据库集群部署

    角色 IP 组件 配置 master-1 192.168.10.11 kube-apiserver kube-controller-manager kube-scheduler etcd 2c 2g ...

  6. SequoiaDB数据库集群部署

    一般在多机环境下部署数据库的集群模式是比较繁琐的,下面我来分享一个如何通过shell脚本的方式简单.方便地部署我们的集群. 首先,我们要给机器配置信任关系,这样我们就无需手动的输入密码来执行ssh和s ...

  7. 【Data Cluster】真机环境下MySQL数据库集群搭建

    真机环境下MySQL-Cluster搭建文档  摘要:本年伊始阶段,由于实验室对不同数据库性能测试需求,才出现MySQL集群搭建.购置主机,交换机,双绞线等一系列准备工作就绪,也就开始集群搭建.起初笔 ...

  8. H2数据库集群

    H2数据库集群 1. H2数据库简单介绍 1.1 H2数据库优势 经常使用的开源数据库:H2,Derby,HSQLDB.MySQL,PostgreSQL. 当中H2,HSQLDB相似,十分适合作为嵌入 ...

  9. mycat数据库集群系列之mysql主从同步设置

    最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据库安装.mycat部署安装.数据库之读写分离 ...

随机推荐

  1. 贪心+huffman编码+模拟退火+分治(一)

    (一)贪心 1.A - 今年暑假不AC “今年暑假不AC?” “是的.” “那你干什么呢?” “看世界杯呀,笨蛋!” “@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很 ...

  2. model form

    ModelForm 能允许我们通过一个 Model 直接创建一个和该模型的字段一一对应的表单,大大方便了表单操作. 下面来看一个例子. 首先我们有这样的 model: from django.db i ...

  3. CentOS7主机名的查看和修改

    CentOS7主机名的查看和修改 在CentOS7中,有三种定义的主机名: 静态的(Static hostname) "静态"主机名也称为内核主机名,是系统在启动时从/etc/ho ...

  4. 浅显易懂的前端知识点(二)——HTTP协议基础

    HTTP 协议的初印象: 是基于 TCP/IP 协议的应用层协议,不涉及数据包的传输,主要规定了客户端和服务器之间的通信格式,默认使用 80 端口. 1 HTTP 协议 0.9 版(1991 年) 是 ...

  5. python之路:day2

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  6. Java8新特性一点通 | 回顾文件操作和watchService文件变更监视操作

    文件操作 WatchService 文件操作 今天重温了一些文件操作: - Files.list() 遍历文件和目录 //List all files and sub-directories usin ...

  7. js实现表单的提交

    <form action="" method="post" name="form"> <tr>           ...

  8. 6.场景4:使用VRRP(L3HA)和Open vSwitch提供高可用性

    此场景描述了使用ML2插件和Open vSwitch(OVS)实现OpenStack网络服务的高可用性实现. 该高可用性实施方案增加了以下情景:带有虚拟路由器冗余协议(VRRP)的Open vSwit ...

  9. java设计模式5——适配器模式

    java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ...

  10. random模块学习笔记

    import random #生成随机浮点数(0到1,没有参数) rf1= random.random() #生成随机浮点数(指定区间) rf2=random.uniform(1,4) #浮点数保留指 ...