AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-859348

Daigo's questions

Martin Hope
Daigo
Asked: 2022-08-30 19:06:37 +0800 CST

O pod está preso no status PodInitializing quando um initContainer é OOMKilled

  • 2

Eu tenho o seguinte ambiente local do Kubernetes:

  • SO: Red Hat Enterprise Linux versão 8.6 (Ootpa)
  • Kubernetes: 1.23.7 ​​(nó único, compilado com kubeadm)
  • Driver NVIDIA: 515.65.01
  • nvidia-container-toolkit: 1.10.0-1.x86_64 (rpm)
  • containerd: v1.6.2
  • vcr.io/nvidia/k8s-device-plugin:v0.12.2

E eu executo o seguinte Pod no meu servidor. Apenas app2 (initContainer2) usa GPU.

initContainer1: app1
↓
initContainer2: app2 (Uses GPU)
↓
container1: app3

Quando o app2 usa muita RAM e é eliminado do OOM, o Pod deve estar no OOMKilledstatus, mas está preso no PodInitializingstatus no meu ambiente.

NAMESPACE     NAME       READY   STATUS            RESTARTS       AGE     IP               NODE      NOMINATED NODE   READINESS GATES
default       gpu-pod    0/1     PodInitializing   0              83m     xxx.xxx.xxx.xxx   xxxxx   <none>           <none>

O resultado kubectl describe podé o seguinte:

Init Containers:
  app1:
    ...
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Tue, 30 Aug 2022 10:50:38 +0900
      Finished:     Tue, 30 Aug 2022 10:50:44 +0900
      ...
app2:
    ...
    State:          Terminated
      Reason:       OOMKilled
      Exit Code:    0
      Started:      Tue, 30 Aug 2022 10:50:45 +0900
      Finished:     Tue, 30 Aug 2022 10:50:48 +0900
      ...
app3:
    ...
    State:          Waiting
      Reason:       PodInitializing
      ...
    ...

Esse problema nunca acontecerá quando eu substituir app2 por outro contêiner que não usa GPU ou quando eu iniciar app2 como um único contêiner (não um contêiner init) do Pod. Em ambos os casos, o status será corretamente OOMKilled.

Isso é um inseto? Em caso afirmativo, existem soluções alternativas?

kubernetes
  • 1 respostas
  • 191 Views
Martin Hope
Daigo
Asked: 2022-01-20 23:51:00 +0800 CST

Não é possível executar o comando dpkg no contêiner kube-proxy

  • 0

Atualmente estou tentando obter uma lista de todos os pacotes debian instalados (dpkg) no k8s.gcr.io/kube-proxy:v1.23.2contêiner.

Primeiro, tentei executar dpkg -lno contêiner em execução como parte do meu cluster kubernetes, mas recebi o seguinte erro.

dpkg-query: error: showing package list on pager subprocess returned error exit status 127

Então eu também tentei o comando diretamente no containerd, nerdctl run -it k8s.gcr.io/kube-proxy:v1.23.2 dpkg -lmas recebi o mesmo erro.

É possível obter a lista modificando algumas configurações ou existe alguma abordagem diferente?

debian dpkg docker kubernetes containers
  • 1 respostas
  • 43 Views
Martin Hope
Daigo
Asked: 2022-01-11 23:50:09 +0800 CST

O pod do Kubernetes falha com o status OutOfMemory imediatamente após o agendamento

  • 1

Estou testando meu aplicativo em um cluster Kubernetes bare-metal (versão 1.22.1) e tendo um problema ao iniciar meu aplicativo como um trabalho.

Meu cluster tem dois nós (mestre e trabalhador), mas o trabalhador está isolado. No nó mestre, 21 GB de memória estão disponíveis para o aplicativo.

Tentei iniciar meu aplicativo como três empregos diferentes ao mesmo tempo. Como configurei 16 GB de memória como solicitação de recurso e limite, apenas um único trabalho foi iniciado e os dois restantes estão em estado Pendente. Eu configurei backoffLimit: 0 para o arquivo Jobs.

