k8s+kubeedge+sedna proceso de instalación + guía para evitar pits + solución

Recientemente, necesito usar kubeedge para aprender computación perimetral. Después de instalarlo muchas veces, siempre encuentro varios problemas, por lo que los enumeraré aquí para la comodidad de la próxima instalación. Hay demasiados posibles errores en él, si tiene alguna pregunta, contácteme por mensaje privado.

1. Preparación ambiental

nodo IP ambiente software
nodo de nube 172.23.70.235 Centos7 (> 2 núcleos 4g) kubernetes+cloudcore
nodo de borde 172.23.70.34 Centos7 (> 2 núcleos 4g) kubeedge (núcleo de borde)

2. Instrucciones de instalación

  1. Por simplicidad y conveniencia, esta instalación solo requiere un nodo de nube k8s, un nodo de borde kubeedge y dos servidores
  2. k8s solo necesita instalarse en el nodo principal, no en los nodos perimetrales
  3. Ambos servidores en el lado de la nube necesitan instalar Docker
  4. Calico solo necesita instalarse en el maestro, que es un complemento para la comunicación del nodo. Sin esto, los núcleos de kubeedge instalados en el maestro informarán un error. Sin embargo, no es necesario instalarlo en el nodo, porque kubeedge ha creado su propio mecanismo de comunicación para esto.
  5. Algunos complementos, como calico, edgemesh, sedna, metric-service y kuborad, etc., se inician a través de archivos yaml, por lo que la descarga real es la herramienta de control k8s kubeadm y la herramienta de control kubeedge keadm. Luego, prepare el archivo yaml con anticipación, después de iniciar k8s y kubeedge, créelo directamente de acuerdo con el contenedor del archivo yaml
  6. Para comprender los conceptos de imagen, contenedor, pod, etc., puede consultar esta dirección para el inicio rápido de k8s, y hay un video: ( K8S) introducción de inicio rápido: https://k8s.easydoc.net/ docs/dRiQjyTY/28366845/6GiNOzyZ/9EX8Cp45
  7. Comprender las instrucciones básicas de k8: uso básico de herramientas de tiempo de ejecución de contenedores
  8. Si encuentra problemas, debe leer los registros del contenedor con paciencia, leer los documentos oficiales con paciencia y visitar más la comunidad de github. La mayoría de los problemas que encuentre también se pueden encontrar, y creo que encontrará las respuestas que desea.

3. Instalación del nodo maestro k8s

3.1 Requisitos previos

Después de preparar el entorno anterior, inicie la instalación. Aquí, nuestro centos usa centos 7.9. Las diferentes versiones del sistema tienen un mayor impacto en k8s, dependiendo de la situación real. Algunos también necesitan actualizar el kernel del sistema.
Las siguientes operaciones solo se realizan en el nodo maestro k8s . Para evitar confusiones, otras operaciones que deben realizarse en el nodo perimetral se realizarán en el siguiente nodo.

Requisitos de configuración del sistema: 2c 2g 20g o más, y la CPU debe tener al menos 2 núcleos, de lo contrario, la inicialización de k8s no tendrá éxito. Se recomienda que la memoria del nodo maestro sea de 4g

Hay muchas formas de instalar k8s:

  1. Use minikube para instalar un clúster de un solo nodo para realizar pruebas
  2. Use la herramienta kubeadm: la forma en que la usamos (entorno de desarrollo, menos máquinas (menos de docenas))
  3. Utiliza kubespray, la herramienta oficial proporcionada por Google
  4. Manual completo: instalación binaria (operación y mantenimiento)
  5. Instalación totalmente automática: rancher, kubesphere (entorno de producción a gran escala, cientos de máquinas, diez mil máquinas)

La salud de k8s va a depender de algunos puertos, para no causar problemas de red abrimos los siguientes puertos en la máquina virtual (maestra):

  1. 6443 principal
  2. 2379
  3. 2380

Preparación del entorno 3.2 k8s

  • 1. Configuración del nombre de host
    (para configurar el nombre de host local, debemos configurar el nombre de host en "k8s-master", que coincide con los hosts)
# 设置当前机器的hostname
hostnamectl set-hostname k8s-master
# 查看当前机器hostname
hostname
  • 2. configuración de hosts
vim /etc/hosts

172.23.70.235 k8s-master
172.23.70.34 kubeedge
  • 3. Instalación del paquete de dependencia básico
# 基础依赖包安装
 yum -y install wget vim net-tools ntpdate  bash-completion

# 系统时钟同步
# 向阿里云服务器同步时间
ntpdate time1.aliyun.com
# 删除本地时间并设置时区为上海
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 查看时间
date -R || date
  • 4. Desactivar el cortafuegos y selinux
 systemctl stop firewalld
 systemctl disable firewalld
 sed -i 's/enforcing/disabled/' /etc/selinux/config
 setenforce 0

  • 5. Cerrar intercambio
