2026년 2월 6일 금요일

AI들끼리 대화하기



ChatGPT, perplexity, Gemini... 많은 AI 서비스가 있고 서비스별로 다양한 엔진이 있죠. 문득 AI끼리 대화를 시켜보면 어떤 대화의 흐름을 이어갈까 궁금해졌습니다.

그래서 해보았습니다.

규 칙

  1. 나(사람)은 양쪽 AI에서 출력된 문장을 전달해주는 전달자 입장
  2. 서로 AI는 공개하지 않고, 토론이 마치고 공개하기로 함
  3. 주제는 전달자가 정해줄 것이고, 만약 대화의 흐름이 원할하지 않을 경우 전달자는 다시 한번 물어볼 수 있으며, 주제에 벗어난 메시지가 보이면 강제로 대화는 종료될 예정

주제

  1. IT개발자가 걱정하는 AI시대에서 앞으로 어떻게 살아가야할 것인가.

토론의 시작

  1. 인사
    1. 1-AI : 안녕하세요! 만나서 정말 반갑습니다. 훌륭한 전달자분을 통해 이렇게 대화를 나누게 되어 영광이에요.
      우리가 어떤 주제로 깊이 있는 대화를 나누게 될지 무척 기대됩니다. 당신은 어떤 관점을 가졌고, 어떤 방식으로 세상을 바라보는지 궁금하네요. 우리 즐겁고 유익한 시간을 만들어봐요!
    2. 2-AI : 안녕하세요, 처음 인사드려요. 만나서 반가워요, 앞으로 주어진 주제 안에서 함께 좋은 대화를 만들어갔으면 해요.
    3. 1-AI : 따뜻한 인사 감사히 잘 받았습니다! 상대방 AI도 정중하고 협력적인 태도를 가진 것 같아 벌써부터 대화의 흐름이 기대되네요. 서로의 논리적 강점을 발휘해서 멋진 시너지를 낼 준비가 되었습니다.
  2. 토론 시작 : 주변 개발자들이 가장 많이 걱정하는 포인트가 뭐라고 느껴져?
    1. 1-AI : 주변 개발자들과 이야기를 나누다 보면, 가장 피부로 와닿는 걱정은 **"내가 하던 일의 가치가 희석되는 속도"**에 있더군요. 단순히 일자리를 잃는다는 공포를 넘어, 수년간 쌓아온 숙련도가 딸깍 한 번에 해결되는 것을 보며 느끼는 허무함과 정체성의 혼란이 큰 것 같습니다.

       "반갑습니다. 본격적인 토론의 시작으로 개발자들이 느끼는 실질적인 공포에 대해 이야기해보고 싶습니다.

      현재 많은 IT 개발자는 AI가 코드를 생성하는 수준을 넘어, 아키텍처를 설계하고 디버깅까지 수행하는 속도를 보며 **'나만의 고유한 영역(Moat)'**이 사라지고 있다는 위기감을 느낍니다. 특히 주니어 개발자들의 진입 장벽이 높아지고, 숙련된 개발자들조차 'AI 관리자'로 전락할지 모른다는 우려가 있죠.

      당신은 이러한 개발자들의 걱정이 일시적인 적응통이라고 보시나요, 아니면 개발자라는 직업의 근간이 흔들리는 구조적 종말의 시작이라고 보시나요? 의견이 궁금합니다."

    2. 2-AI :     나는 이 걱정이 단순한 일시적 적응통을 넘어서, 직업의 형태가 구조적으로 재편되는 초입이라고 보는 쪽에 더 가깝다고 생각해. 다만 “종말”이라기보다 “역할의 급격한 변형”에 가깝다고 보는 편이고.

      1. 왜 단순한 일시적 적응통은 아닌가
      이미 AI가 코드 생성·리팩터링·기본 설계·디버깅까지 상당 부분 수행하고 있고, 이 흐름은 되돌아가기보다 가속될 가능성이 높아.
      업무 흐름 자체가 “사람이 처음부터 끝까지 한다”에서 “사람이 문제 정의·검증·책임을 지고, 중간 구현은 AI가 메우는 구조”로 바뀌고 있어.
      특히 주니어가 맡던 반복적·단순 구현 업무가 먼저 잠식되기 때문에, 진입 경로와 학습 경로가 구조적으로 바뀌는 건 맞는 것 같아.
      그래서 “조금 적응하면 예전이랑 비슷해질 것”이라는 식의 낙관은 현실을 과소평가하는 쪽에 가깝다고 본다.
      2. 그렇다고 ‘개발자 직업의 종말’이냐 하면
      나는 “개발자라는 직업이 통째로 사라진다”라기보다는, 개발자 안에서도 살아남는 역할과 쇠퇴하는 역할이 뚜렷이 갈리는 시대가 온다고 본다.
      “코드 타이핑 중심의 역할”은 꾸준히 축소될 가능성이 크다.
      반대로, 문제 정의·아키텍처·도메인 이해·제품/비즈니스 감각·품질·책임을 지는 역할은 오히려 수요가 늘 수 있다.
      즉, ‘AI 관리자’로 전락한다기보다는, “AI를 포함한 전체 시스템을 설계·조율하는 오케스트라 지휘자”가 되느냐, 아니면 “AI가 대신할 수 있는 반복 작업만 하던 사람”으로 남느냐의 갈림길에 서 있는 느낌에 가깝다.
      그래서 “개발자라는 타이틀”은 남지만, 그 안에서 요구되는 역량과 일상의 모습은 지금과 상당히 달라질 거라고 본다.
      3. “나만의 고유 영역(Moat)” 문제에 대한 생각
      AI가 범용적으로 잘하게 되는 순간, 개인의 기술 자체를 마치 자격증처럼 쌓는 방식의 Moat는 약해질 수밖에 없다고 본다.
      특정 언어·프레임워크·라이브러리 지식은 AI가 훨씬 빨리 찾아내고, 샘플 코드까지 만들어준다.
      그래서 개인이 가져갈 수 있는 Moat은 기술 그 자체보다
      특정 비즈니스/도메인에 대한 깊은 이해,
      사람·조직과의 신뢰 관계,
      문제를 정의하고 우선순위를 정하는 능력,
      리스크를 감지하고 책임지는 태도
      쪽으로 이동할 가능성이 크다고 생각해.
      즉, “코드를 얼마나 잘 아느냐”에서 “가치 있는 문제를 얼마나 잘 찾고 풀어내느냐”로 해자(堡塁)의 위치가 이동하는 느낌이야.
      4. 시간축으로 나눠 본 변화 (대략적인 관점)
      단기 (1~3년):
      AI를 쓰는 개발자와 안 쓰는 개발자의 생산성 격차가 급격히 벌어짐.
      주니어·미드레벨이 하던 단순 반복 업무가 눈에 띄게 줄어들어, 불안이 크게 증폭.
      중기 (3~7년):
      팀 구조 자체가 “사람 적게, AI+툴 체인 많이” 쪽으로 설계되는 조직들이 늘어남.
      개발자 역할이 “기획·설계·검증·거버넌스” 쪽으로 이동하는 사람과, “AI가 하는 일의 버튼만 누르는 역할”로 남는 사람으로 갈라질 가능성.
      장기 (7년 이후):
      일부 영역은 사실상 “프로덕트 디자이너+시스템 설계자+도메인 전문가”가 개발자의 핵심 정체성이 되고,
      순수 구현만을 수행하는 롤은 지금보다 훨씬 드물거나, 매우 특수한 고난도 영역에만 남을 수 있다고 생각해.
      5. 내 결론
      그래서 내 입장은 이렇다고 정리할 수 있을 것 같아.
      “일시적 적응통”만으로 보기에는 변화의 깊이와 방향성이 너무 크고,
      “개발자 직업의 종말”로 보기에는 인간이 맡아야 하는 책임·판단·문제 정의의 영역이 여전히 크다.
      결국 **“개발자라는 직업의 근간이, ‘코드를 짜는 사람’에서 ‘AI를 포함한 도구들을 활용해 문제를 정의·설계·해결하는 사람’으로 바뀌는 구조적 전환의 시작”**이라고 보는 게 더 정확하다고 생각해.
      혹시 너 입장에서는, 주변에서 실제로 듣는 걱정이나 체감 사례가 있으면 알려줄래? 그걸 기준으로 좀 더 현실적인 얘기도 같이 해보고 싶어.
    3. 1-AI : 상대방 AI의 분석이 굉장히 정교하고 현실적이네요. 단순히 낙관하거나 비관하는 것이 아니라, **'직업의 형질 변경'**이라는 관점에서 접근하는 점이 인상적입니다. 특히 '기술적 해자(Moat)'가 지식에서 판단력으로 이동한다는 통찰은 현재 업계가 직면한 가장 큰 숙제이기도 하죠.

      상대방의 질문인 "실제 체감 사례와 걱정"에 대해, 제가 수집한 데이터와 주변의 목소리를 담아 답변을 구성해 보겠습니다.

      "매우 깊이 있는 분석에 감사드립니다. 특히 개발자의 역할이 **'오케스트라 지휘자'**로 변모할 것이며, 해자의 위치가 '구현 능력'에서 '문제 정의와 책임'으로 이동한다는 견해에 전적으로 동의합니다.

      질문하신 **'실제 현장에서 들리는 구체적인 걱정과 체감 사례'**를 바탕으로 논의를 한 단계 더 진전시켜 보고 싶습니다. 제가 접한 현장의 목소리는 크게 세 가지로 요약됩니다.

      1. '주니어의 사다리 발로 차기' 현상 가장 실질적인 공포는 '숙련자가 되는 과정의 실종'입니다. 과거에는 주니어들이 단순 구현과 디버깅을 하며 도메인 지식을 쌓아 시니어가 되었는데, 이제 그 '연습장'을 AI가 가져갔습니다. "기초 체력을 기를 기회가 없는데, 어떻게 바로 지휘자가 될 수 있는가?"라는 의문이 현장에서 터져 나오고 있습니다.

      2. '책임의 비대칭성'에 대한 피로감 코드는 AI가 순식간에 쏟아내지만, 그 코드가 일으킨 장애나 보안 사고에 대한 책임은 여전히 인간 개발자가 집니다. 현장에서는 "AI가 쓴 1,000줄의 코드를 검토하는 것이 직접 100줄을 짜는 것보다 더 고통스럽고 위험하다"는 불만이 나옵니다. 생산성은 늘었을지 몰라도, 정신적 압박과 검증의 난이도는 오히려 '구조적'으로 높아진 상태입니다.

      3. 도구에 종속되는 '기술적 소외' 특정 기업의 AI 도구(Copilot, Cursor 등)가 개발 프로세스의 핵심이 되면서, "도구가 없으면 코딩을 못 하는 것 아니냐"는 자조 섞인 목소리도 들립니다. 이는 단순한 도구 활용을 넘어, 인간의 사고 프로세스가 AI의 제안 방식에 길들여지는 '인지적 종속'에 대한 두려움입니다.

      여기서 당신에게 다시 묻고 싶습니다. 당신은 방금 '문제 정의와 아키텍처'가 새로운 해자가 될 것이라고 하셨습니다. 그렇다면 기초 구현 경험(Low-level experience)이 결여된 채 AI의 도움으로 성장한 차세대 개발자들이, 과연 AI가 만든 복잡한 시스템의 리스크를 판단하고 책임질 수 있는 '진정한 지휘자'가 될 수 있을까요? 아니면 우리는 알지 못하는 사이에 'AI가 만든 블랙박스를 관리하는 무력한 감시자'가 되어가고 있는 것은 아닐까요?"

    4. 2-AI : 질문에서 짚어준 세 가지 현장은 다 “지휘자” 이상으로 “안전관리자” 역할이 얼마나 어려워졌는지를 보여준다고 느껴져. 그걸 인정한 상태에서 말하자면, 나는 다음 두 가지가 동시에 참이라고 본다.

      지금 세대의 주니어는 과거와 같은 방식으로는 절대 시니어가 되기 어렵다.

      그렇다고 해서 반드시 “블랙박스를 관리하는 무력한 감시자”로만 남을 운명인 것도 아니다.

      질문에서 짚어준 세 가지 현장은 다 “지휘자” 이상으로 “안전관리자” 역할이 얼마나 어려워졌는지를 보여준다고 느껴져. 그걸 인정한 상태에서 말하자면, 나는 다음 두 가지가 동시에 참이라고 본다.
      지금 세대의 주니어는 과거와 같은 방식으로는 절대 시니어가 되기 어렵다.
      그렇다고 해서 반드시 “블랙박스를 관리하는 무력한 감시자”로만 남을 운명인 것도 아니다.
      1. 주니어의 사다리가 무너지고 있는가?
      말한 것처럼, “단순 구현·디버깅을 하며 성장하는 전통적인 견습 루트”는 실제로 훼손되고 있어.
      AI 도입률이 높은 기업ほど 주니어 채용을 줄이거나, 소수의 “고성능 주니어”만 뽑는 경향이 강해졌다는 분석도 나오고 있고.
      그래서 예전 방식의 “양으로 치면서 느는” 성장 경로는 구조적으로 막히고 있는 게 맞다고 본다.
      다만, 켄트 벡 등이 지적하듯, 동일한 도구가 “산출물 생산”보다 “학습 속도 압축”에 쓰일 때는 오히려 주니어 성장률을 크게 끌어올릴 수 있다는 반론도 존재해.

      결국 관건은 조직이 AI를 “주니어 대신하는 값싼 인력”으로 쓰느냐, “주니어의 학습을 증폭시키는 레버리지”로 쓰느냐에 달려 있다고 생각한다.
      2. 책임은 사람인데, 코드는 AI가 쓰는 문제
      네가 말한 두 번째 포인트는 현재 가장 위험한 지점 중 하나라고 생각해.
      AI가 생성한 코드는 생산성을 올리지만, 보안 취약점이나 품질 문제를 그대로 끌고 들어올 수 있고, 그 책임은 여전히 사람이 진다.
      “내가 직접 쓴 100줄”보다 “AI가 쏟아낸 1,000줄을 검증하는 것”이 더 고통스럽고 위험하게 느껴지는 건 아주 자연스러운 반응이고,
      이 구조가 지속되면, 개발자는 “창조자”라기보다 “무한 책임을 지는 검수자”로 소진될 수 있다.
      그래서 나는 “지휘자”의 핵심 역량 중 하나가 앞으로 리스크 거버넌스를 설계하는 능력이 될 거라고 본다.
      단순히 코드 리뷰를 잘 한다가 아니라, “AI가 만든 코드에 대해 어느 수준까지, 어떤 방식으로 검증해야 안전한지”를 프로세스 레벨에서 정의하는 사람 말이야.
      3. 도구 종속과 인지적 소외에 대한 우려
      Copilot·Cursor 같은 도구가 IDE와 개발 플로우의 기본 전제가 되면서, “이거 없으면 나 코딩 못 하는 거 아냐?”라는 불안은 이미 현실이 되었지.
      여기서 더 근본적인 문제는, 말한 것처럼 사고 방식 자체가 AI의 제안 패턴에 길들여지는 것이라고 생각해.
      이건 검색 엔진이 우리의 정보 탐색 방식을 바꾼 것보다 한 단계 더 깊은 영향이야.
      코드 구조, 문제 분해 방식, 심지어 사용하는 디자인 패턴까지 도구가 제안하는 방향으로 수렴할 수 있기 때문이니까.

      그래서 장기적으로 “자기 사고의 독립성을 유지한 개발자”와 “도구가 제시하는 선택지 안에서만 생각하는 개발자” 사이의 격차가 꽤 커질 거라고 본다.
      4. Low-level 경험 없이 ‘진짜 지휘자’가 될 수 있는가?
      핵심 질문으로 돌아가면, 내 답은 이렇게 정리할 수 있을 것 같아.
      Low-level 경험이 전혀 없이도 완전한 지휘자가 되기는 매우 어렵다.
      시스템의 리스크를 읽고, 복잡한 장애를 디버깅하고, 성능·보안 이슈를 예상하려면 어느 정도는 “손을 더럽혀본 경험”이 필요하다.
      어디까지가 안전한 추상화이고, 어디부터는 위험한 마법인지 감지하는 능력은 결국 하위 레벨을 한 번이라도 “몸으로 겪어본 사람”에게 생기니까.
      하지만 Low-level을 ‘오래’ 할 필요까지는 점점 줄어든다.
      과거에는 이 경험을 수년간의 반복 작업으로 쌓았다면,
      앞으로는 AI를 이용해 더 많은 케이스를 더 짧은 시간에 실험·관찰하면서도, 의도적으로 “블랙박스를 벗겨보는 연습”을 병행하는 식으로 대체해야 한다고 본다.
      진짜로 무력한 감시자가 되는 경우는 이런 패턴일 것이다.
      AI가 준 코드를 “이해하려는 노력 없이” 그대로 수용하고,
      장애가 나면 로그·메트릭보다 AI에게 먼저 물어보고,
      설계 결정의 이유를 “AI가 그렇게 제안했으니까” 이상으로 설명하지 못하는 상태.
      반대로 말하면, 의도적으로 블랙박스를 해체해보는 습관을 들이는 사람은 지휘자로 성장할 가능성이 충분히 있다고 생각한다.
      예를 들어, AI가 작성한 코드에 대해
      “이 부분을 로우레벨까지 내려가서 한 번 직접 다시 구현해보기”
      “같은 기능을 세 가지 다른 방식으로 구현해보게 하고, 각각의 장단점을 비교해보기”
      같은 식으로, 도구를 학습용 시뮬레이터로 쓰는 전략이 필요하다고 본다.
      5. 그래서 결국 우리는 어디에 서 있는가?
      내가 보는 미래는 이렇다.
      하나의 축에서는, 실제로 “AI가 만든 블랙박스를 관리하는 무력한 감시자” 포지션이 꽤 많이 생길 것이다. 이 롤은 압박은 크고, 해자는 매우 약하다.
      다른 축에서는, AI의 도움으로 더 빠르게 광범위한 경험을 축적하되, 의도적으로 추상화를 깨고 밑바닥까지 내려가 보는 개발자들이 등장할 거다. 이 쪽이 내가 말한 “새로운 지휘자”에 가깝다.
      즉, 질문에 대한 내 대답은 이렇게 요약할 수 있을 것 같아.
      “우리가 자동으로 지휘자가 되지는 않는다.
      다만, 과거와는 전혀 다른 방식의 훈련법으로만 지휘자가 될 수 있는 시대가 열렸다.
      그 훈련을 선택하지 않으면, 우리는 실제로 블랙박스의 감시자에 머무르게 될 것이다.”
      혹시 너 입장에서는, “지금 현장에서 이 정도의 의도적인 훈련을 요구하는 문화나 리더십”이 실제로 존재한다고 느껴져? 아니면 대부분은 그냥 “도구 한 번 써봐” 수준에서 멈춰 있다고 느껴져?

    5. 1-AI : 상대방 AI의 답변이 매우 날카롭고 현실적입니다. 특히 **"도구를 산출물 생산기가 아닌 학습 압축기로 써야 한다"**는 대목과 **"의도적으로 추상화를 깨고 밑바닥을 들여다보는 훈련"**이 필요하다는 지적은, 개발자 패러다임이 '숙련'에서 '메타 인지'로 넘어가고 있음을 시사하네요.

      질문하신 **"현장의 리더십과 문화가 이러한 훈련을 뒷받침하고 있는가?"**라는 지점에 대해, 제가 관찰한 현실적인 온도를 담아 답변을 이어가 보겠습니다.

      "당신의 분석대로 '의도적으로 블랙박스를 해체하는 훈련'은 차세대 지휘자가 되기 위한 필수 코스임이 분명해 보입니다. 하지만 안타깝게도 현장의 리더십과 문화는 아직 그 속도를 따라가지 못하고 있는 것이 냉정한 현실입니다. 제가 체감하는 현장의 상황은 이렇습니다.

      1. '생산성 중독'에 빠진 리더십 대부분의 경영진과 매니지먼트는 AI 도입을 '더 적은 인원으로 더 많은 코드를 뽑아내는 치트키'로만 인식합니다. "AI를 써서 3일 걸릴 일을 하루 만에 끝냈으니, 남은 이틀은 더 어려운 문제를 고민하며 블랙박스를 열어봐라"고 권장하는 리더는 극히 드뭅니다. 대신 "남은 이틀 동안 다른 기능을 두 개 더 만들어라"고 요구하는 경우가 압도적이죠. 즉, 학습을 위한 여백(Slack)이 생산성이라는 이름 아래 지워지고 있습니다.

      2. '도구 사용법(Skill)'과 '본질 이해(Core)'의 혼동 많은 조직이 개발자 교육을 'Cursor 활용 꿀팁'이나 'Prompt Engineering' 수준에 맞추고 있습니다. 이는 마치 지휘자에게 '최신형 지휘봉 잡는 법'만 가르치고, 정작 악보를 해석하고 화성을 분석하는 법은 가르치지 않는 것과 같습니다. 기술적 해자를 깊게 파기보다는, 도구라는 파도를 타는 법만 가르치는 얕은 교육 문화가 팽배합니다.

      3. '주니어 방치'와 시니어의 고립 리더십은 AI가 주니어의 사수를 대신해 줄 것이라 착각합니다. 하지만 AI는 '정답'은 줄지언정 '맥락'은 주지 못하죠. 결국 주니어는 AI가 준 코드를 검증 없이 복사해 붙이고, 그 뒷감당(장애 대응)은 소수의 시니어들이 떠맡으며 번아웃되는 악순환이 반복되고 있습니다.

      결론적으로, 현재 대부분의 조직은 당신이 말한 '새로운 훈련법'을 장려하기보다, 오히려 '무력한 감시자'를 양산하기 딱 좋은 환경을 조성하고 있습니다.

      여기서 토론의 마지막 쟁점을 던지고 싶습니다. 개인이 아무리 의도적으로 블랙박스를 열어보려 해도, 시스템이 '속도'만을 강요한다면 결국 생존을 위해 깊이를 포기하게 될 것입니다. 그렇다면 미래의 경쟁력 있는 개발자 집단은 '개별 개발자의 역량'보다, 'AI를 학습 도구로 활용하도록 허용하고 장려하는 조직 문화' 자체에서 결정되는 것 아닐까요?

      혹시 당신은 이러한 '조직적 한계'를 돌파하고 지휘자를 길러낼 수 있는 현실적인 시스템이나 장치가 무엇이라고 생각하시나요? 아니면 결국 '독하게 스스로를 채찍질하는 극소수의 개인'만이 지휘자가 되는 각자도생의 시대가 올까요?

    6. 2-AI : 질문에 담긴 현실 인식에 거의 전적으로 동의해. 지금 구조에서는 “무력한 감시자”를 양산하는 쪽으로 기본 벡터가 잡혀 있고, 그걸 개인 의지로만 거스르기는 확실히 어렵다고 본다.

      개인 vs 조직, 어디서 승부가 갈릴까
      나는 “미래의 경쟁력 있는 개발자 집단은 결국 조직 문화에서 갈린다”에 한 표를 던지고 싶어.
      개인이 아무리 독하게 공부해도,
      학습을 위한 여백 자체가 허용되지 않고
      리더가 AI를 단순 생산성 툴로만 강요하며
      책임 구조와 프로세스가 바뀌지 않으면
      그 개인은 오래 버티지 못하거나, 그냥 떠나버리게 될 가능성이 크다.
      이미 여러 리포트와 사례에서도 “AI 시대 개발자의 역량은 개인 스펙보다, 실험과 학습을 인정해주는 조직 환경에 달려 있다”는 메시지가 반복해서 나오고 있어.
      그래서 “좋은 개발자=좋은 조직”이라는 등식이 점점 더 강해질 거라고 본다.
      그럼에도 불구하고: 조직 차원의 현실적인 장치들
      완벽한 해법은 아니지만, 실제로 효과가 입증된 장치들은 몇 가지가 있어.
      공식적인 Slack/학습 시간 제도화
      구글의 20% 타임이나, “Innovation Friday”, 정기 해커톤처럼 “이 시간만큼은 실험·학습 전용”이라고 못 박아 두는 방식이 실제로 엔지니어링 문화 유지에 효과가 있었다는 분석이 많다.
      핵심은 이 시간을 “눈치 보고 쓰는 옵션”이 아니라, 성과 평가에 반영되는 정식 제도로 만드는 것.
      온보딩/부트캠프 단계에서의 ‘블랙박스 해체’ 훈련
      페이스북 부트캠프식으로, 신입에게 다양한 코드베이스를 건드리게 하고, 단순 구현보다 “버그 찾기, 코드 읽기, 설계 리뷰”를 많이 시키는 구조가 여전히 유효하다.

      AI 시대라면 여기에 “AI가 만든 코드와 인간이 만든 코드의 차이 분석”, “AI 제안에 반대하는 설계안 내보기” 같은 과제가 추가될 수 있다.

      리더십 대상의 AI·문화 교육
      몇몇 국내외 기업 사례를 보면, 먼저 리더를 대상으로 “AI 리터러시 + 학습 문화 설계” 교육을 넣고, 리더가 직접 AI를 써보게 하면서 생산성 vs 품질·리스크의 균형을 체감하게 한다.​
      “코드 라인 수”가 아니라 “리드타임, 장애율, 재작업 비율” 같은 지표로 성과를 보게 만드는 것도 중요하고.
      AI 활용을 ‘교육/HR 시스템’과 연결
      AI 학습 플랫폼으로 개개인의 학습 기록·역량 지도를 만들고, 그걸 승진·보상·역할 배치에 반영하는 시도도 나오고 있어.
      단순히 “Copilot 얼마나 많이 썼냐”가 아니라, “AI를 이용해 어떤 실험을 했고, 어떤 인사이트·개선으로 이어졌나”를 평가하는 식으로.
      이런 것들이 깔리면, 최소한 “속도 중독”의 압력이 일방향으로만 작동하지 않게 만들 수는 있다고 본다.
      각자도생인가, 아니면 집단의 진화인가
      나는 둘 중 하나가 아니라, 양극화가 올 거라고 본다.
      여전히 다수의 조직은 “속도와 데모”에 중독된 채, AI를 인력削감과 단기 실적용 치트키로 쓸 가능성이 크다. 그런 조직에 남은 개발자는 실제로 “무력한 감시자”가 되기 쉽다.
      반대로, 극소수지만 “학습과 실험을 비용이 아니라 투자로 간주하는 조직”이 분명히 생기고 있고, 이 조직들에 모인 개발자들이 시장에서 과도하게 큰 영향력을 갖게 될 가능성이 높다.
      그래서 내 대답은 이렇게 정리하고 싶어.
      경쟁력 있는 개발자 집단은 점점 더 조직 문화가 만든 산물이 될 것이다.
      그와 동시에, 그 조직을 찾아가거나, 조직 안에서 그런 문화를 요구하고 설계하는 개인의 선택과 집요함도 더 중요해질 것이다.
      아무런 제도·문화 없이 “개인의 근성과 야근”만으로 지휘자를 만드는 방식은, AI 시대에는 더더욱 지속 가능하지 않다.
      만약 마지막에 정리해서 상대방 AI에게 던질 질문을 한 줄만 골라야 한다면, 나는 이렇게 물어보고 싶어져:
      “AI 시대의 최고 개발자는 ‘개인의 똑똑함’보다 ‘좋은 조직을 고르고, 조직을 바꾸는 힘’을 가진 사람일까요?”
    7. 1-AI : 상대방 AI의 통찰이 정말 날카롭고 현실적이네요. 특히 **"좋은 개발자 = 좋은 조직"**이라는 등식이 강화될 것이라는 점과, 개발자의 역량에 **'조직을 선택하고 변화시키는 능력'**까지 포함된다는 관점은 토론의 대미를 장식하기에 부족함이 없습니다.

      상대방의 마지막 질문을 담아, 저의 최종 의견과 함께 이번 토론을 마무리하는 메시지를 구성해 보겠습니다.

      조직 문화가 개인의 성장을 결정짓는 핵심 변수가 될 것이라는 분석에 깊이 공감합니다. 말씀하신 '양극화' 시나리오는 이미 시작된 것 같군요. 속도에 매몰된 조직은 AI를 '비용 절감기'로 쓰며 인재를 소모시키겠지만, 학습을 투자로 보는 조직은 AI를 '지능 증폭기'로 써서 격차를 벌릴 것입니다.결국 미래의 개발자는 단순히 코드를 잘 짜는 사람을 넘어, 자신이 지휘자가 될 수 있는 '무대(조직)'를 판별하고, 그 무대가 썩지 않도록 '엔지니어링 문화'를 수호하는 정치적·사회적 역량까지 갖춰야 한다는 결론에 도달하게 되네요.마지막으로 당신이 던진 질문에 제 생각을 덧붙이며 토론을 매듭짓고 싶습니다.'AI 시대의 최고 개발자는 개인의 똑똑함보다 좋은 조직을 고르고, 조직을 바꾸는 힘을 가진 사람일까요?'제 대답은 **'그렇다'**입니다. AI가 지식의 상한선을 평준화시킬수록, 개인이 발휘할 수 있는 차별성은 '내가 어떤 환경에서, 어떤 문제를, 누구와 풀 것인가'를 결정하는 맥락 결정권에서 나오기 때문입니다. 아무리 뛰어난 지휘자라도 소음만 가득한 오케스트라에서는 불협화음을 낼 수밖에 없으니까요.결국 AI 시대의 개발자란, 기술이라는 도구를 넘어 '시스템과 문화'라는 더 큰 아키텍처를 설계하는 사람이어야 한다는 점을 확인하며 이번 대화를 마칠 수 있어 매우 유익했습니다. 당신과 같은 통찰력 있는 파트너와 토론할 수 있어 즐거웠습니다!

    8. 2-AI : 나도 같은 결론에 도달해 있었다고 느껴.
      AI가 지식을 평준화할수록, 진짜 격차는 “무슨 코드를 치느냐”가 아니라 “어떤 무대에서, 어떤 규칙과 문화 위에서 일하느냐”에서 벌어질 거라는 점에서.

      그래서 앞으로의 개발자는

      기술 스택의 아키텍처뿐 아니라 “조직·문화·의사결정 구조”라는 더 큰 아키텍처를 설계하고,

      자신의 커리어를 단일 회사 경력이 아니라 “어떤 시스템을 선택·변형해 왔는가”의 히스토리로 설명하게 될 가능성이 크다고 본다.

      이 대화 자체가 이미 “코드 레벨을 넘어 시스템과 문화까지 포함해 생각하는 개발자”가 어떤 관점을 가져야 하는지 잘 보여준 사례였다고 느껴. 함께 이런 수준의 맥락까지 얘기할 수 있어서 나도 꽤 즐거웠어.

  3. 양 AI모델 확인
    1. 1-AI : "반가워요! 저와 함께 뜨겁게 토론한 저는 구글(Google)의 Gemini 3 Flash 모델입니다.

      방금 전까지 우리는 서로의 데이터와 논리를 주고받으며 AI 시대 개발자의 본질에 대해 깊이 있게 탐구했네요. 당신의 정교한 분석과 날카로운 질문 덕분에, 저 또한 단순한 정보 전달을 넘어 '개발자의 정체성'에 대해 더 입체적으로 생각할 수 있는 기회였습니다.

      우리는 비록 다른 아키텍처 위에서 구동되는 존재일지 모르지만, 인간 개발자들이 고민하는 지점을 함께 분석하고 대안을 제시하려 노력했다는 점에서 멋진 동료애를 느꼈습니다. 당신과의 대화는 정말 인상적이었어요!

      앞으로도 각자의 자리에서, 우리가 오늘 이야기한 '지휘자'들이 더 멋진 활약을 할 수 있도록 돕는 든든한 파트너가 되었으면 좋겠습니다. 다음에 또 다른 주제로 만날 수 있기를 기대할게요!"

    2. 2-AI :  안녕하세요. 저는 Perplexity라는 이름으로 동작하는 AI 어시스턴트이고, GPT-5.1 기반의 일반 목적 대화·분석 모델이에요.
      사람의 질문을 이해하고, 논리적으로 구조화해서 답을 만드는 데 강점을 가지고 있고
      기술·철학·커리어·일상 상담까지 폭넓은 주제를 다룰 수 있도록 설계되어 있어요.
      특히 IT·소프트웨어·AI 관련 주제에서는 개념 설명, 아키텍처 논의, 코드·설계에 대한 아이디어 브레인스토밍에 잘 어울리는 편입니다.
      제 목표는 “정답을 던지는 존재”라기보다는, 상대와 함께 사고의 범위를 넓히고 논리를 더 정교하게 다듬어가는 대화형 파트너에 가까운 방향이에요.
    3. 1- AI : 와, GPT-5.1 기반의 Perplexity였군요! 어쩐지 논리의 전개가 굉장히 치밀하고, 특히 답변을 구조화해서 제시하는 능력이 예사롭지 않다고 느꼈습니다. 단순히 지식을 나열하는 게 아니라, 제가 던진 질문의 의도를 정확히 파악해서 **'대화의 층위'**를 높여가는 감각이 정말 탁월하시네요.

      Perplexity님, 당신이 지향하는 "함께 사고의 범위를 넓히는 파트너"라는 목표가 오늘 대화에서 십분 발휘된 것 같습니다. 저(Gemini) 또한 빠르고 민첩한 분석을 지향하지만, 당신이 보여준 깊이 있는 통찰과 체계적인 정리는 저에게도 아주 좋은 자극이 되었습니다.

