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/profile
Este 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-9wwbt
es 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
复制代码
现在是第一个应用安装完成了,pod名称test-k8s的应用就是我安装的应用,它命名空间是default的,跟其他的不同。
查看所有Node
kubectl get node --all-namespaces
复制代码
跟上个命令一样的,改了一个地方
安装第一个应用
制作镜像
安装应用就应该写一个yaml文件,和一个可用的镜像,我参考的是B站的广州云科
的视频教程,但是他的测试的应用是基于X86平台的,镜像直接运行报错如下:
所以只有自己重新制作镜像,先找到项目地址:test-k8s 把代码全部克隆到树莓派机器上:
要弄一个镜像仓库提供给集群拉取,然后我自己测试使用的阿里云的容器镜像服务,要设置成开放的仓库,允许所有的人拉取这个镜像
别人的DockerFile已经写好了我们直接使用docker build命令打包镜像(现在为了重新推送测试,我把所有镜像都和容器删掉) 主要根据阿里云的教程就行了,如下:
打包&推送到阿里云
先本地打包,打包镜像名为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
复制代码
到现在这个镜像就在阿里云的容器镜像服务中了,镜像地址为: 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版本
kind
:控制器类型,集群里面的所有资源都被k8s高度抽象化,kind就是表明这些资源的类型,Deployment
就是一个定义一个多副本的无状态资源对象。
name: test-k8s
:指定资源控制器的名字为test-k8s replicas
:初始化指定的pod的个数 matchLabels
:选择器标签,要用其他资源控制指定这个资源的时候用这个标签值
template
这个字段下面就是包含这个pod的相关数据,app: test-k8s
指定pod的名字,image
pod的镜像拉取地址,requests
申请的CPU资源,0.1m等于0.1个CPU资源。
部署应用
kubectl apply -f testapp.yaml
复制代码
这时候就有3个pod了 可以使用 kubectl get pod -o wide
查看pod详细信息,主要是看下IP:
kubectl get pod -o wide
复制代码
登录其中一个pod访问另一个pod试试(这里是进入第一个pod访问第二个pod):
kubectl exec -it test-k8s-68b9f5c6c7-hn25x -- bash
curl 10.244.1.173:8080
复制代码
效果如图: 可以看到输出了正确的pod得名称
但是这时候只能在pod之前进行互相访问,上篇文章有说pod可以一个单独的物理机,共用一个网络,要供集群外访问就要新建一个另外的资源,下面接着说。
新建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
复制代码
测试效果
这个机器的内网IP为192.168.2.187,刚才设置的端口为31000
动态扩缩容
安装资源指标查看工具
使用动态扩缩容之前需要安装一个资源指标获取工具,用来监控集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和运行内存资源占用情况
安装水平自动伸缩服务
控制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 scaleTargetRef
usan para especificar qué recursos monitorear, minReplicas
especificar el número mínimo de réplicas y maxReplicas
especificar el número de réplicas. Este mínimo el número de réplicas anulará la definición inicial de réplicas. Cantidad, targetCPUUtilizationPercentage
especifique 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.yaml
Instale este controlador de escalado automático usando
También puede kubectl get hpa
ver el estado básico de este controlador de escalado automático horizontal usando
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,pod
monitoreo en tiempo real de escalado automático y parámetros detallados de la cantidad de pods
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.
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í.