고 가용성 클러스터 구축 사례는 Kubernetes

머리말

우수한 인프라 유연한 확장 기능, 다양한 편성 애플리케이션 모델의 덕분으로는 Kubernetes (K8S)는 용기 장치의 분야에서 사실상의 표준이되었다. 점점 더 많은 기업들이 인프라 컨테이너 응용 프로그램으로 이러한 경향을 선택 K8S을 받아, 점차 K8S을 통해 자신의 핵심 서비스를 마이그레이션 할 수 있습니다.

가용성 인프라 중요하다. 주요 클라우드 컴퓨팅 업체는 호스팅 서비스 고 가용성, 확장 성 K8S을 도입,의 더 대표가 아마존 EKS , 푸른는 Kubernetes 서비스 (AKS) , 구글는 Kubernetes 엔진 , 알리 클라우드 컨테이너 서비스는 Kubernetes 버전 등등합니다.

공공 클라우드 서비스가 K8S를 호스팅하는 동안 번성하지만, 많은 기업들이 여전히 자체 내장 클러스터를 요구한다. 그것은 뛰어난 K8S 클러스터 배포 시나리오 많은 수의 탄생을 촉진하기 위해,이 이유이며, 그 특성은 다음과 같습니다.

배포 시나리오 특징
Kubeadm 1. 관계자는 도메인 지식의 K8S 클러스터 수명주기 관리 기능을 제공합니다 배포 도구를 생산했다.
2. 공구 빌딩 블록을 결합 할 수있는 높은 수준의 것으로 의도된다.
Kubespray 베어 메탈 및 AWS, GCE, 푸른 및 기타 클라우드 플랫폼에 배포 1. 지원 K8S.
2. Ansible 플레이 북을 기반으로 K8S 클러스터 배포 작업을 정의합니다.
3. 가장 인기있는 리눅스 배포판을 지원합니다.
KOPS 1.은 AWS, GCE와 몇 가지 다른 클라우드 플랫폼에서 배포 K8S을 지원합니다.
2. 동기화 상태 모델에, 건조 실행 자동 나무 등을위한 기반.
3. Terraform 자동 구성을 생성 할 수 있습니다.
차고가 딸린 단층집는 Kubernetes 엔진 (RKE) 1. 잘 알려진 오픈 소스 엔터프라이즈 관리 플랫폼 컨테이너 목장 경량 K8S 설치 도구를 제공합니다.
베어 메탈, 가상 머신, 공공 클라우드 관리에 배포 2. 지원 클러스터를 K8S.

위의 솔루션에서 사용의 간편성과 유연성의 이점을 RKE. 이 문서에서는 본원에서 사용되는 RKE, RKE 버전으로 고 가용성 클러스터 K8S을 배포하는 방법을 가르친다 v0.2.2.

고 가용성 클러스터 아키텍처 K8S

먼저 고 가용성 아키텍처 K8S 클러스터의 특성을 이해할 필요가 다음 그림은 고 가용성 클러스터 아키텍처 다이어그램의 공식 추천입니다.

k8s_arch

핵심 아이디어는 단일 장애 지점을 제거, 구성 요소의 다양한 유형의 K8S 마스터 노드 고 가용성을 확인하는 것입니다.

  • apiserver - KUBE - 외국인 노출 K8S API는 전체 클러스터의 입구를 방문하는 것입니다. apiserver 무 자체 때문에, 상기로드 밸런서와 함께 가용성의 여러 인스턴스를 시작할 수있다.
  • ETCD - 객체, 전체 데이터 센터 클러스터의 구성 및 상태 정보를 저장하는 네트워크 클러스터 K8S. 이는 홀수 etcd 안정적인 데이터 저장 층의 중복 인스턴스를 활성화함으로써 설정 될 수있다.
  • 스케줄러 - KUBE는 - POD는 그들을위한 실행 만든 새 노드를 선택합니다. 클러스터는 동시에 여러 KUBE-스케줄러를 시작할 수 있습니다 및 리더 선거 기능을 사용하여 고 가용성을 달성하기 위해, 하나의 활성 KUBE-스케줄러 인스턴스를 가질 수 있습니다.
  • 컨트롤러 - 관리자 - KUBE - 내부 클러스터 관리 제어 센터. 클러스터는 여러 동시 KUBE-컨트롤러 매니저와 고 가용성을 달성하기 위해 선거 기능의 사용의 선두 주자를 시작할 수 있습니다, 하나의 활성 KUBE-컨트롤러 관리자 인스턴스를 가질 수 있습니다.

또한, Shihai 빌드 클러스터는 다음과 같은 질문을주의한다.

  • 신뢰성 노드에서 프로세스를 K8S. kubelet 필요, KUBE-스케줄러, KUBE-컨트롤러 관리자와 다른 프로세스가 자동으로 실패 후 다시 시작할 수 있습니다.
  • 그 과정에서 비 포드 작업자 노드에 대한 예비 자원, 자원 노드의 부족으로 이어질 것입니다 포드와 자원 경쟁에서 그들을 방지합니다.

RKE은 K8S를 사용하여 고 가용성 클러스터를 구축

노드 계획

첫 번째 단계는 서버 클러스터 노드의 기능에 따라 구분 한 구축하는 것입니다, 다음 표는 저자 환경에서 노드의 계획을 보여줍니다.

IP 역할
192.168.0.10 노드 배포
192.168.0.11 K8S 마스터 - API 서버, etcd, 스케줄러, 컨트롤러 관리자
192.168.0.12 K8S 마스터 - API 서버, etcd, 스케줄러, 컨트롤러 관리자
192.168.0.13 K8S 마스터 - API 서버, etcd, 스케줄러, 컨트롤러 관리자
192.168.0.14 K8S 노동자 - 오믈렛, 프록시
192.168.0.15 K8S 노동자 - 오믈렛, 프록시
192.168.0.16 K8S 노동자 - 오믈렛, 프록시
192.168.0.17 K8S 노동자 - 오믈렛, 프록시

계획 설명 :

  1. 기계는 개별적으로 선택 192.168.0.10배치 노드로. 기계의 적은 수의 경우, 노드의 배치는 K8S 클러스터에 추가 할 수 있습니다.
  2. 가용성을 보장하기 위해, K8S 마스터 구성 요소 배치 세 시스템을 선택합니다. 조건이 마스터의 다른 구성 요소를 etcd과 별도로 배포 할 수 있다면 있도록 필요한 인스턴스의 수를 조절하는 유연성. 예를 들어, 데이터 신뢰성하지만 압력 액세스 요청이 상대적으로 높은, 대신 추가 기계 (3) 마스터의 다른 구성 요소를 선택 배치, 5 ETCD 컴퓨터를 배포 할 수도 있습니다.
  3. K8S 노동자 노드로 나머지 4 기계. 노드의 수는 동적으로 실제 상황에 따라 조정. 때문에 자원의 부족에 포드가 보류 상태에 있었다 때, 노동자의 확장 할 수있다. 노드 자원 활용이 부족하고, POD가 다른 노드에서 실행되도록 일정이 변경 될 수있다이 노드에 존재하는 경우, 작업자의 부피 감소 될 수있다.

환경 준비

노드 계획, 환경 준비 작업의 필요성이 완료되면, 주로 다음이 포함됩니다 :

  1. 安装 RKE - 需要在部署节点(192.168.0.10)上安装 RKE 二进制包,具体安装方法可参考 download-the-rke-binary
  2. 配置 SSH 免密登录 - 由于 RKE 通过 SSH tunnel 安装部署 k8s 集群,需要配置 RKE 所在节点到 k8s 各节点的 SSH 免密登录。如果 RKE 所在节点也需要加入到 k8s 集群中,需要配置到本机的 SSH 免密登录。
  3. 安装 docker - 由于 RKE 通过 docker 镜像rancher/hyperkube启动 k8s 组件,因此需要在 k8s 集群的各个节点(192.168.0.11 ~ 192.168.0.17 这 7 台机器)上安装 docker。
  4. 关闭 swap - k8s 1.8 开始要求关闭系统的 swap,如果不关闭,默认配置下 kubelet 将无法启动。这里需要关闭所有 k8s worker 节点的 swap。

配置 cluster.yml

在完成环境准备后,需要通过 cluster.yml 描述集群的组成和 k8s 的部署方式。

配置集群组成

配置文件 cluster.yml 中的 nodes 配置项用于描述集群的组成。根据节点规划,对于 k8s master 节点,指定其角色为controlplaneetcd。对于 k8s worker 节点,指定其角色为worker

nodes:
  - address: 192.168.0.1
    user: admin
    role:
      - controlplane
      - etcd
  ...
  - address: 192.168.0.7
    user: admin
    role:
      - worker

设置资源预留

K8s 的 worker node 除了运行 pod 类进程外,还会运行很多其他的重要进程,包括 k8s 管理进程,如 kubelet、dockerd,以及系统进程,如 systemd。这些进程对整个集群的稳定性至关重要,因此需要为他们专门预留一定的资源。

笔者环境中的 worker 设置如下:

  • 节点拥有 32 核 CPU,64Gi 内存和 100Gi 存储。
  • 为 k8s 管理进程预留了 1 核 CPU,2Gi 内存和 1Gi 存储。
  • 为系统进程预留了 1 核 CPU,1Gi 内存和 1Gi 存储。
  • 为内存资源设置了 500Mi 的驱逐阈值,为磁盘资源设置了 10% 的驱逐阈值。

在此场景下,节点可分配的 CPU 资源是 29 核,可分配的内存资源是 60.5Gi,可分配的磁盘资源是 88Gi。对于不可压缩资源,当 pod 的内存使用总量超过 60.5Gi 或者磁盘使用总量超过 88Gi 时,QoS 较低的 pod 将被优先驱逐。对于可压缩资源,如果节点上的所有进程都尽可能多的使用 CPU,则 pod 类进程加起来不会使用超过 29 核的 CPU 资源。

上述资源预留设置在 cluster.yml 中具体形式如下。

services:
  kubelet:
    extra_args:
      cgroups-per-qos: True
      cgroup-driver: cgroupfs
      kube-reserved: cpu=1,memory=2Gi,ephemeral-storage=1Gi
      kube-reserved-cgroup: /runtime.service
      system-reserved: cpu=1,memory=1Gi,ephemeral-storage=1Gi
      system-reserved-cgroup: /system.slice
      enforce-node-allocatable: pods,kube-reserved,system-reserved
      eviction-hard: memory.available<500Mi,nodefs.available<10%

关于资源预留更详细的内容可参考文章 Reserve Compute Resources for System Daemons

部署 k8s 集群

当 cluster.yml 文件配置完成后,可以通过命令rke up完成集群的部署任务。下图展示了通过 RKE 部署的 k8s 集群架构图。

rke_arch

该架构有如下特点:

  1. 集群中的各个组件均通过容器方式启动,并且设置重启策略为always。这样当他们出现故障意外退出后,能被自动拉起。
  2. Master 节点上的 kube-scheduler、kube-controller-manager 直接和本机的 API server 通信。
  3. Worker 节点上的 nginx-proxy 拥有 API server 的地址列表,负责代理 kubelet、kube-proxy 发往 API server 的请求。
  4. 为了让集群具有灾备能力,master 节点上的 etcd-rolling-snapshots 会定期保存 etcd 的快照至本地目录/opt/rke/etcd-snapshots中。

配置负载均衡器

클러스터 배포를 완료 한 후에는 API 서버에서 K8S에 액세스 할 수 있습니다. 때문에 높은 가용성 환경 KUBE-apiserver 인스턴스 개시 복수, 이들 예에로드 밸런서를 설정하는 것이 필요하다. 여기에서 192.168.0.10다음과 같은 배치의 nginx nginx.conf 특정 부하 균형 기능을 달성하는 구성이다.

...
stream {
    upstream apiserver {
        server 192.168.0.11:6443 weight=5 max_fails=3 fail_timeout=60s;
        server 192.168.0.12:6443 weight=5 max_fails=3 fail_timeout=60s;
        server 192.168.0.13:6443 weight=5 max_fails=3 fail_timeout=60s;
    }

    server {
        listen 6443;
        proxy_connect_timeout 1s;
        proxy_timeout 10s;
        proxy_pass apiserver;
    }
}
...

이 경우, 이상이 발생하는 부하 분산 포트 액세스 API 서버에서 제공 Unable to connect to the server: x509: certificate is valid for xxx, not 192.168.0.10. 그것은 도메인 이름 또는 PKI 인증서의 API 서버에 추가 부하 분산 장치의 IP 주소 여야합니다, 당신은 인증을 완료 cluster.yml 항목이 기능을 구성 할 수 있습니다.

authentication:
  strategy: x509
  sans:
    - "192.168.0.10"

cluster.yml를 수정 한 후, 명령을 실행합니다 rke cert-rotate.

확인

위의 모든 단계를 완료 한 후, 명령에 의해 kubectl get nodes노드의 상태를 볼 수 있습니다. 모든 노드의 상태가 준비 경우, 클러스터 구축의 성공을 말했다.

NAME            STATUS    ROLES              AGE    VERSION
192.168.0.11    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.12    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.13    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.14    Ready     worker             1d     v1.13.5
192.168.0.15    Ready     worker             1d     v1.13.5
192.168.0.16    Ready     worker             1d     v1.13.5
192.168.0.17    Ready     worker             1d     v1.13.5

개요

전개 단계와, 감소 된 임계 값을 구성을 단순화 K8S 복잡 상세를 작성한 사용자 클러스터 차폐 랜치는 Kubernetes 엔진 (RKE). 기업의 자체 내장 K8S 클러스터 요구 사항이있는 사람들을 위해 좋은 선택이 될 것입니다.

참고 자료

추천

출처yq.aliyun.com/articles/704946