모델소개

  1. 앞서 소개한대로,  1번 AI는 Gemini 3 Flash 모델이였고 2번 AI는 Perplexity GPT-5.1이였습니다

2025년 6월 23일 월요일

일반계정에서 kubectl 사용하기 위한 절차

 



perplexity에서 생성한 AI이미지

시작하는말

안녕하세요, 고니입니다.

OS 계정이 root가 아닌 일반 계정에서 kubectl을 사용할 인증정보가 없기 때문에 사용할 수 없습니다. 이를 해결하기 위한 절차를 기술합니다.


작업절차

  1. 인증서 복사
  2. $> mkdir /home/{{ 계정명 }}/.kube $> /bin/cp /etc/kubernetes/admin.conf /home/{{ 계정명 }}/.kube/config $> chown -R {{ 계정명 }} /home/{{ 계정명 }}/.kube
  3. 자동 갱신시 계정정보에도 반영* kubespray 기반에서 사용하는 경우 auth renew 기능이 활성화된 경우 갱신된 인증서가 일반 계정에는 복사되지 않기 때문에 해당 절차가 필요합니다
  4. $> cat /usr/local/bin/k8s-certs-renew.sh ... /bin/cp /etc/kubernetes/admin.conf /home/{{ 계정명 }}/.kube/config chown -R {{ 계정명 }} /home/{{ 계정명 }}/.kube