NAME            READY   STATUS     RESTARTS   AGE
app1--1-8pp6l   0/1     Pending    0          42s
app2--1-42ssl   0/1     Pending    0          45s
app3--1-gxgwr   0/1     Running    0          46s

Após a conclusão do primeiro pod, apenas um dos dois pods em estado pendente deve ser iniciado. No entanto, um foi iniciado e o outro estava em um status OutOfMemory, embora nenhum contêiner tenha sido iniciado no pod.

NAME            READY   STATUS        RESTARTS   AGE
app1--1-8pp6l   0/1     Running       0          90s
app2--1-42ssl   0/1     OutOfmemory   0          93s
app3--1-gxgwr   0/1     Completed     0          94s

Os eventos do Pod OutOfMemory são os seguintes:

Events:
  Type     Reason            Age                   From               Message
  ----     ------            ----                  ----               -------
  Warning  FailedScheduling  3m41s (x2 over 5m2s)  default-scheduler  0/2 nodes are available: 1 Insufficient memory, 1 node(s) were unschedulable.
  Normal   Scheduled         3m38s                 default-scheduler  Successfully assigned test/app2--1-42ssl to master
  Warning  OutOfmemory       3m38s                 kubelet            Node didn't have enough resource: memory, requested: 16000000000, used: 31946743808, capacity: 37634150400

Parece que o Pod está atribuído ao nó, embora não haja espaço suficiente para ele, pois o outro Pod acabou de ser iniciado.

Acho que esse não é um comportamento esperado do Kubernetes, alguém sabe a causa desse problema?

kubernetes
  • 2 respostas
  • 439 Views
Martin Hope
Daigo
Asked: 2021-12-01 22:10:33 +0800 CST

Como posso modificar o configmap CoreDNS antes de inicializar o cluster usando o kubeadm?

  • 1

Eu preciso construir meu cluster Kubernetes local usando kubeadm.

Como meu ambiente não possui DNS, tenho que modificar um configmap do CoreDNS para que ele não contenha uma seção de encaminhamento.

Depois de implantar o cluster, posso editar o configmap usando kubectl edit cm coredns -n kube-system, mas demora um pouco para o CoreDNS funcionar corretamente após a modificação que pode ser um problema para meu ambiente de produção.

É possível editar este configmap antes da execução do kubeadm init?

kubernetes kubeadm
  • 1 respostas
  • 268 Views
Martin Hope
Daigo
Asked: 2021-11-25 00:25:37 +0800 CST

A instalação offline do kubernetes falha ao usar containerd como CRI

  • 1

Eu tive que construir um cluster Kubernetes bare-metal sem conexão com a Internet por algum motivo.

Como o dockershim estava obsoleto, decidi usar o containerd como CRI, mas a instalação offline com o kubeadm falhou durante a execução kubeadm initdevido ao tempo limite.

    Unfortunately, an error has occurred:
            timed out waiting for the condition

    This error is likely caused by:
            - The kubelet is not running
            - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

    If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands:
            - 'systemctl status kubelet'
            - 'journalctl -xeu kubelet'

E posso ver muitos logs de erros como resultado de journalctl -u kubelet -f:

