728x90
ansible 설치
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible
ansible.cfg 파일
[defaults]
inventory = /etc/ansible/hosts
host_key_checking = False
inventory.ini 파일
[master]
master-node ansible_host=10.0.1.217 ansible_user=ubuntu ansible_ssh_private_key_file=/home/ubuntu/.ssh/sanhak-server.pem ansible_ssh_common_args='-o StrictHostKeyChecking=no'
[worker]
worker-node1 ansible_host=10.0.0.149 ansible_user=ubuntu ansible_ssh_private_key_file=/home/ubuntu/.ssh/sanhak-server.pem ansible_ssh_common_args='-o StrictHostKeyChecking=no'
worker-node2 ansible_host=10.0.2.206 ansible_user=ubuntu ansible_ssh_private_key_file=/home/ubuntu/.ssh/sanhak-server.pem ansible_ssh_common_args='-o StrictHostKeyChecking=no'
master-setup.yml 파일
---
- hosts: master
become: yes
tasks:
- name: 스왑 메모리 비활성화
command: swapoff -a
- name: br_netfilter 모듈 로드
shell: modprobe br_netfilter
become: yes
- name: br_netfilter 모듈 로드 설정 파일 생성
copy:
dest: /etc/modules-load.d/k8s.conf
content: |
br_netfilter
- name: 커널 파라미터 설정
copy:
dest: /etc/sysctl.d/k8s.conf
content: |
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
- name: 커널 파라미터 즉시 적용
command: sysctl --system
- name: socat 패키지 설치
apt:
name: socat
update_cache: yes
- name: Docker 설치 스크립트 실행 (이미 설치되어 있지 않은 경우에만)
shell: |
curl -fsSL https://get.docker.com -o get-docker.sh
chmod +x get-docker.sh
sudo ./get-docker.sh
- name: containerd 기본 설정 파일 생성
shell: |
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
- name: Kubernetes 설치
shell: |
mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update && apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
- name: Kubernetes 클러스터 초기화
become: yes
shell: kubeadm init --pod-network-cidr=192.168.0.0/16
register: kubeadm_output
- name: .kube 디렉토리 생성
file:
path: /home/ubuntu/.kube
state: directory
mode: '0755'
- name: admin.conf 파일 복사
shell: cp -i /etc/kubernetes/admin.conf /home/ubuntu/.kube/config
- name: admin.conf 소유권 변경
shell: chown ubuntu:ubuntu /home/ubuntu/.kube/config
become: yes
- name: 유효한 kubeadm 토큰 조회
become: yes
become_user: root
shell: kubeadm token list | tail -n 1 | awk '{print $1}'
register: kubeadm_token
- name: CA 인증서 해시 값 추출
become: yes
become_user: root
shell: openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
register: discovery_token_ca_cert_hash
- name: master-node.j2 파일에 kubeadm 토큰과 해시값 저장
local_action:
module: template
src: master-node.j2
dest: /etc/ansible/master-node-conf.j2
vars:
kubeadm_token: "{{ kubeadm_token }}"
discovery_token_ca_cert_hash: "{{ discovery_token_ca_cert_hash }}"
when: kubeadm_token.stdout is defined and discovery_token_ca_cert_hash.stdout is defined
- name: 마스터 노드에서 Join 명령어를 저장
set_fact:
kubeadm_token: "{{ kubeadm_token.stdout }}"
discovery_token_ca_cert_hash: "{{ discovery_token_ca_cert_hash.stdout }}"
- name: Join 명령어 생성
set_fact:
join_command: "kubeadm join {{ ansible_default_ipv4.address }}:6443 --token {{ kubeadm_token }} --discovery-token-ca-cert-hash sha256:{{ discovery_token_ca_cert_hash }}"
- name: 마스터 노드에서 Join 명령어 출력
debug:
msg: "Join command: {{ join_command }}"
when: join_command is defined
- name: Kubernetes API 서버가 준비될 때까지 대기
shell: |
until kubectl --kubeconfig=/home/ubuntu/.kube/config get nodes; do
sleep 5
done
become: yes
- name: Calico 네트워크 플러그인 설치
shell: KUBECONFIG=/home/ubuntu/.kube/config kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
become: yes
worker-setup 파일
---
- hosts: worker
vars_files:
- /etc/ansible/master-node-conf.j2
become: yes
tasks:
- name: 스왑 메모리 비활성화
command: swapoff -a
- name: br_netfilter 모듈 로드
become: yes
shell: modprobe br_netfilter
- name: br_netfilter 모듈 로드 설정 파일 생성
copy:
dest: /etc/modules-load.d/k8s.conf
content: |
br_netfilter
- name: 커널 파라미터 설정
copy:
dest: /etc/sysctl.d/k8s.conf
content: |
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
- name: 커널 파라미터 즉시 적용
command: sysctl --system
- name: 브리지 네트워크 설정 확인
shell: sysctl net.bridge.bridge-nf-call-iptables
register: bridge_netfilter_status
- name: socat 패키지 설치
apt:
name: socat
update_cache: yes
- name: Docker 설치 스크립트 실행 (이미 설치되어 있지 않은 경우에만)
shell: |
curl -fsSL https://get.docker.com -o get-docker.sh
chmod +x get-docker.sh
sudo ./get-docker.sh
- name: containerd 기본 설정 파일 생성
shell: |
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
- name: Kubernetes 설치
shell: |
mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update && apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
- name: Debug kubeadm token on worker node
debug:
msg: "Token: {{ kubeadm_token }}"
- name: Debug discovery token hash on worker node
debug:
msg: "Hash: {{ discovery_token_ca_cert_hash }}"
- name: 마스터 노드에서 받은 토큰과 해시값을 사용해 클러스터에 조인
shell: |
kubeadm join {{ hostvars['master-node']['ansible_host'] }}:6443 \
--token {{ kubeadm_token }} \
--discovery-token-ca-cert-hash sha256:{{ discovery_token_ca_cert_hash }}
master-node.j2파일
kubeadm_token: {{ kubeadm_token.stdout }}
discovery_token_ca_cert_hash: {{ discovery_token_ca_cert_hash.stdout }}
1. 마스터 셋업 플레이북 실행
master-node-conf.j2가 생김
실행순서
1. 호스트 파일 작성
2. 마스터 노드 셋업 플레이북 실행
실행 완료
3. 워커 노드 셋업 플레이북 실행
4. 마스터노드에서 node 확인
5. vm 추가 후, 워커 노드 셋업 플레이북 재실행
전에 붙인 노드는 건너뛰고 추가된 노드만 task진행됨
6. 추가된 노드 확인
'k8s' 카테고리의 다른 글
k8s 수동설치 (0) | 2024.10.21 |
---|---|
쿠버네티스 도입 배경 (2) | 2023.12.21 |