Kubernetes 설치

최초로 EMBE Innovation 발표되었을 때, 당신은 그곳에서 다른 블로그 게시물을 찾을 수 있습니다.

또 다른 설치 쿠베르네트스 튜토리얼이 있어요.


알아요. 왜 Kubernetes 튜토리얼을 설치해야 합니까?연구 프로젝트에 대해 가상 x86-64 노드와 같은 그룹의 Nvidia jetson 카드에서 Kubernetes 그룹을 실행해야 합니다.나는 이 확실한 용례를 포함하는 강좌를 발견하지 못했다. (이상하게도, 나는 이것이 흔히 볼 수 있는 곳이라고 생각했다.) 그래서 나는 그것을 '내 노트' 로 삼았다. 그러면 나는 장래에 이 과정을 다시 만들고 자동화할 수 있을 것이다.
나는 이것tutorial from Tutorials point을 영감으로 한다. 이것tutorial from vituxthis.
Jetson 카드 설치this tutorial는 매우 중요합니다.

준비 노드


내 클러스터는 Ubuntu 20.04.1 LTS를 실행하는 x86-64 노드 3개와 Ubuntu 18.04.5 LTS를 실행하는 Nvidia Jetson Nano Devloper 카드 3개로 구성되어 있습니다.x86-64 노드는 vmWare 가상 기기로서 각 가상 기기는 두 개의 핵이 있고 Jetson 카드는 쿼드 코어 ARM Cortex-A57 프로세서와 128개의 NVIDIA CUDA® 핵을 가진 NVIDIA Maxwell 체계 구조를 가지고 있다.
각 노드가 최신 패치를 사용하여 업데이트되고 업그레이드되었는지 확인하십시오.
sudo apt update && sudo apt upgrade

Kubernetes 노드 설정


docker 설정


사실은 이것이 예상보다 훨씬 어렵다는 것을 증명한다.나는 여러 가지 출처를 시도했다. 마지막으로 효과적인 방법은 다음과 같다.
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
sudo apt install docker-ce=5:19.03.14~3-0~ubuntu-focal
docker가 cgroup 드라이버로 systemd 사용하는지 확인해야 합니다. 아래와 같습니다.
파일이 없는 경우/etc/docker/daemon.json를 만들고 다음 항목을 파일에 넣습니다.
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
Nvidia jetson 나노 카드/etc/docker/daemon.json의 내용은 다음과 같이 변경해야 합니다.
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    },
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m"
    },
    "storage-driver": "overlay2"
}
docker 서비스를 다시 시작하려면:
sudo service docker restart

etcd 설정


참고: 이것은 주/제어 평면에만 적용됩니다.
sudo apt install etcd etcd-client

쿠베르네트스 건립


curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt update
sudo apt install kubeadm
kubeadm이 제대로 설치되었는지 확인합니다.
kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:25:59Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
그리고 교환 차례:
sudo swapoff -a
sudo sed -i '/swap/ s/^\(.*\)$/#\1/g' /etc/fstab
주의: 제 사례에서 /swap/를 모델로 매칭하는 것이 중요합니다. 저는 / swap /를 시도했지만 성공하지 못했습니다.
위의 첫 번째 명령은 교환을 닫고, 두 번째 명령은 다시 시작할 때 다시 열리지 않도록 합니다.
각 노드에 고유한 호스트 이름이 있는지 확인하고 마스터 노드가 무엇인지 기억하십시오.내 예에서, 나는 Kubernetes Master에서 이것을 실행한다.
sudo hostnamectl set-hostname k8s1-master
각 작업 노드에서 다음을 수행합니다.
sudo hostnamectl set-hostname k8s<n>-worker
그중<n>이 숫자(2,3 등)로 바뀌었다.

마스터 노드에서 Kubernetes 시작


다음부터 시작합니다.
sudo kubeadm init
만일 모든 것이 순조롭다면, 너는 마지막에 다음과 같은 몇 줄을 써야 한다.
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 10.xxx.yyy.105:6443 --token b0qc...lt \
    --discovery-token-ca-cert-hash sha256:b7ed95...d90b5b4f2b6f51814
작업 노드에서 실행할 수 있도록 마지막 명령을 어느 위치에 저장해야 합니다.
위의 지침에 따라 구성 스크립트를 설정해야 합니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Calico 네트워크 목록을 다운로드하고 설치하려면:
curl https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f calico.yaml

Kubernetes 클러스터에 작업 노드 추가


위의 kubeadm 명령을 사용하여 새 작업 프로세스를 클러스터에 포함합니다.
kubeadm join 10.xxx.yyy.105:6443 --token b0qc...lt \
    --discovery-token-ca-cert-hash sha256:b7ed95...d90b5b4f2b6f51814

클러스터 활용


이것이 바로 나의 결말이다.