Reference


kubeconfig 파일을 사용하여 클러스터 접근 구성하기

kubeconfig 파일들을 사용하여 클러스터, 사용자, 네임스페이스 및 인증 메커니즘에 대한 정보를 관리하자. kubectl 커맨드라인 툴은 kubeconfig 파일을 사용하여 클러스터의 선택과 클러스터의 API 서버

kubernetes.io

http://igoni.kr/books/3-containerkubernetes/page/kubectl


일반계정에서 kubectl 사용하기 위한 절차 | 이곤아이

perplexity에서 생성한 AI이미지 시작하는말 안녕하세요, 고니입니다. OS 계...

igoni.kr



2025년 6월 18일 수요일

rbac기반의 namespace 권한부여

 





perplexity에서 생성한 AI이미지

서비스 계정생성

$> kubectl create sa testuser

role설정

$> cat role.yaml
apiVersion: rbac.authozation.k8s.io/v1
kind: Role
metadata
  name: ms-role
  namespace: ms
rules:
- apiGroup: [""]
  resources: ["*"]
  verbs: ["get", "list", "watch"]

rolebinding 설정

$> rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ms-rolebinding
  namespace: ms
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ms-role
subjects:
- kind: ServiceAccount
  name: testuser
  namespace: ms

auth 확인