11 24 16:25:25 rhel8 kubelet[9299]: E1124 16:25:25.473188    9299 controller.go:144] failed to ensure lease exists, will retry in 7s, error: Get "https://133.117.20.57:6443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/rhel8?timeout=10s": dial tcp 133.117.20.57:6443: connect: connection refused
11 24 16:25:25 rhel8 kubelet[9299]: E1124 16:25:25.533555    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:25 rhel8 kubelet[9299]: I1124 16:25:25.588986    9299 kubelet_node_status.go:71] "Attempting to register node" node="rhel8"
11 24 16:25:25 rhel8 kubelet[9299]: E1124 16:25:25.589379    9299 kubelet_node_status.go:93] "Unable to register node with API server" err="Post \"https://133.117.20.57:6443/api/v1/nodes\": dial tcp 133.117.20.57:6443: connect: connection refused" node="rhel8"
11 24 16:25:25 rhel8 kubelet[9299]: E1124 16:25:25.634625    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:25 rhel8 kubelet[9299]: E1124 16:25:25.735613    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:25 rhel8 kubelet[9299]: E1124 16:25:25.835815    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:25 rhel8 kubelet[9299]: E1124 16:25:25.936552    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:26 rhel8 kubelet[9299]: E1124 16:25:26.036989    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:26 rhel8 kubelet[9299]: E1124 16:25:26.137464    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:26 rhel8 kubelet[9299]: E1124 16:25:26.238594    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:26 rhel8 kubelet[9299]: E1124 16:25:26.338704    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:26 rhel8 kubelet[9299]: E1124 16:25:26.394465    9299 event.go:273] Unable to write event: '&v1.Event{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"rhel8.16ba6aab63e58bd8", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string(nil), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, InvolvedObject:v1.ObjectReference{Kind:"Node", Namespace:"", Name:"rhel8", UID:"rhel8", APIVersion:"", ResourceVersion:"", FieldPath:""}, Reason:"Starting", Message:"Starting kubelet.", Source:v1.EventSource{Component:"kubelet", Host:"rhel8"}, FirstTimestamp:v1.Time{Time:time.Time{wall:0xc05f9812b2b227d8, ext:5706873656, loc:(*time.Location)(0x55a228f25680)}}, LastTimestamp:v1.Time{Time:time.Time{wall:0xc05f9812b2b227d8, ext:5706873656, loc:(*time.Location)(0x55a228f25680)}}, Count:1, Type:"Normal", EventTime:v1.MicroTime{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:(*v1.EventSeries)(nil), Action:"", Related:(*v1.ObjectReference)(nil), ReportingController:"", ReportingInstance:""}': 'Post "https://133.117.20.57:6443/api/v1/namespaces/default/events": dial tcp 133.117.20.57:6443: connect: connection refused'(may retry after sleeping)
11 24 16:25:27 rhel8 kubelet[9299]: E1124 16:25:27.143503    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:27 rhel8 kubelet[9299]: E1124 16:25:27.244526    9299 kubelet.go:2407] "Error getting node" err="node \"rhel8\" not found"
11 24 16:25:27 rhel8 kubelet[9299]: E1124 16:25:27.302890    9299 remote_runtime.go:116] "RunPodSandbox from runtime service failed" err="rpc error: code = Unknown desc = failed to get sandbox image \"k8s.gcr.io/pause:3.2\": failed to pull image \"k8s.gcr.io/pause:3.2\": failed to pull and unpack image \"k8s.gcr.io/pause:3.2\": failed to resolve reference \"k8s.gcr.io/pause:3.2\": failed to do request: Head \"https://k8s.gcr.io/v2/pause/manifests/3.2\": dial tcp: lookup k8s.gcr.io on [::1]:53: read udp [::1]:39732->[::1]:53: read: connection refused"
11 24 16:25:27 rhel8 kubelet[9299]: E1124 16:25:27.302949    9299 kuberuntime_sandbox.go:70] "Failed to create sandbox for pod" err="rpc error: code = Unknown desc = failed to get sandbox image \"k8s.gcr.io/pause:3.2\": failed to pull image \"k8s.gcr.io/pause:3.2\": failed to pull and unpack image \"k8s.gcr.io/pause:3.2\": failed to resolve reference \"k8s.gcr.io/pause:3.2\": failed to do request: Head \"https://k8s.gcr.io/v2/pause/manifests/3.2\": dial tcp: lookup k8s.gcr.io on [::1]:53: read udp [::1]:39732->[::1]:53: read: connection refused" pod="kube-system/kube-scheduler-rhel8"
11 24 16:25:27 rhel8 kubelet[9299]: E1124 16:25:27.302989    9299 kuberuntime_manager.go:815] "CreatePodSandbox for pod failed" err="rpc error: code = Unknown desc = failed to get sandbox image \"k8s.gcr.io/pause:3.2\": failed to pull image \"k8s.gcr.io/pause:3.2\": failed to pull and unpack image \"k8s.gcr.io/pause:3.2\": failed to resolve reference \"k8s.gcr.io/pause:3.2\": failed to do request: Head \"https://k8s.gcr.io/v2/pause/manifests/3.2\": dial tcp: lookup k8s.gcr.io on [::1]:53: read udp [::1]:39732->[::1]:53: read: connection refused" pod="kube-system/kube-scheduler-rhel8"
11 24 16:25:27 rhel8 kubelet[9299]: E1124 16:25:27.303080    9299 pod_workers.go:765] "Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"kube-scheduler-rhel8_kube-system(e5616b23d0312e4995fcb768f04aabbb)\" with CreatePodSandboxError: \"Failed to create sandbox for pod \\\"kube-scheduler-rhel8_kube-system(e5616b23d0312e4995fcb768f04aabbb)\\\": rpc error: code = Unknown desc = failed to get sandbox image \\\"k8s.gcr.io/pause:3.2\\\": failed to pull image \\\"k8s.gcr.io/pause:3.2\\\": failed to pull and unpack image \\\"k8s.gcr.io/pause:3.2\\\": failed to resolve reference \\\"k8s.gcr.io/pause:3.2\\\": failed to do request: Head \\\"https://k8s.gcr.io/v2/pause/manifests/3.2\\\": dial tcp: lookup k8s.gcr.io on [::1]:53: read udp [::1]:39732->[::1]:53: read: connection refused\"" pod="kube-system/kube-scheduler-rhel8" podUID=e5616b23d0312e4995fcb768f04aabbb

