使用Helm部署MetalLB并使用LoadBalancer

你好。
我是Class Act公司基础设施事业部的大塚。

在之前的文章中,我们已经在kubetnetes集群上部署了Helm。这一次,我想通过使用Helm来部署MetalLB,以便能够使用LoadBalancer。
以下是之前文章的链接。

 

此外,我们正在使用不使用Helm的MetalLB部署方法进行实施。即使我忘记了做过什么,也不能说出来。

 

MetalLB是什么

希望您能點擊以下連結,以便查看我在文章中提供的清晰引用來源。

 

建立形象

我們將建構的映像如下所示:
在k8s集群中建立metal-lb命名空間和wp命名空間,並在metal-lb命名空間中部署metallb相關的pod和service。然後,我們將在wp命名空間中部署所需的WordPress環境。

k8s_3-ページ11.drawio.png

参考网站

 

环境建设

创建命名空间

使用以下命令创建命名空间。

root@k8s-master:~/yaml/configmap# kubectl create ns metal-lb
namespace/metal-lb created
root@k8s-master:~/yaml/configmap# kubectl create ns wp
namespace/wp created
root@k8s-master:~/yaml/configmap# kubectl get ns
NAME              STATUS   AGE
default           Active   21d
kube-node-lease   Active   21d
kube-public       Active   21d
kube-system       Active   21d
metal-lb          Active   14s
observability     Active   7d5h
wp                Active   6s

MetalLB的部署

使用Helm部署MetalLB。
添加MetalLB的存储库后,进行部署。
通过使用–namespace选项,它将在指定的namespace中进行部署。

root@k8s-master:~/yaml/metal-lb# helm ls
NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION

root@k8s-master:~/yaml/metal-lb# helm repo add metallb https://metallb.github.io/metallb
root@k8s-master:~/yaml/metal-lb# helm install metallb metallb/metallb --namespace metal-lb
NAME: metallb
LAST DEPLOYED: Sat Jul  1 14:01:52 2023
NAMESPACE: metal-lb
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
MetalLB is now running in the cluster.

Now you can configure it via its CRs. Please refer to the metallb official docs
on how to use the CRs.

我将检查Pod和Service。
Speaker和Controller的角色如下所示。由于我的K8s环境由7台构成,因此会有7个Speaker Pod。
Speaker:在所有节点上运行的Pod。确保MetalLB服务的可访问性。
Controller:负责管理和分配IP地址。

root@k8s-master:~/yaml/metal-lb# kubectl get pod,svc -n metal-lb 
NAME                                      READY   STATUS    RESTARTS   AGE
pod/metallb-controller-5cd9b4944b-hdbkj   1/1     Running   0          34s
pod/metallb-speaker-k84gr                 4/4     Running   0          34s
pod/metallb-speaker-pvc82                 4/4     Running   0          34s
pod/metallb-speaker-pzqdg                 4/4     Running   0          34s
pod/metallb-speaker-s7vk2                 4/4     Running   0          34s
pod/metallb-speaker-t86kq                 4/4     Running   0          34s
pod/metallb-speaker-xsgsf                 4/4     Running   0          34s
pod/metallb-speaker-zfptn                 4/4     Running   0          34s

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/metallb-webhook-service   ClusterIP   10.109.95.209   <none>        443/TCP   35s

定义MetalLB的地址池

MetalLB定义了用于向负载均衡器分配地址的地址池。
准备以下的yaml文件。在本例中,将使用192.168.2.45~49的地址范围。

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default
  namespace: metal-lb
spec:
  addresses:
  - 192.168.2.45-192.168.2.49
  autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default
  namespace: metal-lb
spec:
  ipAddressPools:
  - default

我要部署这个。

root@k8s-master:~/yaml/configmap# kubectl apply -f metallb-config.yaml
ipaddresspool.metallb.io/default created
l2advertisement.metallb.io/default created

部署相关的WordPress应用

准备四个YAML文件。

apiVersion: v1 
kind: Pod 
metadata: 
  name: wordpress-pod 
  namespace: wp
  labels: 
    app: wordpress  
spec: 
  containers: 
    - name:  wordpress-con 
      image: wordpress:php8.1-apache 
      ports: 
      - containerPort: 80 
      env: 
      - name: WORDPRESS_DB_HOST 
        value: mysql-clusterip 
      - name: WORDPRESS_DB_USER 
        value: devuser 
      - name: WORDPRESS_DB_PASSWORD 
        value: password 
      - name: WORDPRESS_DB_NAME 
        value: gke-wordpress-database
apiVersion: v1 
kind: Pod 
metadata: 
  name: mysql-pod  
  namespace: wp
  labels: 
    app: mysql  
spec: 
  containers: 
    - name:  mysql-con  
      image: mysql:8.0-debian 
      ports:  
      - containerPort: 3306  
      env: 
      - name: MYSQL_USER 
        value: devuser 
      - name: MYSQL_PASSWORD  
        value: password  
      - name: MYSQL_ROOT_PASSWORD  
        value: password  
      - name: MYSQL_DATABASE 
        value: gke-wordpress-database
apiVersion: v1  
kind: Service  
metadata:  
  name: mysql-clusterip 
  namespace: wp
spec:  
  selector:  
    app: mysql  
  type: ClusterIP  
  ports:  
  - name: mysql  
    port: 3306  
    protocol: TCP  
    targetPort: 3306
apiVersion: v1 
kind: Service 
metadata: 
  name: wordpress-loadbalancer 
  namespace: wp 
spec: 
  type: LoadBalancer 
  selector: 
    app: wordpress
  ports: 
  - protocol: TCP 
    port: 60000 
    targetPort: 80

我們將進行部署。

root@k8s-master:~/yaml/wp# kubectl apply -f mysql-clusterip.yaml
service/mysql-clusterip created
root@k8s-master:~/yaml/wp# kubectl apply -f mysql-pod.yaml
pod/mysql-pod created
root@k8s-master:~/yaml/wp# kubectl apply -f wordpress-loadbalancer.yaml
service/wordpress-loadbalancer created
root@k8s-master:~/yaml/wp# kubectl apply -f wordpress-pod.yaml
pod/wordpress-pod createdz

我要确认部署已经完成。
我要确认Pod已经处于运行状态,并且通过MetalLB分配的IP地址已经附加到LoadBalancer的EXTERNAL-IP上。

root@k8s-master:~/yaml/wp# kubectl get pod,svc -n wp
NAME                READY   STATUS    RESTARTS   AGE
pod/mysql-pod       1/1     Running   0          52s
pod/wordpress-pod   1/1     Running   0          39s

NAME                             TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)           AGE
service/mysql-clusterip          ClusterIP      10.96.152.58    <none>         3306/TCP          58s
service/wordpress-loadbalancer   LoadBalancer   10.105.94.140   192.168.2.45   60000:31847/TCP   45s
fegfeihudhwj.png
广告
将在 10 秒后关闭
bannerAds