쿠버네티스 클러스터 생성
이 예제 절차를 사용하여 업스트림 Kubernetes 클러스터를 만듭니다.
이 예제 절차는 순전히 정보 제공의 목적으로 제공됩니다. 클러스터를 생성할 수 있는 방법은 kubeadm, kOps 또는 kubespray와 같은 여러 가지가 있습니다.
이 예시에서는 kubespray와 Ansible을 사용하여 클러스터를 생성한다. Kubespray는 앤서블(Ansible) 플레이북을 사용하는데, 이는 클러스터 생성을 상당히 간단하게 만든다. 단계를 더 쉽게 수행할 수 있도록 별도의 설치 관리자 머신을 사용하여 설치를 수행하고 kubectl 및 기타 도구를 실행합니다.
클러스터 만들기에 대한 자세한 내용은 공식 Kubernetes 설명서(https://kubernetes.io/docs/home/)를 참조하세요.
아래 명령줄 예제가 항상 절대 디렉터리 경로를 표시하는 것은 아닙니다. 디렉터리 구조 내에서 이러한 명령을 적용하는 것은 사용자에게 맡깁니다.
- 설치 관리자 컴퓨터에 새 OS를 설치하고 다음에 대해 OS를 최소한으로 구성합니다.
- 고정 IP 주소 및 마스크(예: 단일 클러스터의 경우 172.16.0.10/24) 및 게이트웨이
- 하나 이상의 DNS 서버에 대한 액세스
- 루트 SSH 액세스를 포함한 SSH 연결
- Ntp
- 로컬 컴퓨터에서 sudo 사용자로 설치 관리자 시스템에 SSH를 수행합니다.
- ansible을 설치합니다.
sudo apt install ansible
- kubectl을 설치합니다. 이 예제에서는 설치 관리자 머신에서 kubectl을 실행합니다. 다른 머신(예: 로컬 머신)에서 kubectl을 실행하려면 대신 해당 머신에 kubectl을 다운로드하여 설치합니다.
- Kubernetes 리포지토리를 설정하고 업데이트합니다.
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
- kubectl을 설치합니다.
sudo apt install kubectl
- Kubernetes 리포지토리를 설정하고 업데이트합니다.
- Contrail Analytics를 설치하려면 Helm 3.0 이상을 설치하십시오.
-
Helm 리포지토리를 설정하고 업데이트합니다.
curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt update
-
Helm을 설치합니다.
sudo apt install helm
-
- 설치 프로그램 시스템에서 컨트롤 플레인 및 작업자 노드로의 SSH 암호 없는 루트 액세스를 구성합니다. 이렇게 하면 나중에 플레이북을 실행할 때 ansible이 이러한 노드에 로그인할 수 있습니다.
- SSH 키를 만듭니다.
user@installer:~$ ssh-keygen
이 예제에서는 SSH 키를 기본 위치 ~/. ssh/id_rsa.pub에 저장합니다.
- 컨트롤 플레인 및 작업자 노드의 루트 사용자에게 키를 복사합니다. 예를 들어:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.0.11 ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.0.12 ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.0.13
- SSH 키를 만듭니다.
- kubespray 디렉토리를 복제한다.
예를 들어:
user@installer:~/contrail$ git clone https://github.com/kubernetes-sigs/kubespray -b release-2.16
이렇게 하면 현재 위치(이 예제의 ~/contrail )에 kubespray 디렉토리의 복제본이 생성된다.
- 필요한 경우 포드 및 서비스 서브넷을 구성합니다.
kubespray가 사용하는 기본 서브넷은 kubespray/roles/ kubespray-defaults/defaults/main.yaml 파일에 정의되어 있다. 해당 파일에서 다음 매개 변수를 찾아 그에 따라 변경합니다.
kube_service_addresses: 10.233.0.0/18 kube_pods_subnet: 10.233.64.0/18 kube_service_addresses_ipv6: fd85:ee78:d8a6:8607::1000/116 kube_pods_subnet_ipv6: fd85:ee78:d8a6:8607::1:0000/112
참고:다중 클러스터 Contrail 설정을 생성하는 경우 각 클러스터에서 서로 다른 Pod 및 서비스 서브넷을 구성해야 합니다. 이러한 서브넷은 전체 다중 클러스터 내에서 고유해야 합니다.
이 문서의 다중 클러스터 예제를 따르는 경우 중앙 클러스터의 서브넷을 기본값으로 두고 다음과 같이 워크로드 클러스터에서 서브넷을 구성합니다.
kube_service_addresses: 10.234.0.0/18 kube_pods_subnet: 10.234.64.0/18 kube_service_addresses_ipv6: fd85:ee78:d8a6:8608::1000/116 kube_pods_subnet_ipv6: fd85:ee78:d8a6:8608::1:0000/112
- 노드 로컬 DNS를 비활성화합니다.
kubespray/ roles/kubespray-defaults/defaults/main.yaml 파일에서
enable_nodelocaldns: false
. - 클러스터에서 DPDK를 실행하는 경우 multus를 구성합니다.
DPDK를 실행할 때 Multus가 필요합니다.
- multus를 활성화합니다.
kubespray/ roles/kubespray-defaults/defaults/main.yaml 에서, multus를 활성화한다.
kube_network_plugin_multus: true
- multus 버전을 DPDK를 실행하는 데 필요한 버전인 0.3.1로 설정합니다. 두 파일에서 버전을 설정합니다.
kubespray/roles/network_plugin/multus/defaults/main.yml 에서 multus 버전을 구성한다.
multus_cni_version: "0.3.1"
kubespray/extra_playbooks/roles/network_plugin/multus/defaults/main.yml 에서 multus 버전을 구성한다.multus_cni_version: "0.3.1"
- multus를 활성화합니다.
- ansible에서 사용할 인벤토리 파일을 생성합니다. 예를 들어:
all: hosts: # list all nodes here k8s-cp0: # desired hostname ansible_host: 172.16.0.11 k8s-worker0: ansible_host: 172.16.0.12 k8s-worker1: ansible_host: 172.16.0.13 vars: ansible_user: root artifacts_dir: /tmp/mycluster cluster_name: mycluster.contrail.lan container_manager: crio # container runtime docker_image_repo: <your docker repository URL> download_container: false download_localhost: true download_run_once: true enable_dual_stack_networks: true enable_nodelocaldns: false etcd_deployment_type: host host_key_checking: false kube_network_plugin: cni kube_network_plugin_multus: false kubeconfig_localhost: true kubectl_localhost: true kubelet_deployment_type: host override_system_hostname: true kube-master: hosts: # hostname of control plane node (from hosts section) k8s-cp0: kube-node: hosts: # hostnames of worker nodes (from hosts section) k8s-worker0: k8s-worker1: etcd: hosts: # hostname of control plane node (from hosts section) k8s-cp0: k8s-cluster: children: kube-master: kube-node:
파일에서 지정하는 호스트 이름(
k8s-cp0
, ,k8s-worker0
k8s-worker1
)은 매개변수가 로true
설정될 때override_system_hostname
노드에서 자동으로 구성됩니다.참고:다중 클러스터 Contrail 설정을 생성하는 경우 다중 클러스터의 각 노드에 대해 서로 다른 노드 이름을 구성해야 합니다. 노드 이름은 전체 다중 클러스터에서 고유해야 합니다.
참고:DPDK
kube_network_plugin_multus: true
를 실행 중인 경우 .다른 컨테이너 런타임으로 실행하려면 위의 값을 변경합니다
container_manager
.확인이 로 설정되어 있는지
false
확인합니다enable_nodelocaldns
.다른 수의 컨트롤 플레인 및 작업자 노드로 실행하려면 그에 따라 인벤토리를 조정합니다.
- ansible이 inventory.yaml 파일의 내용을 기반으로 컨트롤 플레인 및 작업자 노드에 SSH를 사용할 수 있는지 확인합니다. 이 예제에서 inventory.yaml 파일은 ~/contrail 디렉터리에 있습니다.
user@installer:~/contrail$ ansible -i inventory.yaml -m ping all [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details k8s-cp0 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } k8s-worker0 | SUCCESS => {ansi "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } k8s-worker1 | SUCCESS => {ansi "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
- 클러스터를 생성하려면, kubespray 디렉터리에서 플레이북을 실행한다. 아래 명령을 조정하여 디렉터리 구조 내에서 inventory.yaml을 참조합니다.
user@installer:~/contrail/kubespray$ ansible-playbook -i ../inventory.yaml cluster.yml
이 단계는 클러스터의 크기에 따라 완료하는 데 한 시간 이상 걸릴 수 있습니다.참고:아직 CNI를 구성하지 않았으므로 네트워크 및 CNI 경고와 오류를 무시해도 됩니다. 치명적인 오류가 발생하면 ansible은 플레이북을 중지합니다.
- 클러스터의 보안 토큰을 기본 ~/.kube/config 위치에 복사합니다. kubeconfig는 Contrail 툴이 작동하기 위한 기본 위치에 있어야 합니다.
inventory.yaml 파일에서 보안 토큰 위치를 찾을 수 있습니다. 이 예에서 인벤토리 파일을 사용하는 경우 토큰은 / tmp/mycluster에 있습니다.
mkdir ~/.kube
cp /tmp/mycluster/admin.conf ~/.kube/config
참고:기존 클러스터에 대한 토큰을 이미 보유하고 있는 kubeconfig가 있는 경우 ~/. kube/config 파일을 덮어쓰는 대신 병합해야 합니다.
- 표준 kubectl 명령을 사용하여 클러스터의 상태를 확인합니다.
- 노드의 상태를 표시합니다.
user@installer:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-cp0 NotReady control-plane,master 4m57s v1.20.7 k8s-worker0 NotReady <none> 3m17s v1.20.7 k8s-worker1 NotReady <none> 2m45s v1.20.7 user@installer:~$ kubectl describe node k8s-cp0 <trimmed> Conditions: Type Status <trimmed> Reason Message ---- ------ ------ ------- MemoryPressure False KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False KubeletHasSufficientPID kubelet has sufficient PID available Ready False KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: No CNI configuration file in /etc/cni/net.d/. Has your network Addresses: <trimmed>
- 포드의 상태를 표시합니다.
user@installer:~$ kubectl get pods -A -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE <trimmed> kube-system coredns-657959df74-rprzv 0/1 Pending 0 6m44s <none> <none> <none> <none> kube-system dns-autoscaler-b5c786945 0/1 Pending 0 6m40s <none> <none> <none> <none> kube-system kube-apiserver-k8s-cp0 1/1 Running 0 9m27s 172.16.0.11 k8s-cp0 <none> <none> kube-system kube-controller-manager- 1/1 Running 0 9m27s 172.16.0.11 k8s-cp0 <none> <none> kube-system kube-proxy-k5mcp 1/1 Running 0 7m28s 172.16.0.13 k8s-worker1 <none> <none> kube-system kube-proxy-sccjm 1/1 Running 0 7m28s 172.16.0.11 k8s-cp0 <none> <none> kube-system kube-proxy-wqbt8 1/1 Running 0 7m28s 172.16.0.12 k8s-worker0 <none> <none> kube-system kube-scheduler-k8s-cp0 1/1 Running 0 9m27s 172.16.0.11 k8s-cp0 <none> <none> kube-system nginx-proxy-k8s-worker0 1/1 Running 0 8m2s 172.16.0.12 k8s-worker0 <none> <none> kube-system nginx-proxy-k8s-worker1 1/1 Running 0 7m30s 172.16.0.13 k8s-worker1 <none> <none>
- 노드의 상태를 표시합니다.