{"componentChunkName":"component---src-templates-post-template-jsx","path":"/works/posts/2022-10-23--001","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"3c5d73d3-6826-5a96-b5c3-ceeb315dd67b","html":"<p>503 Service Unavailable 오류가 발생하기 전, 해당 서비스의 인프라 구성은 아래와 같았다.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/6e7f019e9e1d17fc2de2f4d15f49b5d1/49853/001-1.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 55.833333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABW0lEQVQoz5WT6W7CQAyE8/5PRzhzQkggBEK4T3FM81laqT8q2q5krbPeHY89jqcP6/1+277b7TSZTHS5XHS9Xu27aRptNhvzgyBQGIa2e5/AHOB2u9XxeNT9ftfz+dThcFAchVoul9rv9wYWx7GGw6E89/Ane71eBgiT8Xis1WplBlCaJJrNZsaQWJZlnxl+Z9rtdlXXtc7ns5W8Xq/ldzqatiAAjkYjDQYD2z2CXCYrlynNnWGLxUJVVVn/HCCM82mmqo01rQ8Q7Pr9vryiKBRFkdI0tYfQL8vSREjasjh7PB52mRIx4hAgVuS5fN+3eK/Xk0dml931Dp8zRIAtSWi+W8QAhSk+7Jz92kMWKgLAqLiRCVpFy/ncJoDqMAP8i8o8ojWAwYpSaVPelsuZm8F/zSFtuN1ulgThkhawbkeImQQcM5X/8qcAcDqdDBCV6Sfqkggf8RCR4f4CyKZEBTxgHF4AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 1\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/6e7f019e9e1d17fc2de2f4d15f49b5d1/d9199/001-1.png\"\n        srcset=\"/devHistoryBlog/static/6e7f019e9e1d17fc2de2f4d15f49b5d1/8ff5a/001-1.png 240w,\n/devHistoryBlog/static/6e7f019e9e1d17fc2de2f4d15f49b5d1/e85cb/001-1.png 480w,\n/devHistoryBlog/static/6e7f019e9e1d17fc2de2f4d15f49b5d1/d9199/001-1.png 960w,\n/devHistoryBlog/static/6e7f019e9e1d17fc2de2f4d15f49b5d1/07a9c/001-1.png 1440w,\n/devHistoryBlog/static/6e7f019e9e1d17fc2de2f4d15f49b5d1/29114/001-1.png 1920w,\n/devHistoryBlog/static/6e7f019e9e1d17fc2de2f4d15f49b5d1/49853/001-1.png 2224w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>얼마전 IDC1 에 문제가 발생하였고, 결국 <strong>IDC1은 down</strong>이 되었다.</p>\n<p>하지만, <strong>GSLB에 의해 요청은 모두 IDC2로 연결</strong>이 되었고, 해당 deployment 는 Autoscale도 걸려있었기 때문에 큰 문제없이 <strong>서비스가 정상으로 작동</strong>이 되는듯 하였다.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/ec46d7a95980d6d71de6ea8264a8d146/f37ba/001-2.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 59.583333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABxklEQVQoz41TSW7jMBDk/1+R6zxibnPJwYgde7TvsvZdtqM4klxTJOBgLjFMoNDNllhd7G4KPFi3203ZeZpQBh7mcSB6rNMHkl8vaP/8xnK9ogp9NMkRbRRAPCK7E36dRuS2hZl2JT6HHs3mFYOlY+o7hLqGmN+Tww7ifvAnKIXnE8auw3A+Y/q8oqW/N0wExyO6voemG9gdDopYPCK6rauyU9sg8T11uKlrFEUBnQSe42AYBoRBAM/3kVKlwBNrNDXUWYqOh89U2dOapok0TVUSy7JgkTzQ/kLUzFiWpcLlclEZm6ZBVVVoq1Jdd7mcgGX+TvDBWE2VPf+bmMAloWkYyCwDwvM8HCjfdV0kSQKHmaIoYlYbnmWiorKVZM77FlUUKnTpEWORY8gz1HEIa7eFs3+HvXuDmOcZy7Lgyvbfl/Rl/IuQN/BZn5yKrtyvrG8/jsjyAhUVDvRdipLQWQbx06j8v2zbVupPJ3abBDXL8bbZwGG8Z8dlDWVNNU17bmwkkSxFlmXI81yplmRxHKuaq6YQivCZwZaqJr6W765zL5uQUrX0A47NkTNpMCaeeXpyVOQUdLyehFR4h5yG/X6P7Xar7D87k5DMJ7BpSgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 2\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/ec46d7a95980d6d71de6ea8264a8d146/d9199/001-2.png\"\n        srcset=\"/devHistoryBlog/static/ec46d7a95980d6d71de6ea8264a8d146/8ff5a/001-2.png 240w,\n/devHistoryBlog/static/ec46d7a95980d6d71de6ea8264a8d146/e85cb/001-2.png 480w,\n/devHistoryBlog/static/ec46d7a95980d6d71de6ea8264a8d146/d9199/001-2.png 960w,\n/devHistoryBlog/static/ec46d7a95980d6d71de6ea8264a8d146/07a9c/001-2.png 1440w,\n/devHistoryBlog/static/ec46d7a95980d6d71de6ea8264a8d146/29114/001-2.png 1920w,\n/devHistoryBlog/static/ec46d7a95980d6d71de6ea8264a8d146/f37ba/001-2.png 2216w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>하지만, 어느순간부터 해당 서비스에서 <strong>503 오류</strong>가 발생한다는 제보가 들어왔다.</p>\n<p>503 오류는 “<strong>서비스를 일시적으로 사용할 수 없음(503 Service Temporarily Unavailable Error)</strong>” 을 의미하고, 나는 로그도 제대로 확인도 안하고.. nginx에서 발생하는 오류라고 바로 판단을 해버렸다. (삽질의 시작…)</p>\n<br/>\n<br/>\n<h2>✔️ 첫번째 삽질!!</h2>\n<h3>👀 첫번째 의심)</h3>\n<ul>\n<li>“<strong>(클라 요청수) > (pod 들이 수행할 수 있는 요청 수) 상태라서 nginx에서 was로 못보내고 있나?</strong>”</li>\n<li>autoscaling이 발생되었지만, 순간 요청수가 많아 pod가 추가 생성되기 전에 요청을 모두 견뎌내지 못하여 503 오류가 발생한 것인가?</li>\n</ul>\n<h3><strong>💩 첫번째 조치)</strong></h3>\n<ul>\n<li>최소 pod수를 2배로 증가</li>\n</ul>\n<p>하지만.. 503 에러는 계속 발생하였다….😢</p>\n<br/>\n<br/>\n<h2>✔️ 두번째 삽질!!</h2>\n<h3><strong>👀 두번째 의심)</strong></h3>\n<ul>\n<li><strong>두개의 ingress가 총 요청수를 못견디고 있는건가?</strong></li>\n<li>현재 ingress node는 2개인 상태였고, 해당 클러스터에 딱 그 시점에! 다른 서비스가 잠시 머물고 있었는데, nginx가 일시적으로 과부하가 되거나 리소스 제약에 직면하면 해당 오류가 발생할 수 있다는 글을 보게 되었고 nginx를 의심을 하게 됬었다.</li>\n</ul>\n<h3><strong>💩 두번째 조치)</strong></h3>\n<ul>\n<li>ingress pod 한개 추가</li>\n</ul>\n<p>역시.. 503 에러는 계속 발생하였다….😢</p>\n<br/>\n<br/>\n<h2>✔️ 세번째 드디어!!!</h2>\n<p>“<strong>LB에서 요청을 잘못 전달하고 있는게 아닐까?”</strong></p>\n<h3>👀 세번째 의심)</h3>\n<ul>\n<li><strong>앞단 LB에서 로드밸런싱이 잘못되고 있는건 아닐까?</strong></li>\n<li>위 조치까지 하고 nginx 로그를 살펴보게 되었는데, 503 오류에 대한 로그가 딱히 보이지 않아서 물음표를 그리고 있다가 문득! 로드밸런싱이 잘못되고 있을수도 있겠다는 생각이 들었다.</li>\n</ul>\n<h3>🤡 세번째 조치)</h3>\n<ul>\n<li>GSLB로 묶은 VIP 중에 IDC1의 VIP를 제외하도록 요청을 하였다.</li>\n</ul>\n<br/>\n<p>그랬더니!! 드디어 503 오류가 사라졌다!! 만쉐이! 🙌</p>\n<p>아 진짜.. 경험에 의해 바로 판단하지 말고 로그를 꼭 확인하는 습관을 길러야겠다…ㅠㅜ<br>\n하지만 왜 지금 off 인 IDC1 쪽으로 로드밸런싱이 되고 있던건지, GSLB에 버그가 있던거지 정확한 원인은 파악을 하지 못한체, 일단 서비스가 정상화 된 것으로 만족하고 마무리를 지었다.</p>\n<hr>\n<p>하루가 지난 후, 인프라팀에서 공지가 내려왔다.<br>\n아래 상황에서 장애가 난 IDC1에 구축된 클러스터로 트래픽이 인입되면서 서비스 장애로 이어지는 상황이 발생!!</p>\n<ul>\n<li>worker node 가 하나라도 살아난 경우(pod 실행 여부와 상관 없이 핑만 나가는 경우)</li>\n<li>ingress가 하나라도 살아난 경우</li>\n<li>GSLB로 묶여있고, 해당 VIP를 제외(요청등을 통해)하지 않은 경우</li>\n</ul>\n<br/>\n<p>즉, 풀어서 얘기하면 아래와 같다.</p>\n<ul>\n<li>IDC1에 전력이 조금씩 on이 되면서 클러스터를 구성하는 <strong>일부 노드들이 정상화</strong> 되었고,</li>\n<li><strong>서비스 상태는 정상이 아니지만</strong>(pod가 없고 ingress만 있는 경우 등..) GSLB에서 health check를 성공으로 판단하였고,</li>\n<li>때문에 <strong>트래픽이 인입되면서 서비스 장애가 발생</strong>하니, IDC1의 VIP를 제거 요청해라!!</li>\n</ul>\n<br/>\n<p>그래 GSLB는 잘못이 없구나.. (policy 가 어떻게 설정이 되었는지는 난 알지 못하니깐)\nIDC에 문제가 생기면 일단 GSLB에 묶여있는 VIP를 제거하는게 안전하구나.. 라는 배움을 하나 얻게되었다.</p>","fields":{"tagSlugs":["/tags/gslb/"],"slug":"/works/posts/2022-10-23--001"},"frontmatter":{"title":"503 Service Unavailable 오류!! 범인은 누구냐! (WAS? Nginx? GSLB?)","tags":["GSLB"],"date":"2022-10-23","description":null}}},"pageContext":{"slug":"/works/posts/2022-10-23--001"}},"staticQueryHashes":[]}