在之前的文章 “在 Kubernetes 多节点集群部署 Elastic Stack”,我们详细地介绍了如何部署 Kubernetes 及在它的上面部署 Elastic Stack。在今天的文章中,我来讲述一下如何为自己的本地 Kubernetes 部署一个 LoadBalancer,虽然这个在很多的云服务上已经是一个标配。在今天的展示中,我们将使用一个开源的 LoadBalance Metallb

安装

我们首先进入到 MetalLB, bare metal load-balancer for Kubernetes,并按照上面讲解的办法进行安装。我们首先运用指南中的 manifest:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml

经过实践,上面的两个网址不能被正常访问。我们可以通过一些方法下载下来,并存于之前教程中所述的 kmaster 目录中:

$ pwd
/Users/liuxg/vms/kmaster
liuxg:kmaster liuxg$ ls metall*
metallb_namespace.yaml metallb.yaml

在上面,我们已经下载好所需要的两个文件了。我们接着执行如下的命令:

kube-shell> kubectl apply -f metallb_namepsace.yaml
error: the path "metallb_namepsace.yaml" does not exist
kube-shell> kubectl apply -f metallb_namespace.yaml
namespace/metallb-system created
kube-shell> kubectl apply -f metallb.yaml
podsecuritypolicy.policy/controller created
podsecuritypolicy.policy/speaker created
serviceaccount/controller created
serviceaccount/speaker created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
role.rbac.authorization.k8s.io/config-watcher created
role.rbac.authorization.k8s.io/pod-lister created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/config-watcher created
rolebinding.rbac.authorization.k8s.io/pod-lister created
daemonset.apps/speaker created
deployment.apps/controller created

 我们可以通过如下的方法来显示所有的 namespace:

kubectl get ns
NAME                   STATUS   AGE
default                Active   3d17h
elastic-system         Active   3d16h
kube-node-lease        Active   3d17h
kube-public            Active   3d17h
kube-system            Active   3d17h
kubernetes-dashboard   Active   3d17h
metallb-system         Active   90s

在上面,我们可以看到有一个新的 namespace metallb-system 已经被创建了。我们可以通过如下的命令查看一下在这个 namespace下有什么资源:

 kubectl get all -n metallb-system
NAME                              READY   STATUS                       RESTARTS   AGE
pod/controller-5f875c554f-87nwp   1/1     Running                      0          2m26s
pod/speaker-48qn9                 0/1     CreateContainerConfigError   0          2m26s
pod/speaker-7sbr9                 0/1     CreateContainerConfigError   0          2m26s



NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
daemonset.apps/speaker   2         2         0       2            0           beta.kubernetes.io/os=linux   2m26s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           2m26s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-5f875c554f   1         1         1       2m26s

我们可以看到有一个 controller 及两个 speaker。因为我们有两个 node,所以显示有两个 speaker。在我的另外一个配置中,我创建了一个master及两个worker,那么就会有3个 speaker。上面显示有一个错误 CreateContainerConfigError。这是什么原因呢?我们查看一下文档,我们可以看到,我们还需要做如下的这个部分:

# On first install only
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

运行上面的指令,然后我们再次查看:

kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-5f875c554f-87nwp   1/1     Running   0          6m5s
pod/speaker-48qn9                 1/1     Running   0          6m5s
pod/speaker-7sbr9                 1/1     Running   0          6m5s



NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
daemonset.apps/speaker   2         2         2       2            2           beta.kubernetes.io/os=linux   6m5s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           6m5s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-5f875c554f   1         1         1       6m5s

这次显示我们所有的情况都正常。也就是说我们的 LoadBalancer 已经部署正常了。为了能够使得我们的 LoadBalancer 能够正常工作,我们还需要对它做一些配置的工作。还记得我们之前的 Kubernetes 的 --pod-network-cidr IP 地址范围吗?我们在命令行中打入如下的命令来定义我们想要的 IP 地址范围:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 10.2.14.240-10.2.14.250
EOF

 我们可以通过如下的方法来查看配置 ConfigMap 的情况:

$ kubectl describe ConfigMap config -n metallb-system
Name:         config
Namespace:    metallb-system
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","data":{"config":"address-pools:\n- name: default\n  protocol: layer2\n  addresses:\n  - 10.2.14.240-10.2.14.250\n"},"k...

Data
====
config:
----
address-pools:
- name: default
  protocol: layer2
  addresses:
  - 10.2.14.240-10.2.14.250

Events:  <none>

这样 LoadBalancer 的配置工作就完成了。

kube-shell> cat <<EOF | kubectl apply -f -
            apiVersion: v1
            kind: ConfigMap
            metadata:
              namespace: metallb-system
              name: config
            data:
              config: |
                address-pools:
                - name: default
                  protocol: layer2
                  addresses:
                  - 10.2.14.240-10.2.14.250
            EOF
configmap/config created

运用 LoadBalancer 到 Elastic Stack 服务中

接着我们可以在我们的 Elastic Stack 中来实践刚刚安装好的 LoadBalancer。我们使用如下的命令来查看我们所有的服务:

kubectl get svc
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes              ClusterIP   10.96.0.1        <none>        443/TCP          3d17h
quickstart-es-default   ClusterIP   None             <none>        <none>           3d16h
quickstart-es-http      NodePort    10.111.1.15      <none>        9200:31308/TCP   3d16h
quickstart-kb-http      NodePort    10.109.179.162   <none>        5601:31249/TCP   2d23h

上面显示我们有一个叫做 quickstart-kb-http 的服务。我们使用如下命令来对它进行修改:

修改完后进行保存。

我们重新来查看我们的服务:

kube-shell> kubectl get svc
NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes              ClusterIP      10.96.0.1        <none>        443/TCP          3d18h
quickstart-es-default   ClusterIP      None             <none>        <none>           3d17h
quickstart-es-http      NodePort       10.111.1.15      <none>        9200:31308/TCP   3d17h
quickstart-kb-http      LoadBalancer   10.109.179.162   10.2.14.240   5601:31282/TCP   2d23h

上面显示我们的服务已经改为 LoadBalancer 了,而且我们可以看到一个被分配的 External-IP 地址 10.2.14.240。这个刚好是在我们之前定义的IP地址范围之内。

接着,我们在 Host 机器的 /etc/hosts 文件中加入如下的一句:

10.2.14.240     logserver.com

打开我们的浏览器,并在 Chrome 浏览器地址栏中输入地址 https://logserver.com:5601 :

我们打入 thisisunsafe:

提示需要我们输入用户名及密码。我们按照之前学到方法输入用户名 elastic 及密码:

PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)

echo $PASSWORD
$ PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)
vagrant@kmaster:~$ echo $PASSWORD
k9grnwhtsqp2nnhxc7r9zphn

请注意上面的命令必须是在 kmaster 的 VM 中运行:

当我输入正确的用户名及密码后,我们可以进入到 Kibana 界面:

至此,我们的 LoadBalance 的工作已经完成。

Logo

开源、云原生的融合云平台

更多推荐