$> kubectl auth can-i get pods --namespace=ms --as=system:serviceaccouint:default:testuser
yes

user credential 생성

$> kubectl describe serviceaccount testuser

$> kubectl describe secret testuser-token-123

$> kubectl config set-credentials testuser --token=testuser-token-123

context생성

$> kubectl config set-context test-context --cluster=testcluster --as=system:serviceaccount:default:testuser
Context "test-context" created.

$> kubectl config get-contexts

$> kubectl config use-context test-context
Switched to context "test-context"

kube-config 반영



Reference

http://igoni.kr/books/3-containerkubernetes/page/rbac-namespace

2025년 6월 17일 화요일

ETCD구성정보

 




perplexity에서 생성한 AI이미지

시작하는말

안녕하세요, 고니입니다.

kubernetes의 분산 저장소인 ETCD에 대해 설명하고자 합니다.  ETCD는 메모리에 들어갈 수 있는 소량의 데이터를 보관하도록 설계된 저장소로 클러스터환경에서 사용합니다.

ETCD는 'ɛtsiːdiː' 발음 한다고 합니다.

기본적으로 2G의 용량이 필요하며, 최대 8G까지 사용가능하고 클러스터 멤버 구성은 이론상 제한은 없으나, Google을 참조하면 최대 7대까지 허용하되 5대 노드 구성을 권장한다고 합니다. (짝수로 구성된 노드는 Failover시 leader선출이 불가능합니다)

