Elastic:为Kubernetes添加LoadBalancer
在之前的文章“在Kubernetes多节点集群部署Elastic Stack”,我们详细地介绍了如何部署Kubernetes及在它的上面部署Elastic Stack。在今天的文章中,我来讲述一下如何为自己的本地Kubernetes部署一个LoadBalancer,虽然这个在很多的云服务上已经是一个标配。在今天的展示中,我们将使用一个开源的LoadBalance Metallb。
安装
我们首先进入到https://metallb.universe.tf/installation/,并按照上面讲解的办法进行安装。我们首先运用指南中的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)
aaa@qq.com:~$ echo $PASSWORD
k9grnwhtsqp2nnhxc7r9zphn
请注意上面的命令必须是在kmaster的VM中运行:
当我输入正确的用户名及密码后,我们可以进入到Kibana界面:
至此,我们的LoadBalance的工作已经完成。