-
github: cid:link_2BIRD是什么 BIRD是布拉格查理大学数学与物理学院的一个学校项目,项目名是BIRD Internet Routing Daemon的缩写。 目前,它由CZ.NIC实验室开发和支持。 BIRD项目旨在开发一个功能齐全的动态 IP 路由守护进程,主要针对(但不限于)Linux,FreeBSD和其他类UNIX系统,并在GNU通用公共许可证下分发。详细信息参照官网 https://bird.network.cz calico 中的 Bird是一个BGP client,它会主动读取felix在host上设置的路由信息,然后通过BGP协议广播出去.bird github上主要是提供了 bird,bird6,birdcl 3个可执行程序如果要通过编译源代码则有点不容易,我经过测试,通过下在 bird2.07 的源码比较靠谱birdcl 命令1987 birdcl -s /var/run/calico/bird.ctl show protocols1988 birdcl -s /var/run/calico/bird.ctl show status1989 birdcl -s /var/run/calico/bird.ctl show interface1990 birdcl -s /var/run/calico/bird.ctl show protocols1991 birdcl -s /var/run/calico/bird.ctl show ospf interface1992 birdcl -s /var/run/calico/bird.ctl show ospf status1993 birdcl -s /var/run/calico/bird.ctl show ospf state1994 birdcl -s /var/run/calico/bird.ctl show state1995 birdcl -s /var/run/calico/bird.ctl show static1996 birdcl -s /var/run/calico/bird.ctl show bfd session1997 birdcl -s /var/run/calico/bird.ctl show route1998 birdcl -s /var/run/calico/bird.ctl show configurate1999 birdcl -s /var/run/calico/bird.ctl dump routes2000 birdcl -s /var/run/calico/bird.ctl show route/usr/local/etc/bird.conf cat /usr/local/etc/bird.conf# This is a basic configuration file, which contains boilerplate options and# some basic examples. It allows the BIRD daemon to start but will not cause# anything else to happen.## Please refer to the BIRD User's Guide documentation, which is also available# online at cid:link_4 in HTML format, for more information on# configuring BIRD and adding routing protocols.# Configure logginglog syslog all;# log "/var/log/bird.log" { debug, trace, info, remote, warning, error, auth, fatal, bug };# Set router ID. It is a unique identification of your router, usually one of# IPv4 addresses of the router. It is recommended to configure it explicitly.# router id 198.51.100.1;# Turn on global debugging of all protocols (all messages or just selected classes)# debug protocols all;# debug protocols { events, states };# Turn on internal watchdog# watchdog warning 5 s;# watchdog timeout 30 s;# You can define your own constants# define my_asn = 65000;# define my_addr = 198.51.100.1;# Tables master4 and master6 are defined by default# ipv4 table master4;# ipv6 table master6;# Define more tables, e.g. for policy routing or as MRIB# ipv4 table mrib4;# ipv6 table mrib6;# The Device protocol is not a real routing protocol. It does not generate any# routes and it only serves as a module for getting information about network# interfaces from the kernel. It is necessary in almost any configuration.protocol device {}# The direct protocol is not a real routing protocol. It automatically generates# direct routes to all network interfaces. Can exist in as many instances as you# wish if you want to populate multiple routing tables with direct routes.protocol direct { disabled; # Disable by default ipv4; # Connect to default IPv4 table ipv6; # ... and to default IPv6 table}# The Kernel protocol is not a real routing protocol. Instead of communicating# with other routers in the network, it performs synchronization of BIRD# routing tables with the OS kernel. One instance per table.protocol kernel { ipv4 { # Connect protocol to IPv4 table by channel# table master4; # Default IPv4 table is master4# import all; # Import to table, default is import all export all; # Export to protocol. default is export none };# learn; # Learn alien routes from the kernel# kernel table 10; # Kernel table to synchronize with (default: main)}# Another instance for IPv6, skipping default optionsprotocol kernel { ipv6 { export all; };}# Static routes (Again, there can be multiple instances, for different address# families and to disable/enable various groups of static routes on the fly).protocol static { ipv4; # Again, IPv4 channel with default options# route 0.0.0.0/0 via 198.51.100.10;# route 192.0.2.0/24 blackhole;# route 10.0.0.0/8 unreachable;# route 10.2.0.0/24 via "eth0";# # Static routes can be defined with optional attributes# route 10.1.1.0/24 via 198.51.100.3 { rip_metric = 3; };# route 10.1.2.0/24 via 198.51.100.3 { ospf_metric1 = 100; };# route 10.1.3.0/24 via 198.51.100.4 { ospf_metric2 = 100; };}# Pipe protocol connects two routing tables. Beware of loops.# protocol pipe {# table master4; # No ipv4/ipv6 channel definition like in other protocols# peer table mrib4;# import all; # Direction peer table -> table# export all; # Direction table -> peer table# }# RIP example, both RIP and RIPng are supported# protocol rip {# ipv4 {# # Export direct, static routes and ones from RIP itself# import all;# export where source ~ [ RTS_DEVICE, RTS_STATIC, RTS_RIP ];# };# interface "eth*" {# update time 10; # Default period is 30# timeout time 60; # Default timeout is 180# authentication cryptographic; # No authentication by default# password "hello" { algorithm hmac sha256; }; # Default is MD5# };# }# OSPF example, both OSPFv2 and OSPFv3 are supported# protocol ospf v3 {# ipv6 {# import all;# export where source = RTS_STATIC;# };# area 0 {# interface "eth*" {# type broadcast; # Detected by default# cost 10; # Interface metric# hello 5; # Default hello perid 10 is too long# };# interface "tun*" {# type ptp; # PtP mode, avoids DR selection# cost 100; # Interface metric# hello 5; # Default hello perid 10 is too long# };# interface "dummy0" {# stub; # Stub interface, just propagate it# };# };#}# Define simple filter as an example for BGP import filter# See cid:link_1 for more examples# filter rt_import# {# if bgp_path.first != 64496 then accept;# if bgp_path.len > 64 then accept;# if bgp_next_hop != from then accept;# reject;# }# BGP example, explicit name 'uplink1' is used instead of default 'bgp1'# protocol bgp uplink1 {# description "My BGP uplink";# local 198.51.100.1 as 65000;# neighbor 198.51.100.10 as 64496;# hold time 90; # Default is 240# password "secret"; # Password used for MD5 authentication## ipv4 { # regular IPv4 unicast (1/1)# import filter rt_import;# export where source ~ [ RTS_STATIC, RTS_BGP ];# };## ipv6 { # regular IPv6 unicast (2/1)# import filter rt_import;# export filter { # The same as 'where' expression above# if source ~ [ RTS_STATIC, RTS_BGP ]# then accept;# else reject;# };# };## ipv4 multicast { # IPv4 multicast topology (1/2)# table mrib4; # explicit IPv4 table# import filter rt_import;# export all;# };## ipv6 multicast { # IPv6 multicast topology (2/2)# table mrib6; # explicit IPv6 table# import filter rt_import;# export all;# import filter rt_import;# export all;# };#}# Template example. Using templates to define IBGP route reflector clients.# template bgp rr_clients {# local 10.0.0.1 as 65000;# neighbor as 65000;# rr client;# rr cluster id 1.0.0.1;## ipv4 {# import all;# export where source = RTS_BGP;# };## ipv6 {# import all;# export where source = RTS_BGP;# };# }## protocol bgp client1 from rr_clients {# neighbor 10.0.1.1;# }## protocol bgp client2 from rr_clients {# neighbor 10.0.2.1;# }## protocol bgp client3 from rr_clients {# neighbor 10.0.3.1;# }root@node-10-120-13-236:~# birdcl -s /var/run/calico/bird.ctl show route BIRD v0.3.3+birdv1.6.8 ready.0.0.0.0/0 via 10.120.13.1 on ens160 [kernel1 2020-12-31] * (10)192.168.98.0/26 via 10.120.13.237 on ens160 [Mesh_10_120_13_237 2020-12-31] * (100/0) [i] unreachable [Mesh_10_120_127_236 2021-01-01 from 10.120.127.236] (100/-) [i] unreachable [Mesh_10_120_127_235 2021-01-01 from 10.120.127.235] (100/-) [i] unreachable [Mesh_10_120_127_238 2021-01-01 from 10.120.127.238] (100/-) [i] unreachable [Mesh_10_120_127_237 2021-01-01 from 10.120.127.237] (100/-) [i] via 10.120.13.237 on ens160 [Mesh_10_120_13_238 2020-12-31 from 10.120.13.238] (100/0) [i] via 10.120.13.237 on ens160 [kernel1 2020-12-31] (10)192.168.100.0/26 blackhole [static1 2020-12-31] * (200) unreachable [Mesh_10_120_127_236 2021-01-01 from 10.120.127.236] (100/-) [i] unreachable [Mesh_10_120_127_235 2021-01-01 from 10.120.127.235] (100/-) [i] unreachable [Mesh_10_120_127_237 2021-01-01 from 10.120.127.237] (100/-) [i] unreachable [Mesh_10_120_127_238 2021-01-01 from 10.120.127.238] (100/-) [i]192.168.100.0/32 dev vxlan.calico [direct1 2020-12-31] * (240)192.168.100.5/32 dev calia2c25e78e3e [kernel1 2020-12-31] * (10)192.168.100.4/32 dev cali03f1aaccec2 [kernel1 2020-12-31] * (10)192.168.100.6/32 dev calicc710dcfd64 [kernel1 2020-12-31] * (10)192.168.69.192/26 via 10.120.13.1 on ens160 [Mesh_10_120_127_235 2021-01-01 from 10.120.127.235] * (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_236 2021-01-01 from 10.120.127.236] (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_237 2021-01-01 from 10.120.127.237] (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_238 2021-01-01 from 10.120.127.238] (100/?) [i] unreachable [Mesh_10_120_13_237 2020-12-31 from 10.120.13.237] (100/-) [i] unreachable [Mesh_10_120_13_238 2020-12-31 from 10.120.13.238] (100/-) [i] via 192.168.69.192 on vxlan.calico [kernel1 2020-12-31] (10)192.168.95.0/26 via 10.120.13.1 on ens160 [Mesh_10_120_127_235 2021-01-01 from 10.120.127.235] * (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_236 2021-01-01 from 10.120.127.236] (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_237 2021-01-01 from 10.120.127.237] (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_238 2021-01-01 from 10.120.127.238] (100/?) [i] unreachable [Mesh_10_120_13_237 2020-12-31 from 10.120.13.237] (100/-) [i] unreachable [Mesh_10_120_13_238 2020-12-31 from 10.120.13.238] (100/-) [i] via 192.168.95.0 on vxlan.calico [kernel1 2020-12-31] (10)192.168.34.192/26 via 10.120.13.238 on ens160 [Mesh_10_120_13_237 2020-12-31 from 10.120.13.237] * (100/0) [i] unreachable [Mesh_10_120_127_236 2021-01-01 from 10.120.127.236] (100/-) [i] unreachable [Mesh_10_120_127_235 2021-01-01 from 10.120.127.235] (100/-) [i] unreachable [Mesh_10_120_127_237 2021-01-01 from 10.120.127.237] (100/-) [i] unreachable [Mesh_10_120_127_238 2021-01-01 from 10.120.127.238] (100/-) [i] via 10.120.13.238 on ens160 [Mesh_10_120_13_238 2020-12-31] (100/0) [i] via 10.120.13.238 on ens160 [kernel1 2020-12-31] (10)192.168.56.128/26 via 10.120.13.1 on ens160 [Mesh_10_120_127_235 2021-01-01 from 10.120.127.235] * (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_236 2021-01-01 from 10.120.127.236] (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_237 2021-01-01 from 10.120.127.237] (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_238 2021-01-01 from 10.120.127.238] (100/?) [i] unreachable [Mesh_10_120_13_237 2020-12-31 from 10.120.13.237] (100/-) [i] unreachable [Mesh_10_120_13_238 2020-12-31 from 10.120.13.238] (100/-) [i] via 192.168.56.128 on vxlan.calico [kernel1 2020-12-31] (10)192.168.3.128/26 via 10.120.13.1 on ens160 [Mesh_10_120_127_235 2021-01-01 from 10.120.127.235] * (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_236 2021-01-01 from 10.120.127.236] (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_237 2021-01-01 from 10.120.127.237] (100/?) [i] via 10.120.13.1 on ens160 [Mesh_10_120_127_238 2021-01-01 from 10.120.127.238] (100/?) [i] unreachable [Mesh_10_120_13_237 2020-12-31 from 10.120.13.237] (100/-) [i] unreachable [Mesh_10_120_13_238 2020-12-31 from 10.120.13.238] (100/-) [i] via 192.168.3.128 on vxlan.calico [kernel1 2020-12-31] (10)10.120.13.0/24 dev ens160 [direct1 2020-12-31] * (240)172.17.0.0/16 dev docker0 [direct1 2020-12-31] * (240)bird的 github 上 有 配置的 样例cid:link_0bird的官网也有例子# Generated by confdinclude "bird_aggr.cfg";include "bird_ipam.cfg";router id 10.192.0.2;# Configure synchronization between routing tables and kernel.protocol kernel { learn; # Learn all alien routes from the kernel persist; # Don't remove routes on bird shutdown scan time 2; # Scan kernel routing table every 2 seconds import all; export filter calico_kernel_programming; # Default is export none graceful restart; # Turn on graceful restart to reduce potential flaps in # routes when reloading BIRD configuration. With a full # automatic mesh, there is no way to prevent BGP from # flapping since multiple nodes update their BGP # configuration at the same time, GR is not guaranteed to # work correctly in this scenario.}# Watch interface up/down events.protocol device { debug { states }; scan time 2; # Scan interfaces every 2 seconds}protocol direct { debug { states }; interface -"cali*", "*"; # Exclude cali* but include everything else.}# Template for all BGP clientstemplate bgp bgp_template { debug { states }; description "Connection to BGP peer"; local as 64512; multihop; gateway recursive; # This should be the default, but just in case. import all; # Import all routes, since we don't know what the upstream # topology is and therefore have to trust the ToR/RR. export filter calico_export_to_bgp_peers; # Only want to export routes for workloads. source address 10.192.0.2; # The local address we use for the TCP connection add paths on; graceful restart; # See comment in kernel section about graceful restart. connect delay time 2; connect retry time 5; error wait time 5,30;}# ------------- Node-to-node mesh -------------# This node is configured as a route reflector with cluster ID 10.0.0.1;# ignore node-to-node mesh setting.# ------------- Global peers -------------# No global peers configured.# ------------- Node-specific peers -------------# For peer /host/kube-master/peer_v4/172.19.4.87protocol bgp Node_172_19_4_87 from bgp_template { neighbor 172.19.4.87 as 64533;}
-
Kubernetes是一个用于容器编排和管理的开源平台。它可以帮助您简化容器化应用程序的部署、扩展和管理。本指南将引导您完成Kubernetes的基本概念和入门操作。1. 安装Kubernetes集群首先,您需要设置Kubernetes集群。以下是一些常见的安装选项:Minikube: 适用于本地开发和学习的单节点Kubernetes集群。kubeadm: 用于在Linux系统上快速设置多节点Kubernetes集群。选择适合您需求的安装选项,并按照相关文档进行操作。2. 创建和管理应用程序接下来,您将学习如何使用Kubernetes部署和管理应用程序。创建DeploymentDeployment是一种Kubernetes资源,用于定义应用程序的部署和扩展。创建一个名为myapp-deployment的Deployment,指定容器镜像和副本数量:apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deployment spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp-container image: your-docker-image ports: - containerPort: 8080将上述内容保存为myapp-deployment.yaml文件,并使用以下命令创建Deployment:kubectl apply -f myapp-deployment.yaml创建ServiceService是一种Kubernetes资源,用于公开应用程序内部的服务。创建一个名为myapp-service的Service,将流量路由到Deployment:apiVersion: v1 kind: Service metadata: name: myapp-service spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer将上述内容保存为myapp-service.yaml文件,并使用以下命令创建Service:kubectl apply -f myapp-service.yaml扩展应用程序要增加应用程序的副本数量,可以使用以下命令:kubectl scale deployment myapp-deployment --replicas=5这将将myapp-deployment的副本数量扩展到5个。3. 监控和管理集群Kubernetes提供了各种工具和资源,可用于监控和管理集群。查看集群状态要检查集群状态和节点信息,可以使用以下命令:kubectl cluster-info kubectl get nodes查看Pod状态和日志要查看正在运行的Pod的状态和日志,可以使用以下命令:kubectl get pods kubectl logs <pod-name>更新应用程序要更新应用程序的镜像版本或配置,可以编辑相关的Deployment或ConfigMap,并使用以下命令进行更新:kubectl apply -f myapp-deployment.yaml结论这份简洁的Kubernetes入门指南帮助您了解了Kubernetes的基本概念和操作。您可以继续深入学习Kubernetes的更多高级功能和概念,以便更好地管理和扩展您的应用程序。
-
k8s创建私有仓库凭据有两种方式 1.使用kubectl命令创建secret 2.使用docker凭证作为k8s的凭据。 1.使用kubectl命令创建secret kubectl create secret docker-registry <name> --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL <name>:凭据名称 DOCKER_REGISTRY_SERVER:私有服务地址 DOCKER_USER:登录账号 DOCKER_PASSWORD:密码 DOCKER_EMAIL:邮箱 2.使用docker凭证作为k8s的凭据。 1.首先登录私有服务 docker login -u admin -p 123456 192.168.0.76:81 2.查看auth文件内容 cat /root/.docker/config.json 3.基于auth文件创建secret kubectl create secret generic mysecrettest \ --from-file=.dockerconfigjson=/root/.docker/config.json \ --type=kubernetes.io/dockerconfigjson 3.在yaml文件中使用凭据 apiVersion: v1kind: Podmetadata: name: mytest namespace: defaultspec: containers: - name: mytest image: zztestimg:latest imagePullSecrets: - name: mysecrettest
-
apiVersion: apps/v1kind: Deploymentmetadata: name: my-spring-boot-appspec: replicas: 3 selector: matchLabels: app: my-spring-boot-app template: metadata: labels: app: my-spring-boot-app spec: containers: - name: my-spring-boot-app image: my-spring-boot-app:1.0.0 ports: - containerPort: 8080 volumeMounts: - mountPath: /app name: my-app-volume volumes: - name: my-app-volume persistentVolumeClaim: claimName: my-app-pvc---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: my-app-pvc labels: app: my-spring-boot-appspec: accessModes: - ReadWriteOnce storageClassName: standard resources: requests: storage: 10Gi在上面的示例中,我们定义了一个名为“my-spring-boot-app”的Deployment Pod,它将在Kubernetes集群中部署3个相同的容器(容器名为“my-spring-boot-app”)。我们还定义了该Pod的Selector,该Selector告诉Kubernetes Pod将被部署到哪个部署节点上。在Pod的Template中,我们使用了一个VolumeMount,该VolumeMount将应用程序的主目录挂载到容器内的“/app”目录中。在该VolumeMount的PersistentVolumeClaim中,我们指定了应用程序的名称(“my-app”),以及应用程序应该使用的存储类型(Standard级别)和存储大小(10GiB)。要使用上述YAML文件部署Spring Boot应用程序并使用文件卷,您需要将该文件上传到Kubernetes集群,并使用Kubernetes客户端(如kubectl)将该Pod添加到Kubernetes集群中。然后,您需要使用Kubernetes客户端(如kubectl)上传一个PersistentVolumeClaim并将其挂载到您的应用程序容器中的FileVolume上。
-
Kubernetes YAML格式是一种配置文件格式,用于描述和配置容器化应用程序。YAML文件使用键值对的形式,以简单易读的方式描述应用程序的配置。下面是一个简单的 Kubernetes YAML 配置文件示例:apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image ports: - containerPort: 8080在这个示例中,我们定义了一个名为“my-pod”的 Pod 类型,并定义了一个名为“my-container”的 Container 类型。Pod 类型定义了 Pod 的名称和版本,Container 类型定义了 Pod 中的容器。 YAML 文件中的键值对使用冒号(:)分隔,并且可以包含注释。在示例中,注释是以 # 符号开头的。 使用 Kubernetes YAML 配置文件可以方便地管理和配置容器化应用程序,使其具有良好的可维护性和可扩展性。kind的类型Kubernetes YAML文件中的类型主要包括 Pod、Deployment、Service、PersistentVolume、PersistentVolumeClaim、ConfigMap、Ingress、PodSecurityPolicy、HorizontalPodAutoscaler 等。其中,下面是一些常用的类型:Pod:表示容器化应用程序的一个实例。它可以包含多个容器,并且可以使用容器名称或 IP 地址来访问容器内的应用程序。Deployment:表示一组相关的容器,以便在容器中运行相同的版本。一旦Deployment 被部署,它将自动维护和更新容器。Service:表示一个通过名称相互通信的 Pod 实例。Service 可以通过名称或 IP 地址访问容器内的应用程序。PersistentVolume:表示持久化存储数据的 Pod 容器。它可以存储容器内的数据,以便在 Pod 重启时恢复。PersistentVolumeClaim:表示为 Pod 存储持久化存储数据的一项声明。它可以将 Pod 的存储需求注册到 Kubernetes 中。ConfigMap:表示应用程序配置的一个字典。它可以存储应用程序配置信息,例如应用程序配置文件、环境变量等。Ingress:表示 Kubernetes 的入站规则。它可以控制 Pod 访问应用程序的网络端口。PodSecurityPolicy:用于保护 Pod 内的容器免受外部攻击的安全组件。HorizontalPodAutoscaler:用于管理 Kubernetes 上 Pod 的自动扩展。它可以动态调整 Pod 内容器的实例数以达到平衡状态。以下是一个简单的 Kubernetes YAML 配置文件示例,其中使用了 Pod 类型:apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image ports: - containerPort: 8080在这个示例中,Pod 类型被用于定义 Pod 实例的类型。使用 Pod 类型时,name 和 image 关键字后面的字符串就是 Pod 的名称和版本。使用 containers 关键字定义 Pod 的容器。容器之间用逗号分隔,可以指定多个容器。使用 ports 关键字定义 Pod 中的容器端口映射。容器之间使用冒号 : 分隔,可以指定多个容器的端口映射。在这个示例中,Pod 的实例数量为 1,容器的版本为 1.0,容器名称为 my-container,容器的容器端口映射为 8080。Pod 的实例使用了多个容器,每个容器都有不同的版本和名称。这样,可以使 Pod 中的容器相互隔离,并为不同的应用程序提供隔离和管理。
-
1.下载yaml文件,具体对应版本参考: wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.5/aio/deploy/recommended.yaml 2.执行 kubectl apply -f recommended.yaml 3.查看安装情况 kubectl get pods --all-namespaces -o wide | grep dashboard 4.查看svc kubectl get svc --all-namespaces 5.删除现有的 dashboard 服务,因为该服务的类型是ClusterIP,不便于我们通过浏览器访问,因此需要改成 NodePort 类型的 kubectl delete service kubernetes-dashboard --namespace=kubernetes-dashboard 6.创建配置文件dashboard-svc.yaml并上传服务器 kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: type: NodePort ports: - port: 443 targetPort: 8443 selector: k8s-app: kubernetes-dashboard 7.创建该 Service kubectl apply -f dashboard-svc.yaml 8.再次查看服务 kubectl get svc --all-namespaces 9.创建 kubernetes-dashboard 管理员角色,dashboard-svc-account.yaml apiVersion: v1 kind: ServiceAccount metadata: name: dashboard-admin namespace: kube-system --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: dashboard-admin subjects: - kind: ServiceAccount name: dashboard-admin namespace: kube-system roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io 10.执行创建 kubectl apply -f dashboard-svc-account.yaml 11.获取token kubectl get secret -n kube-system |grep admin|awk '{print $1}' kubectl describe secret dashboard-admin-token-xxxxx -n kube-system|grep '^token'|awk '{print $2}' 12.浏览器访问,如果是edge浏览器会提示“你的连接不是专用连接”,只需要键盘输入thisisunsafe就可继续访问。 cid:link_0 12.修改token过期时间,默认过期时间是15分钟。 - '--token-ttl=832000'
-
服务器配置节点(华为云服务器)配置master2vCPUs | 4GiB | s6.large.2 CentOS 7.8 64bitnode12vCPUs | 8GiB | s6.large.4 CentOS 7.8 64bitnode22vCPUs | 8GiB | s6.large.4 CentOS 7.8 64bit1.master节点安装脚本:install_k8s_master.sh。sh文件上传到服务器后执行:chmod +x install_k8s_master.sh sh install_k8s_master.sh安装过程中会有根据提示要求键盘输入。安装docker过程中遇到卡着需要输入y,有两次#!/bin/bash# Kubernetes部署环境要求:#(1)一台或多台机器,操作系统CentOS 7.x-86_x64#(2)硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+;#(3)集群内各个机器之间能相互通信;#(4)集群内各个机器可以访问外网,需要拉取镜像;#(5)禁止swap分区; # 安装步骤#1. 安装docker#1.1 如果没有安装docker,则安装docker。会附带安装一个docker-compose##2. 安装k8s#2.1 初始化环境#2.2 添加安装源#2.3 安装kubelet、kubectl、kubeadmin#2.4 安装master#2.5 安装网络插件 set -e # 安装日志install_log=/var/log/install_k8s.logtm=$(date +'%Y%m%d %T') # 日志颜色COLOR_G="\x1b[0;32m" # greenRESET="\x1b[0m" function info(){ echo -e "${COLOR_G}[$tm] [Info] ${1}${RESET}"} function run_cmd(){ sh -c "$1 | $(tee -a "$install_log")"} function run_function(){ $1 | tee -a "$install_log"} function install_docker(){ info "1.使用脚本自动安装docker..." wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com:443/use-framework-upgrade/docker-ce.repo yum install docker-ce info "2.启动 Docker CE..." sudo systemctl enable docker sudo systemctl start docker info "3.添加镜像加速器..." if [ ! -f "/etc/docker/daemon.json" ];then touch /etc/docker/daemon.json fi cat <<EOF > /etc/docker/daemon.json{ "registry-mirrors": [ "https://5ajk0rns.mirror.aliyuncs.com" ]}EOF info "4.重新启动服务..." sudo systemctl daemon-reload sudo systemctl restart docker info "5.测试 Docker 是否安装正确..." docker run hello-world info "6.检测..." docker info read -p "是否安装docker-compose?默认为 no. Enter [yes/no]:" is_compose if [[ "$is_compose" == 'yes' ]];then info "7.安装docker-compose" sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod a+x /usr/local/bin/docker-compose # 8.验证是否安装成功 info "8.验证docker-compose是否安装成功..." docker-compose -v fi} function install_k8s() { info "初始化k8s部署环境..." init_env info "添加k8s安装源..." add_aliyun_repo info "安装kubelet kubeadmin kubectl..." install_kubelet_kubeadmin_kubectl info "安装kubernetes master..." yum -y install net-tools if [[ ! "$(ps aux | grep 'kubernetes' | grep -v 'grep')" ]];then kubeadmin_init else info "kubernetes master已经安装..." fi info "安装网络插件flannel..." install_flannel info "去污点..." kubectl taint nodes --all node-role.kubernetes.io/master-} # 初始化部署环境function init_env() { info "关闭防火墙" systemctl stop firewalld systemctl disable firewalld info "关闭selinux" sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/g' /etc/selinux/config source /etc/selinux/config info "关闭swap(k8s禁止虚拟内存以提高性能)" swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab info "设置网桥参数" cat <<-EOF > /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF sysctl --system #生效 sysctl -w net.ipv4.ip_forward=1 info "时间同步" yum install ntpdate -y ntpdate time.windows.com} # 添加aliyun安装源function add_aliyun_repo() { cat > /etc/yum.repos.d/kubernetes.repo <<- EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF} function install_kubelet_kubeadmin_kubectl() { yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y systemctl enable kubelet.service info "确认kubelet kubeadmin kubectl是否安装成功" yum list installed | grep kubelet yum list installed | grep kubeadm yum list installed | grep kubectl kubelet --version} function kubeadmin_init() { sleep 1 read -p "请输入master ip地址:" ip kubeadm init --apiserver-advertise-address="${ip}" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 mkdir -p "$HOME"/.kube sudo cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config sudo chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config} function install_flannel() { yum -y install wget wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml} # 安装dockerread -p "是否安装docker?默认为:no. Enter [yes/no]:" is_dockerif [[ "$is_docker" == 'yes' ]];then run_function "install_docker"fi # 安装k8sread -p "是否安装k8s?默认为:no. Enter [yes/no]:" is_k8sif [[ "$is_k8s" == 'yes' ]];then run_function "install_k8s"fi2.node节点安装脚本:install_k8s_node.sh#!/bin/bash# Kubernetes部署环境要求:#(1)一台或多台机器,操作系统CentOS 7.x-86_x64#(2)硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+;#(3)集群内各个机器之间能相互通信;#(4)集群内各个机器可以访问外网,需要拉取镜像;#(5)禁止swap分区; # 安装步骤#1. 安装docker#1.1 如果没有安装docker,则安装docker。会附带安装一个docker-compose##2. 安装k8s#2.1 初始化环境#2.2 添加安装源#2.3 安装kubelet、kubectl、kubeadmin#2.4 安装master#2.5 安装网络插件 set -e # 安装日志install_log=/var/log/install_k8s.logtm=$(date +'%Y%m%d %T') # 日志颜色COLOR_G="\x1b[0;32m" # greenRESET="\x1b[0m" function info(){ echo -e "${COLOR_G}[$tm] [Info] ${1}${RESET}"} function run_cmd(){ sh -c "$1 | $(tee -a "$install_log")"} function run_function(){ $1 | tee -a "$install_log"} function install_docker(){ info "1.使用脚本自动安装docker..." wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com:443/use-framework-upgrade/docker-ce.repo yum install docker-ce info "2.启动 Docker CE..." sudo systemctl enable docker sudo systemctl start docker info "3.添加镜像加速器..." if [ ! -f "/etc/docker/daemon.json" ];then touch /etc/docker/daemon.json fi cat <<EOF > /etc/docker/daemon.json{ "registry-mirrors": [ "https://5ajk0rns.mirror.aliyuncs.com" ]}EOF info "4.重新启动服务..." sudo systemctl daemon-reload sudo systemctl restart docker info "5.测试 Docker 是否安装正确..." docker run hello-world info "6.检测..." docker info read -p "是否安装docker-compose?默认为 no. Enter [yes/no]:" is_compose if [[ "$is_compose" == 'yes' ]];then info "7.安装docker-compose" sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod a+x /usr/local/bin/docker-compose # 8.验证是否安装成功 info "8.验证docker-compose是否安装成功..." docker-compose -v fi} function install_k8s() { info "初始化k8s部署环境..." init_env info "添加k8s安装源..." add_aliyun_repo info "安装kubelet kubeadmin kubectl..." install_kubelet_kubeadmin_kubectl} # 初始化部署环境function init_env() { info "关闭防火墙" systemctl stop firewalld systemctl disable firewalld info "关闭selinux" sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/g' /etc/selinux/config source /etc/selinux/config info "关闭swap(k8s禁止虚拟内存以提高性能)" swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab info "设置网桥参数" cat <<-EOF > /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF sysctl --system #生效 sysctl -w net.ipv4.ip_forward=1 info "时间同步" yum install ntpdate -y ntpdate time.windows.com} # 添加aliyun安装源function add_aliyun_repo() { cat > /etc/yum.repos.d/kubernetes.repo <<- EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF} function install_kubelet_kubeadmin_kubectl() { yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y systemctl enable kubelet.service info "确认kubelet kubeadmin kubectl是否安装成功" yum list installed | grep kubelet yum list installed | grep kubeadm yum list installed | grep kubectl kubelet --version} function kubeadmin_init() { sleep 1 read -p "请输入master ip地址:" ip kubeadm init --apiserver-advertise-address="${ip}" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 mkdir -p "$HOME"/.kube sudo cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config sudo chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config} function install_flannel() { yum -y install wget wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml} # 安装dockerread -p "是否安装docker?默认为:no. Enter [yes/no]:" is_dockerif [[ "$is_docker" == 'yes' ]];then run_function "install_docker"fi # 安装k8sread -p "是否安装k8s?默认为:no. Enter [yes/no]:" is_k8sif [[ "$is_k8s" == 'yes' ]];then run_function "install_k8s"fi3.安装完成master节点后会提示加入节点的命令类似这样[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 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 192.168.0.174:6443 --token 861suk.4xhcuycoev4rh6dm \ --discovery-token-ca-cert-hash sha256:3fabddc90d0966bef569865236913b93fe12ee2429f957718f2485447564 [20230508 13:48:36] [Info] 安装网络插件flannel...在各个node节点上执行命令即可kubeadm join 192.168.0.174:6443 --token 861suk.4xhcuycoev4rh6dm \ --discovery-token-ca-cert-hash sha256:3fabddc90d0966bef569865236913b93fe12ee2429f957718f2485447564 安装验证 验证docker是否安装成功docker -v 验证docker-compose是否安装成功docker-compose -v 验证k8s是否安装成功kubectl get nodes 脚本中已经做了去污点[通过kubeadmin部署k8s,默认master上是不能被调度pod的,去污点就是在master上也可以被调度pod] 等待一会后,再通过kubectl get nodes查看,master状态已经正常了
-
我在尝试部署KubeEdge框架在部署K8s使用 kubeadm init语句初始化集群时遇到了问题使用的Ubuntu版本为18.04Docker版本为18.06.3Kubernetes版本为1.17.4遇到的如下的报错起先是卡在这个位置按照网络上的教学修改了kubelet与Docker的驱动程序改为systemd然后就出现了上面那张图的报错求教错误原因与解决的方案
-
Kubernetes概述什么是容器?·容器为App提供独立的、受控的运行环境,是一种轻量级的操作系统虚拟化。简单的容器:SandBox(沙盒、沙箱)容器基本概念·容器关键概念―容器一镜像容器关键技术CgroupNameSpace容器时代的“双城记”Docker Kubernetes(K8s)Kubernetes -大海航行的舵手K8s集群主要包括两个部分:Master节点(管理节点)和Node节点(计算节点)Master节点主要还是负责管理和控制。Node节点是工作负载节点,里面是具体的容器。Master节点Master节点提供的集群控制,对集群做出全局性决策,例如调度等。通常在master节点上不运行用户容器。Master节点包括API Server、Scheduler、Controller manager、etcd。API Server :整个系统的对外接口Scheduler:集群内部的资源进行调度Controller Manager:负责管理控制器etcd : Kubernetes的后端存储Node节点节点组件运行在每一个Node节点上,维护运行的pod并提供kubernetes运行时环境。Node节点包括Pod、Docker、kubelet、kube-proxy、Fluentd、kube-dns (可选Pod是K8s最小单位Pod : Kubernetes最基本的操作单元Docker :创建容器;Kubelet:负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等;Kube-proxy∶负责为Pod对象提供代理Fluentd:主要负责日志收集、存储与查询。Master节点和Node节点交互Kubernetes云上环境搭建CCE-基于开源K8S、 Docker技术的企业级容器服务云容器引擎(Cloud Container Engine,CCE)是基于业界主流的Docker和Kubernetes开源技术构建的容器服务,提供众多契合企业大规模容器集群场景的功能,在系统可靠性、高性能、开源社区兼容性等多个方面具有独特的优势,满足企业在构建容器云方面的各种需求。CCE优势:高性能、简单易用、安全可靠、开放兼容怎么管理K8s集群图形化WEB-UI 华为云CCE控制台、官方Dashboard命令行Kubectl iWebTerminal 管理员并发用户少Node+EIP 管理员并发用户多华为云Kubernetes环境快速搭建架构CE快该束物建KubernetesKubernetes的访问VPC:提供网络环境EIP:访问公网ECS:弹性云主机CCE:创建K8s集群Kubernetes环境管理进行Kubectl及配置文件下载下载kubectl和kubectl配置文件 kubeconfig.json和kubectlKubectl客户端服务器购买集群中管理节点安全组设置安装和使用kubectl使用Kubernetes只需一个部署文件,使用一条命令就可以部署多层容器(前端,后台等)的完整集群:$kubectl create -f single-config-file.yamlkubectl是和Kubernetes API交互的命令行程序。1.3 Kubernetes核心概念Kubernetes最小管理单元-PODPod是Kubernetes管理的最小基础单元。一个Pod中封装了︰一个或多个紧耦合的应用容器存储资源独立的IP容器运行的选项相同Pod中的任何容器都将共享相同的名称空间和本地网络。容器可以很容易地与其他容器在相同的容器中进行通信实践1:POD的创建和管理1.POD定义文件的上传通过winscp将下载的附件中的yml文件上传至客户端服务器目录并查看;2.创建PODkubectl apply -f POD-1Containeryml3.POD的管理指定POD运行到指定的NODE上kubectl apply -f POD-NodeSelector.yml4.POD的删除kubectl get podkubectl delete pod nginx有状态应用和无状态应用无有状态应用无状态服务,易于部署且易于扩展。如果流量上升,则只需添加更多的负载平衡;上游容器镜像和基础架构中正在运行的容器其实几乎没有区别;可以随时被替代,而且容器实例切换过程中几乎不需要耗费“切换成本”。有状态应用有状态的服务,从部署开始,这些容器就开始与上游镜像不同了,时间越长它们的差异越大;每个运行的应用程序都至少有—个小状态(差异),但对于“无状态”应用程序来说,状态(差异)很小,而且可以进行快速替换。无状态应用控制器– DeploymentReplicationController 无状态应用的高可靠 ReplicaSets 无状态应用的高可靠应用的滚动发布 Deployment实践2:Deployment的创建和管理1.创建deploymentkubectl apply -f deployment.yml2.查看PODkubectl get pod3.手动删除PODkubbectl delete pod nginx-deployment-67d4b848b4-sghfq4.扩展Deployment数量kubectl scale deployment.v1.apps/nginx-deployment --replicas=4kubectl get pod5.查看deployment状态和数量有状态应用控制器- StatefulSet如果部署的应用满足右侧一个或多个部署需求则建议使用StatefulSet。在具有以下特点时使用StatefulSets·稳定性,唯一的网络标识符·稳定性,持久化存储·有序的部署和扩展·有序的删除和终止·有序的自动滚动更新实践3:StatefulSet的创建和管理1.在Winscp将StatefulSet定义文件statefulset.yml上传至ecs-k8s。2.通过以下命令创建StatefulSet。kubetcl apply -f statefulset.yml3.通过以下命令查看POD数量和名称kubectl get pod4.手动删除名称为web-0的POD。kubectl delete pod web-05.再次查看POD。kubectl get pod系统应用控制器- DaemonSetDaemonSet能够让所有或者特定的Node节点运行一个pod。当节点加入到kubernetes集群中,pod会被( DaemonSet ) 调度到该节点上运行。当节点从kubernetes集群中被移除,( DaemonSet )调度的pod会被移除。运行日志采集器在每个Node上,例如fluentd ,logstash运行监控的采集端在每个Node,例如prometheusnode exporter , collectd等每个Node上运行一个分布式存储的守护进程,例如glusterd , ceph适合场景:在一个区域的Node上都运行一个守护进程实践4:DaemonSet的创建和管理在winscp中上传daemonset.yml文件至ecs-k8s查看kube-system命令空间中的DaemonSetkubectl get ds -n kube-system创建daemonsetkubectl apply -f daemonset.yml4.再次查看kube-system中的DaemonSetkubectl get ds -n kube-system5.在CCE中购买节点6.查看各个DaemonSet实例数kubectl get ds -n kube-system临时任务控制器–Job我们经常需要进行批量数据处理和分析,以及按照时间进行调度执行。可以在Kubenrtes中使用容器技术完成,使用Job和CronJob来执行。Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。CronJob是基于调度的Job执行将会自动产生多个job,调度格式参考Linux的cron系统。实践5:Jobs创建和管理winscp将Job.yml上传运行Jobkubectl apply -f Job. Yml3.查看job运行状态kubectl get job4.查看此Job的输出kubectl get podkubectl logs pi-c5pgr应用访问- ServiceKubernetes应用间互访- Cluster IPKubernetes集群外互访–NodePort公网访问- LoadBalancer实践6 : Service的创建和管理1.上传的deployment文件创建Deploymentkubectl apply -f deployment. Yml2.创建NodePort类型的Service并查看kubectl expose deployment nginx-deployment-type=NodePortkubectl get service通过curl命令验证网站kubectl get node4.url 192.168.0.227:324655.华为云控制台查看其中一个kubernetes Node绑定的公网地址6.在浏览器中,输入ECS绑定的公网地址+Service的Nodeport命名空间- NameSpace作用:Kubernetes可以使用Namespaces(命名空间)创建多个虚拟集群;Namespace为名称提供了一个范围。资源的Names在Namespace中具有唯一性场景:当团队或项目中具有许多用户时,可以考虑使用Namespace来区分,a如果是少量用户集群,可以不需要考虑使用Namespace,如果需要它们提供特殊性质时,可以开始使用Namespace。大多数的Kubernetes中的集群默认会有一个叫default的namespace。实际上,应该是3个:default:你的service和app默认被创建于此。kube-system : kubernetes系统组件使用。kube-public :公共资源使用。实践7∶命名空间的创建和管理默认的Nama&pice实践手动的创建一个NameSpace命名空间并查看kubectl create namespace testkubectl get namespace2.创建一个POD并指定此POD运行在test命名空间llkubectl apply-f POD-1Container.yml -namespace=test3.查看指定命名空间里的PODkubectl get pod -n test.创建一个限制CPU和内存大小的NameSpacekubectl create -f ns-cpu-men.yml -namespace=quota-mem-cpu-examplekubectl get resourcequota mem-cpu-demo -namespace=quota-mem-cpu-example R--output=yaml
-
您好,我在安k8s前尝试安装docker10.20.7之后写入配置文件,然后重启的时候报错配置文件:[Unit]Description=Docker Application Container EngineDocumentation=http://docs.docker.comAfter=network.target docker.socket[Service]Type=notifyEnvironmentFile=-/run/flannel/dockerWorkingDirectory=/usr/local/binExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock --selinux-enabled=false --log-opt max-size=1gExecReload=/bin/kill -s HUP $MAINPID# Having non-zero Limit*s causes performance problems due to accounting overhead# in the kernel. We recommend using cgroups to do container-local accounting.LimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinity# Uncomment TasksMax if your systemd version supports it.# Only systemd 226 and above support this version.#TasksMax=infinityTimeoutStartSec=0# set delegate yes so that systemd does not reset the cgroups of docker containersDelegate=yes# kill only the docker process, not all processes in the cgroupKillMode=processRestart=on-failure[Install]WantedBy=multi-user.targetrestart后报错:[drm:virtio_gpu_dequeue_ctrl_func [virtio_gpu]] ERROR response 0x1202 (command 0x103)6月 25 19:09:19 ecs-formal-0002 kernel: virtio_gpu_dequeue_ctrl_func: 24 callbacks suppressed6月 25 19:09:19 ecs-formal-0002 kernel: [drm:virtio_gpu_dequeue_ctrl_func [virtio_gpu]] ERROR response 0x1202不知道什么问题,烦请解答,谢谢!
-
问题现象集群添加节点的时候报错提示:unable to fetch kubeadm-config问题原因一般在这个环节出现添加错误并提示没有权限获取config文件,大多是由于token错误或者失效造成的,由于默认情况下master节点上的token只会保留24小时,超过期限之后会失效。处理步骤 步骤1去master节点上检查token状态: kubeadm token list 步骤2如果发现已经invalid则需要重新生成一个临时token(这里暂时不讨论生成长期有效的token)执行: kubeadm create token 步骤3 使用新的token执行添加操作即可通过
-
背景项目中的系统要求使用如下软件栈:l UOS 20 Enterprise sp2l Javal Mysqll Redisl Kafkal Dockerl Kubernetes问题POD中的容器无法正常通信,网络通信故障表现如下:问题分析项目K8S使用的calico组件管理网络,Calico 是一个纯三层的协议,为 OpenStack 虚机和 Docker 容器提供多主机间通信。Calico 不使用重叠网络比如 flannel 和 libnetwork 重叠网络驱动,它是一个纯三层的方法,使用虚拟路由代替虚拟交换,每一台虚拟路由通过BGP协议传播可达信息(路由)到剩余数据中心。Calico 依赖 etcd 在不同主机间共享和交换信息,存储 Calico 网络状态。Calico 网络中每个主机都要运行 Calico 组件,提供容器 interface 管理,动态路由,动态 ACL,报告状态等功能。基于上图的通信故障,定位问题发生跨POD的通信规则上。l 首先排查calico网络配置,客户的系统calico使用BGC协议管理网路规则,Calico引入这个BGP,它是将每个node,都做成一个虚拟路由器,他们通过BGP实现相互路由信息的交换,而flannel是由一个守护进程维护的每个路由表,发送到本地的节点,而calico采用的是BGP来实现数据交换,但路由表也要写到每个节点上。查看calico的配置参数为发现异常。l 然后在node和POD上排查路由列表,路由表也是正常的。l 最后排查iptables规则,因为calico的流量隔离是基于iptables实现的,并且从etcd中获取需要生成的隔离规则。最终定位iptables规则的问题。Calico使用OS自带的iptables生成路由规则,保证节点间、POD间通信。UOS上iptables升级到了1.8.2,后端从Legacy模式变成了nf_tables。这两种模式的区别不在此赘述,简单来说就是calico无法适配高版本的iptables,无法在Host上产生正确的路由规则。在社区上的方案方案并没有为适配nf_tables另外实现路由规则的建立,而是重用了legacy模式的逻辑,先产生legacy模式的路由规则,再使用iptables-nft-save和iptables-nft-restore命令分别导出及写入到host的iptables中。解决办法更换calico的网络模式,从BGP模式更换成IPIP,IPIP就是把一个IP数据包又套在一个IP包里,即把 IP 层封装到 IP 层的一个 tunnel,它的作用其实基本上就相当于一个基于IP层的网桥!一般来说,普通的网桥是基于mac层的,根本不需 IP,而这个 ipip 则是通过两端的路由做一个 tunnel,把两个本来不通的网络通过点对点连接起来。ipip 的源代码在内核 net/ipv4/ipip.c 中可以找到。操作步骤Calico.yaml文件中,将CALICO_IPV4POOL_IPIP的值修改成“Always”,即可!
上滑加载中
推荐直播
-
OpenHarmony应用开发之网络数据请求与数据解析
2025/01/16 周四 19:00-20:30
华为开发者布道师、南京师范大学泰州学院副教授,硕士研究生导师,开放原子教育银牌认证讲师
科技浪潮中,鸿蒙生态强势崛起,OpenHarmony开启智能终端无限可能。当下,其原生应用开发适配潜力巨大,终端设备已广泛融入生活各场景,从家居到办公、穿戴至车载。 现在,机会敲门!我们的直播聚焦OpenHarmony关键的网络数据请求与解析,抛开晦涩理论,用真实案例带你掌握数据访问接口,轻松应对复杂网络请求、精准解析Json与Xml数据。参与直播,为开发鸿蒙App夯实基础,抢占科技新高地,别错过!
回顾中 -
Ascend C高层API设计原理与实现系列
2025/01/17 周五 15:30-17:00
Ascend C 技术专家
以LayerNorm算子开发为例,讲解开箱即用的Ascend C高层API
回顾中
热门标签