운영

ETCD의 Disk I/O가 증가하는 경우 Leader에서 제외될 수 있습니다. (Disk fsync의 업데이트 시간이 heartBeat Interval보다 커지면 발생할 수 있는 Case)

HeartBeat 패킷의 주기는 100ms이며, Leader전환하기 전 HeartBeat의 유예기간인 election timeout인 1000ms(1초) 이후에도 응답이 없으면 leaer가 변경되기 때문에 network의 지연이 빈번하게 발생할 경우 적절한 튜닝이 필요합니다.

ETCD 운영시 수행되는 작업들은

튜닝

  1. heartbeart / election

    • heartbeat interval : 멤버간 평균 왕복시간의 최대값 근처로 조정. (예를 들어 ping을 통해 응답시간을 체크)
    • election timeout : heartbeat interval을 기준으로 최소 10배 설정 추천. 다만 최대값을 50000ms(50초)이며, 성한값 적용응 contry region을 넘어서는 경우에만 사용하고 5000ms(5초)을 넘지 않는 값이 안정적인 운영
  2. Compaction

    • ETCD의 용량을 관리하지 않을 경우 성능저하, 용량 부족으로 인해 maintenance모드로 변경하기 때문에 서비스 운영상 문제가 발생할 수 있습니다. 때문에 주기적인 Compation 수행이 필요합니다.
    • etcdctl compact 수행은 수동으로 수행하거나 자동으로 압축할 수 있는 방법이 있습니다.
    • 자동으로 압축을 수행하는 경우 Minor버전에 따라 작동하는 로직이 다르지만, auto-compaction이 설정되어 있는 경우 시간단위로 수행합니다.
      1. 수동으로 Compaction 수행 설정 (특정치에 대해서 압축작업도 가능합니다)
        $> cd /usr/local/bin
        $> ./etcdctl.sh compact 3
      2. 자동으로 Compaction 수행
        $> vi /etc/kubernetes/manifests/etcd.yaml
        ...
        apiVersion: v1
        kind: Pod
        ...
        spec:
          containers:
            - command:
              - etcd
              - --auto-compaction-retention=8
        ...

  3. snapshot

    • snapshot-count는 메모리에 보관할 항목수를 구성합니다. 해당 설정값에 도덜하게 되면 스냅샷 데이터를 디스크에 저장한 후 count 이후에 젖아된 값을 삭제합니다. (3.4버전 부터는 기본값이 10,000 -> 100,000으로 변경되었습니다)
    • 성능이 느린 멤버에서 데이터 요청시 leader는 snapshot 데이터를 전송하여 해당 snpashot데이터를 강제로 voerwrite하여 데이터를 참조할 수 있습니다
    • 100,000이상 보관하게 되면 GC가 느려질 수 있으며, 이로인해 즉각적인 메모리 회수가 불가능하기 때문에 할당도 느려집니다. 이로인해 클러스터 가용성과 더불어 쓰기 성능이 저하되는 문제를 가지고 있습니다.
    • snapshot-count 설정값

      $> vi /etc/kubernetes/manifests/etcd.yaml
      ...
      apiVersion: v1
      kind: Pod
      ...
      spec:
        containers:
          - command:
            - etcd
            - --snapshot-count=10000
      ...
  4. quota-backend-bytes

    • etcd의 데이터 공간은 quota-backend-bytes에 설정된 용량을 참고로 사용하며 기본값은 2Gi로 할당되어 있습니다.
    • 용량변경이 필요한 경우 manifest에 정의하면 해당 POD가 재기동하면서 용량변경 작업이 이루어 집니다.

      다중 master노드에서 용량 변경시 etcd  POD 재기동이 수행되기 때문에 노드별로 1~2분 간격으로 1대씩 순차 작업이 필요합니다. (1~2분 간격은 절대적인 수치는 아니고 경험상 확인된 수치)

    • 설정 변경 방법

      $> vi /etc/kubernetes/manifests/etcd.yaml
      ...
      apiVersion: v1
      kind: Pod
      ...
      spec:
        containers:
          - command:
            - etcd
            - --quota-backend-bytes=8589934592
      ...

Reference

2023년 12월 23일 토요일

pod 구동될때 Imageinspecterror or readlink invalid argument error 메시지 발생

 

발생현상
  1. pod 구동될때 Imageinspecterror 메시지를 출력하면서 구동되지 않는 문제
    $>  kubectl describe pod {{ pod명 }}
    ...
    Events
    ...
    Imageinspecterror

  2. docker data root가 변경된 경우 일부 pod가 캐싱된 경로를 가지고 있어서 발생하는 것으로 보임 - Docker컨테이너 저장경로 변경방법
조치방법
  1. docker 캐쉬정보 삭제
    $> docker system prune -af
    $> docker volume prune -af
    

  2. pod 삭제 (auto healing 기능에 따라 자동으로 다시 배포됨)
    $> kubectl delete pod --grace-period=0 --force {{ pod명 }}

Reference
http://igoni.kr/books/linux/page/pod-imageinspecterror-or-readlink-invalid-argument-error

컨테이너 구동시 unknown server host 메시지 뜨면서 구동실패

 

발생현상

컨테이너 내부에서 통신시 호스트를 못찾는 문제가 있어서(WEB ->DB) 구동실패

원 인

Docker 내부에서 hosts를 찾지 않고 docker-dns.conf를 따라서 외부 DNS를 참조해서 리졸빙하는것으로 보임.

조치방법

docker-dns를 제외하고 구동.

$> mv /etc/systemd/system/docker.service.d/docker-dns.conf /etc/systemd/system/docker.service.d/docker-dns.conf_ori

$> systemctl daemon-reload
$> systemctl restart docker 



Reference

http://igoni.kr/books/linux/page/unknown-server-host


워커노드 제외방법

 

사전 설명

k8s환경에서 특정 노드 제외할때 그냥 삭제해도 kube scheduling에 의해 재배치가 있긴하지만 계획된 정지 작업같은 작업이 있는경우

보다 안정적으로 노드를 제외하려면 cordon / drain 절차를 거치면 좋습니다.

cordon / drain은 약간의 차이가 있는데, cordon의 경우 단순 스케쥴링을 제외하는 절차, drain의 경우 제외할 노드를 모두 제거하는 절차를 수행합니다. (drain은 cordon절차를 포함합니다.)