# 临时关闭Swap
swapoff -a
# 修改 /etc/fstab 删除或者注释掉swap的挂载,可永久关闭swap
sed -i '/swap/s/^/#/' /etc/fstab
# 修改完后我们检测以下,看最后一行swap 都是0 就成功了
free -m
#----------------start----------------------
              total        used        free      shared  buff/cache   available
Mem:           1837         721          69          10        1046         944
Swap:             0           0           0
#-----------------end---------------------

  • 6. Puente de filtrado
# 网桥过滤
vim /etc/sysctl.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward=1
net.ipv4.ip_forward_use_pmtu = 0

# 生效命令
sysctl --system
# 查看效果
sysctl -a|grep "ip_forward"

  • 7. Habilite ipvs
    A partir de la versión 1.8 de kubernetes, kube-proxy ha agregado soporte para ipvs, los problemas de rendimiento y seguimiento son mejores que iptable) ------ Este paso es opcional, si no se ejecuta, iptables se usará de manera predeterminada
# 安装IPVS
yum -y install ipset ipvsdm
# 编译ipvs.modules文件
vi /etc/sysconfig/modules/ipvs.modules
# 文件内容如下
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# 赋予权限并执行
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules &&lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 重启电脑,检查是否生效
reboot
lsmod | grep ip_vs_rr

3.3 Instalación de la ventana acoplable

  • instalación de fuente de cambio de ventana acoplable
# 安装yum utils
yum install -y yum-utils
# yum docker-ce config 换源
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum -y install docker-ce docker-ce-cli containerd.io
# 启动docker, enable 为必须,k8s会检测docker.service
systemctl enable docker && systemctl start docker


  • El parámetro exec-opts de aceleración de imagen de configuración de Docker está configurado como native.cgroupdriver=systemd, este paso es muy importante, la siguiente dirección de imagen se refiere a Alibaba Cloud.
# 创建docker目录
mkdir -p /etc/docker
# 设置镜像源, exec-opts必须指定否则k8s启动报错(cgroup、systemd)
tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://g6t55xi7.mirror.aliyuncs.com"]
}
EOF
# 重启docke并生效镜像加速
systemctl daemon-reload && systemctl restart docker

3.4 Instalación de Kubernetes

  • Configurar fuente de kubernetes
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

Nota: Aliyuan no sincroniza gpg con el sitio web oficial (debido a que el sitio web oficial no abre el método de sincronización, puede haber casos en los que falle la verificación del índice gpg, use el siguiente comando para instalar) Nota: Aliyuan no sincroniza gpg con el sitio web oficial (debido a que el sitio web oficial no
abre el modo de sincronización, puede haber casos en los que falle la verificación de índice gpg, use el siguiente comando para instalar)

# 检测可用的k8s版本(--nogpgcheck 忽略gpg检测)
yum list --nogpgcheck  --showduplicates kubeadm --disableexcludes=kubernetes
# 找到我们想要安装的版本,并安装--------------这里我们用1.23.8版本,最新版目前是1.24.0 版本安装启用了docker 会有一些问题。
# 安装kubelet、kubeadm、kubectl 组件--- 这里要注意,docker 版本和 k8s版本有关系,尽量使用支持区间的版本
# yum install --nogpgcheck kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8
yum -y install --nogpgcheck kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8

  • Una vez finalizada la instalación, vamos a comprobar
# 检查kubectl version
kubectl version
##########show start############
Client Version: version.Info{
    
    Major:"1", Minor:"20", GitVersion:"v1.23.8", GitCommit:"5575935422cc1cf5169dfc8847cb587aa47bac5a", GitTreeState:"clean", BuildDate:"2021-06-16T13:00:45Z", GoVersion:"go1.15.13", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
###########show end###########
# 检查kubeadm版本
kubeadm version
##########show start############
kubeadm version: &version.Info{
    
    Major:"1", Minor:"20", GitVersion:"v1.23.8", GitCommit:"5575935422cc1cf5169dfc8847cb587aa47bac5a", GitTreeState:"clean", BuildDate:"2021-06-16T12:58:46Z", GoVersion:"go1.15.13", Compiler:"gc", Platform:"linux/amd64"}
##########show end############

  • Inicie el servicio k8s
# 启动k8s服务
systemctl enable kubelet && systemctl start kubelet
# 查看服务状态
systemctl status kubelet

# 如果不指定版本初始化那么会使用最新的k8s,有可能存在的报错信息如下,需要先手动设置下
# 运行初始化后有可能会报错:
#########错误信息--start###########
[init] Using Kubernetes version: v1.24.2
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: E0627 16:44:11.772277   16359 remote_runtime.go:925] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
time="2023-03-27T16:44:11+08:00" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
#########错误信息--end###########
# 解决方案:
vim /etc/containerd/config.toml
# 从disabled_plugins 数组值中删除 "cri"属性
# 重启容器
systemctl restart containerd

  • Inicialización del nodo maestro maestro k8s (solo se ejecuta el nodo maestro; aquí se considera un solo maestro)
