DM Log

[CI/CD #6] Jenkins + Ansible + Kubernetes 연동 본문

개발공부/Infra

[CI/CD #6] Jenkins + Ansible + Kubernetes 연동

Dev. Dong 2025. 11. 1. 23:44

Ansible + Kubernetes 연동

Docker Container 내부에 운영되는 Ansible-server와 playbook을 이용하여 Kubernetes를 제어

Ansible에서 Kubernetes 제어

  • Ansible 접속
docker exec -ti ansible-server bash
  • Ansible 내부 hosts 파일 생성
[ansible-server]
localhost

[kubernetes]
192.168.x.x. (host pc Ip)
  • ssh 키 복사 (비밀번호 없이 접속 가능하도록 설정) - Linux
ssh-keygen
ssh-copy-id user@192.168.x.x (hostPC 정보)
  • ssh 키 복사 (비밀번호 없이 접속 가능하도록 설정) - window
    • ansible-server에서 id_rsa.pub 파일 내용을 직접 복사(Paste) 하여 Windows의 C:\Users\<계정>\.ssh\authorized_keys 파일 생성
    • cat /root/.ssh/id_rsa.pub
    • hosts 파일 변경
[ansible-server]
localhost

[kubernetes]
192.168.x.x

[windows]
192.168.x.x

[windows:vars]
ansible_user=아이디
ansible_password=비번
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
ansible_winrm_transport=ntlm
ansible_port=5985
  • (참고) (window) port 22: Connection refused 해결 ssh 연결 서비스 켜기
# powershell 관리자 권한
# sshd 설치 확인
Get-Service sshd
# 미설치시
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# 설치 완료 후
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
  • (참고) ntlm 관련 error message 발생
    • WinRM이 “로컬 관리자 계정의 원격 NTLM 인증”을 기본적으로 제한
    • user 계정이 관리자라도 원격으로 로그인하면 “표면상 관리자이지만 권한 제한"
    • powershell에 아래 명령어로 문제 해
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" `
  -Name "LocalAccountTokenFilterPolicy" -Value 1 -Type DWord
  
Restart-Service WinRM
  • Ansible-server에 playbook 작성 (deployment 실행)
- name: Create pods using deployment 
  hosts: kubernetes 
  # become: true
  # user: ubuntu
 
  tasks: 
  - name: delete the previous deployment
    command: kubectl delete deployment.apps/cicd-deployment

  - name: create a deployment
    command: kubectl apply -f cicd-devops-deployment.yml
  • host PC 에 실행시킬 Script 파일 생성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cicd-deployment
spec:
  selector:
    matchLabels:
      app: cicd-devops-project
  replicas: 2

  template:
    metadata:
      labels:
        app: cicd-devops-project
    spec:
      containers:
      - name: cicd-devops-project
        image: edowon0623/cicd-project-ansible
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
  • Ansible-server에 playbook 작성 (service 실행)
- name: create service for deployment
  hosts: kubernetes
  # become: true
  # user: ubuntu

  tasks:
  - name: create a service
    command: kubectl apply -f cicd-devops-service.yml
  • host PC 에 실행시킬 Script 파일 생성
apiVersion: v1
kind: Service
metadata:
  name: cicd-service
  labels:
    app: cicd-devops-project
spec:
  selector:
    app: cicd-devops-project
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 32000
  • 명령어 입력
    • (참고) window의 경우  playbook 작성 시, command 부분을 win_command로 변경 필요
    • (참고) 파일 위치 Window의 정확한 경로 입력 필요
#ansible 서버
ansible-playbook -i ./k8s/hosts k8s-cicd-deployment-playbook.yml
ansible-playbook -i ./k8s/hosts k8s-cicd-service-playbook.yml

 


Jenkins + Ansible + Kubernetes 연동

Setup Ansible on Jenkins

  • Manage Jenkinx → Configure System → Publish over SSH
  • Add SSH Servers
    • Name: k8s-master
    • Hostname: [k8s-master IP] HOST PC IP
    • Username: 사용자 이름
    • Passphrase/Password: 비밀번호
    • Port: 22

Jenkins로 Kubernetes 실행

  • 프로젝트 생성 →  My-K8s-Project
  • Build Triggers
    • SSH server: k8s-master
  • Exec command
    • "C:\Program Files\Docker\Docker\resources\bin\kubectl.exe" apply -f C:\cicd-devops-deployment.yml
    • window 사용시 cmd로 실행되도록 해야함

Jenkins로 Ansible 연동하여 Kubernetes 실행

  • 프로젝트 생성 →  My-K8s-Project-using-Ansible
  • Build Triggers
    • SSH server: ansible-host
  • Exec command
    • ansible-playbook -i ./k8s/hosts k8s-cicd-deplyment-playbook.yml

Jenkins + Ansible + Kubernetes 자동화 프로세스 구성

CI Jobs

  • git pull
  • create a docker image
  • push the image to the registry
  • remove the image from the local

Jenkins Item 생성 후 CI 작업 진행 빌드 후 조치 설정

  • ansible-playbook -i ./k8s/hosts create-cicd-devops-image.yml --limit ansible-server
- hosts: all
#   become: true

  tasks:
  - name: create a docker image with deployed waf file
    command: docker build -t [사용자 계정]/cicd-project-ansible .
    args:
        chdir: /root

  - name: push the image on Docker Hub
    command: docker push [사용자 계정]/cicd-project-ansible
    ignore_errors: yes
  - name: remove the docker image from the ansible server
    command: docker rmi [사용자 계정]/cicd-project-ansible
    ignore_errors: yes

CD Jobs

  • create a deployment
  • create a service

Jenkins에서 CI ITEM이후 CD ITEM 연결

  • 빌드 후 조치에서 Build other Projects 추가 후 kubenetes deployment와 service 생성 ITEM 연결