NESTA PÁGINA
Casos de uso de roteador nativos de nuvem e visão geral da configuração
Leia este capítulo para revisar exemplos de configuração para vários casos de uso de roteador nativo de nuvem da Juniper quando implantado no modo de interface de rede de contêiner (CNI).
O roteador nativo de nuvem da Juniper pode ser implantado como um switch virtual ou um roteador de trânsito, seja como uma função de rede de contêiner puro (CNF) ou como uma interface de rede de contêiner (CNI). No modo CNF, não há pods de aplicativo em execução no nó e o roteador só realiza comutação ou encaminhamento de pacotes por meio de várias interfaces no sistema. No modo CNI, os pods de aplicativo que usam interfaces de rede baseadas em software, como veth-pairs ou interfaces baseadas em usuário DPDK vhost, são anexados ao roteador nativo da nuvem. Este capítulo fornece exemplos de configuração para anexar diferentes tipos de interface de carga de trabalho à instância CNI do roteador nativo da nuvem.
Exemplo de configuração
A CNI do roteador nativo de nuvem é implantada como uma CNI secundária, juntamente com Multus como uma CNI primária, para criar diferentes tipos de interfaces secundárias para o pod de aplicativos. A Multus usa um arquivo de definição de anexo de rede (NAD) para configurar uma interface secundária para o pod do aplicativo. O NAD especifica como criar uma interface secundária, alocação de endereço IP, instância de rede e muito mais. Um pod pode ter um ou mais NADs, normalmente um por interface de pod. Oconfig: campo no arquivo NAD define a configuração CNI do roteador nativo de nuvem. Aqui está um formato genérico do NAD:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: <vrf-name>
spec:
config: '{
"cniVersion":"0.4.0",
"name": "<vrf-name>",
"plugins": [
{
"type": "jcnr",
"args": {
"key1":"value1",
"key2","value2",
....
},
"ipam": {
"type": "<ipam-type>",
....
},
"kubeConfig":"/etc/kubernetes/kubelet.conf"
}
]
}'
| Descrição da chave | |
|---|---|
| nome de instância | O nome da instância de roteamento |
| instânciasPoquétimos | Um de: roteador virtual — para aplicativos não relacionados a VPN vrf — implementações de VPN de camada 3 switch virtual — implementações de Camada 2 |
| interfacePoquétipo | Ou "veth" ou "virtio" |
| vlanId | Uma id vlan válida "1-4095" |
| bridgeVlanId | Uma id vlan válida "1-4095" |
| vlanIdList | Uma lista de comandos separada vlan-id, por exemplo: "1, 5, 7, 10-20" |
| parentInterface | Nome de interface válido conforme deve aparecer no pod. As sub-interfaces/crianças têminterface parental como prefixo seguido de "." Se a interface parental for especificada, a sub interface deve ser explicitamente especificada. |
| vrfTarget | O alvo de rota para a instância de roteamento vrf |
| bridgeDomain | Domínio bridge sob qual interface de pod deve ser anexada na instância do switch virtual. |
| tipo (ipam) | estático — atribui o mesmo IP a todos os pods, para atribuir um IP único por pod definir um NAD exclusivo por pod por interface host local — endereço IP exclusivo por interface de pod no mesmo host. Os endereços IP não são exclusivos em dois nós diferentes descasos — endereço IP exclusivo por pod em todos os nós |
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: vswitch-pod1-bd100
spec:
config: '{
"cniVersion":"0.4.0",
"name": "vswitch-pod1-bd100",
"plugins": [
{
"type": "jcnr",
"args": {
"instanceName": "vswitch",
"instanceType": "virtual-switch",
"interfaceType": "veth",
"bridgeDomain": "bd100",
"bridgeVlanId": "100"
},
"ipam": {
"type": "static",
"addresses":[
{
"address":"99.61.0.2/16",
"gateway":"99.61.0.1"
},
{
"address":"1234::99.61.0.2/120",
"gateway":"1234::99.61.0.1"
}
]
},
"kubeConfig":"/etc/kubernetes/kubelet.conf"
}
]
}'
k8s.v1.cni.cncf.io/networks anotação. Por exemplo:
apiVersion: v1
kind: Pod
metadata:
name: pod1
annotations:
k8s.v1.cni.cncf.io/networks: vswitch-pod1-bd100
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kind-worker
containers:
- name: pod1
image: ubuntu:latest
imagePullPolicy: IfNotPresent
securityContext:
privileged: false
env:
- name: KUBERNETES_POD_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
volumeMounts:
- name: dpdk
mountPath: /dpdk
subPathExpr: $(KUBERNETES_POD_UID)
volumes:
- name: dpdk
hostPath:
path: /var/run/jcnr/containers
/dpdk/dpdk-interfaces.json dentro do contêiner de aplicativos para o aplicativo DPDK consumir. Também é exportado para o pod como uma anotação de pod.
Quando você cria um pod para uso no roteador nativo de nuvem, o componente Kubernetes conhecido como kubelet chama a CNI da Multus para configurar redes e interfaces de pod. Multus lê a seção de anotações do arquivo pod.yaml para consultar o NAD correspondente. Se um NAD aponta como jcnr o plug-in da CNI, Multus chama o JCNR-CNI para configurar a interface do pod. O JCNR-CNI cria a interface conforme especificado no NAD. A JCNR-CNI então gera e empurra uma configuração para o cRPD.
Solucionando problemas
Os pods principais não surgem por várias razões:
-
Imagem não encontrada
-
A CNI falhou em adicionar interfaces
-
A CNI falhou em empurrar a configuração para o cRPD
-
A CNI não invocou as APIs REST do vRouter
-
O NAD é inválido ou indefinido
Os comandos a seguir serão úteis para solucionar problemas de pod:
# Check the Pod status kubectl get pods –A
# Check pod state and CNI logs kubectl describe pod <pod-name>
# Check the pod logs kubectl logs pod <pod-name>
# Check the net-attach-def kubectl get net-attach-def <net-attach-def-name> -o yaml
# Check CNI logs tail –f /var/log/jcnr/jcnr-cni.log
# Check the cRPD config added by CNI (on the cRPD CLI) cli> show configuration groups cni