Quando faço a mesma coisa com a conexão com a Internet, a instalação é bem-sucedida. E ao usar o docker em vez do containerd, a instalação é feita com sucesso mesmo se não houver conexão com a Internet.

kubernetes kubeadm containerd
  • 1 respostas
  • 1309 Views
Martin Hope
Daigo
Asked: 2021-11-10 17:24:15 +0800 CST

Posso configurar o Docker para gerenciar recursos no namespace "k8s.io" do containerd?

  • 0

Eu tinha um cluster do Kubernetes com o Docker e recentemente o migrei para o containerd, mas ainda quero usar o Docker para gerenciar imagens e contêineres do Kubernetes devido a alguns problemas de compatibilidade.

Ao usar o Docker como um tempo de execução, o Docker conseguiu carregar imagens para que o Kubernetes pudesse usá-lo e conseguiu listar contêineres em execução como pods do Kubernetes com o comando docker ps.

Mesmo depois de mudar para containerd, ainda posso executar e usar o Docker com ele. No entanto, como o Docker está isolado do mundo Kubernetes, é impossível gerenciar recursos no Kubernetes usando comandos docker.

Parece que o Kubernetes está sendo executado com o namespace do containerd "k8s.io", então espero poder configurar o Docker para gerenciar recursos nesse namespace, é possível?

docker kubernetes containerd
  • 1 respostas
  • 89 Views
Martin Hope
Daigo
Asked: 2021-10-26 21:18:51 +0800 CST

/etc/resolv.conf está faltando após a instalação do RHEL 8

  • 0

Instalei o RedHat Enterprise Linux 8.4 (instalação mínima) no meu servidor local e obtive alguns problemas relacionados ao docker.

Então descobri que o /etc/resolv.conf estava faltando.

Depois de executar "systemctl reload NetworkManager", o arquivo foi criado e o docker funcionou.

Não sei por que tenho que recarregar o NetworkManager para criar o resolv.conf e se minha rede está funcionando corretamente. Existe alguma maneira comum de fazer isso no RHEL8?

resolv.conf networkmanager rhel8
  • 1 respostas
  • 1788 Views
