Use el clúster k8s creado por Raspberry Pi para implementar la primera aplicación e intente expandir y reducir dinámicamente la capacidad

Resumen

El año pasado, usé Raspberry Pi para construir un clúster k8s. No sabía mucho sobre esto en ese momento, así que solo construí un clúster simple, instalé complementos de red, solo un tablero simple y no implementé ningún Aplicaciones Enlaces a artículos anteriores: Enséñele cómo usar Raspberry Pi 4B para construir un clúster k8s

Recientemente, por capricho, hice un nuevo chasis con bloques de construcción para probar e implementar una aplicación. Hoy resumiré todos los procesos y problemas que he experimentado recientemente para su referencia.

Manejo de problemas previos

Sustitución de complementos de red

En el último artículo se decía que se instaló el plug-in de red colico, es decir recientemente se encontró que el plug-in pod de colico no arrancaba, después de intentarlo por mucho tiempo sin éxito solo lo reinstalé, y lo instalé de acuerdo al tutorial anterior, solo se puede reinstalar el plug-in fannel.

eliminar el complemento web

Retire primero el complemento de red

kubectl delete -f calico.yaml
复制代码

En este punto, queda una tarjeta de red virtual tunl0, puede usar ifconfig para verla y desinstalarla, porque lo intenté muchas veces y combiné muchos comandos de shell en un solo comando, que puede modificarse de acuerdo con su situación real:

ifconfig tunl0 down;ip link delete tunl0;rm -f /etc/cni/net.d/*;kubectl delete -f calico.yaml;systemctl start kubelet; systemctl start docker
复制代码

Restablecimiento de clúster

Ejecute el comando de inicialización del clúster en 3 máquinas:

kubeadm reset
复制代码

Tres máquinas eliminan los archivos de configuración:

rm -rf $HOME/.kube;rm -rf /etc/cni/net.d
复制代码

Reinicie docker y kubelet, y las reglas del firewall se borrarán:

systemctl daemon-reload;systemctl stop kubelet; systemctl stop docker; iptables --flush; iptables -tnat --flush;systemctl start kubelet; systemctl start docker
复制代码

Instalación de clúster

Al igual que en el artículo anterior, la instalación del nodo maestro no se describirá en detalle aquí.

sudo kubeadm init --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.20.0 --apiserver-advertise-address=192.168.2.181 --pod-network-cidr=192.168.0.0/16 --ignore-preflight-errors=all
复制代码

Comando de unión de nodo de nodo

kubeadm join 192.168.2.181:6443 --token jqll23.kc3nkji7vxkaefro  --discovery-token-ca-cert-hash sha256:1b475725b680ed8111197eb8bfbfb69116b38a8d2960d51d17af69188b6badc2 --ignore-preflight-errors=all 
复制代码

Ver todos los comandos de Nodo:

kubectl get pods --all-namespaces
复制代码

A veces, se informará un error cuando se ejecute el comando después de que la máquina se reinicie: Se rechazó la conexión con el servidor localhost: 8080. ¿Especificó el host o puerto correcto?
Solución: Razón: el maestro de kubernetes no está vinculado a la máquina, y el clúster no está vinculado cuando se inicializa El problema se puede resolver configurando la variable de entorno en la máquina local en este momento.

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile

source /etc/profile
复制代码

source /etc/profileEste problema se puede resolver completamente colocándolo en un script que se ejecuta automáticamente al inicio

Error de ejecución del pod, verifique el registro

Lo he intentado muchas veces y, a menudo, el pod no se ejecuta correctamente después de instalar el complemento de red. Puede usar el siguiente comando para ver el motivo del registro:

kubectl logs -f test-k8s-68bb74d654-9wwbt -n kube-system
复制代码

test-k8s-68bb74d654-9wwbtes el nombre del pod específico

Instalar complemento de red

Usa el archivo yaml oficial

curl -sSL https://raw.githubusercontent.com/coreos/flannel/v0.12.0/Documentation/kube-flannel.yml | kubectl apply -f -*
复制代码

没想到直接成功了,之前都是无法连接10.1244.***.**的报错.

查看所有pod

kubectl get pods --all-namespaces
复制代码

imagen.png 现在是第一个应用安装完成了,pod名称test-k8s的应用就是我安装的应用,它命名空间是default的,跟其他的不同。

查看所有Node

kubectl get node --all-namespaces
复制代码

跟上个命令一样的,改了一个地方 imagen.png

安装第一个应用

制作镜像

安装应用就应该写一个yaml文件,和一个可用的镜像,我参考的是B站的广州云科的视频教程,但是他的测试的应用是基于X86平台的,镜像直接运行报错如下:

c33c444a5e810da7fb889eb3358874b.png

所以只有自己重新制作镜像,先找到项目地址:test-k8s 把代码全部克隆到树莓派机器上:

image.png 要弄一个镜像仓库提供给集群拉取,然后我自己测试使用的阿里云的容器镜像服务,要设置成开放的仓库,允许所有的人拉取这个镜像

image.png 别人的DockerFile已经写好了我们直接使用docker build命令打包镜像(现在为了重新推送测试,我把所有镜像都和容器删掉) 主要根据阿里云的教程就行了,如下:

image.png

打包&推送到阿里云

先本地打包,打包镜像名为k8s,-t为镜像标签的简写,tag的意思。可以在构建中设置多个标签

docker build -t test-k8s .
复制代码

镜像打一个新tag

docker tag test-k8s:latest registry.cn-shenzhen.aliyuncs.com/koala9527/testapp:latest
复制代码

推送

docker push registry.cn-shenzhen.aliyuncs.com/koala9527/testapp:latest
复制代码

image.png

到现在这个镜像就在阿里云的容器镜像服务中了,镜像地址为: registry.cn-shenzhen.aliyuncs.com/koala9527/testapp:latest

写第一个应用的yaml文件

文件名testapp.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  # 部署名字
  name: test-k8s
spec:
  replicas: 3
  # 用来查找关联的 Pod,所有标签都匹配才行
  selector:
    matchLabels:
      app: test-k8s
  # 定义 Pod 相关数据
  template:
    metadata:
      labels:
        app: test-k8s
    spec:
      # 定义容器,可以多个
      containers:
      - name: test-k8s # 容器名字
        image: registry.cn-shenzhen.aliyuncs.com/koala9527/testapp:v1  # 镜像
        resources:
          requests:
            cpu: 100m
复制代码

这里稍微解释复习一下这些资源描述文件中字段得意思,虽然上篇文章也有解释
apiVersion:api版本,我的理解就是资源控制的相关版本控制,k8s里的功能在高速迭代,不同的资源控制器使用不同的api版本,不同版本集群支持的api不同,写的yaml文件需要配合真实的集群环境,资源控制器类型就是用kind字段指定。

可以使用kubectl api-versions查看集群的api版本 image.png

kind:控制器类型,集群里面的所有资源都被k8s高度抽象化,kind就是表明这些资源的类型,Deployment就是一个定义一个多副本的无状态资源对象。
name: test-k8s :指定资源控制器的名字为test-k8s replicas:初始化指定的pod的个数 matchLabels:选择器标签,要用其他资源控制指定这个资源的时候用这个标签值
template这个字段下面就是包含这个pod的相关数据,app: test-k8s指定pod的名字,imagepod的镜像拉取地址,requests申请的CPU资源,0.1m等于0.1个CPU资源。

部署应用

kubectl apply -f testapp.yaml
复制代码

这时候就有3个pod了 image.png 可以使用 kubectl get pod -o wide查看pod详细信息,主要是看下IP:

 kubectl get pod -o wide
复制代码

image.png

登录其中一个pod访问另一个pod试试(这里是进入第一个pod访问第二个pod):

kubectl exec -it test-k8s-68b9f5c6c7-hn25x -- bash
curl 10.244.1.173:8080
复制代码

效果如图: image.png 可以看到输出了正确的pod得名称
但是这时候只能在pod之前进行互相访问,上篇文章有说pod可以一个单独的物理机,共用一个网络,要供集群外访问就要新建一个另外的资源,下面接着说。

微信截图_20220404212645.png

新建service资源控制器

yaml文件

service的特性:

  • Service 通过 label 关联对应的 Pod
  • Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP
  • 提供了负载均衡功能,自动转发流量到不同 Pod
  • 可对集群外部提供访问端口
  • 集群内部可通过服务名字访问

所有的资源都是通过yaml文件描述,写一个描述servie的yaml文件,文件名为service.yaml

apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    app: test-k8s
  type: NodePort  
  ports:
    - port: 8080        # 本 Service 的端口,内部访问
      targetPort: 8080  # 容器端口,也就是test-k8s这个应用的
      nodePort: 31000 #暴露出集群的端口

复制代码

值得说的是service这个资源控制的中type这个关键字类型,这里指定的是NodePort类型,在每个Node上开放一个端口,可以访问,如果不指定这个type,默认的类型就是ClusterIp,这个就是不允许集群外访问的,只允许集群内部访问,其他还有LoadBalance类型,负载均衡的意思,一般是云厂商提供的这个资源类型,不常见。

还要注意NodePort暴露的端口固定范围为: 30000-32767

应用Service:

和应用Deployment一样:

kubectl apply -f service.yaml
复制代码

查看k8s中Service资源

kubectl get svc
复制代码

image.png

测试效果

这个机器的内网IP为192.168.2.187,刚才设置的端口为31000

image.png

动态扩缩容

安装资源指标查看工具

使用动态扩缩容之前需要安装一个资源指标获取工具,用来监控集Node,Pod资源占用CPU,运行内存情况,名为metrics-server,集群默认不会安装这个,安装十分简单,在官方的GitHub下载安装:

wget <https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml>
kubectl apply -f components.yaml
复制代码

后面出错了,其相关pod不能启动,需要替换yaml文件内的一段内容,替换成如下,具体原因不清楚:

接下里就可以使用top命令查看pod和node CPU和运行内存资源占用情况 image.png

安装水平自动伸缩服务

控制pod的动态扩缩容又是一个资源控制器,叫HorizontalPodAutoscaler,字面意思是水平自动伸缩,跟service.yaml一样简单,文件名:hpa.yaml

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  namespace: default
  name: test-k8s-scaler
  labels:
    app: test-k8s-scaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-k8s
  minReplicas: 2
  maxReplicas: 100
  targetCPUUtilizationPercentage: 45

复制代码

Los datos en los metadatos del controlador de escalado automático horizontal representan la información básica del controlador. Los datos en el espacio se scaleTargetRefusan para especificar qué recursos monitorear, minReplicasespecificar el número mínimo de réplicas y maxReplicasespecificar el número de réplicas. Este mínimo el número de réplicas anulará la definición inicial de réplicas. Cantidad, targetCPUUtilizationPercentageespecifique el indicador de CPU cuando se activa el escalado, k8s tiene un algoritmo complejo (se explica brevemente en el libro "Kubernetes en acción") y observará el uso de recursos de estos pods a ciertos intervalos para ajustar automáticamente, aquí experimento Siempre que el uso de la CPU del pod supere el 45%, la estrategia de expansión se activará para la expansión y se pueden especificar otros indicadores para monitorear, pero generalmente la CPU y la memoria en ejecución.

kubectl apply -f hpa.yamlInstale este controlador de escalado automático usando

También puede kubectl get hpaver el estado básico de este controlador de escalado automático horizontal usando

image.png

Autoescalado con AB Stress Test

Dirección de descarga Descargue directamente en Windows, descomprímalo y luego ingrese al directorio bin para ejecutar el siguiente comando:

./ab.exe -n 10000 -c 100 http://192.168.2.181:31000/
复制代码

Significa un total de solicitudes de 1w, solicitud y ejecución de 100 subprocesos al mismo tiempo, watch kubectl get hpa,podmonitoreo en tiempo real de escalado automático y parámetros detallados de la cantidad de podsimage.png

Unos minutos después de que se complete la solicitud, la cantidad de pods volverá a 2 y todas las pruebas se completarán en este momento.

微信截图_20220404212522.png

Resumir

La aplicación de demostración se puede implementar en el clúster. Todo el proceso no es complicado y no hay una característica compleja que queme el cerebro. La expansión y contracción horizontal en K8 es el lugar más atractivo para mí, así que después de que la aplicación se implemente con éxito, el primer paso es tratar de lograr esto. La función está lista, y luego usaré Gitlab para implementar automáticamente la aplicación para CI/CD real. No es necesario escribir comandos manualmente. Envíe el código para fusionar la rama para activar el comando de implementación, o intente instalar otras aplicaciones que puedan proporcionar servicios reales para usarlo. Realmente funciona, gracias a todos por ver aquí.

Supongo que te gusta

Origin juejin.im/post/7082743804272312333
Recomendado
Clasificación