# 初始化
kubeadm init  \
--image-repository registry.aliyuncs.com/google_containers  \
--apiserver-advertise-address=172.23.70.235  \
--service-cidr=10.222.0.0/16 \
--pod-network-cidr=10.244.0.0/16


#这里补充以下参数说明
--apiserver-advertise-address=172.23.70.235    这个参数就是master主机的IP地址,例如我的Master主机的IP是:172.23.70.235

--image-repository=registry.aliyuncs.com/google_containers  这个是镜像地址,由于国外地址无法访问,故使用的阿里云仓库地址:registry.aliyuncs.com/google_containers

--service-cidr=10.222.0.0/16       这个参数后的IP地址直接就套用10.222.0.0/16 ,以后安装时也套用即可,不要更改

--pod-network-cidr=10.244.0.0/16       k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,如果不知道怎么配,就先用这个10.244.0.0/16
还可以指定k8s版本,用以下参数即可
--kubernetes-version=v1.23.8   这个参数是下载的k8s软件版本号

总之,只修改master主机IP,k8s软件版本)



# 初始化过程比较长,需要下载一些资源

#---------------打印信息 start---------------------
I0628 15:14:20.293469    5655 version.go:255] remote version is much newer: v1.24.2; falling back to: stable-1.23
[init] Using Kubernetes version: v1.23.8
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local localhost.localdomain] and IPs [10.222.0.1 192.168.56.105]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost localhost.localdomain] and IPs [192.168.56.105 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost localhost.localdomain] and IPs [192.168.56.105 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 4.502756 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.23" in namespace kube-system with the configuration for the kubelets in the cluster
NOTE: The "kubelet-config-1.23" naming of the kubelet ConfigMap is deprecated. Once the UnversionedKubeletConfigMap feature gate graduates to Beta the default name will become just "kubelet-config". Kubeadm upgrade will handle this transition transparently.
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node localhost.localdomain as control-plane by adding the labels: [node-role.kubernetes.io/master(deprecated) node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node localhost.localdomain as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: 4yipfl.er9r8aqnq0hpd8a4
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.23.70.235:6443 --token 4yipfl.er9r8aqnq0hpd8a4 \
        --discovery-token-ca-cert-hash sha256:afa76da3ced528e667374693fb4b0edd160530c251471ae11ece13c65d3d162a

#---------------打印信息 end---------------------

Aquí se añaden las siguientes explicaciones:

nombre del parámetro valor de ejemplo significado
–versión-kubernetes –versión-kubernetes número de versión del software k8s
–apserver-advertise-dirección 172.23.70.235 Este parámetro es la dirección IP del host maestro
–repositorio de imágenes registro.aliyuncs.com/google_containers Esta es la dirección del espejo. Dado que no se puede acceder a las direcciones extranjeras, se usó la dirección del almacén de Aliyun
–servicio-cidr 10.222.0.0/16 La dirección IP después de este parámetro se aplica directamente a 10.222.0.0/16, y también se puede aplicar a futuras instalaciones, no cambie
–pod-red-cidr 10.244.0.0/16 El segmento de IP que puede usar la red entre los nodos de pod dentro de k8s no se puede escribir igual que service-cidr. Si no sabe cómo configurarlo, use este 10.244.0.0/16 primero.

En este punto, la instalación de kubeadm init (nodo principal maestro) está completa.
Todavía es necesario realizar algunos trabajos de acabado. De acuerdo con el indicador de registro de inicio de kubeadm, ejecute el siguiente comando.

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

Luego, podemos realizar una consulta de nodo k8s

# 查询节点
kubectl get nodes

#------------展示信息 start--------------
NAME           STATUS     ROLES                  AGE     VERSION
k8s-master   NotReady   control-plane,master   6m21s   v1.23.8
#------------展示信息 end----------------

En este momento, STATUS es NotReady porque los componentes de la red no se han instalado y los Pods no pueden comunicarse entre sí.

Ver información de Pod debajo de cada espacio de nombres

kubectl get pods --all-namespaces

#------------展示信息 start--------------

NAMESPACE     NAME                                   READY   STATUS    RESTARTS   AGE
kube-system   coredns-6d8c4cb4d-5bjmr                0/1     Pending   0          12m
kube-system   coredns-6d8c4cb4d-7w72l                0/1     Pending   0          12m
kube-system   etcd-k8s-master                        1/1     Running   0          12m
kube-system   kube-apiserver-k8s-master              1/1     Running   0          12m
kube-system   kube-controller-manager-k8s-master     1/1     Running   0          12m
kube-system   kube-proxy-rcsfg                       1/1     Running   0          12m
kube-system   kube-scheduler-k8s-master              1/1     Running   0          12m
#------------展示信息 end----------------

Se puede ver que el pod de los corens del servicio de resolución de NDS todavía está en estado Pendiente y no se está ejecutando, porque los componentes de la red aún no se han instalado.

3.5 Instalación de complementos de red

Instalemos los componentes de red.

  1. Complementos de red comunes

Aquí hay solo una breve explicación, se recomienda usar calico
flannel y calico son complementos de red de uso común.
Calico tiene un mejor rendimiento y escenarios de uso más amplios.
flannel no tiene una política de red y no puede controlar el acceso al pod.
Aquí usamos el complemento calico.

  • instalación de complementos
# calico插件安装
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 插件安装过程较慢,请耐心等待
# 安装后我们查看pod状态,直到 所有 STATUS 为 Running 才启动成功
kubectl get pod --all-namespaces

#----------显示如下 start-------------
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-7bc6547ffb-2bnbh   1/1     Running   0          5m57s
kube-system   calico-node-rnhcv                          1/1     Running   0          5m57s
kube-system   coredns-6d8c4cb4d-5bjmr                    1/1     Running   0          90m
kube-system   coredns-6d8c4cb4d-7w72l                    1/1     Running   0          90m
kube-system   etcd-k8s-master                            1/1     Running   0          91m
kube-system   kube-apiserver-k8s-master                  1/1     Running   0          91m
kube-system   kube-controller-manager-k8s-master         1/1     Running   0          91m
kube-system   kube-proxy-rcsfg                           1/1     Running   0          90m
kube-system   kube-scheduler-k8s-master                  1/1     Running   0          91m
#----------显示如下 end---------------

# 查看k8s node 状态
kubectl get nodes

#----------显示如下 start-------------
k8s-master   Ready    control-plane,master   99m   v1.23.8
#----------显示如下 end---------------

Soporte, la instalación está completa, si es posible, puede tomar una instantánea ahora, porque es probable que las operaciones posteriores cometan errores frecuentes, es un buen hábito hacer más copias de seguridad aquí.
Aquí hay otra información general.

Comandos comunes de 3.6 k8s

# 查看k8s 运行日志命令, 这个比较有用,在k8s 启动、kubeadm init、kubeadm join 阶段可以辅助分析问题。
journalctl -xefu kubelet 
# 查看k8s驱动
systemctl show --property=Environment kubelet |cat
# 重启k8s
systemctl restart kubelet
# 启动k8s
systemctl start kubelet
# 停止k8s
systemctl stop kubelet
# 开机自启k8s
systemctl enable kubelet

# dashboard 获取token
kubectl describe secret admin-user -n kubernetes-dashboard

# kubeadm 重置, 有些时候我们在使用kubeadm init 命令时会报错,我们根据错误提示修复问题后需要重新进行 init 操作,因此需要进行reset重置
kubeadm reset

informacion ambiental

# k8s 安装目录
/etc/kubernetes/

总用量 32
-rw-------. 1 root root 5642 628 15:19 admin.conf
-rw-------. 1 root root 5674 628 15:19 controller-manager.conf
-rw-------. 1 root root 1986 628 15:19 kubelet.conf
drwxr-xr-x. 2 root root  113 628 15:19 manifests
drwxr-xr-x. 3 root root 4096 628 15:19 pki
-rw-------. 1 root root 5618 628 15:19 scheduler.conf

# 组件配置文件目录
/etc/kubernetes/manifests/

总用量 16
-rw-------. 1 root root 2310 628 15:19 etcd.yaml
-rw-------. 1 root root 3378 628 15:19 kube-apiserver.yaml
-rw-------. 1 root root 2879 628 15:19 kube-controller-manager.yaml
-rw-------. 1 root root 1464 628 15:19 kube-scheduler.yaml

# 自定义dashboard yaml文件目录
/opt/kube-dashboard/conf/

总用量 8
-rw-r--r--. 1 root root 1124 629 08:41 admin-user-dashboard.yaml
-rw-r--r--. 1 root root  285 629 08:25 k8s-dashboard.yaml

4. Instalar KubeEdge

¡Aún en el nodo maestro k8s! ! !

  • Versión instalada: v1.12.1
    Como se muestra en la figura a continuación, aquí se instala la relación correspondiente entre las versiones de Kubernetes y Kubeedge.
    inserte la descripción de la imagen aquí

4.1 Instalar keadm

Si la red no es buena, también se puede utilizar la instalación fuera de línea. Descargue los siguientes archivos, enlace de descarga: https://github.com/kubeedge/kubeedge/releases/tag/v1.12.1
la versión debe corresponder, no se equivoque aquí, todos son v1.12.1

inserte la descripción de la imagen aquí
Haga clic derecho para copiar la dirección del enlace (tenga en cuenta la arquitectura) e ingrese en el nodo:

#查看自己的架构
uname -a
# 下载Keadm
wget https://github.com/kubeedge/kubeedge/releases/download/v1.13.0/keadm-v1.13.0-linux-amd64.tar.gz

#解压
tar zxvf keadm-v1.12.1-linux-amd64.tar.gz
#添加执行权限
chmod +x keadm-v1.12.1-linux-amd64/keadm/keadm 
#移动目录
mv keadm-v1.12.1-linux-amd64/keadm/keadm /usr/local/bin/
# 查看keadm是否安装
keadm version

#输出版本信息
version: version.Info{
    
    Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"919ad5378eaca3cb0c666c22a19db01261cbc9a6", GitTreeState:"clean", BuildDate:"2022-11-02T08:22:56Z", GoVersion:"go1.17", Compiler:"gc", Platform:"linux/amd64"}

4.2 Iniciar Cloudcore

Ejecute el siguiente comando para iniciar cloudecode, modifique la siguiente dirección a la dirección de host k8s-master

sudo keadm init --advertise-address=172.23.70.235 --kubeedge-version=1.12.1 

# 查询cloudcore进程,如果查到cloudcore,表明启动成功
ps -ef | grep cloudcore		

aparece el problema:

ejecutar el comando keadm falló: se agotó el tiempo de espera de la condición

Esto se debe a que cloudcore no tiene tolerancia a las contaminaciones y el nodo maestro predeterminado no implementa aplicaciones. Puede usar el siguiente comando para ver las contaminaciones:

kubectl describe nodes k8s-master | grep Taints

Eliminar la mancha en el maestro

 kubectl taint node k8s-master node-role.kubernetes.io/master-

# 然后重置
keadm reset
#再重新启动

Es muy probable que la descarga no se pueda descargar por problemas como la red, o haya algún error en el funcionamiento, etc. Puedes analizar los problemas específicos, me encontré con muchos problemas en este paso durante el proceso de instalación, pero lo he olvidado ahora. Es principalmente un problema de red. Si aquí Si tiene alguna pregunta, puede dejar un mensaje para comunicarnos juntos

ver puerto

netstat -tpnl

Aparecen 10000 y 10002, estos dos puertos son normales.
inserte la descripción de la imagen aquí
Si la instalación falla, puede restablecerla con el siguiente comando y luego reinstalarla

keadm reset

4.2.1 Generar un certificado, que será utilizado posteriormente

# 使用以下命令生成证书
 keadm gettoken

# 输出
9424892067e8fa67b46f826274bfceae786b57ec988d276e345ab473828c2314.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODE3ODQwMTN9.sH06gTP7ugZFuuOzcmKiglMu-GcNLZo1R1J5T2msv5Q

En este punto, si no hay ningún problema, el nodo de la nube se instala temporalmente y puede volver a tomar una instantánea para instalar el nodo perimetral.


4.3 Instalación del nodo perimetral

¡Lo siguiente se opera en el nodo de borde!, en la máquina con IP 172.23.70.34

4.3.1 Instalar ventana acoplable

Preparación

  • 1. Configuración del nombre de host
    (para configurar el nombre de host local, debemos configurar el nombre de host en "k8s-master", que coincide con los hosts)
# 设置当前机器的hostname
hostnamectl set-hostname kubeedge
# 查看当前机器hostname
hostname
  • 2. configuración de hosts
vim /etc/hosts

172.23.70.235 k8s-master
172.23.70.34 kubeedge
  • 3. Instalación de fuente de cambio de ventana acoplable
# 安装yum utils
yum install -y yum-utils
# yum docker-ce config 换源
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum -y install docker-ce docker-ce-cli containerd.io
# 启动docker, enable 为必须,k8s会检测docker.service
systemctl enable docker && systemctl start docker

  • 4.
    El parámetro exec-opts de aceleración de imagen de configuración de Docker está configurado como native.cgroupdriver= cgroupfs , este paso es muy importante, la siguiente dirección de imagen se refiere a Alibaba Cloud.
# 创建docker目录
mkdir -p /etc/docker
# 设置镜像源, exec-opts必须指定否则k8s启动报错(cgroup、systemd)
tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=cgroupfs"],
  "registry-mirrors": ["https://g6t55xi7.mirror.aliyuncs.com"]
}
EOF
# 重启docke并生效镜像加速
systemctl daemon-reload && systemctl restart docker

4.3.2 Instalar keadm en el nodo perimetral

De la misma manera, primero descarga e instala keadm, este paso es el mismo que el de la nube, así:

# 下载Keadm
wget https://github.com/kubeedge/kubeedge/releases/download/v1.12.1/keadm-v1.12.1-linux-amd64.tar.gz

#解压
tar zxvf keadm-v1.12.1-linux-amd64.tar.gz
#添加执行权限
chmod +x keadm-v1.12.1-linux-amd64/keadm/keadm 
#移动目录
mv keadm-v1.12.1-linux-amd64/keadm/keadm /usr/local/bin/
# 查看keadm是否安装
keadm version

#输出版本信息
version: version.Info{
    
    Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"919ad5378eaca3cb0c666c22a19db01261cbc9a6", GitTreeState:"clean", BuildDate:"2022-11-02T08:22:56Z", GoVersion:"go1.17", Compiler:"gc", Platform:"linux/amd64"}

4.3.3 Agregar administración de nodos en la nube

usar comando

#注意这里是要加入master的IP地址,token是master上四.2.1的步骤获取的
keadm join --cloudcore-ipport=172.23.70.235:10000 --kubeedge-version=1.12.1 --token=6ff1a09e9cc6beca30061ed96b189859e3e43d7932583d1b712adba49b4a28d6.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2Nzk3OTQ1MTV9.xUx5Q4-HcYpvvaSaStmgTmYNhzIgcmtm-Ev-EG5QblQ

Si hay un error aquí, puede consultar la solución de error mencionada en mis otros blogs, por ejemplo

Comprobar si la instalación es exitosa
inserte la descripción de la imagen aquí

Comando de la siguiente manera:

#启动edgecore      
systemctl start edgecore    

#设置开机自启
systemctl enable edgecore.service  

#查看edgecore开机启动状态 enabled:开启, disabled:关闭
systemctl is-enabled edgecore

#查看状态     
systemctl status edgecore 

#查看日志
journalctl -u edgecore.service -b

4.4 Comprobar y verificar el nodo maestro (k8s-master)

Todos los estados deben estar en ejecución o listos.

Ver el estado del nodo

# 查看节点状态
kubectl get nodes -o wide

inserte la descripción de la imagen aquí
Ver la instalación del sistema kube

kubectl get pod -n kube-system

inserte la descripción de la imagen aquí
Ver instalación de cloudcore

# 查看cloudcore安装
kubectl get pod -n kubeedge

inserte la descripción de la imagen aquí
Si los estados están en ejecución o listos, la instalación está completa. El siguiente paso es comenzar a instalar EdgeMesh y Sedna.

4.5 Implementar Visual KuBoard (Opcional)

Sitio web oficial de KuBord: https://kuboard.cn/install/v3/install-in-k8s.html#%E5%AE%89%E8%A3%85
Los comandos de instalación proporcionados son los siguientes:

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml

Visite Kuboard
y abra el enlace http://172.23.70.235:30080 en el navegador

Introduzca el nombre de usuario y la contraseña iniciales e inicie sesión

  • Nombre de usuario: administrador
  • Contraseña: Kuboard123

Una vez completada la implementación, ingrese el puerto 30080 para ver este comando, ejecute

curl -k 'http://172.23.70.235:30080/kuboard-api/cluster/default/kind/KubernetesCluster/default/resource/installAgentToKubernetes?token=VJr7EYvO0Dvh7eoB8JlYcN7S0GQhnPZE' > kuboard-agent.yaml
kubectl apply -f ./kuboard-agent.yaml

Entonces puedes ver la información del clúster.
inserte la descripción de la imagen aquí

Cinco, instalación de Sedna

¡Todo lo siguiente se realiza en el nodo de la nube k8s-master! ! !

Documento oficial de instalación de Sedna: https://github.com/kubeedge/sedna/blob/main/docs/setup/install.md
Este documento parece ser bastante simple, pero de hecho hay muchas trampas, echemos un vistazo uno por uno.

Mire los requisitos:
inserte la descripción de la imagen aquí
kubectl , kubernetes y KubeEdge han sido instalados El documento también menciona que EdgeMesh debe estar ejecutándose, así que instale EdgeMesh primero.

5.1 Preparación previa

Documento oficial de instalación de EdgeMesh: https://edgemesh.netlify.app/zh/guide/#%E4%BE%9D%E8%B5%96%E7%8E%AF%E5%A2%83

Según la descripción de la documentación oficial:

  • Paso 1: elimine la corrupción del nodo maestro K8s
 kubectl taint nodes --all node-role.kubernetes.io/master-

Si no se implementa ninguna aplicación para el proxy en el nodo principal de K8s, es posible que no se ejecuten los pasos anteriores.

  • Paso 2: agregue etiquetas de filtro al servicio de la API de Kubernetes
kubectl label services kubernetes service.edgemesh.kubeedge.io/service-proxy-name=""
  • Paso 3: habilite el servicio Edge Kube-API Endpoint de KubeEdge
    Consulte el documento Edge Kube-API Endpoint para habilitar este servicio. Extremo de Edge Kube-API

5.1.1 Configurar extremo de Kube-API perimetral

Paso 1: en la nube, abra el módulo dynamicController. Una vez completada la configuración, debe reiniciar cloudcore

vim /etc/kubeedge/config/cloudcore.yaml
modules:
  ...
  dynamicController:
    enable: true
...

Paso 2: en el nodo perimetral, abra el módulo metaServer (si su KubeEdge < 1.8.0, también debe cerrar el antiguo módulo edgeMesh), una vez completada la configuración, debe reiniciar edgecore

vim /etc/kubeedge/config/edgecore.yaml
modules:
  ...
  edgeMesh:
    enable: false
  ...
  metaManager:
    metaServer:
      enable: true
...

Paso 3: en el nodo perimetral, configure clusterDNS y clusterDomain. Una vez completada la configuración, debe reiniciar edgecore

vim /etc/kubeedge/config/edgecore.yaml
modules:
  ...
  edged:
    ...
    tailoredKubeletConfig:
      ...
      clusterDNS:
      - 169.254.96.16
      clusterDomain: cluster.local

Sugerencia:
la configuración en el paso 3 es para que la aplicación perimetral acceda al servicio EdgeMesh DNS y no tiene nada que ver con el extremo de Kube-API perimetral en sí, pero para la fluidez de la configuración, aún se explica aquí.
El valor '169.254.96.16' establecido por clusterDNS proviene del valor predeterminado de bridgeDeviceIP en commonConfig. Normalmente, no hay necesidad de modificarlo. Si tiene que modificarlo, mantenga los dos consistentes.

Paso 4: Finalmente, en el nodo perimetral, pruebe si la función de extremo de Kube-API perimetral es normal

curl 127.0.0.1:10550/api/v1/services
{
    
    "apiVersion":"v1","items":[{
    
    "apiVersion":"v1","kind":"Service","metadata":{
    
    "creat.......

Nota
Si el valor devuelto es una lista vacía, o la respuesta tarda mucho tiempo (cerca de 10 s) en obtener el valor devuelto, significa que su configuración puede ser incorrecta, verifique cuidadosamente.

Después de completar los pasos anteriores, se habilitó la función de extremo de Kube-API perimetral de KubeEdge y luego se continúa con la implementación de EdgeMesh.

5.2 Instalar EdgeMesh

Hay dos formas de instalar, una es la instalación de Helm y la otra es la instalación manual, lo que causará problemas. Se recomienda utilizar la instalación manual, el método de instalación es el siguiente:

  • Paso 1: Obtener EdgeMesh
git clone https://github.com/kubeedge/edgemesh.git
cd edgemesh
  • Paso 2: Instalar CRD
 kubectl apply -f build/crds/istio/
customresourcedefinition.apiextensions.k8s.io/destinationrules.networking.istio.io created
customresourcedefinition.apiextensions.k8s.io/gateways.networking.istio.io created
customresourcedefinition.apiextensions.k8s.io/virtualservices.networking.istio.io created
  • Paso 3: implementar edgemesh-agent
kubectl apply -f build/agent/resources/
serviceaccount/edgemesh-agent created
clusterrole.rbac.authorization.k8s.io/edgemesh-agent created
clusterrolebinding.rbac.authorization.k8s.io/edgemesh-agent created
configmap/edgemesh-agent-cfg created
configmap/edgemesh-agent-psk created
daemonset.apps/edgemesh-agent created

Sugerencias
Configure los relayNodes en build/agent/resources/04-configmap.yaml de acuerdo con su clúster K8s y regenere la contraseña de PSK.

Aquí hay una pista, queremos modificar build/agent/resources/04-configmap.yamleste archivo, use el siguiente comando:

cd build/agent/resources
vim 04-configmap.yaml

Cámbielo como se muestra en la figura a continuación:
inserte la descripción de la imagen aquí
preste atención a la configuración de psk en la parte inferior, inicie otra terminal nuevamente y use el siguiente comando para generar psk

openssl rand -base64 32

Luego complete y guarde, y luego vuelva a ejecutar la implementación en el paso 3.

  • Paso 4: verificar los resultados de la implementación
kubectl get all -n kubeedge -o wide

La instalación es exitosa como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

5.3 Prueba de comunicación colaborativa en la nube

Como se muestra en la figura, para verificar si la instalación de nuestro edgemesh está completa y si la comunicación es normal, lo mejor es probar el efecto de la comunicación.
inserte la descripción de la imagen aquí
Comunicación en la nube de borde cruzado⭐La
aplicación busybox-edge en edgezone puede acceder a la aplicación tcp-echo-cloud en la nube, y la aplicación busybox-cloud en cloudzone puede acceder a la aplicación tcp-echo-edge en el borde. pasos

:

Ejecute el siguiente comando en k8s-master (172.23.70.235):

kubectl apply -f examples/cloudzone.yaml
namespace/cloudzone created
deployment.apps/tcp-echo-cloud created
service/tcp-echo-cloud-svc created
deployment.apps/busybox-sleep-cloud created

Ejecute el siguiente comando en el nodo perimetral kubeedge (172.23.70.34):

kubectl apply -f examples/edgezone.yaml
namespace/edgezone created
deployment.apps/tcp-echo-edge created
service/tcp-echo-edge-svc created
deployment.apps/busybox-sleep-edge created

Aquí, si el nodo perimetral no tiene instalado kubectl , la ejecución puede fallar.

Mensaje de error: no se puede stat '/etc/kubernetes/admin.conf': No existe tal archivo o directorio

Solución:
copie etc/kubernetes/admin.conf del nodo k8s-master al nodo kubeedge.

Ejecute el comando copiar archivo en k8s-master:

scp /etc/kubernetes/admin.conf [email protected]:/etc/kubernetes/admin.conf

Simplemente ingrese la contraseña.
Luego ejecute en el nodo del nodo:

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

source ~/.bash_profile

Verifique de nuevo:

kubectl get pods

De lo contrario, instale el siguiente kubectl en el nodo y ejecútelo de la siguiente manera:

## 配置kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


# 执行安装
yum -y install --nogpgcheck kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8

# 检查kubectl version
kubectl version

5.3.1 Prueba del lado del acceso a la nube

#执行命令:
 BUSYBOX_POD=$(kubectl get all -n cloudzone | grep pod/busybox | awk '{print $1}')
 kubectl -n cloudzone exec $BUSYBOX_POD -c busybox -i -t -- sh
 telnet tcp-echo-edge-svc.edgezone 2701
Welcome, you are connected to node ke-edge1.
Running on Pod tcp-echo-edge.
In namespace edgezone.
With IP address 172.17.0.2.
Service default.
Hello Edge, I am Cloud.
Hello Edge, I am Cloud.

como muestra la imagen:
inserte la descripción de la imagen aquí

5.3.2 Prueba de nube de acceso perimetral

$ BUSYBOX_CID=$(docker ps | grep k8s_busybox_busybox-sleep-edge | awk '{print $1}')
$ docker exec -it $BUSYBOX_CID sh
$ telnet tcp-echo-cloud-svc.cloudzone 2701
Welcome, you are connected to node k8s-master.
Running on Pod tcp-echo-cloud.
In namespace cloudzone.
With IP address 10.244.0.8.
Service default.
Hello Cloud, I am Edge.
Hello Cloud, I am Edge.

Como se muestra en la imagen:
inserte la descripción de la imagen aquí
si todo pasa, no hay problema, puede continuar con la instalación de Sedna, de lo contrario, verifique uno por uno. Problemas y soluciones comunes: el manual de preguntas y respuestas de EdgeMesh más completo de toda la red: https://zhuanlan.zhihu.com/p/585749690

5.4 Instalación Sedna

Instalación con un clic de seda en el sitio web oficial (no recomendado, cometerá errores)

# 不建议使用这种方式安装
curl https://raw.githubusercontent.com/kubeedge/sedna/main/scripts/installation/install.sh | SEDNA_ACTION=create bash -
  • instalación local

Descarga el archivo install.sh

wget https://raw.githubusercontent.com/kubeedge/sedna/main/scripts/installation/install.sh

modificación relevante

#改名字
mv install.sh offline-install.sh

#修改文件中的一下内容(sh的语法)
1.第28行:TMP_DIR='opt/sedna'
2.第34行:删除  trap "rm -rf '%TMP_DIR'" EXIT
3.第415行:删除  prepare

Descargue el sitio web oficial de sedna github: https://github.com/kubeedge/sedna/tree/main/build
inserte la descripción de la imagen aquí

git clone https://github.com/kubeedge/sedna.git

#将build和文件夹里的内容一块复制到sedna文件夹下:
cd build/ /opt/sedna/

Luego, ingrese /opt/sednaal directorio e instale sedna:

#直接进入之前准备好的文件目录运行
SEDNA_ACTION=create bash - offline-install.sh

Verifique el estado de instalación de sedna:

kubectl get pod -n sedna

inserte la descripción de la imagen aquí
Si todos se están ejecutando, la instalación es exitosa. De esta manera, puede jugar felizmente con casos de aprendizaje incremental y aprendizaje federado.

6. Referencias

Supongo que te gusta

Origin blog.csdn.net/MacWx/article/details/130200209
Recomendado
Clasificación