여기서 당신은 Nvidia Jetson의 세 개의 판을 볼 수 있습니다.그것들은 실제로 RC 자동차 디스크에 설치되어 오토매틱 자동차 수업에 사용되지만, 나는 그것들을 Kubernetes 집단의 노드로 사용할 수 있다.k8s1로 표시된 노드는 이 집단의 주 노드이다.이것과 다른 가상 기기는 모두 표준 x86-64 노드와 Nvidia nano 카드로 위에서 말한 바와 같이 모두 ARM64 체계 구조이다.
클러스터 노드의 Kubernetes 보기입니다.
$ kubectl get nodes
NAME           STATUS   ROLES                  AGE   VERSION
360lab-nano0   Ready    <none>                 20d   v1.20.2
360lab-nano2   Ready    <none>                 20d   v1.20.2
360lab-nano4   Ready    <none>                 20d   0.5.0
k8s1-master    Ready    control-plane,master   20d   v1.20.2
k8s2-worker    Ready    <none>                 20d   0.5.0
k8s3-worker    Ready    <none>                 20d   v1.20.2
그것들은 모두 v1을 운행한다.20.2nano4k8s2를 제외한 Kubernetes는 kurstlet 대체kubelet를 실행할 수 있다. (에이전트는 Kubernetes 마스터와 대화하고 어떤 용기를 실행할 것인지에 대한 명령을 받는다) 그리고 Docker 용기가 아닌 WebAssembly/WASI 모듈을 실행할 수 있다.나는 곧 각종 방식으로 Kubernetes에서 Web Assembly를 실행하는 것에 관한 새로운 블로그를 발표할 것이다.
Docker 컨테이너는 Kubernetes에서 가장 흔히 볼 수 있는 실행 도구로 시스템 구조와 운영체제에 의존합니다.Linux를 사용하는 x86-64 노드에서는 x86-64로 컴파일/구축된 Linux 용기만 실행할 수 있습니다.이것은 자동으로 식별되기 때문에 용기를 실행하기 위해 목록을 배치할 때 matchine 노드만 조건에 부합됩니다.
Docker Buildx는 docker cli 플러그인입니다. 이 플러그인은 우리를 도와줍니다.가장 좋은 경우 다음과 같이 다중 아키텍처의 docker 컨테이너를 구축할 수 있습니다.
docker buildx build --platform linux/amd64,linux/arm64 -t matsbror/hello-arch:latest --push .
이 예에서는 환경에 대한 정보를 반환하는 작은 Python flask 응용 프로그램입니다.크로스플랫폼 docker의 창설은 매우 느리다. ARM 체계 구조의 일부분 simulator (x86-64 체계 구조를 사용한다고 가정하면) 을 시작해서 구축할 수 있지만, 최소한 Python과 같은 해석적인 언어는 사용하기 쉽다.C++와 Rust와 같은 컴파일러 언어는 훨씬 복잡하다.
다음 목록을 사용하여 이 컨테이너를 배치할 수 있습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-arch
  labels:
    app: hello-arch
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-arch
  template:
    metadata:
      labels:
        app: hello-arch
    spec:
      containers:
      - image: matsbror/hello-arch
        imagePullPolicy: Always
        name: hello
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      imagePullSecrets:
      - name: regcred
      nodeSelector:
        kubernetes.io/arch: arm64
        #kubernetes.io/arch=amd64
--------
apiVersion: v1
kind: Service
metadata:
  name: hello-svc
  labels:
    app: hello-arch
spec:
  type: NodePort
  ports:
  - port: 5000
    nodePort: 30001
    targetPort: 5000
    protocol: TCP
  selector:
    app: hello-arch
그것은 배치 및 응답 포트 5000의 노드 포트 서비스를 만듭니다.nodeSelector 키는 이 용기가 운행할 수 있는 체계 구조를 정의했다.우선, 우리는 그것을 arm64 specification와 분리할 것이다.
$ kubectl apply -f hello-service.yaml
deployment.apps/hello-arch created
service/hello-svc created
한동안 클러스터가 arm64 노드 중 하나에서 컨테이너를 시작했습니다.
$ curl k8s1.uni.lux:30001
{
  "result": "Flask inside Docker!!",
  "system": [
    "Linux",
    "hello-arch-65d5b8f665-b8jdg",
    "4.9.140-tegra",
    "#1 SMP PREEMPT Tue Oct 27 21:02:37 PDT 2020",
    "aarch64"
  ]
}
보시다시피 이것은 aarch64(ARM64와 동일) 체계 구조에서 운행되고 4.9.140-tegra 핵을 사용합니다.
서비스 및 배포를 중단하고 amd64 아키텍처 사양부터 시작하겠습니다.
$ kubectl delete service/hello-svc deployment.apps/hello-arch
service "hello-svc" deleted
deployment.apps "hello-arch" deleted$ 

# change arm64 in the manifest to amd64

$ kubectl apply -f hello-service.yaml
deployment.apps/hello-arch created
service/hello-svc created

$ curl k8s1.uni.lux:30001
{
  "result": "Flask inside Docker!!",
  "system": [
    "Linux",
    "hello-arch-b7fb4c8ff-blkg8",
    "5.4.0-65-generic",
    "#73-Ubuntu SMP Mon Jan 18 17:25:17 UTC 2021",
    "x86_64"
  ]
}
이제 응답은 x86 64(AMD64와 동일) 아키텍처에서 동일한 컨테이너가 실행되고 있음을 나타냅니다.
다음에, 나는 왜 당신이 여러 개의 체계 구조를 가지고 있을 때, 이것은 좋은 생각이 아닐 수도 있는지 설명하고, WebAssembly가 어떻게 해결 방안의 일부분이 되는지 보여줄 것이다.
따라오세요.

좋은 웹페이지 즐겨찾기