Martin Hope
Daigo
Asked: 2021-10-26 18:04:04 +0800 CST

o kubernetes coredns está no status CrashLoopBackOff com o erro "nenhum servidor de nomes encontrado"

  • 1

Eu tentei construir kubernetes usando kubeadm no meu servidor bare-metal com containerd como cri, mas parecia que o coredns falhou ao iniciar após a instalação do cni (weave-net).

Dois contêineres coredns estão agora no estado "CrashLoopBackOff" e os logs deles são:

plugin/forward: no nameservers found

E a descrição de "kubectl describe pod" é a seguinte:

Events:
  Type     Reason            Age                    From               Message
  ----     ------            ----                   ----               -------
  Warning  FailedScheduling  4m52s (x9 over 13m)    default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Normal   Scheduled         4m7s                   default-scheduler  Successfully assigned kube-system/coredns-58cf647449-8pq7k to k8s
  Normal   Pulled            3m13s (x4 over 4m6s)   kubelet            Container image "localhost:5000/coredns:v1.8.4" already present on machine
  Normal   Created           3m13s (x4 over 4m6s)   kubelet            Created container coredns
  Normal   Started           3m13s (x4 over 4m6s)   kubelet            Started container coredns
  Warning  Unhealthy         3m13s                  kubelet            Readiness probe failed: Get "http://10.32.0.3:8181/ready": dial tcp 10.32.0.3:8181: connect: connection refused
  Warning  BackOff           2m54s (x12 over 4m5s)  kubelet            Back-off restarting failed container

Se eu adicionar algumas configurações como "nameserver 8.8.8.8" em /etc/resolv.conf, os pods coredns começam a ser executados. No entanto, atualmente eu não uso nenhum dns externo, e com o Docker como cri, o coredns funcionou bem, embora não houvesse configurações em /etc/resolv.conf.

É possível lidar com este problema sem configurar algum servidor dns upstream no resolv.conf?

Informação do servidor:

OS: RedHat Enterprise Linux 8.4
cri: containerd 1.4.11
cni: weave-net 1.16
tools: kubeadm, kubectl, kubelet 1.22.1

Eu tentei usar chita como cni também, mas o resultado foi o mesmo.

domain-name-system kubernetes kubeadm
  • 2 respostas
  • 1460 Views
Martin Hope
Daigo
Asked: 2021-10-03 04:13:07 +0800 CST

Kubeadm com containerd não pode usar imagens carregadas localmente

  • 0

Estou tentando construir kubernetes com containerd no servidor bare-metal (RHEL8).

Não há conexão com a Internet, então baixei manualmente as imagens necessárias (por exemplo, k8s.gcr.io/kube-scheduler:v1.22.1) e as carreguei usando "ctr image import".

As imagens parecem ter sido carregadas com sucesso.

#ctr images ls -q
k8s.gcr.io/coredns/coredns:v1.8.4
k8s.gcr.io/etcd:3.5.0-0
k8s.gcr.io/kube-apiserver:v1.22.1
k8s.gcr.io/kube-controller-manager:v1.22.1
k8s.gcr.io/kube-proxy:v1.22.1
k8s.gcr.io/kube-scheduler:v1.22.1
k8s.gcr.io/pause:3.5

Então eu executei "kubeadm init", mas falhou com erros ImagePull.

#kubeadm init --kubernetes-version=1.22.1 --cri-socket=/run/containerd/containerd.sock
[init] Using Kubernetes version: v1.22.1
[preflight] Running pre-flight checks
        [WARNING FileExisting-tc]: tc not found in system path
[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'
error execution phase preflight: [preflight] Some fatal errors occurred:

Como posso permitir que o kubeadm use imagens locais? Ou não há problema em ignorar esses erros de comprovação?

Editar: Este procedimento (carregar manualmente as imagens em vez de executar a extração das imagens de configuração do kubeadm) funcionou bem com o docker e o CentOS7.

kubernetes kubeadm containerd rhel8
  • 2 respostas
  • 1745 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve