Ansible Automation을 사용하여 AWS에 다중 노드 Kubernetes 클러스터 배포

용례

  • Ansible Playbook을 생성하여 3개의 AWS EC2 인스턴스를 시작합니다
  • .
  • Ansible Playbook을 만들고 이러한 인스턴스에 Docker
  • 를 구성합니다.
  • Playbook을 만들고 kubeadm
  • 을 사용하여 위에서 만든 EC2 인스턴스에 K8S 마스터 및 K8S 작업 노드를 구성합니다.

    선결 조건: (RHEL-8)

  • 컨트롤러 노드가 RHEL8
  • 일 때 컨트롤러 노드는 ansible 설치와 설정을 통해 설정해야 한다
  • 관리자 권한이 있는 사용자IAM를 만들고 해당 사용자access keysecret key를 기록합니다.
  • AWS 클라우드에 Key pair 형식의 (.pem)를 만들고 로컬 시스템에서 다운로드하고 WinSCP를 통해 RHEL-8을 통해 전송한다.
  • 1단계: Ansible 설치 및 구성


    기본 운영 체제(RHEL8)에 Ansible을 설치하고 Ansible 구성 파일을 구성합니다.
    이를 위해서는 다음 명령을 사용하십시오 -
    yum install python3 -y
    
    pip3 install ansible -y
    
    vim /etc/ansible/ansible.cfg
    
    참고: Python Ansible을 설정하려면 운영 체제에 설치해야 합니다.
    구성ansible.cfg 파일에 다음 명령을 씁니다.이를 위해 vi, vim, gedit 등 모든 편집기를 선택할 수 있습니다 -
    [defaults]
    inventory=/root/ip.txt  #inventory path
    host_key_checking=False
    command_warnings=False
    deprecation_warnings=False
    ask_pass=False
    roles_path= /root/roles      #roles path
    force_valid_group_names = ignore
    private_key_file= /root/awskey.pem   #your key-pair 
    remote_user=ec2-user
    
    [privilege_escalation]
    become=True
    become_method=sudo
    become_user=root
    become_ask_pass=False
    
    

    2단계: 역할 만들기


    🔶 캐릭터 작업 구역에 들어갑니다.
    cd /roles
    
    다음 명령을 사용하여 3개의 다른 캐릭터를 만듭니다
  • 쿠베르네트스 성계단
  • 쿠베르네트스 대사
  • 쿠베르네트스 노예
  • # ansible-galaxy init <role_name>
    
    ansible-galaxy init kube_cluster
    ansible-galaxy init k8s_master
    ansible-galaxy init k8s_slave
    

    3단계: Kubernetes 클러스터의 역할 작성


    🔶 작업 폴더에 들어갑니다.우리는 이 폴더에 모든 작업을 기록해야 한다
    cd /roles/kube_cluster/tasks
    
    vim main.yml
    

    🔶 I am going to create cluster over Amazon Linux instances.
    Write below source code inside it-


    - name: Installing boto & boto3 libraries
      pip:
        name: "{{ item }}"
        state: present
      loop: "{{ lib_names }}"
    
    - name: Creating Security Group for K8s Cluster
      ec2_group:
        name: "{{ sg_name }}"
        description: Security Group for allowing all port
        region: "{{ region_name }}"
        aws_access_key: "{{ access_key }}"
        aws_secret_key: "{{ secret_key }}"
        rules:
        - proto: all
          cidr_ip: 0.0.0.0/0
        rules_egress:
        - proto: all
          cidr_ip: 0.0.0.0/0
    
    - name: Launching three EC2 instances on AWS
      ec2:
        key_name: "{{ keypair }}"
        instance_type: "{{ instance_flavour }}"
        image: "{{ ami_id }}"
        wait: true
        group: "{{ sg_name }}"
        count: 1
        vpc_subnet_id: "{{ subnet_name }}"
        assign_public_ip: yes
        region: "{{ region_name }}"
        state: present
        aws_access_key: "{{ access_key }}"
        aws_secret_key: "{{ secret_key }}"
        instance_tags:
          Name: "{{ item }}"
      register: ec2
      loop: "{{ instance_tag }}"
    
    - name: Add 1st instance to host group ec2_master
        add_host:
        hostname: "{{ ec2.results[0].instances[0].public_ip }}"
        groupname: ec2_master
    
    - name: Add 2nd instance to host group ec2_slave
      add_host:
        hostname: "{{ ec2.results[1].instances[0].public_ip }}"
        groupname: ec2_slave
    
    - name: Add 3rd instance to host group ec2_slave
      add_host:
        hostname: "{{ ec2.results[2].instances[0].public_ip }}"
        groupname: ec2_slave
    
    - name: Waiting for SSH
      wait_for:
        host: "{{ ec2.results[2].instances[0].public_dns_name }}"
        port: 22
        state: started
    
    

    소스 코드 설명:

  • 우리는 pip 모듈을 사용하여 두 개의 패키지-botoboto3를 설치하고 있다. 왜냐하면 이 패키지들은 AWS에 연락해서 EC2 실례를 시작할 수 있기 때문이다.
  • ec2_group 모듈로 AWS에서 보안 그룹을 만듭니다.
  • ec2 AWS에서 인스턴스의 모듈을 시작합니다.

    register keyword will store all the Metadata in a variable called ec2 so that in future we can parse the required information from it.


  • loop which again using one variable which contains one list.

    item keyword we are calling the list values one after another.

    add_host module which has the capability to create one dynamic inventory while running the playbook.

    hostname keyword tells the values to store in the dynamic host group.

    wait_for module to hold the playbook for few seconds till all the node’s SSH service started.

    access key and secret key are stored inside vault files to hide it from other users.


    🔶 vars 폴더로 들어갑니다.우리는 이 폴더에 모든 변수를 써야 한다.

    We can directly mention variables inside tasks file but it is good practice to write them inside vars files so that we can change according to our requirements.


    cd /roles/kube_cluster/vars
    
    vim main.yml
    
    안에 다음 소스 코드를 쓰세요-
    instance_tag:
            - master
            - slave1
            - slave2
    
    lib_names:
            - boto
            - boto3
    
    sg_name: Allow_All_SG
    region_name: ap-south-1
    subnet_name: subnet-49f0e521
    ami_id: ami-010aff33ed5991201
    keypair: awskey
    instance_flavour: t2.small
    

    4단계: Kubernetes Master의 역할 작성


    🔶 다음은 k8s 호스트를 설정할 때 반드시 포함해야 하는 절차입니다 -
  • docker와 iproute tc
  • 설치
  • Kubernetes에 백승 환매
  • 설정
  • kubeadm,kubelet,kubectl 프로그램 설치
  • docker 및 Kubernetes 사용
  • 구성 이미지 풀기
  • docker 수호 프로그램을 설정합니다.json 파일
  • docker 서비스 다시 시작
  • 구성 Ip 테이블 및 sysctl 새로 고침
  • kubeadm 서비스 시작
  • 에 설정된 홈 디렉토리입니다.kube 디렉토리
  • 파일 구성 파일 복사 중
  • 설치 액세서리(예: 플란넬
  • 창설영패
  • 영패의 출력을 파일에 저장합니다.
  • 🔶 작업 폴더에 들어갑니다.우리는 이 폴더에 모든 작업을 기록해야 한다
    cd /roles/k8s_master/tasks
    
    vim main.yml
    
    안에 다음 소스 코드를 쓰세요-
    - name: "Installing docker and iproute-tc"
      package:
         name:
             - docker
             - iproute-tc
         state: present
    
    - name: "Configuring the Yum repo for kubernetes"
      yum_repository:
         name: kubernetes
         description: Yum for k8s
         baseurl: https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
         enabled: yes
         gpgcheck: yes
         repo_gpgcheck: yes
         gpgkey: https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    
    - name: "Installing kubeadm,kubelet kubectl program"
      yum:
         name:
            - kubelet
            - kubectl
            - kubeadm
         state: present
    
    - name: "Enabling the docker and kubenetes"
      service:
         name: "{{ item }}"
         state: started
         enabled: yes
      loop:
            - kubelet
            - docker
    
    - name: "Pulling the config images"
      shell: kubeadm config images pull
    
    - name: "Confuring the docker daemon.json file"
      copy:
        dest: /etc/docker/daemon.json
        content: |
          {
          "exec-opts": ["native.cgroupdriver=systemd"]
          }
    
    - name: "Restarting the docker service"
      service:
         name: docker
         state: restarted
    
    - name: "Configuring the Ip tables and refreshing sysctl"
      copy:
        dest: /etc/docker/daemon.json
        content: |
          {
          "exec-opts": ["native.cgroupdriver=systemd"]
          }
    
    - name: "systemctl"
      shell: "sysctl --system"
    
    - name: "Starting kubeadm service"
      shell: "kubeadm init  --ignore-preflight-errors=all"
    
    - name: "Creating .kube Directory"
      file:
         path: $HOME/.kube
         state: directory
    
    - name: "Copying file config file"
      shell: "cp -i /etc/kubernetes/admin.conf $HOME/.kube/config"
      ignore_errors: yes
    
    - name: "Installing Addons e.g flannel"
      shell: "kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml"
    
    - name: "Creating the token"
      shell: "kubeadm token create --print-join-command"
      register: token
    
    - debug:
           msg: "{{ token.stdout }}"
    

    소스 코드 설명:


    1. K8s 클러스터를 설정하려면 마스터 노드에 kubeadm 프로그램을 설치해야 합니다.
  • 우리는 메인 실례에 Docker, Kubeadmiproute-tc 패키지를 설치하고 있다.
  • service 모듈은 docker &kubelet 서비스를 시작하는 데 사용됩니다.
  • command 모듈에서kubeadm 명령을 실행합니다. 이 명령은 Kubernetes 그룹을 실행하는 데 필요한 모든 Docker 이미지를 가져옵니다.
  • Docker 기본 cgroup을 systemd로 변경해야 합니다. 그렇지 않으면 kubeadm에서 K8s 클러스터를 설정할 수 없습니다.이를 위해 우리는 먼저 copy 모듈을 사용하여 파일/etc/docker/daemon.json을 만들고 그 안에 내용을 넣는다.
  • 다음에 command 모듈을 사용하여 집단을 초기화한 다음에 shell 모듈을 사용하여 메인 노드에 kubectl 명령을 설정합니다.
  • 다음에 Kubernetes 그룹에 배치된 command 모듈 IFlannel를 사용하여 덮어쓰기 네트워크 설정을 만들 수 있습니다.
  • 두 번째 command 모듈도 노드에서 집단에 가입한 영패를 획득하는 데 사용된다.
  • 사용register, 두 번째 command 모듈의 출력을 token라는 변수에 저장합니다.현재, 이 영패 변수는 주 노드에 들어갈 수 있도록 종속 노드에서 실행해야 하는 명령을 포함하고 있습니다.
  • 5단계: 쿠베르네트스 노예를 위한 역할 작성


    🔶 다음은 k8s 랜덤을 설정하는 데 필요한 절차입니다 -
  • docker와 iproute tc
  • 설치
  • Kubernetes에 백승 환매
  • 설정
  • kubeadm,kubelet-kubectl 프로그램 설치
  • docker 및 Kubernetes 사용
  • 구성 이미지 풀기
  • docker 수호 프로그램을 설정합니다.json 파일
  • docker 서비스 다시 시작
  • 구성 IP 테이블 및 sysctl 새로 고침
  • 마스터
  • 를 복제할 때 저장된join 명령
    🔶 작업 폴더에 들어갑니다.우리는 이 폴더에 모든 작업을 기록해야 한다
    cd /roles/k8s_slave/tasks
    
    vim main.yml
    
    안에 다음 소스 코드를 쓰세요-
    - name: "Installing docker and iproute-tc"
      package:
         name:
             - docker
             - iproute-tc
         state: present
    
    - name: "Configuring the Yum repo for kubernetes"
      yum_repository:
         name: kubernetes
         description: Yum for k8s
         baseurl: https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
         enabled: yes
         gpgcheck: yes
         repo_gpgcheck: yes
         gpgkey: https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    
    - name: "Installing kubeadm,kubelet kubectl program"
      yum:
         name:
            - kubelet
            - kubectl
            - kubeadm
         state: present
    
    - name: "Enabling the docker and kubenetes"
      service:
         name: "{{ item }}"
         state: started
         enabled: yes
      loop:
            - kubelet
            - docker
    
    - name: "Pulling the config images"
      shell: kubeadm config images pull
    
    - name: "Confuring the docker daemon.json file"
      copy:
        dest: /etc/docker/daemon.json
        content: |
          {
          "exec-opts": ["native.cgroupdriver=systemd"]
          }
    
    - name: "Restarting the docker service"
      service:
         name: docker
         state: restarted
    
    - name: "Configuring the Ip tables and refreshing sysctl"
      copy:
        dest: /etc/sysctl.d/k8s.conf
        content: |
          net.bridge.bridge-nf-call-ip6tables = 1
          net.bridge.bridge-nf-call-iptables = 1
    
    - name: "systemctl"
      shell: "sysctl --system"
    
    - name: joining to Master
      command: "{{ hostvars[groups['ec2_master'][0]]['token']['stdout'] }}"
    

    6단계: Ansible Vault 파일 작성


    🔶 캐릭터 작업 구역에 들어갑니다.
    🔶 다음 명령을 실행하고vault 파일을 만듭니다
    # ansible-vault create <filename>.yml
    
    ansible-vault create cred.yml
    
    🔶 그것은 당신의 선택에 따라 금고 비밀번호를 요구할 것입니다.
    🔶 그리고 편집기로 그것을 열고 이 파일에 두 개의 변수를 만들고 AWS access keysecret key 를 값으로 합니다.
    예를 들면 다음과 같습니다.
    access_key: ABCDEFGHIJKLMN
    secret_key: abcdefghijklmn12345
    
    🔶 명령(:wq)을 사용하여 파일을 저장합니다.

    단계 7: 설치 파일 만들기


    이제 마침내 같은 작업 구역에서 setup.yml 파일을 만들 때가 왔다. 우리는 이 작업 구역을 실행하여 AWS에 전체 인프라를 설치할 것이다.
    - hosts: localhost
      gather_facts: no
      vars_files:
             - cred.yml
      tasks:
             - name: "Running kube_cluster role"
               include_role:
                    name: kube_cluster
    
    
    - hosts: ec2_master
      gather_facts: no
      tasks:
        - name: Running K8s_Master Role
          include_role:
            name: k8s_master
    
    - hosts: ec2_slave
      gather_facts: no
      tasks:
        - name: Running K8s_Slave Role
          include_role:
            name: k8s_slave
    

    🔶 Write proper hostname, vault file name and role name.


    8단계:Ansible 시나리오 실행


    🔶 다음 명령을 사용하여 ansible playbook을 실행합니다.
    ansible-playbook setup.yml --ask-vault-pass
    
    🔶 그런 다음 Ansible Vault(cred.yml 파일)의 암호를 전달하고 암호를 제공하라는 메시지가 표시됩니다.




    예!,그것은 전체 인프라 시설을 성공적으로 운행하고 설치했다

    9단계: 테스트...


    🔶 이제 우리 다중 노드 집단이 다음 명령을 사용했는지 확인해 봅시다.
    kubectl get nodes
    


    🔶 여기에서, 우리는 우리의 who 집단이 성공적으로 시작되었고, 우리의 모든 노드가 준비되어 있음을 볼 수 있다.
    🔶 이제 주 노드에 배치를 만듭니다
    kubectl create deployment myd --image=httpd
    

    🔶 여기서 우리는 우리의 배치가 성공적으로 창설되었음을 볼 수 있다

    GitHub 링크: https://github.com/surajwarbhe/K8s-master-slave-on-aws
    LinkedIn 프로필:

    좋은 웹페이지 즐겨찾기