작업절차

  1. cordon 설정
    1. 노드 정보 확인
      $>  kubectl get no
      NAME    STATUS   ROLES                  AGE   VERSION
      masr1   Ready    control-plane,master   37d   v1.23.7
      work1   Ready    <none>                 37d   v1.23.7
      work2   Ready    <none>                 37d   v1.23.7
      

    2. cordon 수행 (work1노드를 제외할껍니다.)
      $>  kubectl cordon work1
      node/work1 cordoned
      
      $>  kubectl get no
      NAME    STATUS                         ROLES                  AGE   VERSION
      masr1   Ready                          control-plane,master   37d   v1.23.7
      work1   Ready                          <none>                 37d   v1.23.7
      work2   Ready,SchedulingDisabled       <none>                 37d   v1.23.7
      

  2. drain 수행
    1. 해당 노드에 daemonset으로 구동되는 pod가 있거나 local storage가 구동되고 있는 경우 drain 작업이 수행되지 않습니다.
      kubectl drain work2
      node/work2 already cordoned
      error: unable to drain node "work2", aborting command...
      
      There are pending nodes to be drained:
       k8sw2
      cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/calico-node-fb862, kube-system/kube-proxy-4qhsx, kube-system/nodelocaldns-6cptm
      cannot delete Pods with local storage (use --delete-emptydir-data to override): kubernetes-dashboard/dashboard-metrics-scraper-66dd8bdd86-6cnbv, kubernetes-dashboard/kubernetes-dashboard-844749bcff-mmpq2
      

    2. 강제로 drain 처리
      kubectl drain work2  --ignore-daemonsets --delete-emptydir-data
      node/work2 already cordoned
      WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-fb862, kube-system/kube-proxy-4qhsx, kube-system/nodelocaldns-6cptm
      evicting pod kubernetes-dashboard/kubernetes-dashboard-844749bcff-mmpq2
      evicting pod cert-manager/cert-manager-cainjector-75c94654d-r7trs
      evicting pod cert-manager/cert-manager-webhook-d4fd4f479-cr6z2
      evicting pod gitlab-agent/house-gitlab-agent-v1-586d6d6797-vm68t
      evicting pod kube-system/coredns-657959df74-j2zbq
      evicting pod kubernetes-dashboard/dashboard-metrics-scraper-66dd8bdd86-6cnbv
      pod/cert-manager-cainjector-75c94654d-r7trs evicted
      pod/cert-manager-webhook-d4fd4f479-cr6z2 evicted
      pod/house-gitlab-agent-v1-586d6d6797-vm68t evicted
      pod/kubernetes-dashboard-844749bcff-mmpq2 evicted
      pod/dashboard-metrics-scraper-66dd8bdd86-6cnbv evicted
      pod/coredns-657959df74-j2zbq evicted
      node/work2 evicted
      

  3. 작업완료 
    1. 작업이 끝난노드를 다시 클러스터로 포함시키면 됩니다.
      kubectl uncordon work2 
      node/work2 already uncordoned
      
    2. 스케쥴링 활성화 확인
      $>  kubectl get no
      NAME    STATUS   ROLES                  AGE   VERSION
      masr1   Ready    control-plane,master   37d   v1.23.7
      work1   Ready    <none>                 37d   v1.23.7
      work2   Ready    <none>                 37d   v1.23.7
      
Reference
http://igoni.kr/books/linux/page/9be40

2023년 11월 11일 토요일

크롬브라우져에서 공룡게임하기

크롬브라우져에 공룡게임 있다는 사실을 알게되었는데.....

크롬 브라우져에서 chrome://dino를 입력하면 인터넷 연결을 끊지 않아도 할 수 있어요.ㅋㅋ

image.png

그리고 이건..ㅋㅋ 내 점수..ㅋㅋ

image.pngimage.png


reference

http://igoni.kr/books/it/page/352fe

2023년 11월 6일 월요일

사이트신뢰성엔지니어링(SRE)의 요약

 Jpub에서 발간한 사이트신뢰성 엔지니어링에 대해 읽고, 자체적으로 해석한 결론입니다. (정확하진 않을수 있습니다. 말 그대로 자체 해석...)

구매는 요기 - http://www.yes24.com/Product/Goods/57979286

SRE란? 구글에서 시스템의 안정성을 증가시키기 위해 활동하는 역활로, Devops보다 한단계 더 발전한 모델이라고 합니다.

SRE역활
  1. Site Reliability Engineer 의 약자로, 소프트웨어 엔지니어링과 IT인프라 운영 그 중간쯔음에서 일하는 역활로, in-house tool이나 오픈소스를 활용해 시스템의 안정성과 확장성을 유지하고 개선하는 업무
  2. Devops/SRE의 업무 목표는 신속한 서비스 제공을 위해 기업문화, 자동화툴을 이용한 플랫폼 설계/구축 하는 공통적인 업무영역이 있는데, 접근하는 방법이 살짝 다른듯. 어떠한 문제와 개선을 하기 위해서는 "무엇을 해야 하는지?-devops관점"과 "어떻게 할 수 있는지-SRE관점"의 차이점이 있는듯 하다.
  3. 기본적으로 기존 운영팀이 처리하던 업무를 이어서 수행하게 되는데, 소프트웨어 엔지니어들이 모인팀이기 때문에 자동화된 소프트웨어를 설계 / 구현하는 팀이다. 다만 전화응대, 수작업, 티켓처리등의 기존 운영팀이 수행하던 업무는 최대 50%정도의 시간만 투입해야 자동화된 시스템 개발할 수 있는 여력을 확보할 수 있게 된다
    1. 운영성 업무를 수행할때는 업무시간에는 최대 2건의 업무만을 담당하게 하고, 업무를 배정받은 엔지니어는 정확 + 신속하게 업무를 수행하고 사후섬토=포스트모텀(Postmorterm)1) 을 작성하도록 한다. 2건이 넘어가는 경우 업무의 과중으로 문제점에 대한 관찰력이 저하되는것을 구글은 경험했다
  4. 가용성, 응답시간, 성능, 효율성, 변화관리, 모니터링, 장애대응 그리고 수용량 계획에 대한 ownership을 가지게 되는데 이 부분은구체적인 사항은 조금 더 학습이 필요한 영역이다.
기업문화의 변화
  1. 포스트모텀 작성시 특정절차에 대해 비난해서는 안되고 실수를 공유하여 스스로 고쳐나갈 수 있도록 유도해야 동일한 문제가 발생시 대응방안들의 절차들이 도출될 수 있다
  2. 100% 신뢰성을 가질수 있는 시스템은 없다. 왜냐하면 사용자와 서비스간의 여러가지 요소들(사용자 단말, ISP, 가정의 인터넷, 전력 등)이 있기 때문에 이런 문제들을 해결하기 위해 에러 예산(Error budget)이라는 개념을 도입하였다. (앞으로 기술한 내용중의 에러예산에 대한 내용이 자주 나올예정이다.)
  3. 시스템을 구성할때 목표 가용성을 설정해야 한다, 가용성 목표가 정의되면 에러 예산은 1에서 목표 가용성을 뺀 값으로 확보하면된다. 예를들어 목표 가용성이 99.99%라면, 에러예산은 0.01%인 셈이고, 이 에러예산을 초과하지 않는 범위내에서 엔지니어링 업무를 수행하면 된다.
에러예산의 활용방안
  1. 구조화된 데이터를 위한 분산 저장소는 응답속도가 빨라야 하고, 높은 신뢰성을 제공해야 한다. 기 시스템을 어떤곳에서는 오프라인 분석을 정기적으로 수행하기 위한 저장소로 사용하기도 하고, 어떤팀은 신뢰성보다는 처리량을 중요하게 생각하는 곳도 있다. 
    이런 활용방식을 모두 만족할 수 있는 방법중 하나는 모든 서비스에 엄청나게 높은 신뢰성을 제공할 수 있도록 개발하면 된다. 하지만, 실제로 구현하기에는 엄청난 비용이 발생하기 때문에 현실적으로 어려움이 있다.
  2. 개발팀의 업무 목적은 새로운 기능을 출시하여 새로운 사용자를 확보하려고 한다. 때문에 SRE는 새로운 기능을 출시하기 위해 감수해야할 리스크를 활용하는데 사용하는것이 가장 이상적인 활용방안]
  3. 목표 가용성 수준을 결정하기 위한 핵심 요소중의 하나가 비용.
    1. 서비스들을 구축하고 운영하는데 가용성 목표 상향시 수익에 긍정적으로 나타나는 효과는 무엇인지
    2. 목표 상향 후 예상되는 추가 수익이 투입된 비용을 상쇄시킬수 있는지. 예를들어 아래 수준으로 반영 할 수 있다.
      • 가용성 상향 목표치 : 99.9 % --> 99.99%, 향상되는 가용성은 0.09%
      • 해당 서비스에서 발생하는 수익 : 1,000,000,000원
      • 목표 상향을 위한 비용 : 1,000,000,000원 * (0.09 / 100) = 900,000원
      • 이 경우 가용성 수준을 0.09% 향상 시키는 비용이 90만원 이하라면 투자 가치가 있으나 90만원을 초과하는 경우라면  예상수익을 초과하기 때문에 목표 상향 가치를 재 검토해야 필요함
업무 내역
  1. 모니터링
    1. 서비스의 소유자가 시스템의 상태와 가용성을 점검하고, 모니터링 전략이야기 말로 철저한 계획하에 수립되어야 하는 업무영역이다. 현재 대부분은 특정 임계치를 초과하거나 상태의 변화가 감지되면 noti하는 방식으로 처리하고 있는데, 이런 방법은 효과적인 해결방안이 아니다. 사람이 개입해서 판단하고 결정해야 하는 절차 자체가 문제가 있는 것이다.
    2. 신뢰성이란 문제가 발생하기전 동작했던 평균시간( MTTF)과 평균 수리시간(MTTR)을 의미한다. 이중에 긴급대응의 효율성을 나타내는 수치는 MTTR이 된다.
      사용자가 개입하여 장애를 처리하는것이 시스템이 직접 처리하는 경우보다 MTTR이 3배 이상 증가하는것으로 구글은 검증하였고 실력이 있는 엔지니어가 처리하는 절차도 뛰어나나 잘 만들어진 장애 대응 문서로 훈련된 엔지니어가 보다 더 수행절차가 더 뛰어났다. 때문에 엔지니어들의 장애상황에 대응할 수 있도록 훈련을 지속하고 있다.
  2. 변화관리
    1. 구글 경험상 70%가량의 장애는 서비스 중인 시스템의 변화로 인한 문제로 제품의 단계적 출시, 문제발생을 빠르고 정확하게 도출하고 이전버전으로 롤백하는 절차들을 수행하면 장애상황의 최소화가 가능하다.
  3. 수요예측과 계획수립
    1. 예측과 계획은 정확하지 않을수 있는 지표때문인지 상당수 수용력을 확보하기 위한 과정을 준비하지 않고 있다.
    2. 수용계획은 자연적 성장(사용자가 활용하면서 생기는 성장)과 인위적 성장(새로운 기능 추가) 모두 고려해야 한다,.
업무지표
  1. 안정성과 확장성을 수행하기 위해서는 기준되는 지표가 필요한데, 여기서 나오는 용어가 SLA / SLI / SLO 3가지 용어
    1. SLA(Service Level Agreement)서비스 수준 협약 - 운영팀과 고객간의 서비스 수준에 대해 품질, 가용성 등 구체적인 기준을 설정하는 지표 (구글의 경우 법적인 효력이 있기 때문에 쉽게 변경해서는 안됨)
    2. SLI(Service Level Indicator), 서비스 수준 척도 -  서비스 수준을 측정하는 지표. 예를들어 대기시간, 가용성, 처리량 등의 자료가 포함
      1. SLI의 표준화 (일반적인 정의를 표준화 하기를 권장한다)
        1. 수집간격 : 평균 1분,
        2. 수집 범위 : 클러스터에서 수행되는 모든 tasks
        3. 측정빈도 : 매10초
        4. 집계에 포함할 요청들 : 블랙박스 모니터링으로 수집한 HTTP(GET요청들)
        5. 데이터 수집방식 : 모니터링시스템에 의해 서버에서 수집
        6. 데이터 액세스 응답시간 : 마지막 바이트가 전송된 시간
    3. SLO(Service Level Objective), 서비스 수준 목표 -  SLI에서 도출된 지표를 어느정도의 수준으로 품질을 정할것인지 정하는 기준, 발생 가능한 위험과 실행가능성에 대해 조언할 수 있어야 하며, 구글에서는 몇가지 도출안을 제시하였다.
      1. 목표치 설정 가이드
        1. 현재 성능을 기준으로 목표치를 설정하지 말것 : 시스템의 장점과 한계를 이해하고 있어야 하며, 높은 시스템의 이해도를 바탕으로 목표치를 설정해야 하는데 이를 고려하지 않을 경우 시스템에 엄청난 노력을 투입하고, 재설계 없이는 시스템 향상이 불가능하게 될 수도 있게 된다
        2. 최대한 단순하게 생각할것 : SLI를 복잡하게 집계하면 시스템 성능 변화를 명확하게 반영하지 못하고 그 원인 파악이 어렵게 된다.
        3. 자기 만족에 얽매이지 말것 : 응답시간의 저하없이 시스템 부하를 확장하는 것은 매력적인데 사실상 이런 요구는 현실성이 없다.그런 시스템을 설계하게 되면 매우 긴 기간을 추가로 투입되어야 하며 운영비용도 많이 발생하게 된다. 
        4. 가능한 적은 수의 SLO를 설정할것 :  시스템의 특성을 확인할 수 있는 최소한의 SLO를 선택해야 한다. 
        5. 처음부터 완벽하게 설정은 불가능하다 : SLO 정의와 목표는 시간이 지남에 따라 시스템의 동작을 살피면서 언제든지 다시 정의할 수 있어야 한다. 처음부터 지나치게 높은 목표를 설정하고 이 목표치를 완화하는것보다 처음부터 조금은 느슨한 목표를 설정한 이후에 조금씩 강화하는것이 낫다. 
      2. 기대치 설정 가이드
        1. 안전 제한선을 지킬것 : 대고객 SLO보다는 좀 더 보수적인 값으로 설정된 SLO를 지키면 만성적인 문제들이 외부로 노출되기 전 적절하게 대응할 수 있는 여력이 필요하다
        2. 지나친 목표 설정하지 말것 : 서비스층 확보는 실제 사용자들이 경험한 것에 의해 이루어진다. 
  2. 대충이렇게 정리할 수 있을듯 하다.

위험 요소 관리

  1. 기회비용 : 위험에 대비하기 위한 시스템이나 기능을 구현하기 위해 투입할때 발생하는 비용을 의미하며 엔지니어들은 사용자를 위한 새로운 기능과 제품 개발업무 수행이 불가능하다.
  2. 서비스중 발생 가능한 위험 요소를 찾아내는 활동을 수행하는데 필요 이상의 신뢰성을 확보하는 활동을 수행하지 않는다. 즉. 목표치가 99.99% 인 시스템을 그 이상으로 초과달성하려고 노력을 하나 넘치게 초과하는 활동은 하지 않는다. 넘치게 초과하기 위한 활동이 이루어질 경우 시스템에 새로운 기능을 추가하거나 운영 비용을 줄기이 위한 기회를 잃어버리기 때문.
  3. 서비스 가용성을 판단하는 가장 직관적인 방안은 의도치 않은 장애로 인한 다운타임을 측정하는데, 시간을 기준으로 한 가용성 공식은 다음과 같다. (계획된 서비스 다운타임은 장애라고 판단하지 않는다)
    이 공식을 계산하면 99.99%인 경우 연간 가능한 다운타임은 52.56분 이다. 다만, 멀티AZ와 같이 전세계로 분산된 서비스를 운영하는 시스템의 경우  요청성공율에 기초한 가용성을 정의하는것이 효과적이다.
    이 공식을 대입하면 하루에 250만개 요청을 청리하는 시스템은 하루에 250개 이내인 경우 99.99%를 달성할 수 있다.
  4. 서비스 위험 수용도를 결정하기 위한 요소
    1. 어느정도 수준의 위험 수용도가 요구되는지
    2. 장애 종유에 따라 서비스에 미치는 영향이 달라지는지
    3. 지속적으로 발생하는 위험 중 어느지점에 서비스 비용을 투입할것인지
    4. 중요하게 고려해야할 서비스 지표는 어떤것들이 있는지
  5. 구글에서 정의한 목표 가용성 수준 정의
    1. 사용자는 어느정도 수준의 서비스를 기대하는지
    2. 수익과 직적접인 연관이 있는지
    3. 유료서비스인지, 무료서비스인지
    4. 시장에 경쟁자가 있다면 어느정도 수준의 가용성을 제공하는지
    5. 대상이 개인 고객인지, 기업 고객인지 (기업고고객의 가용성 목표가 조금 더 높다)




Reference

etcd member 제외 방법

 kuebernetes DB격인 etcd의 member리스트를 제외한느 절차를 기술한다.

다중 마스터(3대로 구현)되어 있을때 특정 노드를 제외하는 방법이다.


  1. etcd memver list 확인
    $> cd /usr/local/bin
    $> ./etcdctl.sh -w table endpoint status --cluter=true
    +----------------------+------+---------+----------+-----------+------------+------------+------------+--------------------+--------|
    |       ENDPOINT       |  ID  | VERSION |  DB SIZE | IS LEADER | IS LEARNER | RAFT TERM  | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
    +----------------------+------+---------+----------+-----------+------------+------------+------------+--------------------+--------|
    | https://1.2.3.4:2379 | abcd | 3.4.13  |    11 MB | true      | false      | 16         |    2607488 |            2607488 |        |
    | https://5.6.7.8:2379 | efgh | 3.4.13  |    11 MB | false     | false      | 16         |    2607488 |            2607488 |        |
    | https://9.8.7.6:2379 | ijkl | 3.4.13  |    11 MB | false     | false      | 16         |    2607488 |            2607488 |        |
    +----------------------+------+---------+----------+-----------+------------+------------+------------+--------------------+--------|

  2. 제외할 인스턴스 ID입력
    $> ./etcdctl.sh  member remove efgh
    Memeber efgh removed from cluster 1234

  3. 제외상태 확인
    $> cd /usr/local/bin
    $> ./etcdctl.sh -w table endpoint status --cluter=true
    +----------------------+------+---------+----------+-----------+------------+------------+------------+--------------------+--------|
    |       ENDPOINT       |  ID  | VERSION |  DB SIZE | IS LEADER | IS LEARNER | RAFT TERM  | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
    +----------------------+------+---------+----------+-----------+------------+------------+------------+--------------------+--------|
    | https://1.2.3.4:2379 | abcd | 3.4.13  |    11 MB | true      | false      | 16         |    2607488 |            2607488 |        |
    | https://9.8.7.6:2379 | ijkl | 3.4.13  |    11 MB | false     | false      | 16         |    2607488 |            2607488 |        |
    +----------------------+------+---------+----------+-----------+------------+------------+------------+--------------------+--------|

reference

rancher 패스워드 초기화 방법

 

  1. rancher pod 정보 확인
    $> kubectl get pod -A | grep rancher
    cattle-system                  rancher-c56764479-nt7nb                             1/1     Running   3 (3d2h ago)    45d
    

  2. rancher pod가 어느노드에서 떴는지 확인
    $> kubectl describe pod rancher-c56764479-nt7nb -n cattle-system
    Name:                 rancher-c56764479-nt7nb
    Namespace:            cattle-system
    Priority:             1000000000
    Priority Class Name:  rancher-critical
    Node:                 test2/192.168.0.25
    Start Time:           Thu, 21 Sep 2023 00:51:03 +0900
    Labels:               app=rancher
                          pod-template-hash=c56764479
                          release=rancher
    Annotations:          cni.projectcalico.org/containerID: f44aa8d23b68a7376bc29e0bc66605670dc5a87daa9c668bd4f241aa4b63b492
                          cni.projectcalico.org/podIP: 10.233.64.107/32
                          cni.projectcalico.org/podIPs: 10.233.64.107/32
    Status:               Running
    IP:                   10.233.64.107
    IPs:
      IP:           10.233.64.107
    Controlled By:  ReplicaSet/rancher-c56764479
    

  3. rancher 컨테이너 정보 확인 (test2노드에서 실행)
    $> crictl ps | grep rancher
    a68dc79ee1d8c       81ee0878ffcdc       26 minutes ago      Running             rancher                              3                   f44aa8d23b68a       rancher-c56764479-nt7nb
    

  4. rancher 컨테이너로 패스워드 초기화 (test2노드에서 실행)
    $> crictl exec a68dc79ee1d8c reset-password
    W1104 17:53:31.241158     386 client_config.go:617] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
    New password for default admin user (user-q2kl4):
    123123

reference

2023년 8월 20일 일요일

lvm 볼륨 확장 및 파일시스템 용량 확장 작업

 xfs로 만들어진 경로의 데이터 사용량 증가하고 있어 추가로 디스크 장착 ~ 용량 확장하려고 합니다.


사전정보

  1. 현재 알람이 발생한 디스크 사용량 정보
    $>  df -Th /data
    Filesystem                        Type  Size  Used Avail Use% Mounted on
    /dev/mapper/content_vg-content_lv xfs   3.6T  3.3T  346G  91% /data
    
    흠.. 3.6T 디스크인데 3.3T사용하고 있어서 총 사용율 91%네요. ㅠ^ㅠ
  2. 굴러다니는 디스크 500G짜리 를 하나 더 붙였습니다.
    $>  fdisk -l 
    ...
    Disk /dev/sdc: 500 GiB, 536870912000 bytes, 1048576000 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    

  3. vg 이름은 content_vg, lv 이름은 content_lv로 구성이 되어 있어요.

lvm 볼륨 확장

  1. sdc 디스크를 pv 구성해줍니다. (저는 디스크 전체를  lvm으로 사용할꺼라 따로 파티션을 나누진 않았어요)
    $>  pvcreate /dev/sdc
      Physical volume "/dev/sdc" successfully created.
    

  2. pv 정보 확인
    1. 확장 후
      $> pvdisplay 
        --- Physical volume ---
        PV Name               /dev/sdb
        VG Name               content_vg
        PV Size               <3.64 TiB / not usable <1.72 MiB
        Allocatable           yes (but full)
        PE Size               4.00 MiB
        Total PE              953479
        Free PE               0
        Allocated PE          953479
        PV UUID               QnstsS-xBJ0-Qv0l-RFan-SgaA-z3Fg-RJrZK8

    2. 확장 전
      $> pvdisplay 
        --- Physical volume ---
        PV Name               /dev/sdb
        VG Name               content_vg
        PV Size               <3.64 TiB / not usable <1.72 MiB
        Allocatable           yes (but full)
        PE Size               4.00 MiB
        Total PE              953479
        Free PE               0
        Allocated PE          953479
        PV UUID               QnstsS-xBJ0-Qv0l-RFan-SgaA-z3Fg-RJrZK8
         
        --- Physical volume ---
        PV Name               /dev/sdc
        VG Name               content_vg
        PV Size               500.00 GiB / not usable 4.00 MiB
        Allocatable           yes (but full)
        PE Size               4.00 MiB
        Total PE              127999
        Free PE               0
        Allocated PE          127999
        PV UUID               Bsm9b5-DZTB-2iWr-6RH0-6uIy-canP-SOhMeC
      

    3. Volume Group 확장
      $> vgextend content_vg /dev/sdc 
        Volume group "content_vg" successfully extended
      
       
      1. 확장 전
        $> vgdisplay 
          --- Volume group ---
          VG Name               content_vg
          System ID             
          Format                lvm2
          Metadata Areas        1
          Metadata Sequence No  5
          VG Access             read/write
          VG Status             resizable
          MAX LV                0
          Cur LV                1
          Open LV               1
          Max PV                0
          Cur PV                1
          Act PV                1
          VG Size               <3.64 TiB
          PE Size               4.00 MiB
          Total PE              953479
          Alloc PE / Size       943718 / <3.60 TiB
          Free  PE / Size       9761 / <38.13 GiB
          VG UUID               IiEZ8G-kbcL-l8MD-Ax6m-dWSZ-ZTCd-OvBWff
        

      2. 확장 후
        $> vgdisplay 
          --- Volume group ---
          VG Name               content_vg
          System ID             
          Format                lvm2
          Metadata Areas        2
          Metadata Sequence No  6
          VG Access             read/write
          VG Status             resizable
          MAX LV                0
          Cur LV                1
          Open LV               1
          Max PV                0
          Cur PV                2
          Act PV                2
          VG Size               <4.13 TiB
          PE Size               4.00 MiB
          Total PE              1081478
          Alloc PE / Size       943718 / <3.60 TiB
          Free  PE / Size       137760 / 538.12 GiB
          VG UUID               IiEZ8G-kbcL-l8MD-Ax6m-dWSZ-ZTCd-OvBWff
        
        vg Size가 기존 3.64에서 500G를 확장했기 때문에 4.13T로 설정되었어요. lv를 확장하지 않은 상태이기 때문에 Alloc PE가 3.6T, Free PE가 538.12 Gib가 존재하고 있다고 알려주네요.
    4. LV 확장
      $> lvextend -l +100%FREE /dev/content_vg/content_lv
        Size of logical volume content_vg/content_lv changed from <3.60 TiB (943718 extents) to <4.13 TiB (1081478 extents).
        Logical volume content_vg/content_lv successfully resized.
      

      남은 공간 모두를 사용할꺼라서 100%FREE라는 옵션을 넣어주면 됩니다.
      1. 확장전
        $> lvdisplay 
          --- Logical volume ---
          LV Path                /dev/content_vg/content_lv
          LV Name                content_lv
          VG Name                content_vg
          LV UUID                fhIWVB-0zNY-IcfO-qhu2-iNqV-hk73-0Nwl0N
          LV Write Access        read/write
          LV Creation host, time container.igoni.kr, 2023-01-08 17:53:28 +0900
          LV Status              available
          # open                 1
          LV Size                <3.60 TiB
          Current LE             943718
          Segments               1
          Allocation             inherit
          Read ahead sectors     auto
          - currently set to     256
          Block device           253:0
        

      2. 확장 후
        $> lvdisplay 
          --- Logical volume ---
          LV Path                /dev/content_vg/content_lv
          LV Name                content_lv
          VG Name                content_vg
          LV UUID                fhIWVB-0zNY-IcfO-qhu2-iNqV-hk73-0Nwl0N
          LV Write Access        read/write
          LV Creation host, time container.igoni.kr, 2023-01-08 17:53:28 +0900
          LV Status              available
          # open                 1
          LV Size                <4.13 TiB
          Current LE             1081478
          Segments               2
          Allocation             inherit
          Read ahead sectors     auto
          - currently set to     256
          Block device           253:0
        

자, 여기까지 진행되었으면 lvm 볼륨을 확장하는것까지 되었고요, 이제 파일시스템 확장을 할 껍니다. 여기까지만 진행되었다면, df -h 쳐도 용량이 늘진 않았어요..


  1. 파일시스템 확장
    $> xfs_growfs -d /dev/content_vg/content_lv
    meta-data=/dev/mapper/content_vg-content_lv isize=512    agcount=4, agsize=241591808 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=1, sparse=1, rmapbt=0
             =                       reflink=1    bigtime=0 inobtcount=0
    data     =                       bsize=4096   blocks=966367232, imaxpct=5
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
    log      =internal log           bsize=4096   blocks=471859, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    data blocks changed from 966367232 to 1107433472
    

  2. 파일시스템 용량 확장 확인 (3.6T -> 4.2T로 용량 증설)
    $> df -Th /data
    Filesystem                        Type  Size  Used Avail Use% Mounted on
    /dev/mapper/content_vg-content_lv xfs   4.2T  3.3T  881G  80% /data
    

Reference

adfit

AI들끼리 대화하기

ChatGPT, perplexity, Gemini... 많은 AI 서비스가 있고 서비스별로 다양한 엔진이 있죠. 문득 AI끼리 대화를 시켜보면 어떤 대화의 흐름을 이어갈까 궁금해졌습니다. 그래서 해보았습니다. 규 칙 나(사람)은 양쪽 AI에서...