<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>mng_jn.log</title>
        <link>https://velog.io/</link>
        <description>꾸준히, 차근차근</description>
        <lastBuildDate>Fri, 19 Aug 2022 08:16:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>mng_jn.log</title>
            <url>https://velog.velcdn.com/images/mng_jn/profile/cb755530-f3d0-4543-a8e3-2f369785521a/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. mng_jn.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/mng_jn" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[🙂0819[AWS CI/CD]]]></title>
            <link>https://velog.io/@mng_jn/0819AWS-CICD</link>
            <guid>https://velog.io/@mng_jn/0819AWS-CICD</guid>
            <pubDate>Fri, 19 Aug 2022 08:16:49 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-cloud9">📌 cloud9</h1>
<h2 id="📙-cloud-9">📙 Cloud 9</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/00d341e4-5dcc-431e-afec-e5cf8dbdb7bd/image.png" alt=""></p>
<p>create environment</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/12587e11-d697-4603-883c-c992c2354eb2/image.png" alt=""></p>
<p>name : my-cloud9</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/917a9080-8b1c-4f88-b0d7-5210e1b4cabc/image.png" alt=""></p>
<p>default로 유지
cost-saving setting ; 자동으로 최대절전모드 전환 (ec2) - Network settings (advanced)</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/8f5865c6-f870-4f70-bc33-cdab0499a9f3/image.png" alt=""></p>
<p>vpc default로 해도 됨. 근데 그냥 설정하자.
+태그 넣기 </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/12a25123-773a-47f8-b87c-92aa87ca525c/image.png" alt=""></p>
<p>확인 후 create</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/34a25ce7-c63f-4eae-bca5-41392754aacb/image.png" alt="">
IDE 환경 생성 완료</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/cca65e34-a7e4-4f66-b6d5-da429d25aaab/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/13278130-9ddc-4004-965a-317c42f6a8a7/image.png" alt=""></p>
<p>my-cloud9이 홈폴더(environment).</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/95d22e0a-aa04-4479-a66b-0eb20ca23afa/image.png" alt="">
hello.py 파일 생성 (my-cloud 폴더 우클릭 - New File)</p>
<pre><code>import sys
print(&#39;Hello, World!&#39;)
print(&#39;The sum of 2 and 3 is 5.&#39;)
sum = int(sys.argv[1]) + int(sys.argv[2])
print(&#39;The sum of {0} and {1} is {2}.&#39;.format(sys.argv[1], sys.argv[2], sum))</code></pre><p>파일에 위 명령어 입력</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/db4d013b-5cc6-464a-986b-bcc405bcc40c/image.png" alt="">
run</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/81927215-7e5a-4ab8-83a1-3103cb7b27e4/image.png" alt="">
command 이용</p>
<h2 id="📙-파이썬으로-aws-sdk-boto3-활용-s3-다루기">📙 파이썬으로 AWS SDK (boto3) 활용 s3 다루기</h2>
<p><strong>boto3를 설치해야함 (SDK)</strong></p>
<pre><code>curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python -m pip --version
rm get-pip.py
python -m pip install boto3
python -m pip show boto3
</code></pre><p>위 명령어 bash탭에서 입력하여 설치
<img src="https://velog.velcdn.com/images/mng_jn/post/615c4a59-60de-4b4f-955c-0a61f34f1b77/image.png" alt=""></p>
<p>s3.py파일 탭에서 생성하여 아래 명령어 입력</p>
<pre><code>import sys
import boto3
from botocore.exceptions import ClientError

def get_s3(region=None):
    &quot;&quot;&quot;
    Get a Boto 3 Amazon S3 resource with a specific AWS Region or with your
    default AWS Region.
    &quot;&quot;&quot;
    return boto3.resource(&#39;s3&#39;, region_name=region) if region else boto3.resource(&#39;s3&#39;)

def list_my_buckets(s3):
    print(&#39;Buckets:\n\t&#39;, *[b.name for b in s3.buckets.all()], sep=&quot;\n\t&quot;)

def create_and_delete_my_bucket(bucket_name, region, keep_bucket):
    s3 = get_s3(region)

    list_my_buckets(s3)

    try:
        print(&#39;\nCreating new bucket:&#39;, bucket_name)
        bucket = s3.create_bucket(
            Bucket=bucket_name,
            CreateBucketConfiguration={
                &#39;LocationConstraint&#39;: region
            }
        )
    except ClientError as e:
        print(e)
        sys.exit(&#39;Exiting the script because bucket creation failed.&#39;)


    bucket.wait_until_exists()
    list_my_buckets(s3)

    if not keep_bucket:
        print(&#39;\nDeleting bucket:&#39;, bucket.name)
        bucket.delete()

        bucket.wait_until_not_exists()
        list_my_buckets(s3)
    else:
        print(&#39;\nKeeping bucket:&#39;, bucket.name)


def main():
    import argparse

    parser = argparse.ArgumentParser()
    parser.add_argument(&#39;bucket_name&#39;, help=&#39;The name of the bucket to create.&#39;)
    parser.add_argument(&#39;region&#39;, help=&#39;The region in which to create your bucket.&#39;)
    parser.add_argument(&#39;--keep_bucket&#39;, help=&#39;Keeps the created bucket. When not &#39;
                                              &#39;specified, the bucket is deleted &#39;
                                              &#39;at the end of the demo.&#39;,
                        action=&#39;store_true&#39;)

    args = parser.parse_args()

    create_and_delete_my_bucket(args.bucket_name, args.region, args.keep_bucket)


if __name__ == &#39;__main__&#39;:
    main()</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/f4828df6-1c01-4a65-8618-21683eb13696/image.png" alt=""></p>
<p>커맨드창에 아래 명령어 입력.</p>
<pre><code>s3.py s3.lovemj.shop ap-northeast-2 --keep_bucket</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/72ba477f-5fa4-4de9-9db7-0d4cf738dd66/image.png" alt=""></p>
<h1 id="📌-codecommit">📌 codecommit</h1>
<h2 id="📙iam-사용자-생성">📙iam 사용자 생성</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/48024e27-b241-4dce-85df-5869c7005c8e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/94aac92a-c757-4373-aa12-648a5a8df600/image.png" alt=""></p>
<p>태그 skip하고 생성, .csv파일 다운로드 .</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/efc9935c-f21f-420a-b590-f494f82ddee4/image.png" alt=""></p>
<p>dev-user 클릭해서 사용자 진입 - 보안 자격 증명 - 하단으로 내려서 AWS CodeCommit에 대한 HTTPS Git 자격 증명에서  자격증명 생성해두기. + 자격증명다운로드
-&gt;github이용할때 매번 로그인하지 않아도 되도록.</p>
<h2 id="📙-codecommit">📙 codecommit</h2>
<p>✔️리포지토리 생성 - 이름 : my-repo -생성</p>
<p>✔️cloud9 bash에서 버전 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/b55a0a6f-a532-4934-bffe-f0cd674da7e9/image.png" alt=""></p>
<p>✔️codecommit https 복제해서 git clone 진행
<img src="https://velog.velcdn.com/images/mng_jn/post/552e9c82-d300-4332-b2bb-5116cc02b8e2/image.png" alt=""></p>
<pre><code>git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/my-repo</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/2420c282-3f4a-44d4-aa81-23cf95bfc78d/image.png" alt=""></p>
<p>-&gt; 이미 자격증명 되어있어서 aws configure 명령어 필요 없음 추후에 다른 ec2에서 하거나 하면 aws configure 해서 자격증명 해주면 됨. 기타 - aws git 자격증명 참고
-&gt;migration 실습하기 위해 생성된 my-repo 삭제</p>
<p>✔️ github리포지토리 migration</p>
<p>git clone 하기 위해 github 주소 복사
<img src="https://velog.velcdn.com/images/mng_jn/post/2cfd3605-727a-41cb-9174-fb233333a894/image.png" alt=""></p>
<p>migration하기 위해 codecommit 리포지토리 주소 복사하여 마이그래이션 진행 </p>
<pre><code>ec2-user:~/environment $ mkdir git-migration
ec2-user:~/environment $ git clone --mirror https://github.com/mangjini/hello-world.git git-migration
ec2-user:~/environment/git-migration (BARE:master) $ git push -uf https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/my-repo --all </code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/7bfbe4b5-cf3c-46d5-9ad7-879f607a1778/image.png" alt=""></p>
<p>마이그레이션 완료 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/d907dc6a-ecba-4506-9459-163c541e9cfb/image.png" alt=""></p>
<h1 id="📌-code-build">📌 code build</h1>
<h2 id="📙-code-commit에서-코드-빌드를위한-리포지토리-생성하기">📙 code commit에서 코드 빌드를위한 리포지토리 생성하기</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/8889ae9b-0e7f-41ad-a418-47c686d41759/image.png" alt=""></p>
<h2 id="📙-cloud9">📙 cloud9</h2>
<pre><code>ec2-user:~/environment $ npm install vue
ec2-user:~/environment $ npm install --global vue-cli</code></pre><p>codebuild-repo주소 복사해서 git clone.</p>
<pre><code>ec2-user:~/environment $ git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/codebuild-repo</code></pre><p>vue 웹팩 설치</p>
<pre><code>ec2-user:~/environment $ vue init webpack codebuild-repo</code></pre><pre><code>ec2-user:~/environment $ cd codebuild-repo/
ec2-user:~/environment/codebuild-repo (master) $ ls
build  config  index.html  node_modules  package.json  package-lock.json  README.md  src  static  test
ec2-user:~/environment/codebuild-repo (master) $ 
ec2-user:~/environment/codebuild-repo (master) $ git add.
git: &#39;add.&#39; is not a git command. See &#39;git --help&#39;.

The most similar command is
        add
ec2-user:~/environment/codebuild-repo (master) $ git add .
ec2-user:~/environment/codebuild-repo (master) $ git status
ec2-user:~/environment/codebuild-repo (master) $ git commit -m &quot;uploading new file&quot;
ec2-user:~/environment/codebuild-repo (master) $ git push</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/e1b30be9-1067-44a0-bda8-f5585d3984de/image.png" alt=""></p>
<h2 id="📙-s3">📙 s3</h2>
<p>✔️s3 버킷- 속성 -정적 웹 사이트 호스팅 편집</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e8d2b3cc-4cf5-403d-804b-05b70704afeb/image.png" alt="">
변경사항 저장 클릭</p>
<p>✔️권한 - 퍼블릭 액세스 허용 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/16a129a3-e08c-456e-868c-4a25dd42f749/image.png" alt="">
✔️ 권한 - 버킷정책 편집 - 정책 생성기 </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/348e45be-2e20-422d-8eda-7c9fd22e21f0/image.png" alt=""></p>
<p>✔️
<img src="https://velog.velcdn.com/images/mng_jn/post/3f84328d-6d70-4fdf-ab75-146920b9fa29/image.png" alt="">
ARN : arn:aws:s3:::s3.lovemj.shop</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/20013f23-9fa8-49dc-93d5-27a8fc52eb74/image.png" alt=""></p>
<pre><code>{
  &quot;Id&quot;: &quot;Policy1660876142326&quot;,
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;Stmt1660876078119&quot;,
      &quot;Action&quot;: [
        &quot;s3:GetObject&quot;
      ],
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Resource&quot;: &quot;arn:aws:s3:::s3.lovemj.shop/*&quot;,
      &quot;Principal&quot;: &quot;*&quot;
    }
  ]
}</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/4dbc7626-d106-498f-bab8-259414a88404/image.png" alt="">
arn에 버킷이름 옆에 /* 꼭해주기!</p>
<h2 id="📙-code-build">📙 code build</h2>
<p>프로젝트 빌드 - 빌드 프로젝트 생성
<img src="https://velog.velcdn.com/images/mng_jn/post/ffdba66a-dc2d-4d6c-8de7-84766ff5825b/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/924397ec-fa2d-47d6-9262-e9eaf78ff191/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/fc578f21-e6b2-4af1-ab2f-3d18754f97c3/image.png" alt=""></p>
<p>나머지 default - 빌드 프로젝트 생성 </p>
<h2 id="📙-iam--역할">📙 iam- 역할</h2>
<p>codebuild 검색 - s3 role 클릭
<img src="https://velog.velcdn.com/images/mng_jn/post/18ab3be2-14e5-4d29-8c0d-b14df5eba9d3/image.png" alt="">
권한정책- 권한 추가 - 정책 연결 - s3 검색 - s3FullAccess - 하단에 정책 연결 클릭
<img src="https://velog.velcdn.com/images/mng_jn/post/347e46b6-623e-4c10-b2c0-20e8625d7f6a/image.png" alt=""></p>
<h2 id="📙-빌드">📙 빌드</h2>
<p>경로에 맞게 buildspec.yml 생성
<img src="https://velog.velcdn.com/images/mng_jn/post/e344f47f-7c24-4a18-a3ba-0266f8f20ee3/image.png" alt=""></p>
<pre><code>version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 16
    commands:
      - npm i npm@latest -g
  pre_build:
    commands:
      - npm install
  build:
    commands:
      - npm run build
  post_build:
    commands:
      - aws s3 sync ./dist s3://s3.lovemj.shop</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/8ef43011-3fd6-4462-850f-78bffaa37991/image.png" alt=""></p>
<pre><code>git add .
git commit -m &quot;codebuild test commit&quot;
git push</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/68ab4a3b-4f18-4e02-998c-f1898f05ae13/image.png" alt=""></p>
<p>codebuild에서 빌드 시작
<img src="https://velog.velcdn.com/images/mng_jn/post/fd668f33-cf81-46f5-a241-b198af242f7c/image.png" alt=""></p>
<p>s3속성에서 버킷 웹사이트 엔드포인트로 진입 
<img src="https://velog.velcdn.com/images/mng_jn/post/f0624904-0380-4188-b05e-da7a0bc99621/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/1ae20bbe-9b1c-4fb4-9dcb-8bea730cab8f/image.png" alt=""></p>
<p>route53에서 도메인 설정 -&gt; 버킷 이름과 도메인이 같아야함.
<img src="https://velog.velcdn.com/images/mng_jn/post/a9ade0df-ac98-4865-9c3f-b152dffe4bc2/image.png" alt=""></p>
<h1 id="📌-코드-수정해보고-다시-빌드">📌 코드 수정해보고 다시 빌드</h1>
<h2 id="📙-코드-수정">📙 코드 수정</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/6c6c5f39-6b40-488a-a458-e2041e5a17b3/image.png" alt=""></p>
<p>cli 환경에서는 아래와 같이 진입하여 수정 가능 </p>
<pre><code>ec2-user:~/environment/codebuild-repo/src/components (master) $ vi HelloWorld.vue </code></pre><p>✔️ git push해주기</p>
<pre><code>ec2-user:~/environment/codebuild-repo (master) $ git add .

ec2-user:~/environment/codebuild-repo (master) $ git status

ec2-user:~/environment/codebuild-repo (master) $ git commit -m &quot;Hello mangji add&quot;

ec2-user:~/environment/codebuild-repo (master) $ git push </code></pre><p>✔️code build에서 빌드시작 클릭
<img src="https://velog.velcdn.com/images/mng_jn/post/8970f38f-c1d3-4f9b-921d-5d110a2a3918/image.png" alt="">
수정 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/e98cb51c-691f-401c-82cb-07b1f59162a9/image.png" alt=""></p>
<h1 id="📌-code-deploy">📌 code deploy</h1>
<h2 id="📙-역할-만들기">📙 역할 만들기</h2>
<p>iam - 역할 만들기 - 
<img src="https://velog.velcdn.com/images/mng_jn/post/61995e40-d043-49cf-9e7d-980099daa1c2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/1f56ab39-9c09-48eb-b245-3c9f5f49ae37/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/3b9d810d-9946-442d-b08f-c52f570af00b/image.png" alt="">
-&gt; 역할 생성</p>
<p>✔️역할에 신뢰 관계 편집</p>
<p> codedeployrole클릭 - 신뢰 관계 - 신뢰 정책 편집 - 
기존 json문 삭제하고 아래 내용 붙여넣기</p>
<pre><code>{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Sid&quot;: &quot;&quot;,
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Principal&quot;: {
                &quot;Service&quot;: [
                    &quot;codedeploy.us-east-2.amazonaws.com&quot;,
                    &quot;codedeploy.us-east-1.amazonaws.com&quot;,
                    &quot;codedeploy.us-west-1.amazonaws.com&quot;,
                    &quot;codedeploy.us-west-2.amazonaws.com&quot;,
                    &quot;codedeploy.eu-west-3.amazonaws.com&quot;,
                    &quot;codedeploy.ca-central-1.amazonaws.com&quot;,
                    &quot;codedeploy.eu-west-1.amazonaws.com&quot;,
                    &quot;codedeploy.eu-west-2.amazonaws.com&quot;,
                    &quot;codedeploy.eu-central-1.amazonaws.com&quot;,
                    &quot;codedeploy.ap-east-1.amazonaws.com&quot;,
                    &quot;codedeploy.ap-northeast-1.amazonaws.com&quot;,
                    &quot;codedeploy.ap-northeast-2.amazonaws.com&quot;,
                    &quot;codedeploy.ap-southeast-1.amazonaws.com&quot;,
                    &quot;codedeploy.ap-southeast-2.amazonaws.com&quot;,
                    &quot;codedeploy.ap-south-1.amazonaws.com&quot;,
                    &quot;codedeploy.sa-east-1.amazonaws.com&quot;
                ]
            },
            &quot;Action&quot;: &quot;sts:AssumeRole&quot;
        }
    ]
}</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/8df74c34-185c-41d0-bd82-14e4932463f0/image.png" alt=""></p>
<p>정책 업데이트 클릭</p>
<h2 id="📙-정책-생성">📙 정책 생성</h2>
<p>iam - 정책- 정책 생성 - JSON - 기존 내용 지우고 아래 내용 붙여넣기</p>
<pre><code>{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;s3:Get*&quot;,
        &quot;s3:List*&quot;
      ],
      &quot;Resource&quot;: [
        &quot;arn:aws:s3:::replace-with-your-s3-bucket-name/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-us-east-2/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-us-east-1/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-us-west-1/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-us-west-2/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-ca-central-1/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-eu-west-1/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-eu-west-2/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-eu-west-3/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-eu-central-1/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-ap-east-1/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-ap-northeast-1/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-ap-northeast-2/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-ap-southeast-1/*&quot;,        
        &quot;arn:aws:s3:::aws-codedeploy-ap-southeast-2/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-ap-south-1/*&quot;,
        &quot;arn:aws:s3:::aws-codedeploy-sa-east-1/*&quot;
      ]
    }
  ]
}</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/55747b82-b9b4-4feb-851c-dcc6a5bb8e57/image.png" alt=""></p>
<p>다음 : 태그 - 태그 생략 - 다음: 검토</p>
<p>이름 : codedeploy-ec2 , 정책 생성 버튼 클릭</p>
<h2 id="📙-만든-정책을-부여하기-위한-역할-만들기">📙 만든 정책을 부여하기 위한 역할 만들기</h2>
<p>iam- 역할- 역할만들기</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/f5d0686a-9fe5-4664-a7da-30b4f1d4ca11/image.png" alt=""></p>
<p>-다음 - codedeploy-ec2 선택 , s3 검색해서 AmazonS3FullAccess 선택 - 다음 - 역할 이름 : codedeploy-ec2-role
<img src="https://velog.velcdn.com/images/mng_jn/post/26df8c7c-ea5f-4561-9ed2-a58b00da807d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/71f83a36-917e-43af-b40c-79643b656498/image.png" alt=""></p>
<p>역할생성 클릭 </p>
<h2 id="📙-오토스케일링">📙 오토스케일링</h2>
<p><strong>시작 템플릿으로 해도 되지만 시작구성으로 해보자.</strong>
✔️ec2- 시작구성- 시작 구성생성 - 이름 : my-lc - AMI : ami-01711d925a1e4cc3a - 인스턴스 유형 : t2.micro - 인스턴스 프로필에 역할 할당 
<img src="https://velog.velcdn.com/images/mng_jn/post/115ff3bc-275f-4c0c-a541-2c9fe87a50c2/image.png" alt=""></p>
<p>✔️보안그룹 선택
<img src="https://velog.velcdn.com/images/mng_jn/post/d500dcc3-94df-4613-bdfe-f1aff15987ae/image.png" alt=""></p>
<p>✔️ 키 페어 선택, 체크박스 체크
<img src="https://velog.velcdn.com/images/mng_jn/post/fe7f11c2-fc4c-4696-97f9-3b53902d1ddd/image.png" alt=""></p>
<p>✔️ 다시 위로 올라가서 ,추가구성 - 고급세부 정보 펼치기 ; 사용자 데이터 : </p>
<pre><code>#!/bin/bash
yum update -y
yum install -y ruby
curl -O https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto</code></pre><p>-&gt;codedeploy 에이전트 설치 필요.
(ec2가 코드디플로이로부터 오는 데이터를 받기 위해.)</p>
<p>-&gt; 시작 구성 생성 클릭 </p>
<p>✔️다시 왼쪽 ec2 메뉴에서 - auto scaling 그룹 - auto scaling 그룹 생성 </p>
<p>✔️이름 : my-asg, 하단에 시작 구성으로 전환 클릭 , 만들어둔 시작 구성 선택 (my-lc)
<img src="https://velog.velcdn.com/images/mng_jn/post/a407cee2-0734-4ffe-9722-89d68b0d04fe/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/817a84ad-29c9-486b-8899-019ab4c16d7f/image.png" alt=""></p>
<p>✔️네트워크 MY-VPC , 퍼블릭 서브넷 선택 (A,C)
<img src="https://velog.velcdn.com/images/mng_jn/post/1dd6ac05-35f5-4cba-b639-a2c793690c7e/image.png" alt=""></p>
<p>✔️ 새 로드 밸런서에 연결 - 유형 : ALB - 로드 밸런서 이름 : my-asg-alb - 체계 ; internet-facing (인터넷 배포 용이니까) - 아까 선택해둔 네트워크 확인 - 리스너 및 라우팅 - 대상그룹생성 ; 이름 : my-asg-tg
<img src="https://velog.velcdn.com/images/mng_jn/post/004c0a3b-87da-485e-8694-0118b4862fa0/image.png" alt="">
나머지 default, 다음
상태확인 elb로 하면 보다정확하고 자세한 상태확인 가능. 하지만 지금 우리 deploy케이스에서는 맞지 않아서 ec2로 그대로 두겠음. (deploy 배포 텀중에 상태확인되면 곤란)</p>
<p>✔️ 그룹크기 설정 - 다음 
<img src="https://velog.velcdn.com/images/mng_jn/post/5b9a9a82-1f18-4893-bc73-77a1874f1b8e/image.png" alt=""></p>
<p>✔️ 다 skip하고 , auto scaling 그룹 생성 클릭 
크기조정정책 나중에</p>
<p>✔️ 오토스케일링 선택해서 정보 보기 </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/dc7154c8-9139-4308-aeb1-734230c494e2/image.png" alt=""></p>
<h2 id="📙--cloud9">📙  cloud9</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e190ecec-4a5c-46ea-a4c0-ee9f7b147eca/image.png" alt="">
폴더 생성 ; codedeploy</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/23cae0da-0945-4b72-83b0-b563a6c1de06/image.png" alt="">
파일 생성 ;index.html</p>
<p>index.html 파일 안에 내용 넣어주기</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset=&quot;utf-8&quot;&gt;
  &lt;title&gt;Sample Deployment&lt;/title&gt;
  &lt;style&gt;
    body {
      color: #ffffff;
      background-color: #0188cc;
      font-family: Arial, sans-serif;
      font-size: 14px;
    }
    h1 {
      font-size: 500%;
      font-weight: normal;
      margin-bottom: 0;
    }
    h2 {
      font-size: 200%;
      font-weight: normal;
      margin-bottom: 0;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div align=&quot;center&quot;&gt;
    &lt;h1&gt;Congratulations&lt;/h1&gt;
    &lt;h2&gt;This application was deployed using AWS CodeDeploy.&lt;/h2&gt;
    &lt;p&gt;For next steps, read the &lt;a href=&quot;http://aws.amazon.com/documentation/codedeploy&quot;&gt;AWS CodeDeploy Documentation&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/91c37575-c525-4ca2-b74d-a16ad4e681bd/image.png" alt="">
파일생성 ; appspec.yml
아래 내용 넣어주기</p>
<pre><code>version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html/
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
      runas: root
    - location: scripts/start_server
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server
      timeout: 300
      runas: root</code></pre><p>폴더생성 ;scripts , 안에install_dependencies,start_server,stop_server  파일 생성
<img src="https://velog.velcdn.com/images/mng_jn/post/1c6c7a96-547a-497d-bcf2-968bd2c44e78/image.png" alt="">
내용 ; </p>
<pre><code>vi install_dependencies
#!/bin/bash
yum install -y httpd

vi start_server
#!/bin/bash
systemctl start httpd

vi stop_server
#!/bin/bash
isExistApp = `pgrep httpd`
if [[ -n $isExistApp ]]; then
     systemctl stop httpd
fi</code></pre><p>📢 확장자명 없는 파일생성은 GUI에서 생성 X CLI에서생성해주세요. 인코딩에 문제 생김. </p>
<p>✔️파일 압축 및 s3로 보내기 , 확인 </p>
<pre><code># zip -r codedeploy-sample.zip *
# aws s3 cp codedeploy-sample.zip s3://s3.lovemj.shop

ec2-user:~/environment/codedeploy $ aws s3 ls s3://s3.lovemj.shop
                           PRE static/
2022-08-19 07:27:06       1676 codedeploy-sample.zip
2022-08-19 05:25:42        516 index.html</code></pre><h2 id="📙-code-deploy">📙 code deploy</h2>
<p>code deploy - 애플리케이션 - 애플리케이션 생성
<img src="https://velog.velcdn.com/images/mng_jn/post/16bc9936-3afa-4c2b-872e-05a5081fb650/image.png" alt=""></p>
<p>배포그룹 생성 - 이름 : my-dg - 서비스 역할 : codedeployrole - 환경 구성 : Amazon ec2 오토스케일링 그룹 ;만들어둔 my-asg 선택 
<img src="https://velog.velcdn.com/images/mng_jn/post/c2781f1e-b15d-438b-b73b-e671ea1ab203/image.png" alt=""></p>
<p>로드밸런서 - 로드밸런싱 활성화 해제 - 배포그룹생성
<img src="https://velog.velcdn.com/images/mng_jn/post/552f47ff-9bdb-48ec-bacd-cc7c19a159a4/image.png" alt=""></p>
<p>배포 생성 - 아래와 같이 입력 , 배포만들기 클릭</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/5f7153a2-abcb-48f6-956f-889b986c4ec4/image.png" alt=""></p>
<p>-&gt; 배포 완료 
<img src="https://velog.velcdn.com/images/mng_jn/post/f297f22c-8709-41fe-906c-1b041e7ef57b/image.png" alt=""></p>
<h2 id="📙--alb에서-주소-확인">📙  ALB에서 주소 확인</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/f8ea27aa-6013-44d3-81aa-8e62e646d938/image.png" alt="">
웹페이지 접근 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/3e558df8-a463-4bbe-8a95-83b018fc7846/image.png" alt=""></p>
<p>주소 간소화</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/5080b715-ad4d-4720-95ab-655267509288/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/448c06a3-d24f-459b-8280-981bf5c3442d/image.png" alt=""></p>
<h2 id="📙-index-파일-수정">📙 index 파일 수정</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/3314212e-34f0-4aa7-a104-e20e9f938ff7/image.png" alt=""></p>
<pre><code>ec2-user:~/environment/codedeploy $ rm -rf codedeploy-sample.zip 
ec2-user:~/environment/codedeploy $ zip -r codedeploy-sample.zip *
  adding: appspec.yml (deflated 53%)
  adding: index.html (deflated 47%)
  adding: scripts/ (stored 0%)
  adding: scripts/install_dependencies (stored 0%)
  adding: scripts/start_server (stored 0%)
  adding: scripts/stop_server (deflated 15%)
ec2-user:~/environment/codedeploy $ ll
total 12
-rw-r--r-- 1 ec2-user ec2-user  357 Aug 19 07:09 appspec.yml
-rw-rw-r-- 1 ec2-user ec2-user 1685 Aug 19 08:08 codedeploy-sample.zip
-rw-r--r-- 1 ec2-user ec2-user  732 Aug 19 08:06 index.html
drwxr-xr-x 2 ec2-user ec2-user   73 Aug 19 07:19 scripts
ec2-user:~/environment/codedeploy $ aws s3 cp codedeploy-sample.zip s3://s3.lovemj.shop
upload: ./codedeploy-sample.zip to s3://s3.lovemj.shop/codedeploy-sample.zip
ec2-user:~/environment/codedeploy $ aws s3 ls s3://s3.lovemj.shop
                           PRE static/
2022-08-19 08:10:14       1685 codedeploy-sample.zip
2022-08-19 05:25:42        516 index.html</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/0979bb08-f8e9-4837-8fa9-c5af43647175/image.png" alt="">
배포재시도 클릭</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/259efd2c-a1bf-45b6-b9db-cbbfe77c317b/image.png" alt="">
웹페이지에서 바뀐 것 확인</p>
<h1 id="📌-pipeline">📌 pipeline</h1>
<h2 id="📙-사용자설정">📙 사용자설정</h2>
<p>사용자 - 만들어둔것 선택 - 권한추가 </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/678fd9ed-8568-4be6-bd21-fc1598723c5c/image.png" alt=""></p>
<p>기존정책직접연결-AWSCodePipeline_FullAccess 선택 - 다음 (완료)</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/c562a2ed-99c7-40f4-99cf-ad8c883acc1f/image.png" alt=""></p>
<p>📙 ✔️-✏️📢⭐️📌</p>
<h1 id="📌-기타">📌 기타</h1>
<h3 id="⭐️-aws-git-자격증명">⭐️ aws git 자격증명</h3>
<pre><code>aws configure

git config --global credential.helper &#39;!aws codecommit credential-helper $@&#39;
git config --global credential.useHttpPath true</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[⎈0809[쿠버네티스 모니터링 프로메테우스 , 그라파나]]]></title>
            <link>https://velog.io/@mng_jn/0809%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%94%84%EB%A1%9C%EB%A9%94%ED%85%8C%EC%9A%B0%EC%8A%A4-%EA%B7%B8%EB%9D%BC%ED%8C%8C%EB%82%98</link>
            <guid>https://velog.io/@mng_jn/0809%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%94%84%EB%A1%9C%EB%A9%94%ED%85%8C%EC%9A%B0%EC%8A%A4-%EA%B7%B8%EB%9D%BC%ED%8C%8C%EB%82%98</guid>
            <pubDate>Tue, 09 Aug 2022 08:38:11 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-쿠버네티스-버전-확인">📌 쿠버네티스 버전 확인</h1>
<pre><code>[root@master ~]# kubectl get node
NAME      STATUS   ROLES    AGE   VERSION
master    Ready    master   8d    v1.19.16
worker1   Ready    &lt;none&gt;   8d    v1.19.16
worker2   Ready    &lt;none&gt;   8d    v1.19.16
</code></pre><p>프로메테우스가 서버에 접근해서 정보를 가져오는 방식 (pull방식)
프로메테우스느 데이터를 수집 그라파나는 그 데이터를 가져다 시각화 시켜주는 것.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/230a2f09-389a-4c14-8308-bf363b0ee339/image.png" alt="">
쿠버네티스 클러스터 내에 프로메테우스 설치.(pod-kub-state-metrics, Node-exporter;에이전트)</p>
<h1 id="📌-master-1에서-진행하기">📌 master 1에서 진행하기</h1>
<pre><code>kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.1/components.yaml
</code></pre><p>metric server 관련 설치 내용은 kube-system namespace에 설치됨. </p>
<pre><code>[root@master ~]# kubectl get all -n kube-system
NAME                                  READY   STATUS    RESTARTS   AGE
pod/coredns-f9fd979d6-45rxr           1/1     Running   1          8d
pod/coredns-f9fd979d6-rvnf6           1/1     Running   1          8d
pod/etcd-master                       1/1     Running   1          8d
pod/kube-apiserver-master             1/1     Running   1          8d
pod/kube-controller-manager-master    1/1     Running   1          8d
pod/kube-proxy-tmw8f                  1/1     Running   1          8d
pod/kube-proxy-vc9wp                  1/1     Running   1          8d
pod/kube-proxy-wp8k4                  1/1     Running   1          8d
pod/kube-scheduler-master             1/1     Running   1          8d
pod/metrics-server-6594d67d48-zdpb5   0/1     Running   0          3m40s

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns         ClusterIP   10.96.0.10      &lt;none&gt;        53/UDP,53/TCP,9153/TCP   8d
service/metrics-server   ClusterIP   10.98.109.235   &lt;none&gt;        443/TCP                  3m40s

NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/kube-proxy   3         3         3       3            3           kubernetes.io/os=linux   8d

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns          2/2     2            2           8d
deployment.apps/metrics-server   0/1     1            0           3m40s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-f9fd979d6           2         2         2       8d
replicaset.apps/metrics-server-6594d67d48   1         1         0       3m40s
</code></pre><p>-&gt;여기서 확인해보니 정상적으로 실행되지 않고 있음. (metric server)
-&gt; 수정 필요</p>
<pre><code>[root@master ~]# kubectl edit deployment.apps -n kube-system metrics-server

spec 부분에 라인 맞춰서 아래 문구 추가.
--kubelet-insecure-tls</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/e902a570-3e2e-441c-aa71-5c116bc77c8e/image.png" alt=""></p>
<pre><code>[root@master ~]# kubectl get all -n kube-system
NAME                                  READY   STATUS    RESTARTS   AGE
pod/coredns-f9fd979d6-45rxr           1/1     Running   1          8d
pod/coredns-f9fd979d6-rvnf6           1/1     Running   1          8d
pod/etcd-master                       1/1     Running   1          8d
pod/kube-apiserver-master             1/1     Running   1          8d
pod/kube-controller-manager-master    1/1     Running   1          8d
pod/kube-proxy-tmw8f                  1/1     Running   1          8d
pod/kube-proxy-vc9wp                  1/1     Running   1          8d
pod/kube-proxy-wp8k4                  1/1     Running   1          8d
pod/kube-scheduler-master             1/1     Running   1          8d
pod/metrics-server-6888856cbc-8npjf   1/1     Running   0          89s

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns         ClusterIP   10.96.0.10      &lt;none&gt;        53/UDP,53/TCP,9153/TCP   8d
service/metrics-server   ClusterIP   10.98.109.235   &lt;none&gt;        443/TCP                  14m

NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/kube-proxy   3         3         3       3            3           kubernetes.io/os=linux   8d

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns          2/2     2            2           8d
deployment.apps/metrics-server   1/1     1            1           14m

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-f9fd979d6           2         2         2       8d
replicaset.apps/metrics-server-6594d67d48   0         0         0       14m
replicaset.apps/metrics-server-6888856cbc   1         1         1       89s
</code></pre><p>정상적으로 1/1 running 된 것 확인</p>
<pre><code>[root@master ~]# kubectl top node
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master    168m         8%     999Mi           27%
worker1   46m          4%     375Mi           42%
worker2   41m          4%     358Mi           40%

[root@master ~]# kubectl top pod ##default에는 아무것도 만들지 않음.
No resources found in default namespace.


[root@master ~]# kubectl top pod -n kube-system
NAME                              CPU(cores)   MEMORY(bytes)
coredns-f9fd979d6-45rxr           4m           13Mi
coredns-f9fd979d6-rvnf6           4m           14Mi
etcd-master                       19m          53Mi
kube-apiserver-master             82m          311Mi
kube-controller-manager-master    18m          49Mi
kube-proxy-tmw8f                  1m           19Mi
kube-proxy-vc9wp                  1m           17Mi
kube-proxy-wp8k4                  1m           19Mi
kube-scheduler-master             3m           21Mi
metrics-server-6888856cbc-8npjf   3m           17Mi
</code></pre><p>워커노드 테인트 없는 것확인</p>
<pre><code>[root@master ~]# kubectl describe node worker1 | grep Taints
Taints:             &lt;none&gt;</code></pre><p>프로메테우스 설치 전 네임스페이스 생성</p>
<pre><code>[root@master ~]# kubectl create ns monitoring
namespace/monitoring created
[root@master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   8d
kube-flannel      Active   8d
kube-node-lease   Active   8d
kube-public       Active   8d
kube-system       Active   8d
monitoring        Active   4s
</code></pre><p>프로메테우스 설치</p>
<pre><code>[root@master ~]# yum install -y git
[root@master ~]# git clone https://github.com/hali-linux/my-prometheus-grafana.git
[root@master ~]# ls
anaconda-ks.cfg  my-prometheus-grafana
[root@master ~]# cd my-prometheus-grafana/
[root@master my-prometheus-grafana]# ll
total 44
-rw-r--r-- 1 root root 1006 Aug  9 15:12 grafana.yaml
&lt;!-- 역할주기 
-rw-r--r-- 1 root root 1811 Aug  9 15:12 kube-state-cluster-role.yaml
-rw-r--r-- 1 root root  932 Aug  9 15:12 kube-state-deployment.yaml
-rw-r--r-- 1 root root   98 Aug  9 15:12 kube-state-svcaccount.yaml
-rw-r--r-- 1 root root  330 Aug  9 15:12 kube-state-svc.yaml
--&gt;
-rw-r--r-- 1 root root  652 Aug  9 15:12 prometheus-cluster-role.yaml ## 쿠버네티스 api접근해서 셋팅하기 위한 역할 부여해주는 yaml (첫번재 설치)
-rw-r--r-- 1 root root 5344 Aug  9 15:12 prometheus-config-map.yaml
-rw-r--r-- 1 root root  930 Aug  9 15:12 prometheus-deployment.yaml
-rw-r--r-- 1 root root  710 Aug  9 15:12 prometheus-node-exporter.yaml # 워커 노드들에 대한 자원 수집. (하드웨어 모니터링 - daemon set으로 구성.)
-rw-r--r-- 1 root root  308 Aug  9 15:12 prometheus-svc.yaml # 프로메테우스는 GUI. 진입하기 위한 서비스. 
</code></pre><p>-&gt;파일 설치 순서는 따로 없지만 프로메테우스 먼저, 그다음에 kube-state 야믈 설치.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/8ffee81c-3e43-4bd9-9304-da4e034e3b76/image.png" alt="">
yaml 파일 자체에 네임스페이스 설정되어 있어서 따로 명령어 옵션 추가해주지 않아도 됨.</p>
<pre><code>[root@master my-prometheus-grafana]# kubectl apply -f prometheus-cluster-role.yaml

[root@master my-prometheus-grafana]# kubectl apply -f prometheus-config-map.yaml

[root@master my-prometheus-grafana]# kubectl apply -f prometheus-deployment.yaml

[root@master my-prometheus-grafana]# kubectl apply -f prometheus-node-exporter.yaml

[root@master my-prometheus-grafana]# kubectl apply -f prometheus-svc.yaml
</code></pre><p>설치 확인</p>
<pre><code>[root@master my-prometheus-grafana]# kubectl get pod -n monitoring
NAME                                   READY   STATUS    RESTARTS   AGE
node-exporter-78pxz                    1/1     Running   0          3m2s
node-exporter-db7wm                    1/1     Running   0          3m2s
prometheus-deployment-6fc48d76-gswqb   1/1     Running   0   

[root@master my-prometheus-grafana]# kubectl get pod -n monitoring -o wide
NAME                                   READY   STATUS    RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
node-exporter-78pxz                    1/1     Running   0          4m17s   10.244.1.3   worker1   &lt;none&gt;           &lt;none&gt;
node-exporter-db7wm                    1/1     Running   0          4m17s   10.244.2.4   worker2   &lt;none&gt;           &lt;none&gt;
prometheus-deployment-6fc48d76-gswqb   1/1     Running   0          6m5s    10.244.2.3   worker2   &lt;none&gt;           &lt;none&gt;
4m50s
</code></pre><p>kube-state 설치</p>
<pre><code>[root@master my-prometheus-grafana]# kubectl apply -f kube-state-cluster-role.yaml
clusterrolebinding.rbac.authorization.k8s.io/kube-state-metrics created
clusterrole.rbac.authorization.k8s.io/kube-state-metrics created
[root@master my-prometheus-grafana]# kubectl apply -f kube-state-deployment.yaml
deployment.apps/kube-state-metrics created
[root@master my-prometheus-grafana]# kubectl apply -f kube-state-svcaccount.yaml
serviceaccount/kube-state-metrics created
[root@master my-prometheus-grafana]# kubectl apply -f kube-state-svc.yaml
service/kube-state-metrics created
</code></pre><p>-&gt;kube-system이라는 ns 에 들어가있음. </p>
<p>잘 러닝되고 있는지 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/7b792ce9-710f-4fee-ae6c-78a7c81975cf/image.png" alt=""></p>
<p>프로메테우스 진입하기 위한 포트번호 확인 및 전체적으로 확인.</p>
<pre><code>[root@master my-prometheus-grafana]# kubectl get all -n monitoring
NAME                                       READY   STATUS    RESTARTS   AGE
pod/node-exporter-78pxz                    1/1     Running   0          12m
pod/node-exporter-db7wm                    1/1     Running   0          12m
pod/prometheus-deployment-6fc48d76-gswqb   1/1     Running   0          14m

NAME                         TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/prometheus-service   NodePort   10.101.238.230   &lt;none&gt;        8080:30003/TCP   10m

NAME                           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/node-exporter   2         2         2       2            2           &lt;none&gt;          12m

NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/prometheus-deployment   1/1     1            1           14m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/prometheus-deployment-6fc48d76   1         1         1       14m
</code></pre><p>-&gt;node port 30003 포트</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/48ee54a6-55d2-472d-a765-fdcc482eb523/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/5632cde0-c1c3-49f7-a8f8-28fe7bf35920/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/d8fc3958-23e3-4c17-ae7f-cc8ba6c385d3/image.png" alt=""></p>
<p>-&gt; 보기 쉽지 않음. grafana 설치해보자.</p>
<pre><code>[root@master my-prometheus-grafana]# kubectl apply -f grafana.yaml
deployment.apps/grafana created
service/grafana created

[root@master my-prometheus-grafana]# kubectl get all -n monitoring
NAME                                       READY   STATUS    RESTARTS   AGE
pod/grafana-5d479cc7dc-hmd98               1/1     Running   0          45s
pod/node-exporter-78pxz                    1/1     Running   0          24m
pod/node-exporter-db7wm                    1/1     Running   0          24m
pod/prometheus-deployment-6fc48d76-gswqb   1/1     Running   0          26m

NAME                         TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/grafana              NodePort   10.111.205.242   &lt;none&gt;        3000:30004/TCP   44s
service/prometheus-service   NodePort   10.101.238.230   &lt;none&gt;        8080:30003/TCP   22m

NAME                           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/node-exporter   2         2         2       2            2           &lt;none&gt;          24m

NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/grafana                 1/1     1            1           45s
deployment.apps/prometheus-deployment   1/1     1            1           26m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/grafana-5d479cc7dc               1         1         1       45s
replicaset.apps/prometheus-deployment-6fc48d76   1         1         1       26m
</code></pre><p>-&gt; 포트번호 30004</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/7fee63ab-a567-4179-9fda-addacddd556f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/705bd40a-133c-42e0-960a-7b28133589c7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/cc85b8c1-0e31-49f7-9d50-f614d19ef6f5/image.png" alt=""></p>
<pre><code>[root@master my-prometheus-grafana]# kubectl get svc -n monitoring
NAME                 TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
grafana              NodePort   10.111.205.242   &lt;none&gt;        3000:30004/TCP   22m
prometheus-service   NodePort   10.101.238.230   &lt;none&gt;        8080:30003/TCP   44m
</code></pre><p><a href="http://10.101.238.230:8080">http://10.101.238.230:8080</a> -&gt; 프로메테우스의 클러스터 IP : 8080</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/a90d8a22-b993-42a7-a9a4-a756d517f8bb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/96b18b3e-ed7e-4c8d-9e93-b8a0479aa6a6/image.png" alt=""></p>
<p>그라파나 홈페이지에서 필요한 대시보드 설치하기</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e6c3bb3f-3205-447f-a49b-fe755b02d51e/image.png" alt=""></p>
<p>대시보드 창에서 검색창에 kubernetes 검색 - cluster monitering for kubernetes <img src="https://velog.velcdn.com/images/mng_jn/post/401bccec-cc88-4766-96a8-98b8348affd7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/983c39ee-e018-40fd-9099-0b2ebc1c4681/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/06dcd1e1-2214-49e1-aee5-1039cc9900b4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/df9a23c9-0dd0-49a8-af68-a50f01c79c2c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2da64744-f491-4f32-ab17-0cdafff91414/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/546978d8-0628-4631-aafb-c5c42a1ba068/image.png" alt=""></p>
<p>다른거 import 해보기</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/1cc2911d-2d4b-4bce-bec5-ba8366b849d6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/4c7edcd6-23ec-4b42-b817-3651d81a3c52/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/01e6bd43-4b34-4bbb-95d7-d7e59529d83a/image.png" alt=""></p>
<h1 id="📌-오토스케일링-실습hpa--horizontal-pod-autoscaler">📌 오토스케일링 실습(HPA : Horizontal Pod Autoscaler)</h1>
<pre><code>[root@master my-prometheus-grafana]# cd ~
[root@master ~]# mkdir hpa &amp;&amp; cd $_
[root@master hpa]#
[root@master hpa]# vi php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 2 ## desired capacity 시작 갯수
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: k8s.gcr.io/hpa-example ##부함 올리기 좋은 이미지. 검토할ㄸ내느 이미지만 바꿔주면 됨.
        ports:
        - containerPort: 80 ## 정보성
        resources:
          limits:
            cpu: 500m ## 한도
          requests:
            cpu: 200m ## 최소사항
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80 ##실제 포트 설정
  selector:
    run: php-apache

[root@master hpa]# kubectl apply -f php-apache.yaml

[root@master hpa]# kubectl get all
NAME                             READY   STATUS    RESTARTS   AGE
pod/php-apache-d4cf67d68-ppkbl   1/1     Running   0          54s
pod/php-apache-d4cf67d68-rdjj5   1/1     Running   0          54s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1      &lt;none&gt;        443/TCP   8d
service/php-apache   ClusterIP   10.98.204.31   &lt;none&gt;        80/TCP    54s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   2/2     2            2           54s

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/php-apache-d4cf67d68   2         2         2       54s

</code></pre><pre><code>[root@master hpa]# vi hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  maxReplicas: 4
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  targetCPUUtilizationPercentage: 50
status:
  currentCPUUtilizationPercentage: 0
  currentReplicas: 2
  desiredReplicas: 2

[root@master hpa]# kubectl apply -f hpa.yaml

[root@master hpa]# kubectl get all
NAME                             READY   STATUS    RESTARTS   AGE
pod/php-apache-d4cf67d68-ppkbl   1/1     Running   0          25m
pod/php-apache-d4cf67d68-rdjj5   1/1     Running   0          25m

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1      &lt;none&gt;        443/TCP   8d
service/php-apache   ClusterIP   10.98.204.31   &lt;none&gt;        80/TCP    25m

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   2/2     2            2           25m

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/php-apache-d4cf67d68   2         2         2       25m

NAME                                             REFERENCE               TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/php-apache   Deployment/php-apache   &lt;unknown&gt;/50%   1         4         0          14s


[root@master hpa]# kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         4         2          64s


[root@master ~]# kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c &quot;while sleep 0.01; do wget -q -O- http://php-apache; done&quot;

-&gt;부하 발생시키기 ; http://php-apache 쿠버네티스의 자체 dns ; coredns . 

똑같은 탭 하나 더 만들어서 확인하기
kubectl get hpa</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/a0b4d697-e579-4501-bc21-ab3d0a7cdd4d/image.png" alt=""></p>
<p>첫번째 탭에서 control + c 부하중단</p>
<pre><code>[root@master ~]# kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         4         1          23m
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/852a7236-cc41-486b-8c5c-bcdc628356ad/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e23be655-9507-4369-9113-1ae580917875/image.png" alt=""></p>
<p>📙 ✔️✏️📢⭐️📌</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[🙂0804 [EKS CI/CD - Ansible,Jenkins]]]></title>
            <link>https://velog.io/@mng_jn/0804</link>
            <guid>https://velog.io/@mng_jn/0804</guid>
            <pubDate>Thu, 04 Aug 2022 02:44:54 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-eks-cicd">📌 EKS CI/CD</h1>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/aa2a8648-7fdb-4766-a85f-cccbd42b4d74/image.png" alt=""></p>
<h1 id="📌-eks-준비">📌 EKS 준비</h1>
<h2 id="📙-인스턴스-생성">📙 인스턴스 생성</h2>
<p>이름 : eks-server
이미지 : amazon linux 2
유형 : t2.micro
키페어 선택
네트워크 : MY-VPC, PUB2C
보안그룹 : DEV-SG
사용자데이터 :</p>
<pre><code>#!/bin/bash
timedatectl set-timezone Asia/Seoul
hostnamectl set-hostname eks-server
cd /tmp
curl &quot;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&quot; -o &quot;awscliv2.zip&quot;
unzip awscliv2.zip
./aws/install
curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.21.2/2021-07-05/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin
echo &quot;source &lt;(kubectl completion bash)&quot; &gt;&gt; /home/ec2-user/.bashrc
curl --silent --location &quot;https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz&quot; | tar xz -C /tmp
mv /tmp/eksctl /usr/local/bin</code></pre><p>만들어두고 중지시킨 jenkins,ansible 인스턴스 실행.</p>
<h2 id="📙-레코드-생성">📙 레코드 생성</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/f78e69e4-1dd2-406b-a9b9-d48666e49afd/image.png" alt=""></p>
<h2 id="📙-mobaxterm으로-진입하여-버전확인">📙 mobaxterm으로 진입하여 버전확인</h2>
<pre><code>[ec2-user@eks-server ~]$ aws --version
aws-cli/2.7.21 Python/3.9.11 Linux/5.10.130-118.517.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
[ec2-user@eks-server ~]$ kubectl version
Client Version: version.Info{Major:&quot;1&quot;, Minor:&quot;21+&quot;, GitVersion:&quot;v1.21.2-13+d2965f0db10712&quot;, GitCommit:&quot;d2965f0db1071203c6f5bc662c2827c71fc8b20d&quot;, GitTreeState:&quot;clean&quot;, BuildDate:&quot;2021-06-26T01:02:11Z&quot;, GoVersion:&quot;go1.16.5&quot;, Compiler:&quot;gc&quot;, Platform:&quot;linux/amd64&quot;}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
[ec2-user@eks-server ~]$ eksctl version
0.107.0
</code></pre><h2 id="📙-키형식에서-패스워드로-바꿔주기">📙 키형식에서 패스워드로 바꿔주기</h2>
<pre><code>[ec2-user@eks-server ~]$ sudo passwd ec2-user
Changing password for user ec2-user.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[ec2-user@eks-server ~]$ sudo vi /etc/ssh/sshd_config
PasswordAuthentication yes
#PermitEmptyPasswords no
#PasswordAuthentication no
[ec2-user@eks-server ~]$ sudo systemctl restart sshd
</code></pre><h2 id="📙-iam-역할">📙 IAM 역할</h2>
<p>IAM - 역할 - 역할 만들기 - 신뢰할 수 있는 엔터티 ; AWS 서비스 - 일반 사용 사례 : EC2 - 다음</p>
<p>AmazonEC2FullAccess 검색하여 체크 - 필터 지우기 -IAMFullAccess 검색하여 체크 - AdministratorAccess 검색하여 체크 - 
AWSCloudFormationFullAccess 검색하여체크 - 다음 </p>
<p>역할 이름 : eksctl_role - 역할 생성 클릭 </p>
<p>EC2 대시보드 - 인스턴스 - eks-server 선택 - 마우스 우클릭 - 보안 - IAM 역할 수정 </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/cdcc3415-57ea-4011-9346-c1b54077564e/image.png" alt=""></p>
<p>IAM 역할에서 eksctl_role 선택하고 업데이트</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/0c3772f8-bb6c-4a2e-a165-ef81f76a0492/image.png" alt=""></p>
<h2 id="📙-클러스터-생성-및-노드그룹-생성">📙 클러스터 생성 및 노드그룹 생성</h2>
<pre><code>[ec2-user@eks-server ~]$
eksctl create cluster --name EKS-CLUSTER --region ap-northeast-2 --version 1.21 --vpc-public-subnets subnet-00d4b7ccf0a5221f0,subnet-0833b70ce2cfd51cb --without-nodegroup</code></pre><pre><code>[ec2-user@eks-server ~]$
eksctl create nodegroup \
  --cluster EKS-CLUSTER \
  --region ap-northeast-2 \
  --name NODEGROUP \
  --node-type t2.micro \
  --nodes 4 \
  --nodes-min 4 \
  --nodes-max 8 \
  --ssh-access \
  --ssh-public-key docker-key3</code></pre><h2 id="📙-ansible과-eks서버-연결">📙 ansible과 eks서버 연결</h2>
<p>** anisible 서버에서 진행**</p>
<pre><code>


[ec2-user@ansible-server docker]$ sudo vi /etc/ansible/hosts ## 이 경로에 eks 내부 IP 추가
[eks-server]
10.14.42.197

[ec2-user@ansible-server docker]$ ssh-copy-id 10.14.42.197
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &quot;/home/ec2-user/.ssh/id_rsa.pub&quot;
The authenticity of host &#39;10.14.42.197 (10.14.42.197)&#39; can&#39;t be established.
ECDSA key fingerprint is SHA256:7mAVCmKs8gPFNHMdMCEEQi4kl8lafBsu/OObvZqJ5Kk.
ECDSA key fingerprint is MD5:b4:c3:ba:25:89:0c:13:cd:96:d4:e2:60:cf:c7:f5:5e.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

[ec2-user@ansible-server docker]$ ansible all -m ping
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
[WARNING]: Platform linux on host 10.14.9.46 is using the discovered Python interpreter at /usr/bin/python, but
future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
10.14.9.46 | SUCCESS =&gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python&quot;
    },
    &quot;changed&quot;: false,
    &quot;ping&quot;: &quot;pong&quot;
}
[WARNING]: Platform linux on host 10.14.42.197 is using the discovered Python interpreter at /usr/bin/python,
but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
10.14.42.197 | SUCCESS =&gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python&quot;
    },
    &quot;changed&quot;: false,
    &quot;ping&quot;: &quot;pong&quot;
}

</code></pre><h2 id="📙-ansible서버에서-이미지-관리에-필요한-buildyml-실행해보기">📙 ansible서버에서 이미지 관리에 필요한 build.yml 실행해보기</h2>
<pre><code>[ec2-user@ansible-server ~]$ cd /opt/docker
[ec2-user@ansible-server docker]$ ll
total 944
-rw-rw-r-- 1 ec2-user ec2-user    228 Aug  3 11:48 build.yml
-rw-rw-r-- 1 ec2-user ec2-user    286 Aug  3 12:24 deploy.yml
-rw-rw-r-- 1 ec2-user ec2-user    122 Aug  3 11:23 Dockerfile
-rw-rw-r-- 1 ec2-user ec2-user 951830 Aug  3 14:13 webapp.war

[ec2-user@ansible-server docker]$ vi build.yml
- hosts: ansible-server

  tasks:
  - name: remove docker image
    command: docker rmi -f mj030kk/mytomcat:latest

  - name: create docker image
    command: docker build -t mj030kk/mytomcat:latest .
    args:
      chdir: /opt/docker

  - name: push docker image
    command: docker push mj030kk/mytomcat:latest

[ec2-user@ansible-server docker]$ ansible-playbook build.yml
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/cb6d0645-4dcb-4f99-a4f8-9dac69225140/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/0e75f2c5-09a8-4796-90f4-99769d9adecf/image.png" alt=""></p>
<p>-&gt; 정상 작동 확인</p>
<h2 id="📙-ansible-서버-yml-eks-서버-yaml파일-생성">📙 ansible 서버 yml, eks 서버 yaml파일 생성.</h2>
<pre><code>[ec2-user@ansible-server docker]$  cd /opt/docker

[ec2-user@ansible-server docker]$  vi kube-deploy-svc.yml
- hosts: eks-server

  tasks:
  - name: remove deploy
    command: kubectl delete -f /home/ec2-user/test/deployment.yaml
    ignore_errors: yes
  - name: kube deploy
    command: kubectl apply -f /home/ec2-user/test/deployment.yaml
  - name: kube svc
    command: kubectl apply -f /home/ec2-user/test/svc.yaml
  - name: update
    command: kubectl rollout restart deployment/web-site-deployment
</code></pre><pre><code>[ec2-user@eks-server ~]$ mkdir test &amp;&amp; cd $_

[ec2-user@eks-server test]$ vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-site-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-site-deployment
  template:
    metadata:
      name: web-site-deployment
      labels:
        app: web-site-deployment
    spec:
      containers:
      - name: web-site-deployment-container
        image: mj030kk/mytomcat:latest
        imagePullPolicy: Always

[ec2-user@eks-server test]$ vi svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment
spec:
  type: LoadBalancer
  selector:
    app: web-site-deployment
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

</code></pre><p>서비스와 deployment 분리 이유 : svc까지 지웠다가 다시만들면 접속 주소가 계속 바뀜. deploy만 바꿔주는게 더 적절. </p>
<pre><code>[ec2-user@eks-server test]$ kubectl apply -f deployment.yaml
deployment.apps/web-site-deployment created
[ec2-user@eks-server test]$ kubectl apply -f svc.yaml
service/loadbalancer-service-deployment created

[ec2-user@eks-server test]$ kubectl get all
NAME                                      READY   STATUS    RESTARTS   AGE
pod/web-site-deployment-b455c4dd4-g2dpt   1/1     Running   0          22s
pod/web-site-deployment-b455c4dd4-qpzw2   1/1     Running   0          22s

NAME                                      TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)          AGE
service/kubernetes                        ClusterIP      172.20.0.1      &lt;none&gt;                                                                         443/TCP          50m
service/loadbalancer-service-deployment   LoadBalancer   172.20.160.25   a23e76eb992bf4fc79651a0b4685506d-1520966570.ap-northeast-2.elb.amazonaws.com   8080:30967/TCP   11s

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/web-site-deployment   2/2     2            2           23s

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/web-site-deployment-b455c4dd4   2         2         2       23s
</code></pre><p>로드밸런서 주소 :8080
<img src="https://velog.velcdn.com/images/mng_jn/post/85d42421-2400-438d-8331-b815adfffa0d/image.png" alt=""></p>
<p>로드밸런서 주소 :8080/webapp
<img src="https://velog.velcdn.com/images/mng_jn/post/ad1afc22-2805-4232-9ee6-a091bc1ecbc1/image.png" alt=""></p>
<pre><code>[ec2-user@eks-server test]$ kubectl delete -f .
</code></pre><h2 id="📙-ansible---eks-연결-확인-ansible-playbook">📙 ansible - eks 연결 확인 (ansible playbook)</h2>
<pre><code>[ec2-user@ansible-server docker]$ ansible-playbook kube-deploy-svc.yml

[ec2-user@eks-server test]$ kubectl get svc
NAME                              TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)          AGE
kubernetes                        ClusterIP      172.20.0.1      &lt;none&gt;                                                                         443/TCP          71m
loadbalancer-service-deployment   LoadBalancer   172.20.216.19   a459dbcb64f494db0a7fd15ccf3e4803-2089817562.ap-northeast-2.elb.amazonaws.com   8080:32673/TCP   2m1s
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/c67d5021-4d35-4c02-91ec-0527556f3c9f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/a6732f93-3f72-4ae1-afa1-d2f42bb0ac92/image.png" alt="">
-&gt; 정상작동 확인</p>
<h1 id="📌-젠킨스에서-빌드하기">📌 젠킨스에서 빌드하기</h1>
<p>젠킨스 대시보드 - 새로운 아이템 - 이름 : Deploy_On_Kube_Ansible - Copy from : Copy_Artifacts_onto_Ansible - OK</p>
<p>설명 : 메이븐으로 코드를 빌드하고 앤서블을 활용해서 쿠버네티스(EKS)로 배포하자 - 나머지 그대로, 빌드 후 조치 exec command :</p>
<pre><code>cd /opt/docker;
ansible-playbook build.yml;
sleep 10;
ansible-playbook kube-deploy-svc.yml
</code></pre><ul>
<li>apply, 저장 - 지금 빌드</li>
</ul>
<p>아래와 같이 확인 완료.</p>
<pre><code>[ec2-user@eks-server test]$ kubectl get all
NAME                                       READY   STATUS    RESTARTS   AGE
pod/web-site-deployment-7c66bb5dc8-lsj2p   1/1     Running   0          29s
pod/web-site-deployment-7c66bb5dc8-n6pf9   1/1     Running   0          55s

NAME                                      TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)          AGE
service/kubernetes                        ClusterIP      172.20.0.1      &lt;none&gt;                                                                         443/TCP          87m
service/loadbalancer-service-deployment   LoadBalancer   172.20.216.19   a459dbcb64f494db0a7fd15ccf3e4803-2089817562.ap-northeast-2.elb.amazonaws.com   8080:32673/TCP   17m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/web-site-deployment   2/2     2            2           59s

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/web-site-deployment-7c66bb5dc8   2         2         2       55s
replicaset.apps/web-site-deployment-b455c4dd4    0         0         0       59s
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/188187ac-618c-4073-8c5d-f90f1784344e/image.png" alt="">
엔드포인트 접속 주소는 바뀌지 않은 모습.</p>
<h2 id="📙-서비스주소에-도메인-할당">📙 서비스주소에 도메인 할당</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/b05d22ad-1597-451a-92d0-537dc1e3da0f/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/682e5839-c7e5-446b-870d-a955c91b45e5/image.png" alt=""></p>
<h2 id="📙-웹페이지-수정">📙 웹페이지 수정</h2>
<p><strong>git bash</strong></p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ rm -rf hello-world/

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ git clone https://github.com/mangjini/hello-world.git
Cloning into &#39;hello-world&#39;...
remote: Enumerating objects: 572, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 572 (delta 0), reused 5 (delta 0), pack-reused 565
Receiving objects: 100% (572/572), 830.88 KiB | 2.25 MiB/s, done.
Resolving deltas: 100% (154/154), done.

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd hello-world/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world (master)
$ ls
Dockerfile  pom.xml            regapp-service.yml  test.tml
README.md   regapp-deploy.yml  server/             webapp/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world (master)
$ cd webapp/src/main/webapp/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ ls
WEB-INF/  css/     images/    index.jsp.bak  js/
assets/   gcp.tar  index.jsp  index.jsp.old  test.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ vi index.jsp

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git add .

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git commit -m &quot;hi mj index.jsp&quot;
[master 0be2874] hi mj index.jsp
 1 file changed, 1 insertion(+), 1 deletion(-)

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git push origin master
Enumerating objects: 13, done.
Counting objects: 100% (13/13), done.
Delta compression using up to 4 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 507 bytes | 507.00 KiB/s, done.
Total 7 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To https://github.com/mangjini/hello-world.git
   8a0b4f1..0be2874  master -&gt; master
</code></pre><p>자동 빌드 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/c4fe68eb-bde6-47f2-9a10-1203c1433c69/image.png" alt=""></p>
<p>변경된 웹페이지 확인</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/330f0ee6-b0ca-49b2-b2ad-e3cf67f76066/image.png" alt=""></p>
<h2 id="📙-eks-삭제">📙 eks 삭제</h2>
<p><strong>eks-server에서 진행</strong></p>
<pre><code>kubectl delete all -all
eksctl delete cluster EKS-CLUSTER --region ap-northeast-2</code></pre><h1 id="📌-saa---엔드포인트">📌 SAA - 엔드포인트</h1>
<p>s3 - 버킷생성 - 이름 : s3.lovemj.shop - 버킷만들기
버킷- s3.lovemj.shop - 속성 - 정적 웹사이트 호스팅 활성화 - 인덱스 문서 - index.html - 변경사항 저장</p>
<p>레코드 생성
<img src="https://velog.velcdn.com/images/mng_jn/post/ad2a0c46-71c9-4248-bfbb-1f0c03d6df15/image.png" alt=""></p>
<p>프라이빗 서브넷에 ec2 생성
이름 : private-ec2
이미지 : amazon linux 2
유형 : t2.micro
키페어 선택
네트워크 : MY-VPC, PRI2A
보안그룹 : DEV-SG</p>
<p>ansible서버에서 private로 진입 
private에 eksctl role 역할 부여</p>
<pre><code>[ec2-user@ansible-server ~]$ chmod 400 docker-key3.pem
[ec2-user@ansible-server ~]$ ssh -i docker-key3.pem ec2-user@10.14.79.12

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-14-79-12 ~]$ ping s3.lovemj.shop
PING s3.lovemj.shop (52.219.58.64) 56(84) bytes of data.
^C
--- s3.lovemj.shop ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1021ms

[ec2-user@ip-10-14-79-12 ~]$ aws s3 ls s3://s3.lovemj.shop
Unable to locate credentials. You can configure credentials by running &quot;aws configure&quot;.
[ec2-user@ip-10-14-79-12 ~]$ aws s3 ls s3://s3.lovemj.shop

</code></pre><p>엔드포인트 이용하면 아웃바운드 데이터트랜스퍼 비용 발생 X.
내부망 이용하기때문에 보안적으로도 좋음.</p>
<p>📙  ✔️✏️📢⭐️📌</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0803[CI/CD-Ansible,Jenkins]]]></title>
            <link>https://velog.io/@mng_jn/0803</link>
            <guid>https://velog.io/@mng_jn/0803</guid>
            <pubDate>Wed, 03 Aug 2022 03:39:09 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-saa-준비">📌 SAA 준비</h1>
<h2 id="📙-ebs-인스턴스-스토어">📙 EBS, 인스턴스 스토어</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/810d74e0-08f1-4048-ae95-279a71c1da5b/image.png" alt=""></p>
<p>시험준비 - ebs와 인스턴스 스토어.
인스턴스 스토어는 성능위주. ebs는 가용영역 안에서만 사용 가능.</p>
<h2 id="📙-s3-수명주기-전환-정책-표">📙 s3 수명주기 전환 정책 표</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/5fa4542c-2c2b-4f76-860b-19cecf5617cb/image.png" alt=""></p>
<h1 id="📌-ansible-cicd">📌 ansible CI/CD</h1>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e2f92f6e-9861-4e25-b5f0-c180abaff520/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/1f446ce6-33d5-4510-a451-c16550198c08/image.png" alt=""></p>
<h1 id="📌-ansible">📌 ansible</h1>
<h2 id="📙-인스턴스-생성">📙 인스턴스 생성</h2>
<p>이름 : ansible-server
이미지 : amazon linux 2
유형 : t2.micro
키페어 선택
네트워크 : MY-VPC,  PUB2A
보안그룹 : DEV-SG
사용자데이터 : </p>
<pre><code>#!/bin/bash
timedatectl set-timezone Asia/Seoul
hostnamectl set-hostname ansible-server
amazon-linux-extras install -y ansible2
amazon-linux-extras install docker -y
systemctl enable --now docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
usermod -a -G docker ec2-user
</code></pre><h2 id="📙-route53-레코드-생성으로-도메인-할당">📙 route53 레코드 생성으로 도메인 할당</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/0263b2f0-dc32-49f3-8705-451a05dda6f2/image.png" alt=""></p>
<h2 id="📙-mobaxterm으로-진입하여-설치-확인">📙 mobaxterm으로 진입하여 설치 확인</h2>
<pre><code>[ec2-user@ansible-server ~]$ ansible --version
ansible 2.9.23
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u&#39;/home/ec2-user/.ansible/plugins/modules&#39;, u&#39;/usr/share/ansible/plugins/modules&#39;]
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.18 (default, May 25 2022, 14:30:51) [GCC 7.3.1 20180712 (Red Hat 7.3.1-15)]

  [ec2-user@ansible-server ~]$ docker version
Client:
 Version:           20.10.13
 API version:       1.41

</code></pre><h2 id="📙-젠킨스가-패스워드로-앤서블에-접속할-수-있게하기">📙 젠킨스가 패스워드로 앤서블에 접속할 수 있게하기</h2>
<pre><code>sudo passwd ec2-user
sudo vi /etc/ssh/sshd_config
PasswordAuthentication yes
#PermitEmptyPasswords no
#PasswordAuthentication no
sudo systemctl restart sshd
</code></pre><h2 id="📙-도커와-앤서블-연결하기-위해-인벤토리-편집">📙 도커와 앤서블 연결하기 위해 인벤토리 편집</h2>
<p>도커호스트의 내부 IP를 앤서블 인벤토리에 넣어주기 </p>
<pre><code># sudo vi /etc/ansible/hosts
10.14.40.211
</code></pre><h2 id="📙도커와-앤서블-연결을-위한-키-생성">📙도커와 앤서블 연결을 위한 키 생성</h2>
<p>키 만들기 전에는 진입하려면 비밀번호를 수동으로 쳐줘야함.</p>
<pre><code>[ec2-user@ansible-server ~]$ ansible all -m ping -k
SSH password:
[WARNING]: Platform linux on host 10.14.40.211 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
10.14.40.211 | SUCCESS =&gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python&quot;
    },
    &quot;changed&quot;: false,
    &quot;ping&quot;: &quot;pong&quot;
}
</code></pre><p>키 생성</p>
<pre><code>[ec2-user@ansible-server ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
</code></pre><p>카피명령어로 연결, 다시 ping으로 키진입해보기.</p>
<pre><code># ssh-copy-id 10.14.40.211

# ansible all -m ping</code></pre><p>command 모듈(연결된 도커서버 명령어 실행시킬 수 있는 모듈), uptime 사용으로도 확인가능.</p>
<pre><code>[ec2-user@ansible-server ~]$ ansible all -m command -a uptime
[WARNING]: Platform linux on host 10.14.40.211 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
10.14.40.211 | CHANGED | rc=0 &gt;&gt;
 10:39:19 up  1:01,  2 users,  load average: 0.00, 0.00, 0.00
</code></pre><p>command 활용 2 </p>
<pre><code>[ec2-user@ansible-server ~]$ ansible all -m command -a &quot;docker ps -a&quot;
[WARNING]: Platform linux on host 10.14.40.211 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
10.14.40.211 | CHANGED | rc=0 &gt;&gt;
CONTAINER ID   IMAGE                   COMMAND             CREATED        STATUS                      PORTS     NAMES
b2a6a53c08e6   mj030kk/mytomcat:v1.0   &quot;catalina.sh run&quot;   22 hours ago   Exited (143) 21 hours ago             docker-container
</code></pre><p>-&gt;이런모습으로 도커호스트를 앤서블로 컨트롤 할 것.
command, shell 에서 아쉬운 것은 멱등성이 없음. </p>
<h1 id="📌-jenkins와-앤서블-연결">📌 jenkins와 앤서블 연결</h1>
<h2 id="📙-ansible-server">📙 ansible server</h2>
<pre><code>[ec2-user@ansible-server ~]$ sudo mkdir /opt/docker
[ec2-user@ansible-server ~]$ sudo chown -R ec2-user:ec2-user /opt/docker
</code></pre><h2 id="📙-jenkins">📙 jenkins</h2>
<p>젠킨스대시보드 - 젠킨스 관리 - 시스템설정 - 맨 하단 SSH server 추가 
<img src="https://velog.velcdn.com/images/mng_jn/post/a57150ce-9971-4c93-b3e0-516cf041ff4d/image.png" alt=""></p>
<p>고급 - Use password authentication, or use a different key 체크 - Passphrase / Password 에 비밀번호 입력
<img src="https://velog.velcdn.com/images/mng_jn/post/87c9fa21-b4e8-4802-8f59-a06f72651110/image.png" alt=""></p>
<h1 id="📌-빌드">📌 빌드</h1>
<h2 id="📙-ansible-item">📙 ansible item</h2>
<p>jenins 대시보드 - 새로운 item - name:Copy_Artifacts_onto_Ansible - 
copy from : BuildAndDeployOnContainer - OK</p>
<p>설명 : 메이븐으로 코드를 빌드하고 앤서블을 활용해서 도커호스트로 배포하자
git 경로 : <a href="https://github.com/mangjini/hello-world.git">https://github.com/mangjini/hello-world.git</a></p>
<p>빌드유발 - poll SCM 체크 해제 (자동화 해제) ; test</p>
<p>빌드 후 조치 -  SSh server name : ansible-server로 선택 (기존 : docekr host)
exec command에 있던 내용 삭제 - apply , 저장</p>
<ul>
<li>지금 빌드 클릭</li>
</ul>
<p>ansible 서버에서 확인</p>
<pre><code>[ec2-user@ansible-server docker]$ ll
total 932
-rw-rw-r-- 1 ec2-user ec2-user 951824 Aug  3 11:18 webapp.war
</code></pre><h2 id="📙test">📙test</h2>
<pre><code>[ec2-user@ansible-server docker]$  vi Dockerfile
FROM tomcat:9
RUN cp -R /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps
COPY ./*.war /usr/local/tomcat/webapps

[ec2-user@ansible-server docker]$ docker build -t mj030kk/mytomcat:v1.0 .

[ec2-user@ansible-server docker]$ docker run -d -p 8080:8080 --name test-container mj030kk/mytomcat:v1.0
51003a858bb4147a3b2e98c964629daf09232ff308efcba7967a2e55024a5571

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/bd58b1e6-08ac-4b4f-beb2-08fdc59034ba/image.png" alt=""></p>
<p>test 했던 것들 정리</p>
<pre><code>[ec2-user@ansible-server docker]$ docker images
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
mj030kk/mytomcat   v1.0      7cf717785c7f   5 minutes ago   502MB
tomcat             9         07bcfa45c644   5 days ago      496MB

[ec2-user@ansible-server docker]$ docker rm -f test-container
test-container

[ec2-user@ansible-server docker]$ docker rmi -f mj030kk/mytomcat:v1.0
[ec2-user@ansible-server docker]$ docker rmi -f tomcat:9
</code></pre><h2 id="📙-앤서블과-도커서버-관리">📙 앤서블과 도커서버 관리</h2>
<p>맨 하단에 인벤토리 IP 정리, 그룹화</p>
<pre><code>[ec2-user@ansible-server docker]$ sudo vi /etc/ansible/hosts
[docker-host]
10.14.40.211

[ansible-server]
10.14.9.46
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/7273f86f-6b3b-4635-bc1b-a78fe72c88f6/image.png" alt=""></p>
<p>-&gt; 자기자신도 키 등록해주고, 권한 설정 해줘야 핑 나감.</p>
<pre><code>[ec2-user@ansible-server docker]$ ssh-copy-id 10.14.9.46
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &quot;/home/ec2-user/.ssh/id_rsa.pub&quot;
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ec2-user@10.14.9.46&#39;s password:

Number of key(s) added: 1

Now try logging into the machine, with:   &quot;ssh &#39;10.14.9.46&#39;&quot;
and check to make sure that only the key(s) you wanted were added.
</code></pre><p>완료</p>
<pre><code>[ec2-user@ansible-server docker]$ ansible all -m ping
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
[WARNING]: Platform linux on host 10.14.40.211 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
10.14.40.211 | SUCCESS =&gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python&quot;
    },
    &quot;changed&quot;: false,
    &quot;ping&quot;: &quot;pong&quot;
}
[WARNING]: Platform linux on host 10.14.9.46 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
10.14.9.46 | SUCCESS =&gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python&quot;
    },
    &quot;changed&quot;: false,
    &quot;ping&quot;: &quot;pong&quot;
}
</code></pre><h2 id="📙-앤서블로-빌드">📙 앤서블로 빌드</h2>
<pre><code>[ec2-user@ansible-server docker]$ vi build.yml
- hosts: ansible-server

  tasks:
  - name: create docker image
    command: docker build -t mj030kk/mytomcat:v1.0 .
    args:
      chdir: /opt/docker

  - name: push docker image
    command: docker push mj030kk/mytomcat:v1.0

[ec2-user@ansible-server docker]$ docker login
[ec2-user@ansible-server docker]$ ansible-playbook build.yml
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/079d63a7-5abb-484c-9095-8ce61efa85aa/image.png" alt="">
도커허브에 업로드 완료</p>
<p>이미지도 잘 들어옴</p>
<pre><code>[ec2-user@ansible-server docker]$ docker images
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
mj030kk/mytomcat   v1.0      67835a86bcda   15 minutes ago   502MB
tomcat             9         07bcfa45c644   5 days ago       496MB
</code></pre><h2 id="📙-구성수정">📙 구성수정</h2>
<p>젠킨스 - Copy_Artifacts_onto_Ansible -구성 - 빌드 후 조치 - exec command :</p>
<pre><code>cd /opt/docker;
ansible-playbook build.yml</code></pre><p>-apply,저장 - 지금빌드</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/dffe58ba-480d-4b30-8abd-654267ec7003/image.png" alt="">
방금 업로드라고 바뀐 모습 ( 구성 수정 정상작동 확인 )</p>
<p>제대로 확인하기 위해 docker hub에서 mytomcat 리포 삭제 .
ansible 서버에서도 이미지 삭제.</p>
<pre><code>[ec2-user@ansible-server docker]$ docker images
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
mj030kk/mytomcat   &lt;none&gt;    67835a86bcda   23 minutes ago   502MB
tomcat             9         07bcfa45c644   5 days ago       496MB
[ec2-user@ansible-server docker]$ docker rmi -f 67835a86bcda
</code></pre><p>다시 젠킨스에서 지금 빌드 클릭</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/9faba91f-295c-4ee8-ad2e-cf86443efc19/image.png" alt="">
도커허브에 올라온 모습</p>
<p>ansible에서 확인한 모습</p>
<pre><code>
[ec2-user@ansible-server docker]$ docker images ## 지금 빌드 전
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
tomcat       9         07bcfa45c644   5 days ago   496MB
[ec2-user@ansible-server docker]$ docker images ##지금 빌드 후
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
mj030kk/mytomcat   v1.0      537aa9b06cc8   52 seconds ago   502MB
tomcat             9         07bcfa45c644   5 days ago       496MB
</code></pre><h2 id="📙-test">📙 test</h2>
<pre><code>[ec2-user@ansible-server docker]$ vi deploy.yml
- hosts: docker-host

  tasks:
  - name: remove container
    command: docker rm -f docker-container
  - name: remove image
    command: docker rmi -f mj030kk/mytomcat:v1.0
  - name: create container
    command: docker run -d -p 8080:8080 --name docker-container mj030kk/mytomcat:v1.0

[ec2-user@ansible-server docker]$ ansible-playbook deploy.yml
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/f0a9f5dc-b1a1-421a-a687-f3f6d2716518/image.png" alt=""></p>
<h2 id="📙-자동으로-업데이트-되게-하기-cicd">📙 자동으로 업데이트 되게 하기 [CI/CD]</h2>
<pre><code>[ec2-user@docker-host ~]$ docker rm -f docker-container
docker-container
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/aec21561-67cd-4738-a416-00a9b8111271/image.png" alt=""></p>
<p>젠킨스 - 대시보드 - 포르젝트 - 구성 - 빌드유발 - Poll SCM 스케줄 &#39;* * * * *&#39; - exec command </p>
<pre><code>cd /opt/docker;
ansible-playbook build.yml;
sleep 10;
ansible-playbook deploy.yml
</code></pre><ul>
<li>apply, 저장 - 지금 빌드</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/24a52a71-880a-4ff8-b056-b0aa3906bf05/image.png" alt=""></p>
<h2 id="📙-업데이트-확인">📙 업데이트 확인</h2>
<p>git bash에서,</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ rm -rf hello-world/

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ git clone https://github.com/mangjini/hello-world.git
Cloning into &#39;hello-world&#39;...
remote: Enumerating objects: 565, done.
remote: Total 565 (delta 0), reused 0 (delta 0), pack-reused 565
Receiving objects: 100% (565/565), 826.48 KiB | 917.00 KiB/s, done.
Resolving deltas: 100% (154/154), done.

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd hello-world

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world (master)
$ ls
Dockerfile  README.md  pom.xml  regapp-deploy.yml  regapp-service.yml  server/  test.tml  webapp/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world (master)
$ cd webapp/src/main/webapp/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ ls
WEB-INF/  assets/  css/  gcp.tar  images/  index.jsp  index.jsp.bak  index.jsp.old  js/  test.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ vi index.jsp

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git add .

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git commit -m &quot;edit index.jsp&quot;
[master 8a0b4f1] edit index.jsp
 1 file changed, 1 insertion(+), 1 deletion(-)

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git push origin master
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/db2f2659-0e85-40e9-8426-a07b7c786a3e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/94bc3e26-e630-4ffe-b6ec-3e7ea89f6e35/image.png" alt=""></p>
<p>-&gt; 자동업데이트 확인 완료</p>
<p>📙 ✔️✏️📢⭐️📌</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[🙂0802[CI/CD-AWS codecommit,Jenkins]]]></title>
            <link>https://velog.io/@mng_jn/0802</link>
            <guid>https://velog.io/@mng_jn/0802</guid>
            <pubDate>Tue, 02 Aug 2022 05:03:48 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-docker-host">📌 docker host</h1>
<p><strong>이전에 생성해두고 중지한 gitlab서버(GCP), jenkins/tomcat서버(aws) 시작하고 진행.</strong></p>
<h2 id="📙-docker-host-인스턴스-생성-및-레코드-생성-aws">📙 docker host 인스턴스 생성 및 레코드 생성 (AWS)</h2>
<p>✔️ 이름 : docker-host
✔️ 이미지 : amazon linux 2
✔️ 유형 : t2.micro
✔️ 키페어 선택
✔️ 네트워크 : MY-VPC, PUB2C
✔️ 보안그룹 : DEV-SG
✔️ 사용자데이터 : </p>
<pre><code>#!/bin/bash
timedatectl set-timezone Asia/Seoul
hostnamectl set-hostname docker-host
amazon-linux-extras install docker -y
systemctl enable --now docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
usermod -a -G docker ec2-user</code></pre><p>✔️ IP맵핑
<img src="https://velog.velcdn.com/images/mng_jn/post/3c65c72a-b74a-4b02-a5f7-2c627262f5f5/image.png" alt=""></p>
<h2 id="📙-jenkins-docker-통합">📙 jenkins, docker 통합</h2>
<p>docker host, jenkins server mobaxterm통해 CLI환경 진입.</p>
<p>✔️ docker 설치 잘 되었는지 확인</p>
<pre><code>[ec2-user@docker-host ~]$ docker version</code></pre><p>✔️ docker host에서 명령어로 통합하기 (1)</p>
<pre><code>sudo passwd ec2-user ##키 대신 패스워드로 jenkins와 연결될 수 있도록 패스워드 설정
sudo vi /etc/ssh/sshd_config
PasswordAuthentication yes
#PermitEmptyPasswords no
#PasswordAuthentication no
sudo systemctl restart sshd</code></pre><p>-&gt;세션 끊었다가 접속하면 키 없이 패스워드로 접속 가능.</p>
<p>✔️ docker host에서 명령어로 통합하기 (2)</p>
<pre><code>sudo mkdir /opt/docker

sudo vi /opt/docker/Dockerfile
FROM tomcat:9
RUN cp -R /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps ##컨테이너 안쪽에서 또다른 컨테이너 경로로 보내기 ;
COPY ./*.war /usr/local/tomcat/webapps ##도커 호스트에 있는 것을 컨테이너 안쪽으로 카피.

sudo chown -R ec2-user:ec2-user /opt/docker/</code></pre><p>✔️ <code>RUN cp -R /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps</code> 이유</p>
<pre><code>[ec2-user@docker-host ~]$ docker run -d -p 8080:8080 --name test-tomcat tomcat:9
 ## dockerport:tomcatport

[ec2-user@docker-host ~]$ docker ps
CONTAINER ID   IMAGE      COMMAND             CREATED          STATUS          PORTS                                       NAMES
5602886b782b   tomcat:9   &quot;catalina.sh run&quot;   15 seconds ago   Up 14 seconds   0.0.0.0:8080-&gt;8080/tcp, :::8080-&gt;8080/tcp   test-tomcat

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/dc3c8aec-f6b2-4274-bf40-35be75f00467/image.png" alt=""></p>
<p>안에 내용물이 없어서 화면이 안 뜸.</p>
<pre><code>[ec2-user@docker-host ~]$ docker exec -it test-tomcat bash
root@5602886b782b:/usr/local/tomcat# ls
bin           conf             lib      logs            NOTICE     RELEASE-NOTES  temp     webapps.dist
BUILDING.txt  CONTRIBUTING.md  LICENSE  native-jni-lib  README.md  RUNNING.txt    webapps

root@5602886b782b:/usr/local/tomcat# cp -R webapps.dist/* webapps
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/9ebff4f2-733a-4a5f-b834-a384f798526d/image.png" alt=""></p>
<p>dist에 있는 내용을 webapps폴더로 옮겨주면 첫 페이지가 깨지는 것을 막을 수 있음.</p>
<pre><code>[ec2-user@docker-host ~]$ docker rm -f test-tomcat
test-tomcat</code></pre><p>테스트 마무리</p>
<p>✔️ jenkins도메인:8080으로 진입 - 로그인 후 Jenkins 관리 - 플러그인 관리 - 설치 가능 - publish over ssh검색 - 체크하고 install without restart</p>
<p>✔️ jenkins관리 - 시스템 설정 - 맨 하단 SSH Servers - 추가 - name: docker-host ; hostname:docker.lovemj.shop ; username:ec-user 고급 - Use password authentication, or use a different key 체크 박스 체크 ; Password칸에 password 입력, 맨 하단에 Test configuration 클릭, Success 확인. - apply,저장
<img src="https://velog.velcdn.com/images/mng_jn/post/a5289529-7054-4372-9908-b5f85e4b91f5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/d4f2e538-a553-4c63-8548-7ef95624a8f1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/63b29169-f1ff-428d-9184-a97992cef860/image.png" alt="">
✔️ jenkins dashboard - 사로운 아이템 - 이름 : BuildAndDeployOnContainer  - copyfrom : BuildAndDeployjob - 나머지 그대로 (gitlab올라와있다면 , 안올렸으면 github로 경로 바꾸고) 맨 하단 빌드 후 조치 기존 것 삭제하고 send build artifacts over SSH 선택 - SSH server name; docker-host - source files; <code>webapp/target/*.war</code> - remove prefix; <code>webapp/target</code> - exec command ;</p>
<pre><code>cd /opt/docker;
docker build -t mj030kk/mytomcat:v1.0 .;
docker rm -f docker-container;
docker run -d -p 8080:8080 --name docker-container mj030kk/mytomcat:v1.0</code></pre><ul>
<li>apply, 저장
📢 <code>docker rm -f docker-container;</code>의 이유 ; 다시 빌드 될 때 컨테이너 이름과 포트가 중복되므로 이전에 생성된 것을 지워줘야함.</li>
</ul>
<p>✔️대시보드 - 지금 빌드 후 docker.lovemj.shop:8080/webapp/으로 진입
<img src="https://velog.velcdn.com/images/mng_jn/post/39e0bb22-95b3-497e-a7ea-753675b9efdc/image.png" alt=""></p>
<h2 id="📙-페이지-수정-소스코드-변경-git-bash">📙 페이지 수정 (소스코드 변경) git-bash</h2>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ rm -rf dev-site/

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ git clone -b master http://gitlab.lovemj.shop/mangji/dev-site.git

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd dev-site

r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site (master)
$ cd webapp/src/main/webapp/

r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ vi index.jsp
-&gt;문구 수정

r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ git add index.jsp

r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ git commit -m &quot;modify index.jsp&quot;
[master 8164efb] modify index.jsp
 1 file changed, 1 insertion(+), 1 deletion(-)


r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ git push -uf origin master

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/b10ad786-08b8-4ebd-8b2c-94f6adf3ed05/image.png" alt=""></p>
<h1 id="📌-aws-code-commit">📌 aws code commit</h1>
<h2 id="📙-리포지토리-생성">📙 리포지토리 생성</h2>
<p>✔️ 리포지토리 - 리포지토리 생성 - 이름  : git-test - 생성</p>
<h2 id="📙-iam">📙 IAM</h2>
<p>✔️ 미리 만들어둔 docker 사용자 확인 및 진입
✔️ 보안자격증명 클릭 - AWS CodeCommit에 대한 HTTPS Git 자격 증명 - 자격증명 생성
<img src="https://velog.velcdn.com/images/mng_jn/post/bf05bb7c-ca11-4f38-be0f-b6fecfae2c89/image.png" alt="">
자격증명 다운로드, 비밀번호 표시</p>
<h2 id="📙-gitbash에서-리포-가져오기">📙 gitbash에서 리포 가져오기</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/15737bc0-8070-4ab7-a78d-2ed767bcb102/image.png" alt=""></p>
<p>클립보드에 리포지토리 주소 HTTPS 복제 후 git bash에서 클론 진행.</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/git-test
Cloning into &#39;git-test&#39;...
warning: You appear to have cloned an empty repository.
</code></pre><p>iam에서 띄워둔 ID와 비밀번호 넣어서 자격증명완료.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e352cd82-4d3a-4b4c-9ef0-d7b268f84952/image.png" alt=""></p>
<h2 id="📙-리포지토리에-파일-넣기">📙 리포지토리에 파일 넣기</h2>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd git-test


r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ ls -al
total 20
drwxr-xr-x 1 r2com 197121 0 Aug  2 11:47 ./
drwxr-xr-x 1 r2com 197121 0 Aug  2 11:47 ../
drwxr-xr-x 1 r2com 197121 0 Aug  2 12:06 .git/
</code></pre><p>-&gt; .git/ 이 있다는 것은 init , config 할 필요 없다는 것.</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ echo &quot;Hello World&quot; &gt; README.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git add README.txt
warning: in the working copy of &#39;README.txt&#39;, LF will be replaced by CRLF the next time Git touches it

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git commit -m &quot;add site&quot;
[master (root-commit) 0d03f92] add site
 1 file changed, 1 insertion(+)
 create mode 100644 README.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git remote
origin

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git push origin master

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/6f82993a-305a-48f9-9267-154c22d4817f/image.png" alt=""></p>
<h2 id="📙-원격저장소-마이그레이션-gitlab-codecommit">📙 원격저장소 마이그레이션 gitlab-&gt;codecommit</h2>
<p>gitbash에서 진행</p>
<pre><code>mkdir git-migration
git clone --mirror http://gitlab.lovemj.shop/mangji/dev-site.git git-migration ##git lab 주소
cd git-migration/
git push -uf https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/git-test --all ## codedommit 리포지 주소
</code></pre><h2 id="📙-젠킨스에서-빌드">📙 젠킨스에서 빌드</h2>
<p>✔️ 대시보드 - newitem - 이름: BuildAndDeployOnContainerWithCodecommit - copy from : BuildAndDeployOnContainer - OK</p>
<p>✔️ 설명 : 코드 커밋에서 코드를 가지고 오고 메이븐으로 코드를 빌드하고 도커 호스트로 배포하자 </p>
<p>✔️소스코드 관리 ; 리포지토리 URL : <a href="https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/git-test">https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/git-test</a> 
credential ; 
Add(Jenkins) 
kind:username with password 
username, password ; IAM정보에서 가져오기 - Add
<img src="https://velog.velcdn.com/images/mng_jn/post/356b084e-2c73-4428-befd-73982a0b6618/image.png" alt="">
✔️만든 크리덴셜 선택하고 apply,저장
<img src="https://velog.velcdn.com/images/mng_jn/post/fe0bc482-8945-4f4e-8b5c-732d9ac6b071/image.png" alt=""></p>
<p>✔️빌드완료!
<img src="https://velog.velcdn.com/images/mng_jn/post/cd4ca292-0f9c-41dd-b0a1-286cdb3042db/image.png" alt=""></p>
<h2 id="📙-소스코드-업데이트">📙 소스코드 업데이트</h2>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ cd ~

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ rm -rf git-test/

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/git-test

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd git-test/

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ vi webapp/src/main/webapp/index.jsp

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git add .

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git commit -m &quot;codecommit&quot;
[master ce14734] codecommit
 1 file changed, 1 insertion(+), 1 deletion(-)

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git push -uf origin master

</code></pre><p>✔️ 지금 빌드 후 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/54fbda43-55ee-479b-8b51-a819378f2b84/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0801[k8s version up, eks ingress]]]></title>
            <link>https://velog.io/@mng_jn/0801</link>
            <guid>https://velog.io/@mng_jn/0801</guid>
            <pubDate>Mon, 01 Aug 2022 06:03:11 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-쿠버네티스-버전업">📌 쿠버네티스 버전업</h1>
<h2 id="📙--저번에-만들어둔-centos7-복제연결된-복제해서-worker12만들기">📙  저번에 만들어둔 centos7 복제(연결된 복제)해서 worker1,2만들기</h2>
<p>✔️ centos 7 선택 - 복제 - 이름 : worker1 - 연결된 복제 -&gt; 이름 worker2로 한번 더 진행
✔️ centos7이름 master1으로 바꿔주기
✔️ worker 1,2 : CPU1,RAM 1G로 스펙 바꿔주기 ( 설정 - 시스템)
✔️ 3개의 서버 그룹으로 묶어주고 이름 Kubernetes Cluster</p>
<h2 id="📙-노드공통-명령어">📙 노드공통 명령어</h2>
<pre><code># hostnamectl set-hostname master
# exit

# cat &lt;&lt;EOF &gt;&gt; /etc/hosts
192.168.56.106 master1
192.168.56.107 worker1
192.168.56.108 worker2
EOF
</code></pre><h2 id="📙-노드-명령어">📙 노드 명령어</h2>
<pre><code>--master--
# kubeadm init --apiserver-advertise-address=192.168.56.106 --pod-network-cidr=10.244.0.0/16
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

-- worker 1,2에서 kubeadem init에서 맨 하단에 나온 kubeadm join (토큰정보) 입력 --
# kubeadm join 192.168.56.106:6443 --token 32eyw8.5l08iqkzvrg3q5i0 --discovery-token-ca-cert-hash sha256:5a1f6308637da409dc02418fc208c34caf343d52d857894ab13c7920543deb93

--다시 master로 돌아와서 확인하고 자동완성 명령어진행 --
[root@master ~]# kubectl get node
NAME      STATUS   ROLES    AGE   VERSION
master    Ready    master   6m    v1.19.16
worker1   Ready    &lt;none&gt;   71s   v1.19.16
worker2   Ready    &lt;none&gt;   44s   v1.19.16

# kubectl get pods --all-namespaces
# source &lt;(kubectl completion bash) ## 자동완성 기능
# echo &quot;source &lt;(kubectl completion bash)&quot; &gt;&gt; ~/.bashrc
# exit
</code></pre><p>세 노드 모두 poweroff 후 스냅샷 찍기 이름 : 1.19</p>
<h2 id="📙-ingress--경로기반라우팅-aws---ekselbalb">📙 ingress / 경로기반라우팅 (AWS - EKS,ELB(ALB))</h2>
<pre><code># yum install git -y
# git clone https://github.com/hali-linux/_Book_k8sInfra.git
# kubectl apply -f /root/_Book_k8sInfra/ch3/3.3.2/ingress-nginx.yaml ##controller 사용하기 위한 apply
# kubectl get pods -n ingress-nginx
# mkdir ingress &amp;&amp; cd $_
# vi ingress-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: foods-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: foods-deploy
  template:
    metadata:
      labels:
        app: foods-deploy
    spec:
      containers:
      - name: foods-deploy
        image: halilinux/test-home:v1.0
---
apiVersion: v1
kind: Service
metadata:
  name: foods-svc
spec:
  type: ClusterIP
  selector:
    app: foods-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sales-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sales-deploy
  template:
    metadata:
      labels:
        app: sales-deploy
    spec:
      containers:
      - name: sales-deploy
        image: halilinux/test-home:v2.0
---
apiVersion: v1
kind: Service
metadata:
  name: sales-svc
spec:
  type: ClusterIP
  selector:
    app: sales-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: home-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: home-deploy
  template:
    metadata:
      labels:
        app: home-deploy
    spec:
      containers:
      - name: home-deploy
        image: halilinux/test-home:v0.0
---
apiVersion: v1
kind: Service
metadata:
  name: home-svc
spec:
  type: ClusterIP
  selector:
    app: home-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f ingress-deploy.yaml
# kubectl get all
# kubectl get pod -o wide
# kubectl get svc
# curl 10.98.225.168 ##다른 노드들에서도 접속 가능 
# kubectl get node -o wide


# vi ingress-config.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /foods
        backend:
          serviceName: foods-svc
          servicePort: 80
      - path: /sales
        backend:
          serviceName: sales-svc
          servicePort: 80
      - path:
        backend:
          serviceName: home-svc
          servicePort: 80

# kubectl apply -f ingress-config.yaml
# kubectl get ingress
# kubectl describe ingress ingress-nginx

# vi ingress-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
spec:
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  - name: https
    protocol: TCP
    port: 443
    targetPort: 443
  selector:
    app.kubernetes.io/name: ingress-nginx
  type: LoadBalancer
  externalIPs:
  - 192.168.56.106 ##master IP

# kubectl apply -f ingress-service.yaml
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/b5af8dd9-cd38-45c6-b0ae-6bc88c6caa4a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/b2983d9b-3122-4c42-932f-e7f741b5703c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/42f48d3a-3f07-43e9-b101-6d634d3d118e/image.png" alt=""></p>
<h2 id="📙--taint와-toleration">📙  taint와 toleration</h2>
<p>✔️taint</p>
<pre><code># kubectl taint node worker1 tier=dev:NoSchedule
# kubectl describe nodes worker1
Taints:             tier=dev:NoSchedule

# vi ingress-deploy.yaml
replicas를 다 2개로 (3개의 디플로이 모두)

[root@master ingress]# kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
foods-deploy-7ffcb8f58-d8b6w    1/1     Running   0          13s   10.244.2.6   worker2   &lt;none&gt;           &lt;none&gt;
foods-deploy-7ffcb8f58-lrpvd    1/1     Running   0          16m   10.244.2.5   worker2   &lt;none&gt;           &lt;none&gt;
home-deploy-688558dc79-48xcs    1/1     Running   0          13s   10.244.2.8   worker2   &lt;none&gt;           &lt;none&gt;
home-deploy-688558dc79-7qhhk    1/1     Running   0          68m   10.244.1.3   worker1   &lt;none&gt;           &lt;none&gt;
sales-deploy-7cdbd9848c-4rqdv   1/1     Running   0          68m   10.244.2.3   worker2   &lt;none&gt;           &lt;none&gt;
sales-deploy-7cdbd9848c-tpdch   1/1     Running   0          13s   10.244.2.7   worker2   &lt;none&gt;           &lt;none&gt;
</code></pre><p>-&gt; worker2에만 생성된 모습</p>
<p>✔️toleration</p>
<pre><code># vi pod-taint.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-taint-metadata
  labels:
    app: pod-taint-labels
spec:
  containers:
  - name: pod-taint-containers
    image: nginx
  tolerations:
  - key: &quot;tier&quot;
    operator: &quot;Equal&quot;
    value: &quot;dev&quot;
    effect: &quot;NoSchedule&quot;
---
apiVersion: v1
kind: Service
metadata:
  name: pod-taint-service
spec:
  type: NodePort
  selector:
    app: pod-taint-labels
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 [root@master ingress]# kubectl apply -f pod-taint.yaml
pod/pod-taint-metadata created
service/pod-taint-service created
[root@master ingress]# kubectl get po -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
foods-deploy-7ffcb8f58-d8b6w    1/1     Running   0          9m45s   10.244.2.6   worker2   &lt;none&gt;           &lt;none&gt;
foods-deploy-7ffcb8f58-lrpvd    1/1     Running   0          26m     10.244.2.5   worker2   &lt;none&gt;           &lt;none&gt;
home-deploy-688558dc79-48xcs    1/1     Running   0          9m45s   10.244.2.8   worker2   &lt;none&gt;           &lt;none&gt;
home-deploy-688558dc79-7qhhk    1/1     Running   0          77m     10.244.1.3   worker1   &lt;none&gt;           &lt;none&gt;
pod-taint-metadata              1/1     Running   0          22s     10.244.1.5   worker1   &lt;none&gt;           &lt;none&gt;
sales-deploy-7cdbd9848c-4rqdv   1/1     Running   0          77m     10.244.2.3   worker2   &lt;none&gt;           &lt;none&gt;
sales-deploy-7cdbd9848c-tpdch   1/1     Running   0          9m45s   10.244.2.7   worker2   &lt;none&gt;           &lt;none&gt;
</code></pre><p>-&gt;worker1에 생성됨</p>
<pre><code>  158  kubectl delete -f pod-taint.yaml
[root@master ingress]# kubectl taint node worker2 tier=dev:NoSchedule
[root@master ingress]# kubectl apply -f pod-taint.yaml
[root@master ingress]# kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE    IP           NODE      NOMINATED NODE   READINESS GATES
foods-deploy-7ffcb8f58-d8b6w    1/1     Running   0          96m    10.244.2.6   worker2   &lt;none&gt;           &lt;none&gt;
foods-deploy-7ffcb8f58-lrpvd    1/1     Running   0          112m   10.244.2.5   worker2   &lt;none&gt;           &lt;none&gt;
home-deploy-688558dc79-48xcs    1/1     Running   0          96m    10.244.2.8   worker2   &lt;none&gt;           &lt;none&gt;
home-deploy-688558dc79-7qhhk    1/1     Running   0          164m   10.244.1.3   worker1   &lt;none&gt;           &lt;none&gt;
pod-taint-metadata              1/1     Running   0          97s    10.244.1.6   worker1   &lt;none&gt;           &lt;none&gt;
sales-deploy-7cdbd9848c-4rqdv   1/1     Running   0          164m   10.244.2.3   worker2   &lt;none&gt;           &lt;none&gt;
sales-deploy-7cdbd9848c-tpdch   1/1     Running   0          96m    10.244.2.7   worker2   &lt;none&gt;           &lt;none&gt;
</code></pre><p>worker2에도 테인드, 1or2중에 생성.
또다시 1에 생성된 모습 (2에 할당된 pod가 많아서 그런듯)</p>
<h2 id="📙-클러스터-업그레이드-1">📙 클러스터 업그레이드 1</h2>
<pre><code>- master 노드
# cd ~
# yum list --showduplicates kubeadm --disableexcludes=kubernetes
# yum install -y kubeadm-1.20.15-0 --disableexcludes=kubernetes
# kubeadm version
# kubeadm upgrade plan
# kubeadm upgrade apply v1.20.15
# yum install -y kubelet-1.20.15-0 kubectl-1.20.15-0 --disableexcludes=kubernetes
# systemctl daemon-reload
# systemctl restart kubelet

- worker 노드
# yum install -y kubeadm-1.20.15-0 --disableexcludes=kubernetes
# kubeadm upgrade node

- master 노드
# kubectl drain worker1 --ignore-daemonsets --force
# kubectl drain worker2 --ignore-daemonsets --force

- worker 노드
# yum install -y kubelet-1.20.15-0 kubectl-1.20.15-0 --disableexcludes=kubernetes
# systemctl daemon-reload
# systemctl restart kubelet

- master 노드
# kubectl uncordon worker1
# kubectl uncordon worker2

[root@master ~]# kubectl get node
NAME      STATUS   ROLES                  AGE     VERSION
master    Ready    control-plane,master   4h10m   v1.20.15
worker1   Ready    &lt;none&gt;                 4h5m    v1.20.15
worker2   Ready    &lt;none&gt;                 4h5m    v1.20.15


-&gt; 버전 바뀐 모습 확인 가능</code></pre><h2 id="📙-클러스터-업그레이드-2">📙 클러스터 업그레이드 2</h2>
<pre><code>- master 노드
# cd ~
# yum list --showduplicates kubeadm --disableexcludes=kubernetes
# yum install -y kubeadm-1.21.14-0 --disableexcludes=kubernetes
# kubeadm version
# kubeadm upgrade plan
# kubeadm upgrade apply v1.21.14
# yum install -y kubelet-1.21.14-0 kubectl-1.21.14-0 --disableexcludes=kubernetes
# systemctl daemon-reload
# systemctl restart kubelet

- worker 노드
# yum install -y kubeadm-1.21.14-0 --disableexcludes=kubernetes
# kubeadm upgrade node

- master 노드
# kubectl drain worker1 --ignore-daemonsets --force
# kubectl drain worker2 --ignore-daemonsets --force

- worker 노드
# yum install -y kubelet-1.21.14-0 kubectl-1.21.14-0 --disableexcludes=kubernetes
# systemctl daemon-reload
# systemctl restart kubelet

- master 노드
# kubectl uncordon worker1
# kubectl uncordon worker2

[root@master ~]# kubectl get node
NAME      STATUS   ROLES                  AGE     VERSION
master    Ready    control-plane,master   4h23m   v1.21.14
worker1   Ready    &lt;none&gt;                 4h18m   v1.21.14
worker2   Ready    &lt;none&gt;                 4h18m   v1.21.14


</code></pre><p>📙 ✔️✏️📢⭐️📌</p>
<h1 id="📌기타">📌기타</h1>
<h3 id="⭐️-프로젝트">⭐️ 프로젝트</h3>
<p><a href="https://saramin.github.io/2020-05-01-k8s-cicd/">https://saramin.github.io/2020-05-01-k8s-cicd/</a></p>
<h3 id="⭐️-뭔가-설치하다가-잘못됐거나-안됐을-때-리셋하는-명령어">⭐️ 뭔가 설치하다가 잘못됐거나 안됐을 때 리셋하는 명령어</h3>
<p><code>kubeadm reset</code></p>
<h3 id="⭐️-kebeadm-init-에러">⭐️ kebeadm init 에러</h3>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/65972a8c-8b4f-498a-93ae-bf6ce7cd64bb/image.png" alt=""></p>
<p>systemctl enable --now docker 다시 해주기.</p>
<h3 id="⭐️-yaml파일-s3에-넣어두고-apply-가능">⭐️ yaml파일 s3에 넣어두고 apply 가능.</h3>
<pre><code># kubectl apply -f  s3주소</code></pre><h3 id="⭐️-dockerhub에서-이미지-가져온-경우-경로-문제때문에-웹화면-안나올-수-있음">⭐️ dockerhub에서 이미지 가져온 경우 경로 문제때문에 웹화면 안나올 수 있음</h3>
<p>-&gt; 이미지 이름 자체를 foods 하면 문제가 발생하지 않을 것.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0729[CI/CD;gtilab,jenkins,tomcat]]]></title>
            <link>https://velog.io/@mng_jn/0729</link>
            <guid>https://velog.io/@mng_jn/0729</guid>
            <pubDate>Fri, 29 Jul 2022 01:52:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/mng_jn/post/a46cd688-f7ec-4b8d-8058-9e1481b9f604/image.png" alt=""></p>
<h1 id="📌gitlab">📌Gitlab</h1>
<h2 id="📙-인스턴스-재시작">📙 인스턴스 재시작</h2>
<p>어제 중단해두었던 GCP서버(gitlab)시작 후 IP확인 -&gt; 확인 결과 바뀌지 않음 그대로 진행. 
-&gt; 도메인으로 gitlab 진입하기</p>
<h2 id="📙-new마이그레이션-방법---git-hub-git-lab">📙 (NEW)마이그레이션 방법 - git hub-&gt;git lab</h2>
<p><strong>root아닌 사용자계정에서 진행 
git hub repository - gitbash (win) - git lab</strong></p>
<p>✔️ 메뉴 - create new project -create blank project</p>
<p>✔️ 프로젝트 이름 : dev-site
Visibility Level : public
create project</p>
<p>✔️ git bash 열어서 아래 명령어 진행</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ mkdir git-migration

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ git clone --mirror https://github.com/mangjini/hello-world.git git-migration


</code></pre><p>미러 명령어로 인해 폴더에도 내용이 들어온 모습 확인 가능.</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd git-migration/

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-migration (BARE:master)
$ ls
HEAD  config  description  hooks/  info/  objects/  packed-refs  refs/
</code></pre><p>✔️ git lab에서 master브랜치 추가
<img src="https://velog.velcdn.com/images/mng_jn/post/11dad905-e7d2-4a88-995e-72aaf88e10dd/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/e5fffc89-268d-419d-9bfa-c4264ae301c3/image.png" alt=""></p>
<p>✔️branch protect 해제 
git lab 프로젝트 설정 - repository setting - Protected branches expand - main Unprotect </p>
<p>✔️다시 git hub에서 아래 명령어 진행. </p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/git-migration (BARE:master)
$ git push -uf http://gitlab.lovemj.shop/mangji/dev-site --all
</code></pre><p>git lab에서 마이그레이션 확인 </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/3841d8a7-7e63-4a3a-815d-fba8f213b8f1/image.png" alt=""></p>
<h1 id="📌-jenkins">📌 jenkins</h1>
<h2 id="📙-jenkins-서버-생성">📙 jenkins 서버 생성</h2>
<p>이름 : jenkins-server
키페어 : 생성해둔 키페어
VPC:MY-VPC
서브넷 : PUBLIC-2A
보안그룹 : 기존보안그룹 ; DEV-SG 
고급세부정보; 사용자데이터</p>
<pre><code>#!/bin/bash
timedatectl set-timezone Asia/Seoul</code></pre><p>나머지 default, 인스턴스 시작.</p>
<h2 id="📙-생성한-인스턴스의-퍼블릭-ip에-도메인-할당route53">📙 생성한 인스턴스의 퍼블릭 IP에 도메인 할당(route53)</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/9f2574ca-d7db-4a9f-9c8a-845b619fcac8/image.png" alt=""></p>
<h2 id="📙-서버에-jenkins-설치">📙 서버에 jenkins 설치</h2>
<p><strong>mobaxterm으로 CLI환경 진입</strong>
✔️ 아래 설치 명령어 진행 </p>
<pre><code>$ sudo su -
# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo ## 저장소 가져오기
# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key ## 저장소 검증을 위한 키 가져오기 
# yum install -y fontconfig java-11-openjdk
# amazon-linux-extras install -y java-openjdk11
# yum install -y jenkins
# systemctl enable --now jenkins
# hostnamectl set-hostname jenkins-server
# exit
# sudo su -
# yum install -y git
# cat /var/lib/jenkins/secrets/initialAdminPassword ## 패스워드 수정하기위한 임시패스워드 확인
</code></pre><h2 id="📙-웹브라우저에서-jenkins-설정">📙 웹브라우저에서 Jenkins 설정</h2>
<p>✔️ 웹브라우저로 jenkins 접속 - http://도메인:8080 ; unlock Jenkins(임시 패스워드 입력)
<img src="https://velog.velcdn.com/images/mng_jn/post/4491a153-5b4b-45f3-b8e1-16a1b114bcc0/image.png" alt=""></p>
<p>✔️ getting started 오른쪽 상단 X  , start using jenkins</p>
<p>✔️ 비밀번호 변경 , timezone 설정하기
admin- 설정 - 패스워드 입력 - 맨 하단 Timezone: Asia/Seoul - Apply , Save - ID:admin, 재설정한 패스워드로 로그인</p>
<h2 id="📙-build연습-1">📙 build연습 1</h2>
<p>✔️ 왼쪽메뉴에서 새로운 ITEM -name: HelloWorldJob-Freestyle project- ok - 설명 : 안녕하세요 - build 드랍다운 - excute shell ; command : </p>
<pre><code>echo &quot;Hello world&quot;
uptime
ip a</code></pre><ul>
<li>apply , 저장</li>
</ul>
<p>✔️ 왼쪽메뉴 지금 빌드 클릭 - build history - #1 클릭 - console output
<img src="https://velog.velcdn.com/images/mng_jn/post/1dca3f7d-3180-4823-826d-82125c645977/image.png" alt=""></p>
<h1 id="📌-jenkins와-gitlab-연동">📌 jenkins와 gitlab 연동</h1>
<h2 id="📙-jenkins-플러그인-설치">📙 jenkins 플러그인 설치</h2>
<p>✔️ jenkins - 대시보드 - jenkins 관리 - 플러그인 관리 - 설치가능 탭 클릭 -gitlab 검색 - Gitlab 체크하고 install without restart</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/4f05aa25-3b0c-484b-aa51-2812326e4cbc/image.png" alt=""></p>
<p>✔️  jenkins 관리 - Global Tool Configuration - Git - Name : Git -Path to Git executable : git - Apply, Save</p>
<h2 id="📙-빌드">📙 빌드</h2>
<p>✔️ 왼쪽메뉴에서 새로운 ITEM -name: PullCodeFromGitLab-Freestyle project- ok - 설명 : GitLab에서 코드 가져오기</p>
<p>✔️ 소스코드 관리 : Git 선택 - Repository URL : 
<img src="https://velog.velcdn.com/images/mng_jn/post/7f9ca605-db22-4242-9613-704e268318e7/image.png" alt=""></p>
<p> ✔️ apply , 저장 - 지금 빌드 - #1 클릭 - CONSOL OUTPUT- </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/632df2a4-b8df-4aae-bb2f-99fc8ca4fada/image.png" alt="">
이 경로로 잘 연동 되었는지 확인</p>
<pre><code>[root@jenkins-server ~]# ll /var/lib/jenkins/workspace/PullCodeFromGitLab
total 28
-rw-r--r-- 1 jenkins jenkins  130 Jul 29 10:49 Dockerfile
-rw-r--r-- 1 jenkins jenkins 5970 Jul 29 10:49 pom.xml
-rw-r--r-- 1 jenkins jenkins    1 Jul 29 10:49 README.md
-rw-r--r-- 1 jenkins jenkins  479 Jul 29 10:49 regapp-deploy.yml
-rw-r--r-- 1 jenkins jenkins  195 Jul 29 10:49 regapp-service.yml
drwxr-xr-x 3 jenkins jenkins   32 Jul 29 10:49 server
-rw-r--r-- 1 jenkins jenkins    6 Jul 29 10:49 test.tml
drwxr-xr-x 3 jenkins jenkins   32 Jul 29 10:49 webapp
</code></pre><h1 id="📌-jenkins와-maven-연동">📌 jenkins와 maven 연동</h1>
<p><strong>jenkins,maven,gitlab</strong></p>
<h2 id="📙-maven-설치-jenkins-ec2">📙 maven 설치 (jenkins EC2)</h2>
<p>✔️mobaxterm에서 아래 명령어 진행</p>
<pre><code># cd /opt
# wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
# tar -xvzf apache-maven-3.8.6-bin.tar.gz
# mv apache-maven-3.8.6 maven
# cd maven
# cd bin
# ls
# cd ~
# find / -name java-11* ## java 경로 확인
# vi .bash_profile
M2_HOME=/opt/maven
M2=/opt/maven/bin
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-1.amzn2.0.3.x86_64
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:$JAVA_HOME:$M2_HOME:$M2

# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# source .bash_profile ## bash_profile 수정사항적용

# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-1.amzn2.0.3.x86_64:/opt/maven:/opt/maven/bin

# mvn -v</code></pre><h2 id="📙-jenkins와-maven연결">📙 jenkins와 maven연결</h2>
<p>✔️ jenkins GUI에서 플러그인 설치
dashboard - jenkins 관리 - 플러그인 관리 - 설치 가능 - maven 검색 - maven integration 체크 - install without restart </p>
<p>✔️ dashboard - jenkins 관리 - global tool configuration - JDK(JAVA development kit) - Add JDK -Name : java-11 - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-11.0.13.0.8-1.amzn2.0.3.x86_64 - 하단으로 내려서 Maven - Add Maven - Name : maven-3.8.6 - install automatically 체크 해제 (이미 customize로 설치하였음) - MAVEN_HOME : /opt/maven - apply, save</p>
<h2 id="📙-빌드-1">📙 빌드</h2>
<p>✔️ 왼쪽메뉴에서 새로운 ITEM -name: FirstMavenProject-Maven project- ok - 설명 : 첫번째 메이븐 프로젝트 - 소스코드 관리 : Git - URL: <a href="http://gitlab.lovemj.shop/mangji/dev-site.git">http://gitlab.lovemj.shop/mangji/dev-site.git</a> (gitlab URL) [gitlab repository를 퍼블릭으로 만들었기 때문에 크리덴셜 필요 없음] - Build ; Goals and options : clean install [기존 것이 있으면 삭제하고 설치하겠다.] - apply, 저장</p>
<p>✔️ 지금 빌드 - #1 - 확인</p>
<p>✔️  대시보드 - FirstMavenProject 화면 - 작업공간
-&gt;제대로 연동되었는지 확인 가능 
<img src="https://velog.velcdn.com/images/mng_jn/post/55907fcd-347b-40a1-b8a0-84d6feb24a6a/image.png" alt=""></p>
<p>어제 넣어둔 부트스트랩 파일들 확인 가능 .
<img src="https://velog.velcdn.com/images/mng_jn/post/d05dd6aa-0b3b-499b-b823-4d0712b1acfc/image.png" alt=""></p>
<h1 id="📌-tomcat">📌 Tomcat</h1>
<h2 id="📙-tomcat-ec2-생성">📙 tomcat EC2 생성</h2>
<p>이름 : tomcat-server
키페어 : 생성해둔 키페어
VPC:MY-VPC
서브넷 : PUBLIC-2C
보안그룹 : 기존보안그룹 ; DEV-SG 
고급세부정보; 사용자데이터</p>
<pre><code>#!/bin/bash
timedatectl set-timezone Asia/Seoul</code></pre><p>나머지 default, 인스턴스 시작.</p>
<h2 id="📙-생성한-인스턴스의-퍼블릭-ip에-도메인-할당route53-1">📙 생성한 인스턴스의 퍼블릭 IP에 도메인 할당(route53)</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/56e989f3-2adf-44ae-bfcc-a2bc758d7cf8/image.png" alt=""></p>
<h2 id="📙-서버에-tomcat-설치">📙 서버에 tomcat 설치</h2>
<p><strong>mobaxterm으로 CLI환경 진입</strong></p>
<pre><code>$ sudo su -
# hostnamectl set-hostname tomcat-server
# exit
$ sudo su -
# amazon-linux-extras install -y java-openjdk11
# cd /opt
</code></pre><p>google에서 tomcat 9 download 검색해서 버전정보 확인하기 
<img src="https://velog.velcdn.com/images/mng_jn/post/3a6f6aea-a2f0-4df6-b65b-c56cdab77c10/image.png" alt="">
tar.gz 우클릭 , 링크주소 복사</p>
<pre><code># wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz
# tar -xvzf apache-tomcat-9.0.65.tar.gz
# mv apache-tomcat-9.0.65 tomcat
# cd tomcat/bin/
# ./startup.sh</code></pre><p>start확인</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/a276e099-028d-4e23-a0ac-f4ab9bdc48ec/image.png" alt=""></p>
<h2 id="📙-manager-app-탭-접근제어-해제하기">📙 manager app 탭 접근제어 해제하기</h2>
<p>처음상태
<img src="https://velog.velcdn.com/images/mng_jn/post/6f64201a-7db2-4c84-8903-742c9f84f7d1/image.png" alt=""></p>
<pre><code># cd /opt/tomcat
# find / -name context.xml
# vi /opt/tomcat/webapps/host-manager/META-INF/context.xml ##접근제어 주석처리 해주기
&lt;!--  &lt;Valve className=&quot;org.apache.catalina.valves.RemoteAddrValve&quot;
         allow=&quot;127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1&quot; /&gt; --&gt;

# vi /opt/tomcat/webapps/manager/META-INF/context.xml ## 접근제어 주석처리 해주기
&lt;!--  &lt;Valve className=&quot;org.apache.catalina.valves.RemoteAddrValve&quot;
         allow=&quot;127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1&quot; /&gt; --&gt;
</code></pre><p>접근제어 해제 완료
<img src="https://velog.velcdn.com/images/mng_jn/post/c0e3331f-b9d3-4820-bbec-027316687d50/image.png" alt=""></p>
<p>아래명령어는 해줘도 되지만 안해줘도 접근제어 해제 됨.</p>
<pre><code># cd bin/
# ./shutdown.sh
# ./startup.sh</code></pre><h2 id="📙-role-username-설정">📙 role, username 설정</h2>
<pre><code># /opt/tomcat/conf
# vi /opt/tomcat/conf/tomcat-users.xml
&lt;role rolename=&quot;manager-gui&quot;/&gt;
&lt;role rolename=&quot;manager-script&quot;/&gt;
&lt;role rolename=&quot;manager-jmx&quot;/&gt;
&lt;role rolename=&quot;manager-status&quot;/&gt;
&lt;user username=&quot;admin&quot; password=&quot;kosa0401&quot; roles=&quot;manager-gui, manager-script, manager-jmx, manager-status&quot;/&gt;
&lt;user username=&quot;deployer&quot; password=&quot;kosa0401&quot; roles=&quot;manager-script&quot;/&gt;
&lt;user username=&quot;tomcat&quot; password=&quot;kosa0401&quot; roles=&quot;manager-gui&quot;/&gt;</code></pre><p>아래와 같이 하단에 붙여줌. 
<img src="https://velog.velcdn.com/images/mng_jn/post/f104ac3b-c92e-4811-8206-bce0b33714a1/image.png" alt="">
저장하고 나오면 , 
아래 사용자 이름에 admin으로 로그인 가능해짐.
<img src="https://velog.velcdn.com/images/mng_jn/post/c0e3331f-b9d3-4820-bbec-027316687d50/image.png" alt=""></p>
<h2 id="📙-start-shutdown-간소화">📙 start, shutdown 간소화</h2>
<pre><code># ln -s /opt/tomcat/bin/startup.sh /usr/local/bin/tomcatup
# ln -s /opt/tomcat/bin/shutdown.sh /usr/local/bin/tomcatdown</code></pre><p><code># tomcatdown</code></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/1dd7da05-8aac-43a5-958b-7762020fbcc7/image.png" alt=""></p>
<p><code># tomcatup</code>
<img src="https://velog.velcdn.com/images/mng_jn/post/63dcb4cb-e629-4862-a89c-b33542fd5350/image.png" alt=""></p>
<h1 id="📌-jenkins-tomcat-maven-gitlab">📌 Jenkins, Tomcat, Maven, GitLab</h1>
<h2 id="📙-jenkins---tomcat-셋팅">📙 Jenkins - tomcat 셋팅</h2>
<p>✔️ jenkins - 대시보드 - jenkins 관리 - 플러그인 관리 - 설치가능 탭 클릭 - deploy to container 검색 - deploy to container 체크하고 install without restart</p>
<p>✔️ jenkins - 대시보드 - jenkins 관리 - Manage Credentials - Store ; Jenkins 클릭 - Global credentials 클릭
<img src="https://velog.velcdn.com/images/mng_jn/post/cd1f525e-5cb0-417e-b1d2-18bcb14a7f83/image.png" alt="">
Add credentials 클릭
<img src="https://velog.velcdn.com/images/mng_jn/post/14be8dda-01b7-451c-8204-f299a4c84c17/image.png" alt=""></p>
<p>username: deployer , password 입력 , ID: tomcat_deployer - create</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/0bb9e935-69cf-4010-a7a6-bf47e9326256/image.png" alt=""></p>
<h2 id="📙-빌드-2">📙 빌드</h2>
<p>✔️ 대시보드 - 왼쪽메뉴에서 새로운 ITEM -name: BuildAndDeployjob- maven project- ok 
✔️설명 : 메이븐으로 코드를 빌드하고 톰캣서버로 배포하자 
✔️소스코드 관리 : Git 
-URL: <a href="http://gitlab.lovemj.shop/mangji/dev-site.git">http://gitlab.lovemj.shop/mangji/dev-site.git</a>
✔️Build ; Goals and options : clean install
✔️빌드 후 조치 : Deploy war/ear to a container
WAR/EAR files : <code>**/*.war</code>
Add Container 드랍다운 - tomcat 9.x remote - Credential 드랍다운 - deployer/**** - Tomcat URL : <a href="http://tomcat.lovemj.shop:8080/">http://tomcat.lovemj.shop:8080/</a>
<img src="https://velog.velcdn.com/images/mng_jn/post/472ef771-7196-40d0-a78f-c5019802c973/image.png" alt="">
-apply, 저장</p>
<p>✔️ 지금 빌드 - #1</p>
<p>✔️ 톰캣 manager app에서 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/ea68d1b2-5c8b-4453-8ebc-e07b1a3c7ca8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/570405d9-2c5d-4141-b710-7f8eda492cd8/image.png" alt=""></p>
<h2 id="📙-gitbash-소스코드-고쳐보기">📙 gitbash-소스코드 고쳐보기</h2>
<p>✔️ git bash에 git lab리포지토리(branch-master) 내용물 가져오기</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ git clone -b master http://gitlab.lovemj.shop/mangji/dev-site.git
Cloning into &#39;dev-site&#39;...
remote: Enumerating objects: 568, done.
remote: Total 568 (delta 0), reused 0 (delta 0), pack-reused 568
Receiving objects: 100% (568/568), 800.63 KiB | 27.61 MiB/s, done.
Resolving deltas: 100% (157/157), done.

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd dev-site/webapp/src/main/webapp/

r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ ls
WEB-INF/  css/     images/    index.jsp.bak  js/
assets/   gcp.tar  index.jsp  index.jsp.old  test.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ vi index.jsp</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/58010fd6-c8c2-4164-94eb-783b173113b5/image.png" alt=""></p>
<h2 id="📙-업데이트">📙 업데이트</h2>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ git add index.jsp

r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ git commit -m &quot;mangji&quot;
[master cf6f83e] mangji
 1 file changed, 1 insertion(+), 1 deletion(-)

r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ git push -uf origin master
</code></pre><h2 id="📙-jenkins-수정한-내용-빌드">📙 jenkins-수정한 내용 빌드</h2>
<p>대시보드 - BuildAndDeployjob - 지금 빌드</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/65daa56d-f6e8-4392-8d93-1a7b1f90f5bd/image.png" alt=""></p>
<h2 id="📙-자동으로-빌드">📙 자동으로 빌드</h2>
<p>대시보드 - BuildAndDeployjob  - 구성 - 빌드 유발 - poll SCM 체크 - Schedule : <code>* * * * *</code> - apply -저장 </p>
<p>✔️ 자동 빌드 확인하기 위해 또 내용 수정하기
<img src="https://velog.velcdn.com/images/mng_jn/post/f2d81e8d-954b-4600-991c-92287ebf8f21/image.png" alt=""></p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ git add index.jsp

r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ git commit -m &quot;new&quot;


r2com@DESKTOP-DD3FU43 MINGW64 ~/dev-site/webapp/src/main/webapp (master)
$ git push -uf origin master
</code></pre><p>자동 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/1906ff31-be3e-4cca-ac63-a603226f9a09/image.png" alt=""></p>
<p>변경 내용 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/0047eb61-6536-49ae-83f8-547090107390/image.png" alt=""></p>
<h1 id="📌-쿠버네티스">📌 쿠버네티스</h1>
<h2 id="📙-vm-virtualbox--centos7">📙 VM virtualbox- centos7</h2>
<p>✔️파일 - 가상시스템 가져오기 - centos7.ova - CPU: 2, RAM 4G, -DVD,USB 해제 - 가져오기
✔️ 해당 서버 선택 - 설정 - 네트워크 - NAT네트워크 -  어댑터1 : NATNetWor이름: NatNetwork (다같이 강의실 환경이라 브릿지 이용X 혼자하거나 프로젝트할 때 브릿지 사용하자) - 어댑태2: 호스트 전용 어댑터
-시작</p>
<p>IP : 192.168.56.106</p>
<pre><code># curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
# sed -i -e &quot;s/enabled=1/enabled=0/g&quot; /etc/yum.repos.d/docker-ce.repo
# yum --enablerepo=docker-ce-stable -y install docker-ce-19.03.15-3.el7
# mkdir /etc/docker
# cat &lt;&lt;EOF | sudo tee /etc/docker/daemon.json
{
  &quot;exec-opts&quot;: [&quot;native.cgroupdriver=systemd&quot;],
  &quot;log-driver&quot;: &quot;json-file&quot;,
  &quot;log-opts&quot;: {
    &quot;max-size&quot;: &quot;100m&quot;
  },
  &quot;storage-driver&quot;: &quot;overlay2&quot;
}
EOF
# systemctl enable --now docker
# systemctl daemon-reload
# systemctl restart docker
# systemctl disable --now firewalld
# setenforce 0
# sed -i &#39;s/^SELINUX=enforcing$/SELINUX=disabled/&#39; /etc/selinux/config

# swapoff -a
# sed -i &#39;/ swap / s/^/#/&#39; /etc/fstab

# cat &lt;&lt;EOF &gt; /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# sysctl --system
# reboot

# cat &lt;&lt;&#39;EOF&#39; &gt; /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

# yum -y install kubeadm-1.19.16-0 kubelet-1.19.16-0 kubectl-1.19.16-0 --disableexcludes=kubernetes
# systemctl enable kubelet
</code></pre><p>📙 ✔️✏️📢⭐️📌</p>
<h1 id="🎸-기타">🎸 기타</h1>
<h3 id="⭐️-포트번호-확인-명령어">⭐️ 포트번호 확인 명령어</h3>
<p><code># ss -ant</code></p>
<h3 id="⭐️--git-특정-브랜치-clone">⭐️  git 특정 브랜치 clone</h3>
<pre><code>git clone -b master http://gitlab.lovemj.shop/mangji/dev-site.git</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[0728[tomcat,jenkins,gitlab,gitbash,github]]]></title>
            <link>https://velog.io/@mng_jn/0728</link>
            <guid>https://velog.io/@mng_jn/0728</guid>
            <pubDate>Thu, 28 Jul 2022 04:46:18 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-톰캣젠킨스-인스턴스-재시작">📌 톰캣,젠킨스 인스턴스 재시작</h1>
<p>-&gt; 어제 한 것 이어서 진행
중지해두었던 인스턴스 시작, 퍼블릭 iP바뀌었으므로 route53으로 가서 값 바꿔주기.
tomcat 새시작시 자동실행 설정 안되어있으므로 CLI환경으로 접속해서 서비스 올려주기.</p>
<pre><code>[ec2-user@tomcat-server ~]$ sudo su -
Last login: Wed Jul 27 12:24:59 KST 2022 on pts/0
[root@tomcat-server ~]# tomcatup
</code></pre><h1 id="📌-jenkins">📌 jenkins</h1>
<h2 id="📙-build">📙 build</h2>
<p>✔️ 젠킨스 진입 -  BuildAndDeployjob 클릭
<img src="https://velog.velcdn.com/images/mng_jn/post/4118ba58-624a-4b13-8879-f1f504ca5f1e/image.png" alt="">
✔️ 지금 빌드 클릭 
<img src="https://velog.velcdn.com/images/mng_jn/post/89285368-2278-43ee-8fb6-0c00ad0533f2/image.png" alt=""></p>
<h2 id="📙-tomcat-확인">📙 tomcat 확인</h2>
<p>✔️ tomcat- manager App - webapp/클릭</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/384fb531-639f-458f-be5b-18347eeb1a70/image.png" alt=""></p>
<p>✔️ war파일로 구성된 java  웹사이트 확인 가능.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/431d2fe2-d836-4038-b42d-09fc9e3dfde2/image.png" alt=""></p>
<p>✔️ CLI에서 확인하기</p>
<pre><code>[root@tomcat-server webapp]# find / -name webapp
/opt/tomcat/webapps/webapp
/opt/tomcat/webapps/webapp/META-INF/maven/com.example.maven-project/webapp
/opt/tomcat/work/Catalina/localhost/webapp

[root@tomcat-server webapps]# cd /opt/tomcat/webapps/webapp/

[root@tomcat-server webapp]# ll
total 12
drwxr-x--- 2 root root  28 Jul 28 09:29 images
-rw-r----- 1 root root 759 Jul 28 09:28 index.jsp
-rw-r----- 1 root root 860 Jul 28 09:28 index.jsp.old
drwxr-x--- 3 root root  57 Jul 28 09:29 META-INF
-rw-r----- 1 root root  12 Jul 28 09:28 test.txt
drwxr-x--- 3 root root  36 Jul 28 09:29 WEB-INF
[root@tomcat-server webapp]# cat index.jsp
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset=&quot;utf-8&quot;&gt;
  &lt;title&gt;Sample Deployment&lt;/title&gt;
</code></pre><h1 id="📌-소스코드-업데이트-됐을-때-자동으로-반영되게-하기">📌 소스코드 업데이트 됐을 때 자동으로 반영되게 하기</h1>
<h2 id="📙-github-리포지토리-본인-것으로-바꾸기">📙 github 리포지토리 본인 것으로 바꾸기.</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/244eea43-c20a-4a56-95bc-8628c13e94a8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/046f945d-da5f-48d7-9f5d-b14888f7e63e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/190b6a15-37c0-44c5-b75c-6864a85b7baa/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2e0d7f66-a3f0-4efe-97d8-687013348010/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/8be81b6d-9ae8-44e7-8c48-5d285fcd3664/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/abe44868-820a-4e43-9832-5c93eb34f710/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/ed22812b-2102-4222-965b-d37083d060ac/image.png" alt=""></p>
<h2 id="📙-git-bash에서-소스코드-업데이트">📙 git bash에서 소스코드 업데이트</h2>
<p>(win환경의 사용자)</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ git clone https://github.com/mangjini/hello-world.git


r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd hello-world

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world (master)
$ ls
Dockerfile  pom.xml            regapp-service.yml  test.tml
README.md   regapp-deploy.yml  server/             webapp/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world (master)
$ cd webapp/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp (master)
$ ls
pom.xml  src/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp (master)
$ cd src

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src (master)
$ cd main/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main (master)
$ ls
webapp/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main (master)
$ cd webapp/

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ ls
WEB-INF/  images/  index.jsp  index.jsp.old  test.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ pwd
/c/Users/r2com/hello-world/webapp/src/main/webapp

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ vi index.jsp

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/3d43f318-dace-4bfe-8df3-b25e69f215ab/image.png" alt="">
v2.0으로 수정</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git add index.jsp

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git commit -m &quot;update v2.0&quot;
[master f93f74e] update v2.0
 1 file changed, 1 insertion(+), 1 deletion(-)

 r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git push origin master

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/06050227-11a1-4c9b-983b-b0298e8dd3e7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/62dd9e18-2f0c-4e52-bb09-bb2d194bcc4c/image.png" alt=""></p>
<h2 id="📙-build-자동으로-되게-하기-지금-빌드-누르지-않고도-업데이트-되도록">📙 build 자동으로 되게 하기 (지금 빌드 누르지 않고도 업데이트 되도록)</h2>
<p>프로젝트 - 구성 - 빌드 유발 </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/bf936585-9c7d-4de1-a1a3-acf961f5d2f7/image.png" alt="">
poll SCM 체크 , schedule에 <code>* * * * *</code> 넣어주기. ; 1분단위(가장 작은 간격)로 깃허브에 있는 커밋 부분에 어떤 변화가 있는지 확인. 
-&gt; apply, save</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ vi index.jsp
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/f9dc7c71-a557-4bb0-918b-caf5f7ca45a5/image.png" alt=""></p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git add index.jsp

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git commit -m &quot;update 3.0&quot;
[master cd3db2c] update 3.0
 1 file changed, 1 insertion(+), 1 deletion(-)

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git push origin master
</code></pre><p>자동으로 빌드되는 모습
<img src="https://velog.velcdn.com/images/mng_jn/post/012e195a-2533-405b-9138-f854c7c92d79/image.png" alt=""></p>
<p>웹페이지 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/b43bfb17-4761-4fcf-8e6a-521697a2504e/image.png" alt=""></p>
<h1 id="📌-웹페이지-꾸미기">📌 웹페이지 꾸미기</h1>
<p>✔️ 경로 확인</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ pwd
/c/Users/r2com/hello-world/webapp/src/main/webapp
</code></pre><p>✔️ 해당 경로에 웹페이지 tar파일 (부트스트랩 ) 넣기</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/daee2822-0ab2-4cdd-8ae2-ffe57b5843c1/image.png" alt=""></p>
<p>✔️ tar 파일 압축 해제하고 index.html을 index.jsp로 바꿔주기</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ ls
WEB-INF/  gcp.tar  images/  index.jsp  index.jsp.old  test.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ tar -xvf gcp.tar

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ ls
WEB-INF/  css/     images/     index.jsp      js/
assets/   gcp.tar  index.html  index.jsp.old  test.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ mv index.jsp index.jsp.bak

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ mv index.html index.jsp
</code></pre><pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git add .

r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git commit -m &quot;tar&quot;


r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git push origin master
</code></pre><p>✔️ 자동으로 빌드 완료</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/de315d70-4c6f-4062-96db-a27892258861/image.png" alt=""></p>
<p>✔️ 바뀐 화면 모습</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/7e2607fd-85b4-44ec-b0fe-2180564ec00d/image.png" alt=""></p>
<h1 id="📌-ec2tomcat-server에-gitlab">📌 EC2(tomcat server)에 gitlab</h1>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/92ee9816-1b9e-4df2-a8de-4b7ca80be346/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/19268ebe-4495-4204-9100-ccd93bd311d1/image.png" alt=""></p>
<pre><code>[root@tomcat-server ~]# sudo yum install -y curl policycoreutils-python openssh-server openssh-clients perl

[root@tomcat-server ~]# sudo yum install postfix

[root@tomcat-server ~]# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

[root@tomcat-server ~]# sudo sed -i &quot;s/\/el\/7/\/amazon\/2/g&quot; /etc/yum.repos.d/gitlab_gitlab*.repo

[root@tomcat-server ~]# sudo yum clean metadata

[root@tomcat-server ~]# sudo yum makecache

[root@tomcat-server ~]# sudo EXTERNAL_URL=&quot;http://tomcat.lovemj.shop&quot; yum install -y gitlab-ce

</code></pre><p>-&gt; 너무 무거워서 설치 중단됨. GCP에서 진행.</p>
<h1 id="📌-gcp-인스턴스에-gitlab">📌 GCP 인스턴스에 gitlab</h1>
<h2 id="📙-인스턴스-생성">📙 인스턴스 생성</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/de5c0e15-4ac8-4e8d-b7f2-b0971141a40a/image.png" alt=""></p>
<p>인스턴스 만들기 -
이름 : gitlab
리전 : 서울
가용영역 : a
머신구성 시리즈 : E2
머신 유형 : 커스텀 ; 코어 4C , 메모리 8GB
부팅디스크 
Debian GNU/Linux 11 (bullseye) 그대로 두고
변경 눌러서 크기 32GB로 해주기.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/ff203f9b-3c55-4336-b1c8-c22cb6ebfeee/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/1572a7b2-850d-4385-8323-08d598efe20c/image.png" alt=""></p>
<p>window cmd 창 진입해서</p>
<pre><code>C:\Users\r2com&gt;ssh-keygen -t rsa</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/5f2a5f1f-b9ce-423a-bac3-a684e6ff84ae/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/99d632a2-2500-4d5b-b857-b72f2a2dcc90/image.png" alt=""></p>
<p>id_rsa.pub 메모장으로 열어서 안에 내용물을 &#39;SSH키 1&#39;에 붙여넣기.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e7ac4216-bf4b-4691-8591-892d9d07eecd/image.png" alt=""></p>
<p>만들기 클릭</p>
<p>생성후 퍼블릭 IP 복사해서 aws route53진입하여 도메인 생성해주기 (레코드 생성)</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/06d59578-6ce2-486d-8a68-3b4146f94862/image.png" alt=""></p>
<p>mobaxterm 진입 - 도메인 사용 , id_rsa.pem키 이용.</p>
<h2 id="📙-데비앙서버에-gitlab설치">📙 데비앙서버에 gitlab설치</h2>
<p><a href="https://about.gitlab.com/install/#debian">https://about.gitlab.com/install/#debian</a></p>
<pre><code>
r2com@gitlab2:~$ sudo apt-get update
r2com@gitlab2:~$ sudo apt-get install -y curl openssh-server ca-certificates perl
r2com@gitlab2:~$ sudo apt-get install -y postfix</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/4985c24d-e036-401c-9dc1-241d84d5845a/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/93417591-f02f-40f9-b847-c079f2bbca83/image.png" alt=""></p>
<pre><code>r2com@gitlab2:~$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

r2com@gitlab2:~$ sudo EXTERNAL_URL=&quot;http://gitlab.lovemj.shop&quot; apt-get install gitlab-ce

r2com@gitlab2:~$ sudo timedatectl set-timezone Asia/Seoul

</code></pre><p>설치 완료</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/05e93869-78aa-4a22-adc3-fcfad2cc8640/image.png" alt=""></p>
<h2 id="📙-gui환경에서-기초셋팅">📙 GUI환경에서 기초셋팅</h2>
<blockquote>
<p>참조 ; <a href="https://velog.io/@mng_jn/0726#-git-lab">https://velog.io/@mng_jn/0726#-git-lab</a></p>
</blockquote>
<pre><code>
r2com@gitlab2:~$ sudo cat /etc/gitlab/initial_root_password
</code></pre><p>위 cat을 통한 비밀번호로 로그인 
<img src="https://velog.velcdn.com/images/mng_jn/post/306bf5ec-344a-4d9a-9f3e-c9c3e904d69a/image.png" alt=""></p>
<p>패스워드 변경 
<img src="https://velog.velcdn.com/images/mng_jn/post/a2a3030e-e9c7-4ccc-831d-bbb6318faad3/image.png" alt=""></p>
<p>로그아웃하고 새로운 사용자 생성</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/00243241-8271-4e52-874c-84cea80b899f/image.png" alt=""></p>
<p>다시 root로 로그인하여 사용자 apporve ;
<a href="https://velog.io/@mng_jn/0726#-git-lab">https://velog.io/@mng_jn/0726#-git-lab</a></p>
<p>root 로그아웃하여 사용자로 로그인하고 진행.</p>
<h2 id="📙-프로젝트-생성">📙 프로젝트 생성</h2>
<p>create project - create blank project</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/09924323-b481-466e-9c86-2374cc6bc866/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/0a3b0539-2a40-4dc3-98f9-8a4e67a5fb1c/image.png" alt=""></p>
<p>project name : web-site - visibility level ;public- create project</p>
<h2 id="📙-새로운-브런치-생성">📙 새로운 브런치 생성</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/353834ad-d97d-472e-8a1a-8ac40dcd8c95/image.png" alt=""></p>
<p>branch name: master
create from:main
create branch 클릭
<img src="https://velog.velcdn.com/images/mng_jn/post/00e60ab0-97e4-4a8a-addc-c48d167eb194/image.png" alt=""></p>
<p>master 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/44962c83-a628-4719-85cf-d182384ec09a/image.png" alt=""></p>
<h2 id="📙-gitbash로-gitlab이용하기">📙 gitbash로 gitlab이용하기</h2>
<p>✔️원래 연결해둔 github와 연결 해제</p>
<pre><code>
r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git remote remove origin
</code></pre><p>✔️gitlab과 연결
<img src="https://velog.velcdn.com/images/mng_jn/post/92b3891b-e992-42c0-89d7-40533e47de75/image.png" alt=""></p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git remote add origin http://gitlab.lovemj.shop/mangji/web-site.git</code></pre><p>✔️ push</p>
<p>프로젝트(web-site) 화면 - 왼쪽 메뉴 -settings - repository - default branch expand - master로 선택 - save changes
<img src="https://velog.velcdn.com/images/mng_jn/post/74b2fd80-190e-435c-955d-8c143bc5f4e8/image.png" alt=""></p>
<p>procected branches - expand - main branch unprotect</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/6ec488f0-ed10-48e4-8975-5c4f53457396/image.png" alt=""></p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/hello-world/webapp/src/main/webapp (master)
$ git push -uf origin master
</code></pre><p>push 확인</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/1ade87dd-5d88-470b-91da-a61b23db86c6/image.png" alt=""></p>
<p>📙✔️✏️📢⭐️📌</p>
<h1 id="📌--기타">📌  기타</h1>
<h3 id="⭐️-인스턴스ec2-ip">⭐️ 인스턴스(EC2) IP</h3>
<p>퍼블릭 IP는 종료했다 다시 켜면 바뀜.
그래서 EIP(elastic IP)를 사용 (실무에서).</p>
<h3 id="⭐️-poll">⭐️ poll</h3>
<p>여론조사. 폴링타임 줄일수록 민첩하게 상태 확인 가능. 너무 작으면 장비에 부하가 일어날 수 있음.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0727[jenkins,tomcat]]]></title>
            <link>https://velog.io/@mng_jn/0727</link>
            <guid>https://velog.io/@mng_jn/0727</guid>
            <pubDate>Wed, 27 Jul 2022 03:40:43 GMT</pubDate>
            <description><![CDATA[<h1 id="📌cicd">📌CI/CD</h1>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/8d61b233-4eea-4d30-a9a8-2db0369b8864/image.png" alt="">
레드햇
<img src="https://velog.velcdn.com/images/mng_jn/post/78d277a6-4824-43c8-8eb2-93df11ec256f/image.png" alt="">
aws delivery 에는 수동부분이 있음.</p>
<h1 id="📌-jenkins">📌 Jenkins</h1>
<h2 id="📙-aws-인스턴스-생성">📙 AWS 인스턴스 생성</h2>
<p>이름: jenkins-server
이미지 : 아마존 리눅스2
유형 : t2.micro
키페어 : 생성해둔 키페어
네트워크 : MY-VPC
서브넷 : 퍼블릭 2C
보안그룹 새로생성
이름: DEV-SG
SSH, HTTP, 사용자 지정TCP;포트번호 8080-9000, 모든 ICMP - IPv4
-&gt; 위치무관으로 열기
=&gt; 인스턴스 시작</p>
<h2 id="📙-도메인-할당">📙 도메인 할당</h2>
<p>생성한 인스턴스의 퍼블릭 IP를 값으로 레코드 생성.
<img src="https://velog.velcdn.com/images/mng_jn/post/74f2df52-2dcf-4028-8881-8b2d6184f957/image.png" alt=""></p>
<h2 id="📙-cli환경으로-진입mabaxterm">📙 CLI환경으로 진입(mabaxterm)</h2>
<p>✔️ root 사용자로 변경</p>
<pre><code>[ec2-user@ip-10-14-40-70 ~]$ sudo su -
</code></pre><p>✔️ 젠킨스 설치</p>
<pre><code># wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
# yum install -y fontconfig java-11-openjdk
# amazon-linux-extras install -y java-openjdk11
# yum install -y jenkins
# systemctl enable --now jenkins
# cat /var/lib/jenkins/secrets/initialAdminPassword # 패스워드 수정</code></pre><h2 id="📙-jenkins-접속">📙 jenkins 접속</h2>
<p>✔️앞서 생성한 도메인 , 포트번호 8080으로 접속.
<img src="https://velog.velcdn.com/images/mng_jn/post/1b89e819-4257-4459-a107-fec84e1794eb/image.png" alt="">
위에 cat명령어 통해서 받은 패스워드 입력하고, continue</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2b303cf4-e466-494a-864e-1309b6844443/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/d1a4883e-28fe-4ac3-8503-5029de7b388f/image.png" alt=""></p>
<p>✔️오른쪽 상단 adimin- 설정 -  패스워드 변경, time zone 맞춰주기.</p>
<p>-&gt; 에러(403) 뜰 경우 ID : admin , 비밀번호 입력해서 재 로그인</p>
<h2 id="📙-프로젝트-만들기">📙 프로젝트 만들기</h2>
<p>✔️ 대시보드 - 새로운 item - 이름 : HelloWorldJob -  ok (Freestyle)
<img src="https://velog.velcdn.com/images/mng_jn/post/8dc9431a-54dc-4042-bfa4-79d805652689/image.png" alt=""></p>
<p>✔️ build; play. 실행</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/aa6b2ada-7ef9-4dab-8982-2f1b997a49ff/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/8d36a815-92a8-4e2a-89ac-501aa5f13d19/image.png" alt=""></p>
<p>✔️ 콘솔출력
<img src="https://velog.velcdn.com/images/mng_jn/post/05907eb6-b397-45e7-a53b-1f461a317a41/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/64e78cb9-6a37-4d3b-bfb2-d6a9c1bd0cb3/image.png" alt=""></p>
<h2 id="📙-git-hub-플러그인-설치">📙 git hub 플러그인 설치</h2>
<p>✔️ 젠킨스 관리 - 플러그인 관리
<img src="https://velog.velcdn.com/images/mng_jn/post/a97d1c79-d190-4c60-bfcd-9971809da6f9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/72e48404-38f2-4760-bd3c-b40f9626429c/image.png" alt=""></p>
<p>✔️설치가능 - github 검색 후 체크, install without restart - 설치 후 메인페이지로 돌아가기.
<img src="https://velog.velcdn.com/images/mng_jn/post/d6372f5b-d85f-4edf-9a76-5b91e685c173/image.png" alt=""></p>
<h2 id="📙-git---global-tool-configuration">📙 git - Global Tool Configuration</h2>
<p>젠킨스 관리 - Global Tool Configuration</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/541978f0-2618-4b45-b7b0-3519e21201bc/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/1f61e72d-766e-44cb-9d0e-8819adf875f8/image.png" alt=""></p>
<p>✔️git 설치, 추가 셋팅</p>
<pre><code># yum install -y git
# hostnamectl set-hostname jenkins-server
# exit
$ sudo su -</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/947c48a3-20bb-4802-9834-47838cdbdfc0/image.png" alt=""></p>
<p>-&gt;오류 없어짐 , name Git으로 변경 , 하단에 apply, save</p>
<h2 id="📙-pull-code-from-github">📙 Pull code from github</h2>
<p>✔️ 새로운 ITEM - 이름 : PullCodeFromGitHub - Freestyle project - OK
<img src="https://velog.velcdn.com/images/mng_jn/post/c69b5ce8-4acf-4ef4-b3fc-dca6649c39c8/image.png" alt="">
✔️ 설명 : Pull Code From GitHub - 소스코드 관리 : Git; Repository URL : <a href="https://github.com/hali-linux/hello-world.git">https://github.com/hali-linux/hello-world.git</a> - apply, 저장
✔️ 콘솔보기 - 콘솔출력
<img src="https://velog.velcdn.com/images/mng_jn/post/e5d84f8e-6b43-4a7a-9332-4bf7c70c04d9/image.png" alt=""></p>
<pre><code>[root@jenkins-server ~]# cd /var/lib/jenkins/workspace/

[root@jenkins-server workspace]# ll
total 0
drwxr-xr-x 2 jenkins jenkins   6 Jul 27 01:40 HelloWorldJob
drwxr-xr-x 5 jenkins jenkins 163 Jul 27 02:17 PullCodeFromGitHub

</code></pre><h1 id="📌--maven">📌  maven</h1>
<h2 id="📙--maven-설치">📙  maven 설치</h2>
<p><a href="https://maven.apache.org/install.html">https://maven.apache.org/install.html</a>
<img src="https://velog.velcdn.com/images/mng_jn/post/9abf0f93-18dd-4b2e-a91b-84ee84f31f51/image.png" alt="">
최신버전 링크 확인</p>
<pre><code># cd /opt
# wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
# tar -xvzf apache-maven-3.8.6-bin.tar.gz
# mv apache-maven-3.8.6 maven
# cd maven
# cd bin
# ls -&gt; mvn이 메이븐 파일
# cd ~
# find / -name java-11*

# vi .bash_profile
M2_HOME=/opt/maven
M2=/opt/maven/bin
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-1.amzn2.0.3.x86_64
# User specific environment and startup programs

PATH=$PATH:$HOME/bin:$JAVA_HOME:$M2_HOME:$M2
# echo $PATH
# source .bash_profile
# echo $PATH
# mvn -v
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/cb39ea45-9635-49bd-9378-c6c954fcdc61/image.png" alt=""></p>
<p>✔️웹 jenkins - Jenkins 관리 - 플러그인 관리 - 설치가능 ; maven검색 ; maven Integration체크 - install without restart - 메인페이지로 돌아가기</p>
<p>✔️Jenkins 관리 - Global Tool Configuration - Add JDK 
<img src="https://velog.velcdn.com/images/mng_jn/post/452a0aec-eff0-4fa7-be3b-d6370f38e414/image.png" alt=""></p>
<p>✔️ 하단으로 내려서 ,Add Maven - 이름 : maven-3.8.6 - MAVEN_HOME : /opt/maven
<img src="https://velog.velcdn.com/images/mng_jn/post/5f1232c6-ab90-4ef8-a3c5-eddf9c8f52cd/image.png" alt=""></p>
<h2 id="📙-war파일-생성">📙 war파일 생성</h2>
<p>✔️대시보드 - 새로운 item - 이름 : FirstMavenProject - Maven project
<img src="https://velog.velcdn.com/images/mng_jn/post/5bf04f0c-c7e5-40f9-adbf-1ee7ef30e846/image.png" alt=""></p>
<p>✔️설명 : First Maven Project - 소스코드 관리 : Git ; URL : <a href="https://github.com/hali-linux/hello-world.git">https://github.com/hali-linux/hello-world.git</a> - Build ; Goals and options : clean install - apply , save </p>
<p>✔️ FisrtMavenProject-지금빌드 클릭 - #1 - console output </p>
<p>✔️ 빌드 완료 후 CLI에서 확인</p>
<pre><code>
# timedatectl set-timezone Asia/Seoul

[root@jenkins-server ~]# cd /var/lib/jenkins/workspace/FirstMavenProject/
[root@jenkins-server FirstMavenProject]# ll
total 28
-rw-r--r-- 1 jenkins jenkins  130 Jul 27 03:07 Dockerfile
-rw-r--r-- 1 jenkins jenkins 5970 Jul 27 03:07 pom.xml
-rw-r--r-- 1 jenkins jenkins    1 Jul 27 03:07 README.md
-rw-r--r-- 1 jenkins jenkins  479 Jul 27 03:07 regapp-deploy.yml
-rw-r--r-- 1 jenkins jenkins  195 Jul 27 03:07 regapp-service.yml
drwxr-xr-x 4 jenkins jenkins   46 Jul 27 03:08 server
-rw-r--r-- 1 jenkins jenkins    6 Jul 27 03:07 test.tml
drwxr-xr-x 4 jenkins jenkins   46 Jul 27 03:08 webapp

[root@jenkins-server FirstMavenProject]# cd webapp/
[root@jenkins-server webapp]# ls
pom.xml  src  target
[root@jenkins-server webapp]# cd target
[root@jenkins-server target]# ll
total 556
drwxr-xr-x 2 jenkins jenkins     28 Jul 27 12:08 maven-archiver
drwxr-xr-x 2 jenkins jenkins      6 Jul 27 12:08 surefire
drwxr-xr-x 5 jenkins jenkins    105 Jul 27 12:08 webapp
-rw-r--r-- 1 jenkins jenkins 568794 Jul 27 12:08 webapp.war


</code></pre><p>✔️ GUI - 프로젝트 - 작업공간 - webapp 
<img src="https://velog.velcdn.com/images/mng_jn/post/5ed3289b-846a-4fd4-867c-006a8ea98170/image.png" alt="">
✔️ target - war 파일 확인 
<img src="https://velog.velcdn.com/images/mng_jn/post/3a1a2f4f-555d-47f1-9137-4a1417cb9149/image.png" alt=""></p>
<h1 id="📌-tomcat-서버">📌 tomcat 서버</h1>
<p>✔️ AWS 인스턴스 시작 - 이름 : tomcat-server
이미지 : 아마존 리눅스2
유형 : t2.micro
키페어 : 생성해둔 키페어
네트워크 : MY-VPC
서브넷 : 퍼블릭 2A
보안그룹: DEV-SG
고급세부정보 사용자 데이터 : </p>
<pre><code>#!/bin/bash
timedatectl set-timezone Asia/Seoul</code></pre><p>=&gt; 인스턴스 시작
✔️ 도메인 레코드 생성
<img src="https://velog.velcdn.com/images/mng_jn/post/7e47de58-f09f-4d96-99f2-61bb6dadf961/image.png" alt=""></p>
<p>✔️ 도메인 이용하여 CLI로 진입(mobaxterm), date 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/eb87b97f-d470-4a89-bfb4-d9bf5145f34d/image.png" alt=""></p>
<p>✔️  root 계정 진입 및 호스트 네임 바꿔주기.</p>
<pre><code>[ec2-user@ip-10-14-4-246 ~]$ sudo su -
[root@ip-10-14-4-246 ~]# hostnamectl set-hostname tomcat-server
[root@ip-10-14-4-246 ~]# exit
logout
[ec2-user@ip-10-14-4-246 ~]$ sudo su -
Last login: Wed Jul 27 12:24:38 KST 2022 on pts/0
[root@tomcat-server ~]#
</code></pre><p>✔️ tomcat 설치
<a href="https://tomcat.apache.org/download-90.cgi">https://tomcat.apache.org/download-90.cgi</a></p>
<pre><code># amazon-linux-extras install -y java-openjdk11
# cd /opt
# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz
# tar -xvzf apache-tomcat-9.0.65.tar.gz
# mv apache-tomcat-9.0.65 tomcat
# cd tomcat/bin/
# ./startup.sh # tomcat 기동
</code></pre><p>✔️ 주소 : 8080으로 웹브라우저로 진입
<img src="https://velog.velcdn.com/images/mng_jn/post/3e74bba7-59f4-4799-871a-845328edba32/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/649e471f-6c29-414f-ae14-e391cf930782/image.png" alt="">
-&gt;403 해결해야함</p>
<pre><code># cd /opt/tomcat
# find / -name context.xml #경로확인

# vi /opt/tomcat/webapps/host-manager/META-INF/context.xml
&lt;!--  &lt;Valve className=&quot;org.apache.catalina.valves.RemoteAddrValve&quot; allow=&quot;127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1&quot; /&gt; --&gt;</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/d7e099df-fb1d-4aa4-972d-6c26342121ff/image.png" alt=""></p>
<pre><code>
# vi /opt/tomcat/webapps/manager/META-INF/context.xml
&lt;!--  &lt;Valve className=&quot;org.apache.catalina.valves.RemoteAddrValve&quot;
         allow=&quot;127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1&quot; /&gt; --&gt;</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/3000d32e-deb2-4623-b51d-859f1ba2b7fa/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/0978347a-8800-41ad-be37-212056bf7c30/image.png" alt="">
설정완료 후 로그인 창이 뜨는 모습. -&gt; 로그인 정보 설정 필요</p>
<pre><code># cd tomcat/bin/
# ./shutdown.sh
# ./startup.sh
# /opt/tomcat/conf
# vi tomcat-users.xml ## 하단에 아래 명령어 붙여넣기
&lt;role rolename=&quot;manager-gui&quot;/&gt;
&lt;role rolename=&quot;manager-script&quot;/&gt;
&lt;role rolename=&quot;manager-jmx&quot;/&gt;
&lt;role rolename=&quot;manager-status&quot;/&gt;
&lt;user username=&quot;admin&quot; password=&quot;kosa0401&quot; roles=&quot;manager-gui, manager-script, manager-jmx, manager-status&quot;/&gt;
&lt;user username=&quot;deployer&quot; password=&quot;kosa0401&quot; roles=&quot;manager-script&quot;/&gt; ## jenkins
&lt;user username=&quot;tomcat&quot; password=&quot;kosa0401&quot; roles=&quot;manager-gui&quot;/&gt;</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/4400338c-18fd-48a5-93f5-0837281e7331/image.png" alt=""></p>
<pre><code># ln -s /opt/tomcat/bin/startup.sh /usr/local/bin/tomcatup ##톰켓 실행 심볼릭 링크 설정
# ln -s /opt/tomcat/bin/shutdown.sh /usr/local/bin/tomcatdown ##톰켓 종료 심볼릭 링크 설졍 
# tomcatdown ##톰켓 끄기
# tomcatup ## 톰켓 켜기
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/4307dbad-d93c-4fc8-b968-1d602da88be2/image.png" alt=""></p>
<h2 id="📙-jenkins-tomcat설치">📙 jenkins tomcat설치</h2>
<p>✔️ jenkins GUI, jenkins관리 - 플러그인 관리 - 설치가능 - deploy to container 검색 - 체크하고, install without restart - 설치 다 되면 메인페이지로 돌아가기</p>
<p>✔️ jenkins관리 - manage Credentials - jenkins클릭 - global credential클릭 - ADD credential - 위에서 설정한 username, password기입 (manager-script) - ID , Description 자유롭게 기입(바깥에서 보여지는 식별자) - create</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/73d84ce3-5d3f-4611-94ea-c4f261490361/image.png" alt=""></p>
<p>✔️ 메인 대시보드 - 새로운 ITEM - 이름 : BuildAndDeployjob - maven project - 생성 - 설명 : Build code with help of maven and deploy it on tomcat server</p>
<p>✔️소스코드 관리 : Git ; URL : <a href="https://github.com/hali-linux/hello-world.git">https://github.com/hali-linux/hello-world.git</a></p>
<p>✔️ Build;  Goald and options : clean install</p>
<p>✔️ 빌드 후 조치 ; 빌드 후 조치 추가 : Deploy war/ear to a container ; WAR/EAR files: <code>**/*.war</code> - Add continer : Tomcat 9.x remote - credentials; tomcat_deployer - tomcat URL : 
<a href="http://tomcat.lovemj.shop:8080/">http://tomcat.lovemj.shop:8080/</a> - apply ,저장
<img src="https://velog.velcdn.com/images/mng_jn/post/dc1d6658-c6e0-42b6-8421-df9bf02d0556/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/131dc8bd-3314-4b90-95af-0e064889ee6c/image.png" alt=""></p>
<p>📙✔️✏️📢⭐️📌</p>
<h1 id="📌-기타">📌 기타</h1>
<h3 id="⭐️-gitlab">⭐️ gitlab</h3>
<p>메가존에서 요청한 교육과정</p>
<h3 id="⭐️-젠킨스-접속시-8080포트로-접속하는-이유">⭐️ 젠킨스 접속시 8080포트로 접속하는 이유</h3>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/49e43d09-61b3-45dd-8662-83fb0b427d8f/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0726[git]]]></title>
            <link>https://velog.io/@mng_jn/0726</link>
            <guid>https://velog.io/@mng_jn/0726</guid>
            <pubDate>Tue, 26 Jul 2022 03:46:53 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-git">📌 git</h1>
<h2 id="📙-git-설치">📙 git 설치</h2>
<p>✔️git 홈페이지에서 64-bit 용 설치</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/0c4b48bf-aa5b-4d06-a6c7-48c91a09f057/image.png" alt=""></p>
<p>✔️ 설치과정중 아래 체크만 체크하고 나머지 다 default로 설치진행.
<img src="https://velog.velcdn.com/images/mng_jn/post/a4a9e9fe-b68f-4af8-aa53-265e89bacaa0/image.png" alt=""></p>
<h2 id="📙-git-bash-실행">📙 git bash 실행</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/af4dafa7-41a9-4efa-ae3e-bedaf8cea3bc/image.png" alt=""></p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ mkdir git-test &amp;&amp; cd $_

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test
$ echo &quot;Hello World&quot; &gt; README.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test
$ cat README.txt
Hello World

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test
$
</code></pre><h2 id="📙-git-hub">📙 git hub</h2>
<p>✔️ github 로그인 - 리포지디토리 - new</p>
<p>✔️이름 : test-dev - 생성</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/6008587e-5c12-4638-a620-bcaed0c8ae75/image.png" alt=""></p>
<h2 id="📙-git-bash--git-init">📙 git bash -git init</h2>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test
$ git init
Initialized empty Git repository in C:/Users/r2com/git-test/.git/

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ ls
README.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ ls -al
total 21
drwxr-xr-x 1 r2com 197121  0 Jul 26 09:35 ./
drwxr-xr-x 1 r2com 197121  0 Jul 26 09:33 ../
drwxr-xr-x 1 r2com 197121  0 Jul 26 09:35 .git/ ## init 통해 생성
-rw-r--r-- 1 r2com 197121 12 Jul 26 09:33 README.txt


r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git config --global user.name &quot;mangji&quot;
warning: user.name has multiple values
error: cannot overwrite multiple values with a single value
       Use a regexp, --add or --replace-all to change user.name.

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git config --global user.email &quot;test@example.com&quot;
warning: user.email has multiple values
error: cannot overwrite multiple values with a single value
       Use a regexp, --add or --replace-all to change user.email.



r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git add README.txt
warning: in the working copy of &#39;README.txt&#39;, LF will be replaced by CRLF the next time Git touches it

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git commit -m &quot;add-site&quot; ## 작업한 내용 남기기 

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ echo &quot;Aloha&quot; &gt;&gt; README.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ cat README&gt;txt
cat: README: No such file or directory

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git add README.txt
warning: in the working copy of &#39;README.txt&#39;, LF will be replaced by CRLF the next time Git touches it

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git commit -m &quot;add update&quot;
[master ed57f25] add update
 1 file changed, 1 insertion(+)

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git log
commit ed57f25df216e78723744459346790b20d143fcf (HEAD -&gt; master)
Author: == &lt;==&gt;
Date:   Tue Jul 26 09:47:22 2022 +0900

    add update

commit 4bf982a466fbfdcc96da593dd928117fbbd39bb2
Author: == &lt;==&gt;
Date:   Tue Jul 26 09:42:19 2022 +0900

    add-site

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ cat README.txt
Hello World
Aloha

</code></pre><h2 id="📙-git-bash---rollback">📙 git bash - rollback</h2>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git checkout 4bf982a466fbfdcc96da593dd928117fbbd39bb2

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test ((4bf982a...))
$ cat README.txt
Hello World

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test ((4bf982a...)) ## 다시 가장 최근 버전으로
$ git checkout -
Previous HEAD position was 4bf982a add-site
Switched to branch &#39;master&#39;

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ cat README.txt
Hello World
Aloha

</code></pre><h2 id="📙-git-bash---git-hub에-올리기">📙 git bash - git hub에 올리기</h2>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git remote add origin https://github.com/mangjini/test-dev.git

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git push origin master

</code></pre><p><a href="https://github.com/settings/profile">https://github.com/settings/profile</a>
맨 하단 developer settings - personal access tokens - generate new token
note : test-dev
repo체크
<img src="https://velog.velcdn.com/images/mng_jn/post/0a54b9f3-abbc-4b8c-b25e-391241dc6258/image.png" alt="">
generate token</p>
<p>token 복사해서 붙여넣고 sign in
<img src="https://velog.velcdn.com/images/mng_jn/post/06c1acdd-4115-440c-b41c-1a0fa761adf8/image.png" alt=""></p>
<p>sign in 하면 push 됨.</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git push origin master
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 409 bytes | 409.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/mangjini/test-dev.git
 * [new branch]      master -&gt; master
</code></pre><p>github 리포지토리에서 확인 가능해짐.
<img src="https://velog.velcdn.com/images/mng_jn/post/69cc2fa7-b3f7-488f-a5ff-21a31a38fee2/image.png" alt=""></p>
<h2 id="📙-내려받기">📙 내려받기</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/7416d070-007d-40c3-a54d-a4dbe6d5b02b/image.png" alt=""></p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ git clone https://github.com/mangjini/test-dev.git
Cloning into &#39;test-dev&#39;...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.
</code></pre><pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd test-dev

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-dev (master)
$ ls
README.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-dev (master)
$ cat README.txt
Hello World
Aloha

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-dev (master)
$ echo &quot;NIHAO&quot; &gt;&gt; README.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-dev (master)
$ git add .
warning: in the working copy of &#39;README.txt&#39;, LF will be replaced by CRLF the next time Git touches it

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-dev (master)
$ git commit -m &quot;add list&quot;
[master 2c55c2d] add list
 1 file changed, 1 insertion(+)

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-dev (master)
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 243 bytes | 243.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/mangjini/test-dev.git
   ed57f25..2c55c2d  master -&gt; master

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/9460f5e5-699e-4a30-8049-b99aafc41a5b/image.png" alt=""></p>
<p>다른사용자 (git-test[A])가 확인하기</p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd git-test

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ cat README.txt
Hello World
Aloha


r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git pull origin master ## 니하오 추가된 것 가져오기.
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 223 bytes | 13.00 KiB/s, done.
From https://github.com/mangjini/test-dev
 * branch            master     -&gt; FETCH_HEAD
   ed57f25..2c55c2d  master     -&gt; origin/master
Updating ed57f25..2c55c2d
Fast-forward
 README.txt | 1 +
 1 file changed, 1 insertion(+)

 r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ cat README.txt
Hello World
Aloha
NIHAO

</code></pre><h2 id="📙정리삭제">📙정리(삭제)</h2>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git rm README.txt
rm &#39;README.txt&#39;

r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git commit -m &quot;remove README.txt&quot;
[master 5dd0c11] remove README.txt
 1 file changed, 3 deletions(-)
 delete mode 100644 README.txt

 r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (2/2), 182 bytes | 182.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/mangjini/test-dev.git
   2c55c2d..5dd0c11  master -&gt; master</code></pre><p>삭제 확인</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/4213fe32-71c6-4dc1-b729-12f6dc6e77cf/image.png" alt=""></p>
<h2 id="📙-git-lab">📙 git lab</h2>
<p>✔️centos7 버츄얼 박스에 올리기
<img src="https://velog.velcdn.com/images/mng_jn/post/6ed7443e-5dca-47d0-8fce-770ff201b810/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/4d1eb616-f801-4cf1-90cf-73950b3fcd34/image.png" alt=""></p>
<p>서버 IP : 192.168.4.211 -&gt; mobaxterm으로 진입, 아래 명령어 실행 ( gitlab 설치)</p>
<pre><code>curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
EXTERNAL_URL=&quot;http://192.168.4.211&quot; yum install -y gitlab-ce
</code></pre><p>✔️gitlab설치 완료되면 웹브라우저에서 ip 로 접근 가능.
<img src="https://velog.velcdn.com/images/mng_jn/post/9055e5c5-7fbf-4207-b7a7-3ce99fe353f9/image.png" alt=""></p>
<p>✔️아래 명령어 통해서 패스워드 확인하고 로그인 하기.</p>
<pre><code>cat /etc/gitlab/initial_root_password # 패스워드 수정</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/edf3e3ff-b5cb-459f-8b49-5b804afff0e6/image.png" alt=""></p>
<p>✔️패스워드 변경하기</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/824420c1-1027-44f8-bd20-4e09213db30e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/f06c7883-383b-4774-87eb-5f22a9aef3b2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2f03e0bc-3adc-4916-9335-8610bd2e57ac/image.png" alt=""></p>
<p>✔️ 사용자 만들기
root에서 로그아웃 - register now
<img src="https://velog.velcdn.com/images/mng_jn/post/55ae8341-03f1-4ea1-8ab6-5b8097397b6b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/0cc1cfb6-8e25-4c31-a34d-8b427ebec63d/image.png" alt=""></p>
<p>✔️사용자 승인하기 
root로 로그인 - 메뉴</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/34028eb0-f49b-44e4-b5c8-401d80ce9243/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/aae48f9b-0421-4ec9-83af-fb0ff5db8a7c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/c0344763-a734-43ea-9d22-d4a1343a722c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/f3572958-c133-4d79-99a3-5a29505da673/image.png" alt=""></p>
<p>✔️ 사용자 로그인
root 로그아웃하고 생성해둔 사용자로 로그인, role은 그냥 설문조사 편하게 기입.</p>
<p>✔️ 프로젝트 생성</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2bcc0839-8c6a-4ab1-b0d8-5eca7c2f479d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/bbce4513-36bd-48d1-a950-ffc13de9fcc3/image.png" alt=""></p>
<h2 id="📙-a사용자centosb사용자win-협업">📙 a사용자(centos),b사용자(win) 협업</h2>
<p>a사용자-local</p>
<pre><code>[root@localhost ~]# yum install git -y
[root@localhost ~]# mkdir git-test &amp;&amp; cd $_
[root@localhost git-test]# ls -al
total 0
drwxr-xr-x  2 root root   6 Jul 26 12:05 .
dr-xr-x---. 4 root root 163 Jul 26 12:05 ..
[root@localhost git-test]# echo &quot;Hello World&quot; &gt; README.txt

[root@localhost git-test]# git init
Initialized empty Git repository in /root/git-test/.git/

[root@localhost git-test]# git config --global user.email &quot;test@example.com&quot;
[root@localhost git-test]# git config --global user.name &quot;mangji&quot;
[root@localhost git-test]# git add README.txt
[root@localhost git-test]# git commit -m &quot;add site&quot;
[root@localhost git-test]# echo &quot;Aloha&quot; &gt;&gt; README.txt
[root@localhost git-test]# git add README.txt

[root@localhost git-test]# git commit -m &quot;add update&quot;


[root@localhost git-test]# git log
commit bf8dc53a40f2557c7b559c4fd6569c269d3a13f2
Author: mangji &lt;test@example.com&gt;
Date:   Tue Jul 26 12:13:41 2022 +0900

    add update

commit db621ebd231d5c8fcc38d81e55626cd447a9cc8f
Author: mangji &lt;test@example.com&gt;
Date:   Tue Jul 26 12:11:17 2022 +0900

    add site

[root@localhost git-test]# cat README.txt
Hello World
Aloha

[root@localhost git-test]# git checkout db621e ## 앞에 5글자정도만 해도 체크아웃 가능.


[root@localhost git-test]# cat README.txt
Hello World

[root@localhost git-test]# git checkout - #가장 최신버전으로 원복

[root@localhost git-test]# cat README.txt
Hello World
Aloha

</code></pre><p>✔️local에서 벗어나 원격 저장소 이용하기</p>
<p>1) protection 설정</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/14f54f85-1bdf-4704-836c-710135cb1d79/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/4c6e41d7-ce11-447b-8a0f-13baa8eca6f9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/849b04fb-ac6e-411a-a25f-e011a4d325f9/image.png" alt=""></p>
<p>2) 명령어 진행</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/7d6dc1a3-c167-4273-98e1-b0146bf884fe/image.png" alt=""></p>
<pre><code>[root@localhost git-test]# git remote add origin http://192.168.4.211/kmj/test-procject.git

[root@localhost git-test]# git branch -M main

[root@localhost git-test]# git push -uf origin main

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/ff3ae12f-da6c-4db0-aae4-5c58bc317cfd/image.png" alt=""></p>
<p>✔️ B사용자 </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/7a1a6a8d-2bb9-4089-bcb9-4a3afc7aede8/image.png" alt=""></p>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ cd ~

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ git clone http://192.168.4.211/kmj/test-procject.git
Cloning into &#39;test-procject&#39;...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.

r2com@DESKTOP-DD3FU43 MINGW64 ~
$ cd test-procject/

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-procject (main)
$ ls
README.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-procject (main)
$ cat README.txt
Hello World
Aloha

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-procject (main)
$ echo &quot;NIHAO&quot; &gt;&gt; README.txt

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-procject (main)
$ git add README.txt
warning: in the working copy of &#39;README.txt&#39;, LF will be replaced by CRLF the next time Git touches it

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-procject (main)
$ git commit -m &quot;add list&quot;
[main ff5bd3b] add list
 1 file changed, 1 insertion(+)

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-procject (main)
$ git branch -M main

r2com@DESKTOP-DD3FU43 MINGW64 ~/test-procject (main)
$ git push -uf origin main

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/0a9095a3-0cfa-4f61-95a7-e97761a26424/image.png" alt=""></p>
<p>a 사용자</p>
<pre><code>
[root@localhost git-test]# cat README.txt
Hello World
Aloha

[root@localhost git-test]# git pull origin main

[root@localhost git-test]# cat README.txt

Hello World
Aloha
NIHAO

[root@localhost git-test]# git rm README.txt
rm &#39;README.txt&#39;

[root@localhost git-test]# git commit -m &quot;remove README.txt&quot;
[main 28e0244] remove README.txt
 1 file changed, 3 deletions(-)
 delete mode 100644 README.txt

[root@localhost git-test]# git push origin main
Username for &#39;http://192.168.4.211&#39;: kmj
Password for &#39;http://kmj@192.168.4.211&#39;:
Counting objects: 3, done.
Writing objects: 100% (2/2), 196 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To http://192.168.4.211/kmj/test-procject.git
   ff5bd3b..28e0244  main -&gt; main
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/295ab990-a37b-41df-9429-d3458353bbb7/image.png" alt=""></p>
<p>-&gt;삭제완료</p>
<p>📙✔️✏️📢⭐️📌 </p>
<h1 id="📌-기타">📌 기타</h1>
<h3 id="⭐️-trouble-shooting">⭐️ trouble shooting</h3>
<pre><code>r2com@DESKTOP-DD3FU43 MINGW64 ~/git-test (master)
$ git push origin master
remote: Permission to mangjini/test-dev.git denied to JJ
fatal: unable to access &#39;https://github.com/mangjini/test-dev.git/&#39;: The requested URL returned error: 403
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/6103f75d-4a0e-4baa-8a83-954b02f9fa02/image.png" alt=""></p>
<h3 id="⭐️-오픈소스-설치하고-자동완성기능-안될때는-exit-했다가-재진입">⭐️ 오픈소스 설치하고 자동완성기능 안될때는 exit 했다가 재진입.</h3>
<p>[root@localhost git-test]# exit</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0725[EKS,ECR]]]></title>
            <link>https://velog.io/@mng_jn/0725</link>
            <guid>https://velog.io/@mng_jn/0725</guid>
            <pubDate>Mon, 25 Jul 2022 01:14:53 GMT</pubDate>
            <description><![CDATA[<h1 id="📌aws---eks">📌AWS - EKS</h1>
<h2 id="📙-dockermaster-client인스턴스-생성">📙 docker(master client)인스턴스 생성</h2>
<blockquote>
<p><a href="https://velog.io/@mng_jn/0722">https://velog.io/@mng_jn/0722</a>
-&gt;  이전 게시물과 동일하게 만들기.</p>
</blockquote>
<p>사용자 데이터에 아래 명령어만 추가.</p>
<pre><code>timedatectl set-timezone Asia/Seoul</code></pre><p>최종 사용자 데이터 ;</p>
<pre><code>
#!/bin/bash
timedatectl set-timezone Asia/Seoul
cd /tmp
curl &quot;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&quot; -o &quot;awscliv2.zip&quot;
unzip awscliv2.zip
./aws/install
amazon-linux-extras install docker -y
systemctl enable --now docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
usermod -a -G docker ec2-user
docker run -d -p 80:80 --name=test-site mj030kk/web-site:v2.0
</code></pre><h2 id="📙-route-53-레코드-생성">📙 route 53 레코드 생성</h2>
<p>✔️레코드 이름 : docker,
 값 : 앞서 생성한 인스턴스의 퍼블릭 IP</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/cdf4ac36-d5fb-4101-ba23-b1f843c16c1c/image.png" alt=""></p>
<p> ✔️ 웹브라우저 통해서 도메인 접속 확인</p>
<p> <img src="https://velog.velcdn.com/images/mng_jn/post/b4a8050f-b6c2-4235-a22a-c3d009d87fe2/image.png" alt=""></p>
<h2 id="📙-리포지토리-생성">📙 리포지토리 생성</h2>
<p>✔️ Amazon ECR &gt; 리포지토리 &gt; 리포지토리생성(public)</p>
<p>✔️ 리포지토리 이름 : web-site - 리포지토리 생성</p>
<h2 id="📙-docker서버에서-aws-로그인">📙 docker서버에서 aws 로그인</h2>
<p>✔️ 이전에 사용자 생성시 만들어둔 credential 엑셀파일 이용</p>
<pre><code>[ec2-user@ip-10-14-11-244 ~]$ aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-2
Default output format [None]: json
</code></pre><p>✔️ 로그인 확인</p>
<pre><code>[ec2-user@ip-10-14-11-244 ~]$ aws s3 ls
[ec2-user@ip-10-14-11-244 ~]$
</code></pre><h2 id="📙-리포지토리-푸시">📙 리포지토리 푸시</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/c07493a5-ff2a-49be-89a7-f6fd169d97a1/image.png" alt=""></p>
<p>✔️1. 인증 토큰을 검색하고 레지스트리에 대해 Docker 클라이언트를 인증</p>
<pre><code>[ec2-user@ip-10-14-11-244 ~]$ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/

</code></pre><p>✔️ 2. 사용자 데이터에서 가져왔었던 이미지 확인</p>
<pre><code>[ec2-user@ip-10-14-11-244 ~]$ docker images
REPOSITORY         TAG       IMAGE ID       CREATED       SIZE
mj030kk/web-site   v2.0      cde791130344   11 days ago   172MB
</code></pre><p>✔️ 3. 태그</p>
<pre><code>[ec2-user@ip-10-14-11-244 ~]$ docker tag mj030kk/web-site:v2.0 public.ecr.aws/-/web-site:blue
</code></pre><p>✔️ 4. 푸시</p>
<pre><code>[ec2-user@ip-10-14-11-244 ~]$ docker push public.ecr.aws/n3l5a9n9/web-site:blue
</code></pre><p>✔️ 푸시된 이미지 확인</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/9a36c338-42ba-4546-8073-e5a76414261b/image.png" alt=""></p>
<h2 id="📙-eks-클러스터-생성">📙 EKS 클러스터 생성</h2>
<p><strong>일반사용자에서 진행</strong></p>
<p>✔️ 이름: EKS-CLUSTER
버전: 1.22
역할: eksClusterRole
✔️VPC: MY-VPC
서브넷: public 2a, 2c
✔️ 보안그룹 : MY-SG-WEB
엔드포인트 엑세스 : 퍼블릭 
네트워킹 추가기능 : default
✔️ 제어 플레인 로깅 전부 활성화.
✔️ 생성</p>
<h2 id="📙-노드그룹-추가">📙 노드그룹 추가</h2>
<p><strong>일반사용자에서 진행</strong>
EKS &gt; 클러스터 &gt; EKS-CLUSTER &gt; 노드 그룹 추가</p>
<p>✔️ 이름 : NODEGROUP
 IAM역할 : nodeGroupRole
✔️ AMI 유형 : 아마존리눅스2
용량 유형 : On-Demand
인스턴스 유형 : t2.micro
디스크 크기 : 20GiB
노드그룹 조정 구성 : 5, 5, 10
최대 사용 불가 : 수 ; 1</p>
<p>✔️ 서브넷 : public 2a,2c
노드에 대한 SSH 액세스 구성 활성화 체크
키페어 : 만들어둔 키 선택
권한 허용 대상 : 모두</p>
<p>✔️ 생성</p>
<h2 id="📙-eks-서비스-cli에서-이용하기-위한-설정-docker-server">📙 EKS 서비스 CLI에서 이용하기 위한 설정 (docker server)</h2>
<p>✔️ 자격증명 및 기초셋팅</p>
<pre><code>[ec2-user@ip-10-14-11-244 ~]$ aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER

[ec2-user@ip-10-14-11-244 ~]$ curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.22.6/2022-03-09/bin/linux/amd64/kubectl

[ec2-user@ip-10-14-11-244 ~]$ chmod +x ./kubectl

[ec2-user@ip-10-14-11-244 ~]$ sudo mv ./kubectl /usr/local/bin ## 어느 디렉토리에서든 실행 가능하게 mv. 

[ec2-user@ip-10-14-11-244 ~]$ source &lt;(kubectl completion bash) ## 자동완성기능 활성화.

</code></pre><p>✔️ alias 추가 </p>
<pre><code>
[ec2-user@ip-10-14-11-244 ~]$ vi .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

alias k=kubectl
complete -F __start_kubectl k


export PATH
</code></pre><h2 id="📙-volume--pvpvc">📙 volume ( pv,pvc)</h2>
<p><strong>워커노드1개에 pv,pvc,pod생성해서 연결</strong></p>
<pre><code># mkdir volume &amp;&amp; cd $_

#aws ec2 create-volume --availability-zone=ap-northeast-2a --size=1 --volume-type=gp2
{
    &quot;AvailabilityZone&quot;: &quot;ap-northeast-2a&quot;,
    &quot;CreateTime&quot;: &quot;2022-07-25T02:22:14+00:00&quot;,
    &quot;Encrypted&quot;: false,
    &quot;Size&quot;: 1,
    &quot;SnapshotId&quot;: &quot;&quot;,
    &quot;State&quot;: &quot;creating&quot;,
    &quot;VolumeId&quot;: &quot;vol-0b791600d3e2e4c89&quot;,
    &quot;Iops&quot;: 100,
    &quot;Tags&quot;: [],
    &quot;VolumeType&quot;: &quot;gp2&quot;,
    &quot;MultiAttachEnabled&quot;: false
}


[ec2-user@ip-10-14-11-244 volume]$ vi aws-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gp2
  annotations:
    storageclass.kubernetes.io/is-default-class: &quot;true&quot;
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  fsType: ext4 

 [ec2-user@ip-10-14-11-244 volume]$ k apply -f aws-sc.yaml

vi aws-vol.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-aws
spec:
  storageClassName: gp2
  capacity:
    storage: 1Gi
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteOnce
  awsElasticBlockStore:
    fsType: ext4
    volumeID: vol-0b791600d3e2e4c89
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-aws
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-aws
  namespace: default
  labels:
    app: pod-aws
spec:
  containers:
    - name: test
      image: nginx
      volumeMounts:
        - mountPath: &quot;/usr/share/nginx/html&quot;
          name: pvc
  nodeName: ip-10-14-10-254.ap-northeast-2.compute.internal
  volumes:
    - name: pvc
      persistentVolumeClaim:
        claimName: pvc-aws
 ---
 apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-pod
spec:
  type: NodePort
  selector:
    app: pod-aws
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80 # 컨테이너 포트가 맞다.
    nodePort: 30080

[ec2-user@ip-10-14-11-244 volume]$ k apply -f aws-vol.yaml

[ec2-user@ip-10-14-11-244 volume]$ k get pv,pvc


</code></pre><p>✔️ 보안그룹 설정
pod 설치한 인스턴스 접근 - 퍼블릭 ip 통해서 mobaxterm으로 진입</p>
<pre><code>[ec2-user@ip-10-14-10-254 ~]$ curl 10.14.10.254:30080
&lt;html&gt;
&lt;head&gt;&lt;title&gt;403 Forbidden&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;center&gt;&lt;h1&gt;403 Forbidden&lt;/h1&gt;&lt;/center&gt;
&lt;hr&gt;&lt;center&gt;nginx/1.23.1&lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre><p>마스터 노드에서 접근 할 수 있도록 포트 열기
<img src="https://velog.velcdn.com/images/mng_jn/post/b2c35b31-fb16-4d9c-b8b2-4489d702765a/image.png" alt=""></p>
<pre><code>[ec2-user@ip-10-14-11-244 volume]$ curl 10.14.10.254:30080
&lt;html&gt;
&lt;head&gt;&lt;title&gt;403 Forbidden&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;center&gt;&lt;h1&gt;403 Forbidden&lt;/h1&gt;&lt;/center&gt;
&lt;hr&gt;&lt;center&gt;nginx/1.23.1&lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre><p>✔️ forbidden 없애기 위해 경로 확인</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/594e52f7-656c-4fe5-bf12-950de9ee352d/image.png" alt="">
or </p>
<pre><code>[ec2-user@ip-10-14-10-254 ~]$ lsblk
NAME    MAJ:MIN   RM SIZE RO TYPE MOUNTPOINT
xvda    202:0      0  20G  0 disk
└─xvda1 202:1      0  20G  0 part /
xvdcg   202:21504  0   1G  0 disk /var/lib/kubelet/pods/0831a914-afc3-42bb-a8d6-c67195aea811/volumes/kubernetes.io~aws-ebs/pvc-514
[ec2-user@ip-10-14-10-254 ~]$


</code></pre><p>✔️ 마운트 후 인덱스파일 넣기</p>
<pre><code>[ec2-user@ip-10-14-10-254 ~]$ sudo mount /dev/xvdcg /mnt
[ec2-user@ip-10-14-10-254 ~]$ sudo vi /mnt/index.html
Hello World</code></pre><p>✔️ 확인 워커노드 퍼블릭 IP(웹브라우저), 내부 IP (CLI)</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2e4150de-9df0-4654-8d56-3ee8a4568937/image.png" alt=""></p>
<pre><code>[ec2-user@ip-10-14-10-254 ~]$ curl 10.14.10.254:30080
Hello World</code></pre><h2 id="📙-volumepod-ebs">📙 volume(pod-ebs)</h2>
<pre><code>[ec2-user@ip-10-14-11-244 volume]$ vi test-ebs.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-ebs
  labels:
    app: test-ebs
spec:
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
    - mountPath: &quot;/usr/share/nginx/html&quot;
      name: test-volume
  nodeName: ip-10-14-34-50.ap-northeast-2.compute.internal
  volumes:
  - name: test-volume
    # This AWS EBS volume must already exist.
    awsElasticBlockStore:
      volumeID: &quot;vol-01e83fdaa98a33e1a&quot;
      fsType: ext4
---
apiVersion: v1
kind: Service
metadata:
  name: test-ebs-svc
spec:
  type: NodePort
  selector:
    app: test-ebs
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80 # 컨테이너 포트가 맞다.
    nodePort: 30088

[ec2-user@ip-10-14-11-244 volume]$ k apply -f test-ebs.yaml
</code></pre><p>✔️ 보안그룹 설정 (eks-remoteaccess)</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/b45211c0-62b1-4f60-bd76-19a360511526/image.png" alt=""></p>
<p>✔️ 10.14.31.50에 해당하는 인스턴스 퍼블릭 IP로 mobaxterm 진입.</p>
<p>✔️ 정상적으로 연결된 것 확인(mount X, attatch O)
<img src="https://velog.velcdn.com/images/mng_jn/post/0671b8ca-6417-41fd-8921-8c6ef765bd08/image.png" alt=""></p>
<p>✔️ mount 진행</p>
<pre><code>[ec2-user@ip-10-14-34-50 ~]$ lsblk
NAME    MAJ:MIN   RM SIZE RO TYPE MOUNTPOINT
xvda    202:0      0  20G  0 disk
└─xvda1 202:1      0  20G  0 part /
xvdbv   202:18688  0   1G  0 disk /var/lib/kubelet/pods/64a5d484-5501-41a5-9adb-143f1d0e2aa2/volumes/kubernetes.io~aws-ebs/test-v

[ec2-user@ip-10-14-34-50 ~]$ sudo mount /dev/xvdbv /mnt
[ec2-user@ip-10-14-34-50 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        479M     0  479M   0% /dev
tmpfs           488M     0  488M   0% /dev/shm
tmpfs           488M  740K  487M   1% /run
tmpfs           488M     0  488M   0% /sys/fs/cgroup
/dev/xvda1       20G  3.3G   17G  17% /
/dev/xvdbv      974M   24K  958M   1% /mnt
tmpfs            98M     0   98M   0% /run/user/1000
[ec2-user@ip-10-14-34-50 ~]$ sudo vi /mnt/index.html
ALOHA</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/d34b6004-61c6-4a33-9c3b-f15c6dcac935/image.png" alt=""></p>
<h2 id="📙configmapwordpress">📙configmap(wordpress)</h2>
<pre><code>[ec2-user@ip-10-14-11-244 wokdpress]$ vi confingmap-wordpress.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: config-wordpress
  namespace: default
data:
  MYSQL_ROOT_HOST: &#39;%&#39;
  MYSQL_ROOT_PASSWORD: mode1752
  MYSQL_DATABASE: wordpress
  MYSQL_USER: wpuser
  MYSQL_PASSWORD: wppass

 [ec2-user@ip-10-14-11-244 wokdpress]$ vi mysql-pod-svc.yaml
  apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    app: mysql-pod
spec:
  containers:
  - name: mysql-container
    image: mysql:5.7
    envFrom:
    - configMapRef:
        name: config-wordpress
    ports:
    - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
spec:
  type: ClusterIP
  selector:
    app: mysql-pod
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306</code></pre><pre><code>[ec2-user@ip-10-14-11-244 wokdpress]$ vi wordpress-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wordpress-pod
  labels:
    app: wordpress-pod
spec:
  containers:
  - name: wordpress-container
    image: wordpress
    env:
    - name: WORDPRESS_DB_HOST
      value: mysql-svc:3306
    - name: WORDPRESS_DB_USER
      valueFrom:
        configMapKeyRef:
          name: config-wordpress
          key: MYSQL_USER
    - name: WORDPRESS_DB_PASSWORD
      valueFrom:
        configMapKeyRef:
          name: config-wordpress
          key: MYSQL_PASSWORD
    - name: WORDPRESS_DB_NAME
      valueFrom:
        configMapKeyRef:
          name: config-wordpress
          key: MYSQL_DATABASE
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-svc
spec:
  type: LoadBalancer
#  externalIPs:
#  - 192.168.2.0
  selector:
    app: wordpress-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

[ec2-user@ip-10-14-11-244 wokdpress]$ k apply -f wordpress-pod-svc.yaml

[ec2-user@ip-10-14-11-244 wokdpress]$ k get all
NAME                READY   STATUS    RESTARTS   AGE
pod/mysql-pod       1/1     Running   0          6m43s
pod/wordpress-pod   1/1     Running   0          38s

NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP                                                                   PORT(S)        AGE
service/kubernetes      ClusterIP      172.20.0.1       &lt;none&gt;                                                                        443/TCP        105m
service/mysql-svc       ClusterIP      172.20.238.123   &lt;none&gt;                                                                        3306/TCP       6m43s
service/wordpress-svc   LoadBalancer   172.20.213.161   a719e5c37700144298260442e368755c-740478662.ap-northeast-2.elb.amazonaws.com   80:30318/TCP   37s

</code></pre><p>✔️ https 설정 
aws - ec2 - 로드밸런서 - 생성된 clb클릭 - 리스너 - 편집 - SSL(보안 TCP), 인스턴스 포트 30318- SSL인증서 ACM 추가 후 저장.
<img src="https://velog.velcdn.com/images/mng_jn/post/e89590c4-95c6-45b8-86eb-af9e524853d8/image.png" alt=""></p>
<p>✔️ 보안그룹 설정
<img src="https://velog.velcdn.com/images/mng_jn/post/4b9f0533-4bac-4dbb-b5f2-e873bb102625/image.png" alt="">
소스 보안그룹 클릭, 인바운드 규칙에 HTTPS 추가.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/3027a9a7-283f-4734-96ea-9e601f34c32f/image.png" alt=""></p>
<p>✔️ route53 도메인 설정 (레코드 생성)
레코드 이름 : blog
트래픽 라우팅 대상 별칭으로, CLI manifest로 생성한 clb 선택 
<img src="https://velog.velcdn.com/images/mng_jn/post/b45fcf4c-e49e-4d02-bdd5-033e1c699ca5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/6df49c82-2be0-466b-926d-7a962f5440be/image.png" alt=""></p>
<p>✔️https 설정
워드프레스 설치 후 플러그인 - 새로추가 - https 검색 - Really Simple SSL - 지금 설치 - 활성화 - Activate SSL</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/f792f2af-8271-42ff-b647-ca00b3570b15/image.png" alt=""></p>
<p>완료! </p>
<h2 id="📙-rds">📙 RDS</h2>
<p>✔️RDS- 데이터베이스 생성 - MYSQL(5.7.22)-프리티어
✔️DB인스턴스 식별자 : database-1
마스터사용자이름: mj
마스터 암호 기입
✔️인스턴스 클래스 : db.t2.micro
✔️ 스토리지 유형 : gp2, 자동조정 (default
✔️ VPC:MY-VPC
서브넷 그룹 : default
퍼블릭 액세스 : 아니오
✔️ 보안그룹 새로생성
이름 : MY-SG-RDS
가용영역 : 2b
✔️ 데이터베이스 인증 : 암호 인증
✔️ 추가구성 : 
초기데이터베이스 이름 : wordpress
로그내보내기 다 체크
✔️데이터 베이스 - 보안 - 보안그룹 진입(MY-SG-RDS) - 인바운드 규칙 편집 - 소스 부분 IP:10.14.0.0/16 - 규칙저장
<img src="https://velog.velcdn.com/images/mng_jn/post/32417ef0-b21b-49c3-a45e-4e29224497e8/image.png" alt=""></p>
<pre><code> vi confingmap-wordpress.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: config-wordpress
  namespace: default
data:
  WORDPRESS_DB_HOST: database-1.crfklihww3gw.ap-northeast-2.rds.amazonaws.com:3306
  WORDPRESS_DB_USER: mj
  WORDPRESS_DB_PASSWORD: kosa0401
  WORDPRESS_DB_NAME: wordpress

[ec2-user@ip-10-14-11-244 wokdpress]$ k apply -f confingmap-wordpress.yaml

vi wordpress-deployment-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-deploy
  labels:
    app: wordpress-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress-deploy
  template:
    metadata:
      labels:
        app: wordpress-deploy
    spec:
      containers:
      - name: wordpress-container
        image: wordpress
        envFrom:
        - configMapRef:
            name: config-wordpress
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-svc
spec:
  type: LoadBalancer
#  externalIPs:
#  - 192.168.2.0
  selector:
    app: wordpress-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 [ec2-user@ip-10-14-11-244 wokdpress]$ k apply -f wordpress-deployment-svc.yaml

[ec2-user@ip-10-14-11-244 wokdpress]$ k describe configmaps config-wordpress

[ec2-user@ip-10-14-11-244 wokdpress]$ k get all
</code></pre><p>접속 확인</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/1c8793e5-0548-4218-a5d9-666184415dd8/image.png" alt=""></p>
<p>✔️ route53 도메인 설정
<img src="https://velog.velcdn.com/images/mng_jn/post/b8512fbd-7324-4010-a8fd-d96b8c6f07ba/image.png" alt=""></p>
<p>✔️ https 설정 </p>
<ol>
<li><p>리스너 설정
<img src="https://velog.velcdn.com/images/mng_jn/post/de7c989b-b81d-4c7c-b1a8-7a4d8228545a/image.png" alt=""></p>
</li>
<li><p>로드밸런서 - 보안 - 보안그룹 이름 클릭 - 인바운드 편집에서 https 추가 
<img src="https://velog.velcdn.com/images/mng_jn/post/cb514121-1eae-4373-847e-60cee4b25426/image.png" alt=""></p>
</li>
</ol>
<p>✔️ 워드프레스 도메인으로 진입해서 설치 
<img src="https://velog.velcdn.com/images/mng_jn/post/d7faede6-5b80-49d5-bf46-4eb5250d3600/image.png" alt=""></p>
<p>📙✔️✏️📢⭐️📌</p>
<h1 id="📌기타">📌기타</h1>
<h3 id="⭐️-fargate">⭐️ fargate</h3>
<p>서버리스 시스템.
용량을 계산하지 않아도 됨.
다만 사용량이 계속 변할경우 비용 계산이 예측하기 어려움.</p>
<h3 id="⭐️kubectl-권한">⭐️kubectl 권한</h3>
<p>권한이 없으면 하얀색. 권한 부여해주고 정상 실행이 가능하면 초록색임.
<img src="https://velog.velcdn.com/images/mng_jn/post/449e9f18-c10b-4cd6-9f1f-92bbe2ad8b81/image.png" alt=""></p>
<h3 id="⭐️-서브넷과-ip">⭐️ 서브넷과 ip</h3>
<p>10.14.0 ~ 10.14.15 -&gt; a</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0722[AWS-EKS]]]></title>
            <link>https://velog.io/@mng_jn/0722</link>
            <guid>https://velog.io/@mng_jn/0722</guid>
            <pubDate>Fri, 22 Jul 2022 02:51:12 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-aws-eks">📌 AWS-EKS</h1>
<h2 id="📙-인스턴스-생성">📙 인스턴스 생성</h2>
<p>이름 : docker
유형 t2.micro
키페어 만들어둔 것 설정 
네트워크 - my-vpc, 서브넷 - public subnet 2a
보안그룹 - MY-SG-WEB 새로 생성
<img src="https://velog.velcdn.com/images/mng_jn/post/36773bb7-f255-456e-b54f-34c44ec4bab3/image.png" alt=""></p>
<p>사용자 데이터(cloud init):</p>
<pre><code>#!/bin/bash
cd /tmp
curl &quot;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&quot; -o &quot;awscliv2.zip&quot;
unzip awscliv2.zip
./aws/install
amazon-linux-extras install docker -y
systemctl enable --now docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
usermod -a -G docker ec2-user
docker run -d -p 80:80 --name=test-site mj030kk/web-site:v2.0</code></pre><h2 id="📙-route53도메인-할당">📙 route53도메인 할당</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/b8123e50-2573-42f0-b102-3de1008051ad/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2d17f68b-70cd-4a89-b631-95a0e6900824/image.png" alt=""></p>
<h2 id="📙-ecr---리포지토리-생성">📙 ECR - 리포지토리 생성</h2>
<p>✔️ EKS-ECR-리포지토리 생성
✔️ 퍼블릭
이름 : test-site
리포지토리 생성</p>
<h2 id="📙-cli---aws-credential">📙 CLI - aws credential</h2>
<p>*<em>mabaxterm으로 진입하여 진행 *</em></p>
<pre><code>[ec2-user@ip-10-14-11-61 ~]$ aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]:  ap-northeast-2
Default output format [None]: json
</code></pre><h2 id="📙-이미지-push">📙 이미지 Push</h2>
<p>✔️리포지토리 클릭하고 푸시 명령 보기 - AWS CLI사용 복사해서 mobaxterm에서 붙여넣기.</p>
<pre><code>$ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/-
</code></pre><p>✔️tag 및 push</p>
<pre><code>[ec2-user@ip-10-14-11-61 ~]$ docker tag mj030kk/web-site:v2.0 public.ecr.aws/-/test-site:eagle ## 리포지토리 URI와 버전

[ec2-user@ip-10-14-11-61 ~]$ docker push public.ecr.aws/-/test-site:eagle
</code></pre><p>✔️ 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/12c15d3f-ce90-4613-a712-6b5bcf6bb159/image.png" alt=""></p>
<h2 id="📙-사용자-로그인-firefox">📙 사용자 로그인 (firefox)</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2beb48d7-680a-4b9b-9b3e-c60135ad1d0c/image.png" alt=""></p>
<h2 id="📙-eks-firefox">📙 EKS (firefox)</h2>
<p>✔️1. EKS - 클러스터 추가
이름 : EKS-CLUSTER
버전 : 1.22
역할 : 어제 만들어둔 eksClusterRole
✔️2. VPC: MY-VPC
서브넷: public 2C,2A
보안그룹 : MY-SG-WEB
✔️3. 로깅구성 전부 활성화
<img src="https://velog.velcdn.com/images/mng_jn/post/9dfa0f44-187e-41a4-8d82-2b4afb66de88/image.png" alt="">
✔️4. 생성</p>
<h2 id="📙-kubectl-설치cli">📙 kubectl 설치(CLI)</h2>
<p><a href="https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html">https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html</a>
-&gt; 1.22    버전, amd.</p>
<pre><code>[ec2-user@ip-10-14-11-61 ~]$ curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.22.6/2022-03-09/bin/linux/amd64/kubectl

[ec2-user@ip-10-14-11-61 ~]$ chmod +x ./kubectl

[ec2-user@ip-10-14-11-61 ~]$ sudo mv ./kubectl /usr/local/bin

[ec2-user@ip-10-14-11-61 ~]$ source &lt;(kubectl completion bash)

[ec2-user@ip-10-14-11-61 ~]$ echo &quot;source &lt;(kubectl completion bash)&quot; &gt;&gt; ~/.bashrc

[ec2-user@ip-10-14-11-61 ~]$ kubectl version --short --client
Client Version: v1.22.6-eks-7d68063

[ec2-user@ip-10-14-11-61 ~]$  aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER ## 클러스터 활성 확인 후 연결

Added new context arn:aws:eks:ap-northeast-2:872979928596:cluster/EKS-CLUSTER to /home/ec2-user/.kube/config

[ec2-user@ip-10-14-11-61 ~]$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   172.20.0.1   &lt;none&gt;        443/TCP   4m8s

</code></pre><h2 id="📙-노드그룹-추가-firefox">📙 노드그룹 추가 (firefox)</h2>
<p>✔️ 생성한 클러스터 - 하단 컴퓨팅 - 노드그룹 추가
✔️ 이름 : NODEGROUP-SPOT
역할 : nodeGroupRole
✔️AMI : amazon linux2
용량 유형 : spot
인스턴스 유형 : t2.micro
노드그룹조정 : 2,2,4
✔️서브넷 public2a,2c
SSH 액세스 구성 활성화
키페어 선택, 액세스 권한 모두
✔️생성</p>
<h2 id="📙-pod-확인-firefox-및-생성-cli">📙 pod 확인 (firefox) 및 생성 (CLI)</h2>
<p>EKS &gt; 클러스터 &gt; EKS-CLUSTER &gt; Node: ip-10-14-
<img src="https://velog.velcdn.com/images/mng_jn/post/fdc0d3ab-6003-484c-a878-50dc485aeef0/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/47cfda3a-a634-45ff-9aaa-15363d8a2302/image.png" alt=""></p>
<pre><code>[ec2-user@ip-10-14-11-61 ~]$ kubectl run nginx-pod1 --image=nginx
pod/nginx-pod1 created
[ec2-user@ip-10-14-11-61 ~]$ kubectl get po -o wide
NAME         READY   STATUS              RESTARTS   AGE   IP       NODE                                              NOMINATED NODE   READINESS GATES
nginx-pod1   0/1     ContainerCreating   0          10s   &lt;none&gt;   ip-10-14-44-249.ap-northeast-2.compute.internal   &lt;none&gt;           &lt;none&gt;
[ec2-user@ip-10-14-11-61 ~]$ kubectl run nginx-pod2 --image=nginx
pod/nginx-pod2 created
[ec2-user@ip-10-14-11-61 ~]$ kubectl get po -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP             NODE                                              NOMINATED NODE   READINESS GATES
nginx-pod1   1/1     Running   0          79s   10.14.36.62    ip-10-14-44-249.ap-northeast-2.compute.internal   &lt;none&gt;           &lt;none&gt;
nginx-pod2   1/1     Running   0          54s   10.14.37.103   ip-10-14-44-249.ap-northeast-2.compute.internal   &lt;none&gt;           &lt;none&gt;

</code></pre><h2 id="📙--svc-생성loadbalancer">📙  SVC 생성(loadbalancer)</h2>
<pre><code>[ec2-user@ip-10-14-11-61 ~]$ kubectl expose pod nginx-pod1 --name loadbalancer --type LoadBalancer --port 80
service/loadbalancer exposed
[ec2-user@ip-10-14-11-61 ~]$ kubectl get svc
NAME           TYPE           CLUSTER-IP       EXTERNAL-IP                                                                    PORT(S)        AGE
kubernetes     ClusterIP      172.20.0.1       &lt;none&gt;                                                                         443/TCP        57m
loadbalancer   LoadBalancer   172.20.191.254   a0c52c4ac7e30411f9afc386dbf256bf-1783297533.ap-northeast-2.elb.amazonaws.com   80:31411/TCP   4s
</code></pre><h2 id="📙-route53-cname-해보기">📙 route53 CNAME 해보기</h2>
<p><strong>별칭이 바람직하긴 함(별칭이 더 저렴-비용효율적) 그냥 실습.</strong></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/3f0bc6a2-53a2-4546-8b36-2071f8ac982d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/ba829120-8c45-4f8d-9827-aab6374bea64/image.png" alt=""></p>
<h2 id="📙-https-----사용">📙 HTTPS     사용</h2>
<p>✔️로드밸런서 - 생성되어있는 clb선택 - 리스터 - 편집 - SSL(보안 TCP) - SSL 인증서 변경 클릭, ACM 선택 후 저장
<img src="https://velog.velcdn.com/images/mng_jn/post/ba446481-824e-4fb7-8b5b-9578ca84e439/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/3463fc27-9587-4963-aa8e-fdac6d446275/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/7e90d2e3-276f-4451-9cf1-aa41a595cfda/image.png" alt=""></p>
<p>✔️ 보안그룹 설정
<img src="https://velog.velcdn.com/images/mng_jn/post/aa414689-18a3-475e-ba64-6b4c2a85afaf/image.png" alt="">
해당 보안그룹 ID 선택해서 인바운드 규칙 편집
<img src="https://velog.velcdn.com/images/mng_jn/post/8dac12ec-36d7-48c1-a8cb-738c7cb94e9b/image.png" alt="">
규칙추가
<img src="https://velog.velcdn.com/images/mng_jn/post/1cdb3ec7-50a7-4363-b9cf-a96e0f236311/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2b32d2d3-9d59-4903-9e62-2e74ce12098c/image.png" alt=""></p>
<p>✔️보안그룹 정책?</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/0660429e-df3d-4e04-859d-948cc861f713/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/8d286d08-faf1-4216-93e3-5e7e2faef163/image.png" alt=""></p>
<p>eks cluster sg에서 자기자신에 대한(소스) 전체 트래픽이 열려있기 때문에 worker1,2끼리 ping 나감.</p>
<pre><code>[ec2-user@ip-10-14-44-249 ~]$ ping 10.14.6.21
PING 10.14.6.21 (10.14.6.21) 56(84) bytes of data.
64 bytes from 10.14.6.21: icmp_seq=1 ttl=255 time=1.10 ms
64 bytes from 10.14.6.21: icmp_seq=2 ttl=255 time=1.05 ms
64 bytes from 10.14.6.21: icmp_seq=3 ttl=255 time=1.17 ms
</code></pre><p>물론 자기자신을 열지 않고 그냥 ICMP, anywhere해도 핑 나감 .근데 일일이 포트 열어주기가 번거로움. ( 추후 노드포트라든지..)
그래서 모든 트래픽을 열고, 자기자신(EKS-cluster)을 소스로 하면 그 안에서는 통신할 수 있으며 안전함. -&gt; 동일한 보안그룹 내에 있는 VM 들끼리는 모든 포트가 열려있어서 뭐든 할 수 있다.</p>
<h2 id="📙-노드그룹-삭제-후-재생성">📙 노드그룹 삭제 후 재생성</h2>
<p>✔️ondemand, t2.micro,448,모두</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/ca29a75d-5eb5-474b-9d20-5f29b4142241/image.png" alt=""></p>
<p>✔️인스턴스에서 퍼블릭 IP 확인 네임태그 달아주기 
<img src="https://velog.velcdn.com/images/mng_jn/post/94b4d2a5-758c-4ee6-85a3-d4ac489d3850/image.png" alt=""></p>
<p>✔️ 레코드 생성해서 도메인 만들어 준 후 mobaxterm으로 진입해두기
<img src="https://velog.velcdn.com/images/mng_jn/post/dca5d9ae-f8d2-4bab-9bb0-632e056aeefc/image.png" alt=""></p>
<p>✔️ 노드 확인과 이전시간에 만들어둔 파드와 서비스 삭제</p>
<pre><code>[ec2-user@ip-10-14-11-61 ~]$ kubectl get node ##master client
NAME                                              STATUS   ROLES    AGE     VERSION
ip-10-14-33-7.ap-northeast-2.compute.internal     Ready    &lt;none&gt;   6m35s   v1.22.9-eks-810597c
ip-10-14-37-108.ap-northeast-2.compute.internal   Ready    &lt;none&gt;   6m38s   v1.22.9-eks-810597c
ip-10-14-6-217.ap-northeast-2.compute.internal    Ready    &lt;none&gt;   6m28s   v1.22.9-eks-810597c
ip-10-14-6-234.ap-northeast-2.compute.internal    Ready    &lt;none&gt;   6m35s   v1.22.9-eks-810597c

[ec2-user@ip-10-14-11-61 ~]$ kubectl delete pod,svc --all

</code></pre><h2 id="📙-replica-manifest">📙 replica manifest</h2>
<pre><code>[ec2-user@ip-10-14-11-61 ~]$ mkdir test &amp;&amp; cd $_
[ec2-user@ip-10-14-11-61 test]$ vi replica-loadbalancer.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  replicas: 3 # desired state (kube-controller-manager)
  selector:
    matchLabels:
      app: nginx-replicaset

  template:
    metadata:
      name: nginx-replicaset
      labels:
        app: nginx-replicaset
    spec:
      containers:
      - name: nginx-replicaset-container
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-replicaset
spec:
  type: LoadBalancer
    #  externalIPs:
    #    - 172.25.0.137
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

[ec2-user@ip-10-14-11-61 test]$ kubectl apply -f replica-loadbalancer.yaml

[ec2-user@ip-10-14-11-61 test]$ kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-replicaset-bn7hd   1/1     Running   0          33s
pod/nginx-replicaset-frq7t   1/1     Running   0          33s
pod/nginx-replicaset-z4xsh   1/1     Running   0          33s

NAME                                      TYPE           CLUSTER-IP      EXTERNAL-IP                                                                   PORT(S)        AGE
service/kubernetes                        ClusterIP      172.20.0.1      &lt;none&gt;                                                                        443/TCP        5m41s
service/loadbalancer-service-replicaset   LoadBalancer   172.20.12.111   ab5c6bf5a4d5f48be906c0518d6771b0-457932185.ap-northeast-2.elb.amazonaws.com   80:30758/TCP   33s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-replicaset   3         3         3       33s




</code></pre><p>✔️ replica 4개로 바꾸기</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl edit replicasets.apps nginx-replicaset</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/38a04c4d-575c-4fa6-adf6-cc94e72d164c/image.png" alt=""></p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-replicaset-bn7hd   1/1     Running   0          8m8s
nginx-replicaset-frq7t   1/1     Running   0          8m8s
nginx-replicaset-rvhrr   1/1     Running   0          2m34s
nginx-replicaset-z4xsh   1/1     Running   0          8m8s
</code></pre><p>✔️ 서버 구분하기 위한 수정</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl exec nginx-replicaset-bn7hd -- sh -c &quot;echo &#39;web01&#39; &gt; /usr/share/nginx/html/index.html
&gt; &quot;
[ec2-user@ip-10-14-11-61 test]$ kubectl exec nginx-replicaset-frq7t -- sh -c &quot;echo &#39;web02&#39; &gt; /usr/share/nginx/html/index.html&quot;
[ec2-user@ip-10-14-11-61 test]$ kubectl exec nginx-replicaset-rvhrr -- sh -c &quot;echo &#39;web03&#39; &gt; /usr/share/nginx/html/index.html&quot;
[ec2-user@ip-10-14-11-61 test]$ kubectl exec nginx-replicaset-z4xsh -- sh -c &quot;echo &#39;web04&#39; &gt; /usr/share/nginx/html/index.html&quot;
</code></pre><p>로드밸런서 확인</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/0441e11b-8833-4e21-b3d4-06eff3cb9ddf/image.png" alt=""></p>
<p>✔️replicaset 지워도 바로 서버 올라오는 것 확인</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl delete pod nginx-replicaset-frq7t
pod &quot;nginx-replicaset-frq7t&quot; deleted
kube[ec2-user@ip-10-14-11-61 test]$ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-replicaset-6lng9   1/1     Running   0          5s
nginx-replicaset-bn7hd   1/1     Running   0          13m
nginx-replicaset-rvhrr   1/1     Running   0          7m27s
nginx-replicaset-z4xsh   1/1     Running   0          13m
</code></pre><p>✔️삭제</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl delete -f replica-loadbalancer.yaml
replicaset.apps &quot;nginx-replicaset&quot; deleted
service &quot;loadbalancer-service-replicaset&quot; deleted
</code></pre><h2 id="📙-deploy-manifest">📙 deploy manifest</h2>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx-deployment
  template:
    metadata:
      name: nginx-deployment
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-deployment-container
        image: nginx
        ports:
        - containerPort: 80

[ec2-user@ip-10-14-11-61 test]$ kubectl apply -f deployment.yaml

[ec2-user@ip-10-14-11-61 test]$ kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-55cb6f9cb7-4csjr   1/1     Running   0          43s
pod/nginx-deployment-55cb6f9cb7-ktvq8   1/1     Running   0          43s
pod/nginx-deployment-55cb6f9cb7-r6pr4   1/1     Running   0          43s
pod/nginx-deployment-55cb6f9cb7-rcqbl   1/1     Running   0          43s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   172.20.0.1   &lt;none&gt;        443/TCP   25m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   4/4     4            4           43s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-55cb6f9cb7   4         4         4       43s


</code></pre><p>✔️ ClusterIP 서비스 추가</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ vi clusterip-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service-deployment
spec:
  type: ClusterIP
  externalIPs:
  - 10.14.6.234 # worker1 ip a 해서 나온 사설 IP (eth0:)
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 [ec2-user@ip-10-14-11-61 test]$ kubectl apply -f clusterip-deployment.yaml
service/clusterip-service-deployment created

[ec2-user@ip-10-14-11-61 test]$ kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-55cb6f9cb7-4csjr   1/1     Running   0          5m26s
pod/nginx-deployment-55cb6f9cb7-ktvq8   1/1     Running   0          5m26s
pod/nginx-deployment-55cb6f9cb7-r6pr4   1/1     Running   0          5m26s
pod/nginx-deployment-55cb6f9cb7-rcqbl   1/1     Running   0          5m26s

NAME                                   TYPE        CLUSTER-IP       EXTERNAL-IP    PORT(S)   AGE
service/clusterip-service-deployment   ClusterIP   172.20.222.212  10.14.6.234 80/TCP    13s
service/kubernetes                     ClusterIP   172.20.0.1       &lt;none&gt;         443/TCP   30m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   4/4     4            4           5m26s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-55cb6f9cb7   4         4         4       5m26s

</code></pre><p>보안그룹  eks-remoteAccess 에서 80포트 열어주기 (0.0.0.0/0)</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ curl 10.14.6.234
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
&lt;style&gt;
</code></pre><p>✔️ external IP에 worker IP 모두 추가 <strong>( 사설 IP - node IP)</strong></p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ vi clusterip-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service-deployment
spec:
  type: ClusterIP
  externalIPs:
  - 10.14.6.234
  - 10.14.6.217
  - 10.14.37.108
  - 10.14.33.7
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
</code></pre><p>도메인으로 접속 or 인스턴스 퍼블릭 IP로 접속해서 확인 가능.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/9a5d2f9d-57c9-4393-b45e-2df5e3c10651/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/b543cadf-e9ff-474f-8e6f-12af58270cfd/image.png" alt=""></p>
<p>✔️ loadbalancer</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl delete svc clusterip-service-deployment
service &quot;clusterip-service-deployment&quot; deleted


[ec2-user@ip-10-14-11-61 test]$vi loadbalancer-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment
spec:
  type: LoadBalancer
  externalIPs:
  - 10.14.6.234
  - 10.14.6.217
  - 10.14.37.108
  - 10.14.33.7
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80


[ec2-user@ip-10-14-11-61 test]$ kubectl apply -f loadbalancer-deployment.yaml

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/735c4d88-c578-4499-83f1-b002f8c91c53/image.png" alt=""></p>
<h2 id="📙-deployment-rolling-update">📙 deployment rolling update</h2>
<p>✔️ 레포지토리 URI 확인</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ docker images
REPOSITORY                          TAG       IMAGE ID       CREATED      SIZE
public.ecr.aws/n3l5a9n9/test-site   eagle     cde791130344   9 days ago   172MB
mj030kk/web-site                    v2.0      cde791130344   9 days ago   172MB
</code></pre><p>✔️ 롤링업데이트</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=public.ecr.aws/n3l5a9n9/test-site:eagle</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/47a33e31-e2e6-4b01-98a7-bfcc71aced74/image.png" alt=""></p>
<p>✔️ revision 확인</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         &lt;none&gt;
2         &lt;none&gt;


[ec2-user@ip-10-14-11-61 test]$ kubectl rollout history deployment nginx-deployment  --revision 1
deployment.apps/nginx-deployment with revision #1
Pod Template:
  Labels:       app=nginx-deployment
        pod-template-hash=55cb6f9cb7
  Containers:
   nginx-deployment-container:
    Image:      nginx
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        &lt;none&gt;
    Mounts:     &lt;none&gt;
  Volumes:      &lt;none&gt;

[ec2-user@ip-10-14-11-61 test]$ kubectl rollout history deployment nginx-deployment  --revision 2
deployment.apps/nginx-deployment with revision #2
Pod Template:
  Labels:       app=nginx-deployment
        pod-template-hash=6496bdd586
  Containers:
   nginx-deployment-container:
    Image:      public.ecr.aws/n3l5a9n9/test-site:eagle
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        &lt;none&gt;
    Mounts:     &lt;none&gt;
  Volumes:      &lt;none&gt;
</code></pre><p>✔️ 더 많은 revision 생성 ( 롤링 업데이트)</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=halilinux/test-home:v1.0

[ec2-user@ip-10-14-11-61 test]$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=halilinux/test-home:v0.0

[ec2-user@ip-10-14-11-61 test]$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=halilinux/test-home:v2.0

[ec2-user@ip-10-14-11-61 test]$ kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         &lt;none&gt;
2         &lt;none&gt;
3         &lt;none&gt;
4         &lt;none&gt;
5         &lt;none&gt;

</code></pre><p>✔️ rollout undo (rollback)</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl rollout history deployment nginx-deployment --revision 3
deployment.apps/nginx-deployment with revision #3
Pod Template:
  Labels:       app=nginx-deployment
        pod-template-hash=794df5fcdc
  Containers:
   nginx-deployment-container:
    Image:      halilinux/test-home:v1.0
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        &lt;none&gt;
    Mounts:     &lt;none&gt;
  Volumes:      &lt;none&gt;

[ec2-user@ip-10-14-11-61 test]$ kubectl rollout history deployment nginx-deployment --revision 4
deployment.apps/nginx-deployment with revision #4
Pod Template:
  Labels:       app=nginx-deployment
        pod-template-hash=69b55fbfdd
  Containers:
   nginx-deployment-container:
    Image:      halilinux/test-home:v0.0
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        &lt;none&gt;
    Mounts:     &lt;none&gt;
  Volumes:      &lt;none&gt;

[ec2-user@ip-10-14-11-61 test]$ kubectl rollout history deployment nginx-deployment --revision 5
deployment.apps/nginx-deployment with revision #5
Pod Template:
  Labels:       app=nginx-deployment
        pod-template-hash=7656d75994
  Containers:
   nginx-deployment-container:
    Image:      halilinux/test-home:v2.0
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        &lt;none&gt;
    Mounts:     &lt;none&gt;
  Volumes:      &lt;none&gt;

  [ec2-user@ip-10-14-11-61 test]$ kubectl rollout undo deployment nginx-deployment --to-revision 2 ## revision 2로 롤백

</code></pre><p>revision 5
<img src="https://velog.velcdn.com/images/mng_jn/post/7ce6becc-26b5-4a8d-8b40-fffb05df3f9a/image.png" alt=""></p>
<p>revision 2 ( rollout undo 후)
<img src="https://velog.velcdn.com/images/mng_jn/post/c6122ae9-7e06-4bb0-92f5-dd28ef32b4f0/image.png" alt=""></p>
<p>✔️revision 2로 롤백해서 revision2는 6으로 바뀜. (가장 최근의 이미지가 가장 큰 수)
-&gt;새로운 이미지의 경우에는 새로운 revision이 생김.</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         &lt;none&gt;
3         &lt;none&gt;
4         &lt;none&gt;
5         &lt;none&gt;
6         &lt;none&gt;
</code></pre><p>✔️ revision 목록 갯수 늘리기</p>
<pre><code>[ec2-user@ip-10-14-11-61 test]$ kubectl edit deployments.apps nginx-deployment
deployment.apps/nginx-deployment edited
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/003a4894-29f6-45ad-a616-b3786174937c/image.png" alt="">
10개 -&gt; 20개</p>
<h2 id="📙-wordpress">📙 wordpress</h2>
<p><strong>하나의 파드에 두개이상의 컨테이너.</strong></p>
<pre><code>[ec2-user@ip-10-14-11-61 ~]$ mkdir wordpress &amp;&amp; cd $_
apiVersion: v1
kind: Pod
metadata:
  name: wordpress-pod
  labels:
    app: wordpress-pod
spec:
  containers:
  - name: mysql-container
    image: mysql:5.7
    env:
    - name: MYSQL_ROOT_HOST
      value: &#39;%&#39; # wpuser@%
    - name: MYSQL_ROOT_PASSWORD
      value: kosa0401
    - name: MYSQL_DATABASE
      value: wordpress
    - name: MYSQL_USER
      value: wpuser
    - name: MYSQL_PASSWORD
      value: wppass
    ports:
    - containerPort: 3306
  - name: wordpress-container
    image: wordpress
    env:
    - name: WORDPRESS_DB_HOST
      value: wordpress-pod:3306
    - name: WORDPRESS_DB_USER
      value: wpuser
    - name: WORDPRESS_DB_PASSWORD
      value: wppass 
    - name: WORDPRESS_DB_NAME
      value: wordpress
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment-wordpress
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.0.10
  selector:
    app: wordpress-pod
  ports:
  - protocol: TCP
    port: 80

[ec2-user@ip-10-14-11-61 wordpress]$ kubectl apply -f wordpress-pod-svc.yaml

[ec2-user@ip-10-14-11-61 wordpress]$ kubectl get svc
NAME                                        TYPE           CLUSTER-IP       EXTERNAL-IP                                                                                                                    PORT(S)        AGE
kubernetes                                  ClusterIP      172.20.0.1       &lt;none&gt;                                                                                                                         443/TCP        128m
loadbalancer-service-deployment             LoadBalancer   172.20.218.87    ae8ff9e64d7ad4ac58f23f7d449dbfcc-2071515703.ap-northeast-2.elb.amazonaws.com,10.14.6.234,10.14.6.217,10.14.37.108,10.14.33.7   80:32746/TCP   67m
loadbalancer-service-deployment-wordpress   LoadBalancer   172.20.173.218   a7b30d4e1c9684ce39bcf2c89cd1fbc0-767305826.ap-northeast-2.elb.amazonaws.com                                                    80:30025/TCP   50s


</code></pre><p>✔️레코드 별칭생성. (clb) , HTTPS
<img src="https://velog.velcdn.com/images/mng_jn/post/ed4d2aec-bc3b-4bdf-b276-e3d54b07483a/image.png" alt=""></p>
<p>로드밸런서에서 리스너 추가
<img src="https://velog.velcdn.com/images/mng_jn/post/6b4b0001-5d84-4b2f-8b59-087eaab5d245/image.png" alt=""></p>
<p> kubectl get svc해서 해당 로드밸런서 잘 확인해서 보안그룹 편집(추가).
<img src="https://velog.velcdn.com/images/mng_jn/post/b1531a05-e8ec-4d53-b213-26f9e99254c3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/4f36ff1b-f80c-4222-8ce6-d21b31a9fa0d/image.png" alt=""></p>
<p>도메인으로 진입
<img src="https://velog.velcdn.com/images/mng_jn/post/653fba53-ac2b-4a91-b744-95df8e97f9fb/image.png" alt=""></p>
<p>설치완료
<img src="https://velog.velcdn.com/images/mng_jn/post/3c6d1d90-084a-4eaa-b04b-b7ae013027fb/image.png" alt=""></p>
<p>워드프레스에서 https 플러그인 설치 - 활성화
<img src="https://velog.velcdn.com/images/mng_jn/post/a9d47972-c734-4081-b3e1-42a28ff83167/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/3dcc3bc7-7cf2-4f30-918f-25deda6e4a79/image.png" alt=""></p>
<p>완료!
<img src="https://velog.velcdn.com/images/mng_jn/post/e744b4b7-2a11-4488-8352-09b6afae4990/image.png" alt=""></p>
<h2 id="📙metallb">📙metallb</h2>
<pre><code>[ec2-user@ip-10-14-11-61 ~]$ kubectl delete all --all ## 다 지우고 시작

#git clone https://github.com/hali-linux/_Book_k8sInfra.git

# kubectl apply -f ~/_Book_k8sInfra/ch3/3.3.4/metallb.yaml
# kubectl get pods -n metallb-system -o wide
# vi metallb-l2config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: nginx-ip-range
      protocol: layer2
      addresses:
      - 10.14.6.234
      - 10.14.6.217
      - 10.14.37.108
      - 10.14.33.7</code></pre><p>-&gt;이러다가 끝!</p>
<p>📙✔️✏️📢⭐️📌</p>
<h1 id="📌-기타">📌 기타</h1>
<h3 id="⭐️리포지토리">⭐️리포지토리</h3>
<p>레지스트리 &gt; <strong>리포지토리</strong> - 이미지</p>
<h3 id="⭐️노드그룹-역할-복습">⭐️노드그룹 역할 (복습)</h3>
<p>AmazonEKSWorkerNodePolicy
AmazonEC2ContainerRegistryReadOnly
AmazonEKS_CNI_Policy</p>
<h3 id="⭐️-ad-hoc-포트번호">⭐️ ad-hoc 포트번호</h3>
<pre><code># kubectl expose pod nginx-pod --name clusterip --type=ClusterIP --port 80 # 타겟포트,컨테이너 포트 , nginx 포트
# kubectl expose pod nginx-pod --name nodeport --type=NodePort --port 80
# kubectl expose pod nginx-pod --name loadbalancer --type=LoadBalancer --external-ip 192.168.56.103 --port 80 # 컨테이너  포트</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[0721[Kubernetes]]]></title>
            <link>https://velog.io/@mng_jn/0721Kubernetes</link>
            <guid>https://velog.io/@mng_jn/0721Kubernetes</guid>
            <pubDate>Thu, 21 Jul 2022 00:57:05 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-복습">📌 복습</h1>
<h2 id="📙-수동배치">📙 수동배치</h2>
<pre><code>apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename-metadata
  labels:
    app: pod-nodename-labels
spec:
  containers:
  - name: pod-nodename-containers
    image: nginx
    ports:
    - containerPort: 80
  nodeName: worker1
---
apiVersion: v1
kind: Service
metadata:
  name: pod-nodename-service
spec:
  type: NodePort
  selector:
    app: pod-nodename-labels
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 [root@master1 test2]# kubectl get pod -o wide
NAME                        READY   STATUS         RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
ad-hoc1                     1/1     Running        1          16h   10.244.1.27   worker1   &lt;none&gt;           &lt;none&gt;
pod-nodename-metadata       1/1     Running        0          20s   10.244.1.29   worker1   &lt;none&gt;           &lt;none&gt;
pod-nodeselector-metadata   0/1     NodeAffinity   0          15h   &lt;none&gt;        worker1   &lt;none&gt;           &lt;none&gt;
pod-schedule-metadata       1/1     Running        1          16h   10.244.2.27   worker2   &lt;none&gt;           &lt;none&gt;

</code></pre><h2 id="📙-노드-셀렉터수동배치2">📙 노드 셀렉터(수동배치2)</h2>
<p>✔️라벨링</p>
<pre><code>[root@master1 test2]# kubectl label node worker2 app=dev

[root@master1 test2]# kubectl get node --show-labels

NAME      STATUS   ROLES    AGE   VERSION    LABELS
worker2   Ready    &lt;none&gt;   45h   v1.19.16   app=dev,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker2,kubernetes.io/os=linux

</code></pre><p>✔️노드 셀렉터로 파드 생성</p>
<pre><code># vi pod-nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeselector-metadata-app
  labels:
    app: pod-nodeselector-labels
spec:
  containers:
  - name: pod-nodeselector-containers
    image: nginx
    ports:
    - containerPort: 80
  nodeSelector:
    app: dev
---
apiVersion: v1
kind: Service
metadata:
  name: pod-nodeselector-service2
spec:
  type: NodePort
  selector:
    app: pod-nodeselector-labels
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 [root@master1 test2]# kubectl get pod -o wide
NAME                            READY   STATUS         RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
ad-hoc1                         1/1     Running        1          16h     10.244.1.27   worker1   &lt;none&gt;           &lt;none&gt;
pod-nodename-metadata           1/1     Running        0          7m30s   10.244.1.29   worker1   &lt;none&gt;           &lt;none&gt;
pod-nodeselector-metadata       0/1     NodeAffinity   0          16h     &lt;none&gt;        worker1   &lt;none&gt;           &lt;none&gt;
pod-nodeselector-metadata-app   1/1     Running        0          10s     10.244.2.28   worker2   &lt;none&gt;           &lt;none&gt;
pod-schedule-metadata           1/1     Running        1          16h     10.244.2.27   worker2   &lt;none&gt;           &lt;none&gt;
</code></pre><p>✔️할당했던 라벨 삭제</p>
<pre><code># kubectl label nodes worker2 app-
[root@master1 test2]# kubectl get nodes --show-labels
NAME      STATUS   ROLES    AGE   VERSION    LABELS
master1   Ready    master   46h   v1.19.16   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
worker1   Ready    &lt;none&gt;   45h   v1.19.16   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker1,kubernetes.io/os=linux
worker2   Ready    &lt;none&gt;   45h   v1.19.16   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker2,kubernetes.io/os=linux

</code></pre><h1 id="📌-taint--toleration">📌 taint , toleration</h1>
<h2 id="📙-taint-테스트">📙 taint 테스트</h2>
<pre><code># kubectl taint node worker1 tiger=cet:NoSchedule ##tiger, cat부분임의로 지정하는 부분
# kubectl taint node worker2 tiger=cet:NoSchedule
[root@master1 test2]# kubectl describe nodes worker2 | grep Taints
Taints:             tiger=cat:NoSchedule


[root@master1 test2]# kubectl get pod -o wide
NAME                            READY   STATUS         RESTARTS   AGE   IP            NODE      NOMINATED NODE
test-pod                        0/1     Pending        0          7s    &lt;none&gt;        &lt;none&gt;    &lt;none&gt;           &lt;none&gt;</code></pre><h2 id="📙-toleration">📙 toleration</h2>
<pre><code>
# vi pod-taint.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-taint-metadata
  labels:
    app: pod-taint-labels
spec:
  containers:
  - name: pod-taint-containers
    image: nginx
  ports:
    - containerPort: 80
  tolerations:
  - key: &quot;tiger&quot;
    operator: &quot;Equal&quot;
    value: &quot;cat&quot;
    effect: &quot;NoSchedule&quot;
---
apiVersion: v1
kind: Service
metadata:
  name: pod-taint-service
spec:
  type: NodePort
  selector:
    app: pod-taint-labels
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

</code></pre><h1 id="📌-aws---ekselastic-kubernetes-service">📌 AWS - EKS(Elastic Kubernetes Service)</h1>
<h2 id="📙-인스턴스-생성">📙 인스턴스 생성</h2>
<p>이름 : docker
유형 t2.micro
키페어 생성해서 설정
네트워크 - my-vpc, 서브넷 - public subnet 2c
보안그룹 - MY-SG-WEB
사용자 데이터:</p>
<pre><code>#!/bin/bash
cd /tmp
curl &quot;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&quot; -o &quot;awscliv2.zip&quot;
unzip awscliv2.zip
./aws/install
sudo amazon-linux-extras install docker -y
sudo systemctl start docker &amp;&amp; systemctl enable docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
sudo usermod -a -G docker ec2-user
</code></pre><h2 id="📙-퍼블릭-ip로-도메인-할당">📙 퍼블릭 IP로 도메인 할당</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e3f14662-0ece-4e66-88dc-1fe2b41142f5/image.png" alt=""></p>
<h2 id="📙-dockerhub에서-이미지-가져오기">📙 dockerhub에서 이미지 가져오기</h2>
<p><strong>mabaxterm에 진입해서 진행</strong></p>
<pre><code>$ docker run -d -p 80:80 --name=test-site mj030kk/web-site:v2.0
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/abeaa0f5-4d68-41a4-8ccd-3b72d87b4ec3/image.png" alt=""></p>
<h2 id="📙-iam-사용자-만들기">📙 IAM 사용자 만들기</h2>
<p>✔️IAM - 사용자 추가 - 사용자이름:docker - 자격증명유형 : 액세스 키, 암호 - 비밀번호; 사용자 지정,재설정필요 체크 해제 (내가 이용할 목적) - 다음
<img src="https://velog.velcdn.com/images/mng_jn/post/98d83078-6371-45fe-bc0b-362a9c83b6b8/image.png" alt=""></p>
<p>✔️기존 정책 직접 연결 -  AdministratorAccess 선택 - 다음 - 다음 - 사용자 만들기
<img src="https://velog.velcdn.com/images/mng_jn/post/2e36d817-ed14-4997-856d-710241642058/image.png" alt=""></p>
<p>✔️csv파일 다운로드</p>
<h2 id="📙--cli로그인">📙  CLI로그인</h2>
<pre><code>[ec2-user@ip-10-14-33-225 ~]$ aws configure ##.csv파일 확인
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-2
Default output format [None]: json

</code></pre><p>✔️ .aws폴더삭제하면 로그인 풀림. -&gt; 로그인 하지 않고 이용하고싶으면 역할 사용. 📌 기타 ⭐️ IAM-역할참고.</p>
<h2 id="📙-ecr--amazon-elastic-container-registry">📙 ECR- Amazon Elastic Container Registry</h2>
<p>✔️ECS-ECR- 리포지토리 생성
✔️표시 여부 설정;퍼블릭
세부정보 : 이름 : web-site - 맨 하단 레포지토리 생성
<img src="https://velog.velcdn.com/images/mng_jn/post/105ac53f-6e91-4615-8a1f-d45f312ad698/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/698a2927-ac70-4965-ab98-1c69b3634476/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/9171f0c1-7808-4b6b-99ef-d5e38271280b/image.png" alt=""></p>
<p>✔️ mabaxterm 진입, 위에서 인증토크 명령어 입력</p>
<pre><code>[ec2-user@ip-10-14-33-225 ~]$ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
</code></pre><p>✔️ 리포지토리 URI확인하여 태그 및 리포지토리에 push</p>
<pre><code>[ec2-user@ip-10-14-33-225 ~]$ docker images
REPOSITORY         TAG       IMAGE ID       CREATED      SIZE
mj030kk/web-site   v2.0      cde791130344   8 days ago   172MB

$ docker tag mj030kk/web-site:v2.0 public.ecr.aws/n3l5a9n9/web-site:v1.0

[ec2-user@ip-10-14-33-225 ~]$ docker push public.ecr.aws/n3l5a9n9/web-site:v1.0
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/725cb207-ef34-479c-b25c-358458d0cb68/image.png" alt=""></p>
<h2 id="📙-iam-역할-생성-eks-cluster">📙 IAM 역할 생성 (EKS-Cluster)</h2>
<p>✔️ IAM - 역할 - 역할 만들기 - AWS서비스 - 다른 AWS서비스의 사용 사례 : EKS - EKS-Cluster - 다음
<img src="https://velog.velcdn.com/images/mng_jn/post/ac25ee64-56da-4f4c-8fc3-cc2b335e3c4b/image.png" alt=""></p>
<p>✔️ 권한 추가(이미 되어 있음) - 다음</p>
<p>✔️역할이름 : eksClusterRole - 역할 생성</p>
<h2 id="📙-iam사용자-로그인---ekselastic-kubernetes-service-진행">📙 IAM사용자 로그인 - EKS(Elastic Kubernetes Service) 진행</h2>
<p>*<em>chrome - root, firefox - iam사용자 *</em> </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/093c240a-af00-44d9-9ce2-0763c1041b90/image.png" alt="">
<strong>IAM사용자에서 진행</strong>
✔️EKS - 클러스터 추가 - 생성
이름: EKS-CLUSTER
kubernetes버전 : 1.19
클러스터 서비스 역할 : eksClusterRole - 다음</p>
<p>✔️VPC : MY-VPC
서브넷: public2a,2c
보안그룹 : MY-SG-WEB
<img src="https://velog.velcdn.com/images/mng_jn/post/e39bf871-6505-4602-b636-f4f4e579ad35/image.png" alt=""></p>
<p>✔️클러스터 엔드포인트 액세스 : 퍼블릭
<img src="https://velog.velcdn.com/images/mng_jn/post/e02d0b8f-98c1-4101-9f0f-6b4bb49de5f7/image.png" alt=""></p>
<p>✔️ 네트워킹 추가 기능 ; default 
<img src="https://velog.velcdn.com/images/mng_jn/post/06497e4b-4c22-435c-b503-3c9a23507256/image.png" alt=""></p>
<p>✔️로깅구성 ; default -다음 -생성
<img src="https://velog.velcdn.com/images/mng_jn/post/bed73299-45b2-4bd8-882a-131b5fb6fc3f/image.png" alt=""></p>
<h2 id="📙-클러스터-자격증명-cli">📙 클러스터 자격증명 (CLI)</h2>
<p><a href="https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html">https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html</a></p>
<pre><code># curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.19.6/2021-01-05/bin/linux/amd64/kubectl

# chmod +x ./kubectl

# sudo mv ./kubectl /usr/local/bin

$ source &lt;(kubectl completion bash)

$ echo &quot;source &lt;(kubectl completion bash)&quot; &gt;&gt; ~/.bashrc

$ kubectl version --short --client

$ aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER ##masternode에 접속하기 
</code></pre><h2 id="📙-iam-역할cluster에서-노드그룹추가하기-위한-생성">📙 IAM 역할(cluster에서 노드그룹추가하기 위한) 생성</h2>
<p>✔️ IAM - 역할 - 역할 만들기 - AWS서비스, EC2
<img src="https://velog.velcdn.com/images/mng_jn/post/13f512c2-6258-4ae9-8b4e-ce385930002b/image.png" alt=""></p>
<p>✔️ 아래 정책 검색해서 체크</p>
<p>AmazonEKSWorkerNodePolicy
AmazonEC2ContainerRegistryReadOnly
AmazonEKS_CNI_Policy</p>
<p>✔️ 역할 이름 : nodeGroupRole</p>
<h2 id="📙-docker사용자에서-노드-그룹-추가">📙 docker사용자에서 노드 그룹 추가</h2>
<p>✔️ 노드이름 : NODEGROUP
역할 : nodeGroupRole - 다음
<img src="https://velog.velcdn.com/images/mng_jn/post/6910e280-8b0d-41ae-b1e4-31b16a18d202/image.png" alt=""></p>
<p>✔️ AMI유형 : 아마존 linux2
용량 유형 : Spot
인스턴스 유형 : t2.micro
최대크기 노드 : 4
<img src="https://velog.velcdn.com/images/mng_jn/post/263970ca-70c9-4076-a800-ac942d5d0307/image.png" alt=""></p>
<p>✔️ 서브넷 그대로, SSH 액세스 구성 활성화
키페어 선택, 허용 대상 모두 - 다음 - 노드그룹 생성
<img src="https://velog.velcdn.com/images/mng_jn/post/3e5e30c3-6abc-446f-a30d-36ead31fa332/image.png" alt=""></p>
<p>✔️ root계정에서 인스턴스 목록 확인하고 새로 생성된 node들에 태그 추가(worker1,2) 및 원래 docker ec2를 master1으로 바꿔주기.
<img src="https://velog.velcdn.com/images/mng_jn/post/3b756b07-63ae-420a-9fb1-c609f50e2160/image.png" alt=""></p>
<p>📢 저 인스턴스가 마스터노드는 아님. 마스터 노드는 aws에서 만들어줌. 저걸 통해서 마스터노드에 진입 가능함. </p>
<p>✔️publicIP통해서 mobaxterm진입 가능 확인.</p>
<p>✔️ (docker.lovemj.shop)에서 node들이 잘 붙었는지 확인하기.</p>
<pre><code>[ec2-user@ip-10-14-33-225 ~]$ kubectl get node
NAME                                              STATUS   ROLES    AGE     VERSION
ip-10-14-13-102.ap-northeast-2.compute.internal   Ready    &lt;none&gt;   8m32s   v1.19.15-eks-9c63c4
ip-10-14-44-2.ap-northeast-2.compute.internal     Ready    &lt;none&gt;   8m23s   v1.19.15-eks-9c63c4
</code></pre><h2 id="📙-podservice-이용">📙 pod,service 이용</h2>
<p>✔️ pod 생성</p>
<pre><code>[ec2-user@ip-10-14-33-225 ~]$ mkdir workspace &amp;&amp; cd $_


[ec2-user@ip-10-14-33-225 workspace]$ kubectl run nginx-pod --image=nginx
pod/nginx-pod created

[ec2-user@ip-10-14-33-225 workspace]$ kubectl get pod -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP             NODE                                            NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          32s   10.14.40.245   ip-10-14-44-2.ap-northeast-2.compute.internal   &lt;none&gt;           &lt;none&gt;


[ec2-user@ip-10-14-33-225 workspace]$ kubectl run nginx-pod2 --image=nginx
pod/nginx-pod2 created

[ec2-user@ip-10-14-33-225 workspace]$ kubectl get pod -o wide
NAME         READY   STATUS              RESTARTS   AGE   IP             NODE                                              NOMINATED NODE   READINESS GATES
nginx-pod    1/1     Running             0          69s   10.14.40.245   ip-10-14-44-2.ap-northeast-2.compute.internal     &lt;none&gt;           &lt;none&gt;
nginx-pod2   0/1     ContainerCreating   0          3s    &lt;none&gt;         ip-10-14-13-102.ap-northeast-2.compute.internal   &lt;none&gt;           &lt;none&gt;

</code></pre><p>✔️ 노드 갯수 편집</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/bb78befd-333b-40de-ac45-f33eef64d253/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/91825e5d-212f-4de6-afe1-75cbb088c80f/image.png" alt=""></p>
<pre><code>[ec2-user@ip-10-14-33-225 workspace]$ kubectl get node
NAME                                              STATUS   ROLES    AGE   VERSION
ip-10-14-13-102.ap-northeast-2.compute.internal   Ready    &lt;none&gt;   27m   v1.19.15-eks-9c63c4
ip-10-14-42-111.ap-northeast-2.compute.internal   Ready    &lt;none&gt;   75s   v1.19.15-eks-9c63c4
ip-10-14-44-2.ap-northeast-2.compute.internal     Ready    &lt;none&gt;   27m   v1.19.15-eks-9c63c4
ip-10-14-8-13.ap-northeast-2.compute.internal     Ready    &lt;none&gt;   99s   v1.19.15-eks-9c63c4
</code></pre><p>✔️ 노드 정보 확인</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/f39f16c6-c453-4feb-91c4-94cb6c49e2d8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/23f32275-4a1d-4903-a74f-f21276079818/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/535fb09e-1746-40d3-a6e9-93a726a2f50c/image.png" alt=""></p>
<p>✔️pod , service</p>
<pre><code>[ec2-user@ip-10-14-33-225 workspace]$ kubectl run nginx-pod --image=nginx
pod/nginx-pod created
[ec2-user@ip-10-14-33-225 workspace]$ kubectl expose pod nginx-pod --name clusterip --type ClusterIP --port 80
service/clusterip exposed
[ec2-user@ip-10-14-33-225 workspace]$ kubectl get all
NAME            READY   STATUS    RESTARTS   AGE
pod/nginx-pod   1/1     Running   0          52s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/clusterip    ClusterIP   172.20.244.180   &lt;none&gt;        80/TCP    10s
service/kubernetes   ClusterIP   172.20.0.1       &lt;none&gt;        443/TCP   94m

[ec2-user@ip-10-14-13-102 ~]$ curl 172.20.244.180 ## worker1 or worker2에서 curl.
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;


[ec2-user@ip-10-14-33-225 workspace]$ kubectl expose pod nginx-pod --name nodeport --type NodePort --port 80
service/nodeport exposed


[ec2-user@ip-10-14-33-225 workspace]$ kubectl get all
NAME            READY   STATUS    RESTARTS   AGE
pod/nginx-pod   1/1     Running   0          5m2s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/clusterip    ClusterIP   172.20.244.180   &lt;none&gt;        80/TCP         4m20s
service/kubernetes   ClusterIP   172.20.0.1       &lt;none&gt;        443/TCP        98m
service/nodeport     NodePort    172.20.32.121    &lt;none&gt;        80:30277/TCP   7s


[ec2-user@ip-10-14-13-102 ~]$ curl 10.14.13.102:30277 ##worker인스턴스에서, worker의 내부IP: 포트번호 
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
</code></pre><p>✔️ 인바운드 규칙편집- sg-05b6d25534a484c97 - eks-remoteAccess-f0c10fb4-3dfb-2144-9539-bdc388effc9c - 범위 3000-35000, 내 IP- 규칙추가</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/513b8152-f734-444e-b303-990aad62e45a/image.png" alt=""></p>
<p>worker의 퍼블릭 IP:nodeport번호로 접속
<img src="https://velog.velcdn.com/images/mng_jn/post/8135a7b0-87a7-4a40-9d87-c84744bffcea/image.png" alt=""></p>
<p>-&gt;소스를 내IP가 아닌 0.0.0.0/0으로 할 경우 mabaxterm에서도 curl 통해서 확인 가능.(master,worker1,2)에서 다.  =&gt; 일단 이렇ㄱㅔ 마무리.
<img src="https://velog.velcdn.com/images/mng_jn/post/99228e3a-abcf-43a6-aeaf-8787358930a3/image.png" alt=""></p>
<p>✔️loadbalancer(master client)</p>
<pre><code>$ kubectl expose pod nginx-pod --name loadbalancer --type LoadBalancer --external-ip 3.39.227.176 --port 80
service/loadbalancer exposed
 ## woker1의 외부IP

[ec2-user@ip-10-14-33-225 workspace]$ kubectl get svc
NAME           TYPE           CLUSTER-IP       EXTERNAL-IP                                                                                PORT(S)        AGE
clusterip      ClusterIP      172.20.244.180   &lt;none&gt;                                                                                     80/TCP         53m
kubernetes     ClusterIP      172.20.0.1       &lt;none&gt;                                                                                     443/TCP        147m
loadbalancer   LoadBalancer   172.20.75.202    a8d5a6466ad014a70be8d6964d9aaaca-584221027.ap-northeast-2.elb.amazonaws.com,3.39.227.176   80:30733/TCP   2m4s
nodeport       NodePort       172.20.32.121    &lt;none&gt;         
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/64e575aa-8a7a-42a0-a1dc-4ebe0a2cf783/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/845aa5c7-740a-4cd5-9a47-5ea198581e9b/image.png" alt="">
이건 안되는거 맞음.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/6e86523e-4e91-48f8-828e-0d2a9ab0e4ec/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/5c221807-10b6-4e21-94d7-3a2676912083/image.png" alt=""></p>
<pre><code>[ec2-user@ip-10-14-33-225 workspace]$ kubectl exec nginx-pod -- sh -c &quot;echo &#39;Hello World&#39; &gt; /usr/share/nginx/html/index.html&quot;
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/69a27f7b-562e-413e-8775-6f4a74b71005/image.png" alt=""></p>
<p>✔️pod,service manifest</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/cb6c4c53-04ee-4f66-85c8-9c8163601cf9/image.png" alt=""></p>
<pre><code>$ vi pod-loadbalancer.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-web
  labels:
    app: nginx-pod
spec:
  containers:
  - name: nginx-pod-container
    image: public.ecr.aws/n3l5a9n9/web-site:v1.0
---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-pod
spec:
  type: LoadBalancer
#  externalIPs:
#  - 192.168.56.119
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

$ kubectl apply -f pod-loadbalancer.yaml


[ec2-user@ip-10-14-33-225 workspace]$ kubectl get all
NAME                READY   STATUS              RESTARTS   AGE
pod/nginx-pod       1/1     Running             0          73m
pod/nginx-pod-web   0/1     ContainerCreating   0          5s

NAME                               TYPE           CLUSTER-IP       EXTERNAL-IP                                                                                PORT(S)        AGE
service/clusterip                  ClusterIP      172.20.244.180   &lt;none&gt;                                                                                     80/TCP         72m
service/kubernetes                 ClusterIP      172.20.0.1       &lt;none&gt;                                                                                     443/TCP        166m
service/loadbalancer               LoadBalancer   172.20.75.202    a8d5a6466ad014a70be8d6964d9aaaca-584221027.ap-northeast-2.elb.amazonaws.com,3.39.227.176   80:30733/TCP   21m
service/loadbalancer-service-pod   LoadBalancer   172.20.202.201   ad3b00e165e1b47eabcbdb0c2b222581-1250017540.ap-northeast-2.elb.amazonaws.com               80:30044/TCP   5s
service/nodeport                   NodePort       172.20.32.121    &lt;none&gt;                                                                                     80:30277/TCP   68m

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/3600a9bb-452c-489c-8ce8-d50b02613389/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/ca6e8f64-c080-44c5-a418-5909604e1297/image.png" alt=""></p>
<h2 id="📙-삭제">📙 삭제</h2>
<ol>
<li>노드그룹 삭제</li>
<li>master1삭제(종료)</li>
<li>route53레코드 삭제</li>
<li>로드밸런서 삭제</li>
<li>보안그룹 삭제(default 제외하고 다 삭제하였음)</li>
<li>노드그룹 삭제 확인 후 클러스터 삭제</li>
<li>버킷 삭제</li>
<li>ECR 리포지토리 삭제</li>
</ol>
<p>📙✔️✏️📢⭐️📌</p>
<h1 id="📌-기타">📌 기타</h1>
<h3 id="⭐️-limitrange">⭐️ limitrange</h3>
<p>용량 값을 넣지 않아도 자동으로 셋팅</p>
<h3 id="⭐️trouble-shooting">⭐️trouble shooting</h3>
<pre><code>
[root@master1 test2]# kubectl get pod -o wide
NAME                            READY   STATUS         RESTARTS   AGE   IP            NODE      NOMINATED NODE         READINESS GATES
pod-nodeselector-metadata       0/1     NodeAffinity   0          17h   &lt;none&gt;        worker1   &lt;none&gt;                 &lt;none&gt;
pod-nodeselector-metadata-app   1/1     Running        0          80m   10.244.2.28   worker2   &lt;none&gt;                 &lt;none&gt;
pod-schedule-metadata           1/1     Running        1          17h   10.244.2.27   worker2   &lt;none&gt;                 &lt;none&gt;
pod-taint-metadata              0/1     Pending        0          14m   &lt;none&gt;        &lt;none&gt;    &lt;none&gt;                 &lt;none&gt;


[root@master1 test2]# kubectl describe pod pod-taint-metadata

Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  17m   default-scheduler  0/3 nodes are available: 1 Insufficient memory, 1 node(s)       had taint {node-role.kubernetes.io/master: }, that the pod didn&#39;t tolerate, 1 node(s) had taint {tier: dev}, t      hat the pod didn&#39;t tolerate.
  Warning  FailedScheduling  17m   default-scheduler  0/3 nodes are available: 1 Insufficient memory, 1 node(s)       had taint {node-role.kubernetes.io/master: }, that the pod didn&#39;t tolerate, 1 node(s) had taint {tier: dev}, t      hat the pod didn&#39;t tolerate.

</code></pre><p>taint 삭제하기</p>
<pre><code># kubectl taint node worker1 tier-
</code></pre><h3 id="⭐️-iam-역할">⭐️ IAM-역할</h3>
<p><strong>서비스 권한을 리소스에게 주기</strong>
<strong>다양한 서비스들이 또다른 서비스에 접근해서 조작할 수 있도록 도움.</strong>
✔️ IAM - 역할 - 역할 만들기 - AWS서비스, EC2
<img src="https://velog.velcdn.com/images/mng_jn/post/13f512c2-6258-4ae9-8b4e-ce385930002b/image.png" alt=""></p>
<p>✔️s3검색 - AmazonS3FullAccess체크 - 다음
✔️이름 : S3-role - 역할생성
✔️S3진입 - 버킷 생성
버킷 이름 : s3.lovemj.shop
ACL비활성화,버전관리 활성화,서버측암호화 활성화, S3관리형 키 - 버킷 만들기</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/b921a94c-625c-4452-a249-55858292f996/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/a8906927-7cd3-4dbf-9aaa-f175986e42ce/image.png" alt=""></p>
<pre><code>[ec2-user@ip-10-14-33-225 ~]$ aws s3 ls
2022-07-21 02:38:55 s3.lovemj.shop
</code></pre><p>-&gt;로그인하지 않아도 역할을 통해서 s3접근 가능.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0720[kubernetes]]]></title>
            <link>https://velog.io/@mng_jn/0720</link>
            <guid>https://velog.io/@mng_jn/0720</guid>
            <pubDate>Wed, 20 Jul 2022 03:42:50 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-configmap">📌 configmap</h1>
<pre><code>vi deployment-config01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: configapp
  labels:
    app: configapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: configapp
  template:
    metadata:
      labels:
        app: configapp
    spec:
      containers:
      - name: testapp
        image: nginx
        ports:
        - containerPort: 8080
        env:
        - name: DEBUG_LEVEL # 컨테이너 안에서의 변수명
          valueFrom:
            configMapKeyRef:
              name: config-dev
              key: DEBUG_INFO
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: configapp
  name: configapp-svc
  namespace: default
spec:
  type: NodePort
  ports:
  - nodePort: 30800
    port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: configapp


[root@master1 configmap]# kubectl apply -f deployment-config01.yaml

[root@master1 configmap]# kubectl describe pod configapp-c9bb7b748-2ft9p

[root@master1 configmap]# kubectl exec -it configapp-c9bb7b748-2ft9p -- bash



</code></pre><h2 id="📙-wordpress-configpod">📙 wordpress config(pod)</h2>
<pre><code># vi configmap-wordpress.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: config-wordpress
  namespace: default
data:
  MYSQL_ROOT_HOST: &#39;%&#39;
  MYSQL_ROOT_PASSWORD: mode1752
  MYSQL_DATABASE: wordpress
  MYSQL_USER: wpuser
  MYSQL_PASSWORD: wppass

# kubectl apply -f configmap-wordpress.yaml
# kubectl describe configmaps config-wordpress

</code></pre><pre><code>vi mysql-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    app: mysql-pod
spec:
  containers:
  - name: mysql-container
    image: mysql:5.7
    envFrom: ## 컨피그맵 설정 전체를 한꺼번에 불러와서 사용하기 
    - configMapRef:
        name: config-wordpress
    ports:
    - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
spec:
  type: ClusterIP
  selector:
    app: mysql-pod
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306

[root@master1 configmap]# kubectl apply -f mysql-pod-svc.yaml
[root@master1 configmap]# kubectl get all


vi wordpress-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wordpress-pod
  labels:
    app: wordpress-pod
spec:
  containers:
  - name: wordpress-container
    image: wordpress
    env:
    - name: WORDPRESS_DB_HOST
      value: mysql-svc:3306
    - name: WORDPRESS_DB_USER
      valueFrom:
        configMapKeyRef:
          name: config-wordpress
          key: MYSQL_USER
    - name: WORDPRESS_DB_PASSWORD
      valueFrom:
        configMapKeyRef:
          name: config-wordpress
          key: MYSQL_PASSWORD
    - name: WORDPRESS_DB_NAME
      valueFrom:
        configMapKeyRef:
          name: config-wordpress
          key: MYSQL_DATABASE
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-svc
spec:
  type: LoadBalancer
#  externalIPs:
#  - 192.168.2.0
  selector:
    app: wordpress-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/d61546f9-c08d-4ecd-bf03-b0522c094034/image.png" alt=""></p>
<h2 id="📙-wordpress-configdeploy">📙 wordpress config(deploy)</h2>
<pre><code># vi mysql-deploy-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deploy
  labels:
    app: mysql-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql-deploy
  template:
    metadata:
      labels:
        app: mysql-deploy
    spec:
      containers:
      - name: mysql-container
        image: mysql:5.7
        envFrom:
        - configMapRef:
            name: config-wordpress
        ports:
        - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
spec:
  type: ClusterIP
  selector:
    app: mysql-deploy
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306

[root@master1 configmap]# kubectl apply -f mysql-deploy-svc.yaml

</code></pre><pre><code>[root@master1 configmap]# kubectl delete pod mysql-pod
pod &quot;mysql-pod&quot; deleted
[root@master1 configmap]# kubectl delete pod wordpress-pod
</code></pre><pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-deploy
  labels:
    app: wordpress-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress-deploy
  template:
    metadata:
      labels:
        app: wordpress-deploy
    spec:
      containers:
      - name: wordpress-container
        image: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: mysql-svc:3306
        - name: WORDPRESS_DB_USER
          valueFrom:
            configMapKeyRef:
              name: config-wordpress
              key: MYSQL_USER
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: config-wordpress
              key: MYSQL_PASSWORD
        - name: WORDPRESS_DB_NAME
          valueFrom:
            configMapKeyRef:
              name: config-wordpress
              key: MYSQL_DATABASE
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-svc
spec:
  type: LoadBalancer
#  externalIPs:
#  - 192.168.2.0
  selector:
    app: wordpress-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f wordpress-deploy-svc.yaml
# kubectl get all -o wide
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/1e1c654e-d4cc-4ca7-94d1-89f79a3c0ffe/image.png" alt=""></p>
<pre><code>[root@master1 configmap]# kubectl exec -it wordpress-deploy-57787cfd48-btk9r  -- bash
root@wordpress-deploy-57787cfd48-btk9r:/var/www/html#
root@wordpress-deploy-57787cfd48-btk9r:/var/www/html#
root@wordpress-deploy-57787cfd48-btk9r:/var/www/html# ls -al
</code></pre><h1 id="📌-namespace">📌 namespace</h1>
<p>*<em>AZURE resource group같은 느낌 *</em></p>
<pre><code># kubectl get namespaces
# kubectl config get-contexts kubernetes-admin@kubernetes
# kubectl create namespace test-namespace
# kubectl run nginx-pod1 --image=nginx -n test-namespace
# kubectl get pod -n test-namespace
# kubectl config set-context kubernetes-admin@kubernetes --namespace=test-namespace ##default namespace로 설정

[root@master1 ~]# kubectl config get-contexts kubernetes-admin@kubernetes
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   test-namespace

[root@master1 ~]# kubectl get pod
NAME         READY   STATUS    RESTARTS   AGE
nginx-pod1   1/1     Running   0          4m


# kubectl expose pod nginx-pod1 --type=LoadBalancer --name loadbalancer --port=80 ##metallb덕분에 external ip하지 않아도 됨.

[root@master1 ~]# kubectl get all
NAME             READY   STATUS    RESTARTS   AGE
pod/nginx-pod1   1/1     Running   0          7m40s

NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
service/loadbalancer   LoadBalancer   10.102.29.192   192.168.56.103   80:31344/TCP   10s

[root@master1 ~]# kubectl delete namespace test-namespace

[root@master1 ~]# kubectl get all
No resources found in test-namespace namespace.

[root@master1 ~]# kubectl config set-context kubernetes-admin@kubernetes --namespace= ## default로 돌아가기.

[root@master1 ~]# kubectl config get-contexts kubernetes-admin@kubernetes
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin

</code></pre><h1 id="📌resourcequota">📌ResourceQuota</h1>
<p><strong>어느부서(nameserver)가 전체 클러스터 용량을 점유할 수 있으니까 용량을 정해놓자. =&gt;resource Quota</strong></p>
<h2 id="📙-nameserver-생성">📙 nameserver 생성</h2>
<pre><code>[root@master1 ~]# kubectl create ns my-ns
namespace/my-ns created
[root@master1 ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   26h
kube-flannel      Active   26h
kube-node-lease   Active   26h
kube-public       Active   26h
kube-system       Active   26h
metallb-system    Active   21h
my-ns             Active   13s
</code></pre><h2 id="📙-resourcequota생성-pod제한">📙 resourcequota생성 (pod제한)</h2>
<pre><code># vi sample-resourcequota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: sample-resourcequota
  namespace: my-ns
spec:
  hard:
    count/pods: 5 ## pod 5개 이상 못만들게

kubectl describe resourcequotas sample-resourcequota -n my-ns
kubectl run new-nginx --image=nginx -n my-ns
kubectl get po -n my-ns</code></pre><h2 id="📙-pod-5개-이상-생성-제한-확인">📙 pod 5개 이상 생성 제한 확인</h2>
<pre><code>
[root@master1 resourcequota]# kubectl get resourcequotas -n my-ns
NAME                   AGE   REQUEST           LIMIT
sample-resourcequota   96s   count/pods: 0/5

[root@master1 resourcequota]# kubectl run new-nginx --image=nginx -n my-ns
pod/new-nginx created

[root@master1 resourcequota]# kubectl run new-nginx1 --image=nginx -n my-ns
pod/new-nginx1 created


[root@master1 resourcequota]# kubectl run new-nginx12 --image=nginx -n my-ns
pod/new-nginx12 created

[root@master1 resourcequota]# kubectl run new-nginx3 --image=nginx -n my-ns
pod/new-nginx3 created

[root@master1 resourcequota]# kubectl run new-nginx4 --image=nginx -n my-ns
pod/new-nginx4 created

[root@master1 resourcequota]# kubectl run new-nginx5 --image=nginx -n my-ns
Error from server (Forbidden): pods &quot;new-nginx5&quot; is forbidden: exceeded quota: sample-resourcequota, requested: count/pods=1, used: count/pods=5, limited: count/pods=5

[root@master1 resourcequota]# kubectl get po -n my-ns
NAME          READY   STATUS    RESTARTS   AGE
new-nginx     1/1     Running   0          34s
new-nginx1    1/1     Running   0          30s
new-nginx12   1/1     Running   0          26s
new-nginx3    1/1     Running   0          21s
new-nginx4    1/1     Running   0          17s
</code></pre><p>5개 초과로 생성 안됨.</p>
<h2 id="📙-pod-제한-수정하기-8개">📙 pod 제한 수정하기 (8개)</h2>
<pre><code>[root@master1 resourcequota]# vi sample-resourcequota.yaml
-&gt;여기서 수정

[root@master1 resourcequota]# kubectl edit resourcequotas sample-resourcequota -n my-ns
-&gt; spec 부분 수정
</code></pre><p>늘린다음에 줄인다고 Pod가 삭제되지는 않지만 다시 더 생성은 안됨.</p>
<h2 id="📙-namespace-default로-바꾸기">📙 namespace default로 바꾸기</h2>
<pre><code>[root@master1 resourcequota]#  kubectl config set-context kubernetes-admin@kubernetes --namespace=my-ns
Context &quot;kubernetes-admin@kubernetes&quot; modified.

[root@master1 resourcequota]# kubectl config get-contexts kubernetes-admin@kubernetes
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   my-ns
</code></pre><h2 id="📙--cpu-등-용량-제한-resourcequota">📙  CPU 등 용량 제한 resourcequota</h2>
<pre><code>
vi sample-resourcequota-usable.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: sample-resourcequota-usable
spec:
  hard:
    requests.memory: 2Gi
    requests.storage: 5Gi
    sample-storageclass.storageclass.storage.k8s.io/requests.storage: 5Gi
    requests.ephemeral-storage: 5Gi
    requests.nvidia.com/gpu: 2
    limits.cpu: 4
    limits.ephemeral-storage: 10Gi
    limits.nvidia.com/gpu: 4

 [root@master1 resourcequota]# kubectl get resourcequotas
NAME                          AGE   REQUEST                                                                                                                                                                                     LIMIT
sample-resourcequota          15m   count/pods: 8/8                                                                                                                     
sample-resourcequota-usable   50s   requests.ephemeral-storage: 0/5Gi, requests.memory: 0/2Gi, requests.nvidia.com/gpu: 0/2, requests.storage: 0/5Gi, sample-storageclass.storageclass.storage.k8s.io/requests.storage: 0/5Gi   limits.cpu: 0/4, limits.ephemeral-storage: 0/10Gi, limits.nvidia.com/gpu: 0/4
</code></pre><h2 id="📙-pod-생성">📙 pod 생성</h2>
<p>✔️ 자원 할당을 넣지 않은 경우 -&gt; error</p>
<pre><code>
vi sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16

[root@master1 resourcequota]# kubectl apply -f sample-pod.yaml
Error from server (Forbidden): error when creating &quot;sample-pod.yaml&quot;: pods &quot;sample-pod&quot; is forbidden: failed quota: sample-resourcequota-usable: must specify limits.cpu,requests.memory
</code></pre><p>✔️ 자원 할당을 넣은 경우</p>
<pre><code>vi sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        memory: &quot;64Mi&quot;
        cpu: &quot;50m&quot;
      limits:
        memory: &quot;128Mi&quot;
        cpu: &quot;100m&quot; #1000milicore ; 1core</code></pre><p>1코어를 5%<del>10% 사용하겠다. 50m;5%
메모리를 64</del>128m 사용하겠다.</p>
<pre><code>[root@master1 resourcequota]# kubectl apply -f sample-pod.yaml
Error from server (Forbidden): error when creating &quot;sample-pod.yaml&quot;: pods &quot;sample-pod&quot; is forbidden: exceeded quota: sample-resourcequota, requested: count/pods=1, used: count/pods=5, limited: count/pods=5


[root@master1 resourcequota]# kubectl edit resourcequotas sample-resourcequota
resourcequota/sample-resourcequota edited
-&gt; spec &quot;10&quot;으로.

[root@master1 resourcequota]# kubectl apply -f sample-pod.yaml
pod/sample-pod created
-&gt;생성 성공.</code></pre><p>-&gt;자원할당에서 제한은 없지만 pod제한에서 걸림. Pod 제한 수정하고 pod 생성 완료.</p>
<h2 id="📙-memory-requests-초과해서-생성해보기pod">📙 memory requests 초과해서 생성해보기(pod)</h2>
<pre><code>[root@master1 resourcequota]# kubectl delete pod sample-pod

[root@master1 resourcequota]# vi sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        memory: &quot;3Gi&quot;
        cpu: &quot;50m&quot;
      limits:
        memory: &quot;6Gi&quot;
        cpu: &quot;100m&quot;

[root@master1 resourcequota]# kubectl apply -f sample-pod.yaml
Error from server (Forbidden): error when creating &quot;sample-pod.yaml&quot;: pods &quot;sample-pod&quot; is forbidden: exceeded quota: sample-resourcequota-usable, requested: requests.memory=3Gi, used: requests.memory=0, limited: requests.memory=2Gi

</code></pre><p>-&gt;memory제한으로 인해 생성 안됨.</p>
<pre><code>[root@master1 resourcequota]# vi sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        memory: &quot;2Gi&quot;
        cpu: &quot;50m&quot;
      limits:
        memory: &quot;6Gi&quot;
        cpu: &quot;100m&quot;
[root@master1 resourcequota]# kubectl apply -f sample-pod.yaml
pod/sample-pod created
</code></pre><p>-&gt;2g로 하면 무난히 생성</p>
<pre><code>[root@master1 resourcequota]# vi sample-pod.yaml
[root@master1 resourcequota]# kubectl apply -f sample-pod.yaml
The Pod &quot;sample-pod&quot; is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)
</code></pre><p>-&gt;중간에 메모리 바꾼게 적용되지는 않음 (수정 불가), 지우고 다시 생성만 가능.</p>
<h2 id="📙--cpu초과">📙  CPU초과</h2>
<pre><code>[root@master1 resourcequota]# kubectl delete pod sample-pod
pod &quot;sample-pod&quot; deleted

[root@master1 resourcequota]# vi sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        memory: &quot;1Gi&quot;
        cpu: &quot;4050m&quot;
      limits:
        memory: &quot;6Gi&quot;
        cpu: &quot;4100m&quot;

[root@master1 resourcequota]# kubectl apply -f sample-pod.yaml
Error from server (Forbidden): error when creating &quot;sample-pod.yaml&quot;: pods &quot;sample-pod&quot; is forbidden: exceeded quota: sample-resourcequota-usable, requested: limits.cpu=4100m, used: limits.cpu=0, limited: limits.cpu=4

[root@master1 resourcequota]# vi sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        memory: &quot;64Mi&quot;
        cpu: &quot;3950m&quot;
      limits:
        memory: &quot;128Mi&quot;
        cpu: &quot;4000m&quot;

[root@master1 resourcequota]# kubectl apply -f sample-pod.yaml
pod/sample-pod created

[root@master1 resourcequota]# kubectl get pod
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   0/1     Pending   0          6s
</code></pre><h2 id="📙-시스템-자원과-리소스-쿼터">📙 시스템 자원과 리소스 쿼터</h2>
<pre><code>root@master1 resourcequota]# kubectl describe node worker2
</code></pre><p>node리소스 감안해서 생성해야함.(리소스 쿼터보다 시스템 자원이 우선.)
시스템 자원보다크고 리소스쿼터보다 작은 경우 pod 생성이 되긴 하지만 Pending상태에서 넘어가지 않음.</p>
<pre><code>[root@master1 resourcequota]# vi sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        memory: &quot;64Mi&quot;
        cpu: &quot;500m&quot;
      limits:
        memory: &quot;128Mi&quot;
        cpu: &quot;1000m&quot;


[root@master1 resourcequota]# kubectl get pod
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          3m26s
</code></pre><h2 id="📙-deploy">📙 deploy</h2>
<pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-resource
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.16
        resources:
          requests:
            memory: &quot;64Mi&quot;
            cpu: &quot;50m&quot;
          limits:
            memory: &quot;128Mi&quot;
            cpu: &quot;100m&quot;

[root@master1 resourcequota]# kubectl apply -f sample-resource.yaml


</code></pre><h1 id="📌-limitrange">📌 limitrange</h1>
<pre><code>[root@master1 ~]# mkdir limitrange &amp;&amp; cd $_


# vi sample-limitrange-container.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: sample-limitrange-container
  namespace: my-ns
spec:
  limits: # 최대 2개 파드 생성, 1개 더하면 생성 안됨.
  - type: Container # 컨테이너에 대한
    default: # 기본 최대  Limits, 정한 리소스가 부족하면 컨테이너가 생성되지 않는다.
      memory: 512Mi
      cpu: 500m
    defaultRequest: # 지금 컨테이너에 셋팅할 값. 직접 정하지 않은 경우 최소 용량, 최소 확보 용량.
      memory: 256Mi
      cpu: 250m
    max: # 직접 설정할 경우 값
      memory: 1024Mi
      cpu: 1000m
    min:
      memory: 128Mi
      cpu: 125m
    maxLimitRequestRatio: # Requests와 Limit의 차이 허용 비율 2배, 오버 커밋을 피할 수 있다.
      memory: 2
      cpu: 2


[root@master1 limitrange]# kubectl apply -f sample-limitrange-container.yaml
limitrange/sample-limitrange-container created

[root@master1 limitrange]# kubectl describe limitranges sample-limitrange-container


</code></pre><pre><code>[root@master1 limitrange]# vi sample-pod-limit.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-limitrange
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16

[root@master1 limitrange]# kubectl apply -f sample-pod-limit.yaml
pod/sample-pod-limitrange created
[root@master1 limitrange]# kubectl get pod -o wide</code></pre><p>-&gt; 리소스쿼터와 리밋레인지 같이 사용할 수 있다. =&gt; 컨테이너 부분에 굳이 자원 할당하지 않아도 리밋레인지에 잘 셋팅 해놓으면 매번 만들때마다 컨테이너 쪽에 자원 적어줄 필요 없다.</p>
<pre><code>[root@master1 limitrange]# kubectl describe pod sample-pod-limitrange
</code></pre><h2 id="📙리밋레인지최소보다-작은-용량의-pod-생성">📙리밋레인지(최소)보다 작은 용량의 pod 생성</h2>
<pre><code>[root@master1 limitrange]# vi sample-pod-overrequest.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-overrequest
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        cpu: 100m
      limits:
        cpu: 100m

[root@master1 limitrange]# kubectl apply -f sample-pod-overrequest.yaml
Error from server (BadRequest): error when creating &quot;sample-pod-overrequest.yaml&quot;: Pod in version &quot;v1&quot; cannot be handled as a Pod: v1.Pod.Spec: v1.
</code></pre><p>-&gt; 생성 안됨.</p>
<pre><code>[root@master1 limitrange]# vi sample-pod-overrequest.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-overrequest
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        cpu: 125m
      limits:
        cpu: 125m

[root@master1 limitrange]# kubectl apply -f sample-pod-overrequest.yaml
pod/sample-pod-overrequest created

</code></pre><p>-&gt; 리밋레인지에 맞게 해주니 생성 완료.</p>
<h2 id="📙-limitrange의-overatio-초과해보기">📙 limitrange의 overatio 초과해보기</h2>
<p> *<em>CPU 리퀘스트와 리밋 차이 2배 이상 *</em></p>
<pre><code> [root@master1 limitrange]# vi sample-pod-overratio.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-overratio
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        cpu: 125m
      limits:
        cpu: 500m

[root@master1 limitrange]# kubectl apply -f sample-pod-overratio.yaml
Error from server (Forbidden): error when creating &quot;sample-pod-overratio.yaml&quot;: pods &quot;sample-pod-overratio&quot; is forbidden: cpu max limit to request ratio per Container is 2, but provided ratio is 4.000000
</code></pre><p>-&gt; 생성 안됨 .</p>
<pre><code>[root@master1 limitrange]# vi sample-pod-overratio.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-overratio
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        cpu: 250m
      limits:
        cpu: 500m

[root@master1 limitrange]# kubectl apply -f sample-pod-overratio.yaml
pod/sample-pod-overratio created

[root@master1 limitrange]# kubectl get po -o wide
NAME                               READY   STATUS    RESTARTS   AGE    IP            NODE      NOMINATED NODE   READINESS GATES
new-pod                            1/1     Running   0          45m    10.244.1.22   worker1   &lt;none&gt;           &lt;none&gt;
sample-pod                         1/1     Running   0          55m    10.244.2.20   worker2   &lt;none&gt;           &lt;none&gt;
sample-pod-limitrange              1/1     Running   0          15m    10.244.1.23   worker1   &lt;none&gt;           &lt;none&gt;
sample-pod-overratio               0/1     Pending   0          71s    &lt;none&gt;        &lt;none&gt;    &lt;none&gt;           &lt;none&gt;

</code></pre><p>-&gt; 리밋레인지에 맞게 해주니 생성 완료. 하지만 펜딩걸림.</p>
<pre><code>apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-overratio
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    resources:
      requests:
        cpu: 125m
      limits:
        cpu: 250m


[root@master1 limitrange]# kubectl apply -f sample-pod-overratio.yaml
pod/sample-pod-overratio created
[root@master1 limitrange]# kubectl get po -o wide
NAME                               READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
new-pod                            1/1     Running   0          47m     10.244.1.22   worker1   &lt;none&gt;           &lt;none&gt;
sample-pod                         1/1     Running   0          57m     10.244.2.20   worker2   &lt;none&gt;           &lt;none&gt;
sample-pod-limitrange              1/1     Running   0          17m     10.244.1.23   worker1   &lt;none&gt;           &lt;none&gt;
sample-pod-overratio               1/1     Running   0          4s      10.244.2.23   worker2   &lt;none&gt;           &lt;none&gt;
</code></pre><p>-&gt; cpu줄여서 완료!</p>
<h1 id="📌-schedule">📌 schedule</h1>
<pre><code>[root@master1 limitrange]# kubectl delete pod,deploy --all

[root@master1 ~]# mkdir schedule &amp;&amp; cd $_

</code></pre><h2 id="📙파드-스케줄자동-배치">📙파드 스케줄(자동 배치)</h2>
<pre><code># vi pod-schedule.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-schedule-metadata
  labels:
    app: pod-schedule-labels
spec:
  containers:
  - name: pod-schedule-containers
    image: nginx
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: pod-schedule-service
spec:
  type: NodePort
  selector:
    app: pod-schedule-labels
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

[root@master1 schedule]# kubectl apply -f pod-schedule.yaml
pod/pod-schedule-metadata created
service/pod-schedule-service create


[root@master1 schedule]# kubectl get all
NAME                        READY   STATUS    RESTARTS   AGE
pod/pod-schedule-metadata   1/1     Running   0          29s

NAME                           TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/pod-schedule-service   NodePort   10.108.76.214   &lt;none&gt;        80:30953


[root@master1 schedule]# curl 10.108.76.214
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
</code></pre><h2 id="📙-파드-노드네임수동-배치--노드-지정해서-배치">📙 파드 노드네임(수동 배치- 노드 지정해서 배치)</h2>
<pre><code># vi pod-nodename.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename-metadata
  labels:
    app: pod-nodename-labels
spec:
  containers:
  - name: pod-nodename-containers
    image: nginx
    ports:
    - containerPort: 80
  nodeName: worker2
---
apiVersion: v1
kind: Service
metadata:
  name: pod-nodename-service
spec:
  type: NodePort
  selector:
    app: pod-nodename-labels
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

[root@master1 schedule]# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
ad-hoc1                 1/1     Running   0          13m   10.244.1.25   worker1   &lt;none&gt;           &lt;none&gt;
pod-nodename-metadata   1/1     Running   0          32s   10.244.2.25   worker2   &lt;none&gt;           &lt;none&gt;
pod-schedule-metadata   1/1     Running   0          17m   10.244.2.24   worker2   &lt;none&gt;           &lt;none&gt;
</code></pre><h2 id="📙-노드-셀렉터수동-배치">📙 노드 셀렉터(수동 배치)</h2>
<pre><code># kubectl label nodes worker1 tier=dev
# kubectl get nodes --show-labels

# vi pod-nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeselector-metadata
  labels:
    app: pod-nodeselector-labels
spec:
  containers:
  - name: pod-nodeselector-containers
    image: nginx
    ports:
    - containerPort: 80
  nodeSelector:
    tier: dev
---
apiVersion: v1
kind: Service
metadata:
  name: pod-nodeselector-service
spec:
  type: NodePort
  selector:
    app: pod-nodeselector-labels
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl label nodes worker1 tier-
# kubectl get nodes --show-labels

[root@master1 schedule]# kubectl label node worker1 tier-
-&gt; 라벨지우기

[root@master1 schedule]# kubectl get nodes --show-labels
</code></pre><h2 id="📙-taint---해당-노드에-스케쥴링-방지">📙 taint - 해당 노드에 스케쥴링 방지</h2>
<pre><code># kubectl taint node worker1 tier=dev:NoSchedule
# kubectl describe nodes worker1

</code></pre><p>-&gt;하다가 수업 끝!</p>
<p>📙✔️✏️📢⭐️📌</p>
<h1 id="📌-기타">📌 기타</h1>
<h3 id="⭐️-kubernetes-이미지-pull오류-해결">⭐️ kubernetes 이미지 pull오류 해결</h3>
<pre><code># kubectl create secret generic mj030kk --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson

# kubectl patch -n default serviceaccount/default -p &#39;{&quot;imagePullSecrets&quot;:[{&quot;name&quot;: &quot;mj030kk&quot;}]}&#39;

# kubectl describe serviceaccount default -n default
</code></pre><p>docker로그인에 이어서 쿠버네티스에서도 해주어야 함.</p>
<p>namespace따라가므로 namespace 바뀌면 바뀐 namespace 넣어서도 진행해주어야 함.</p>
<pre><code># kubectl patch -n my-ns serviceaccount/default -p &#39;{&quot;imagePullSecrets&quot;:[{&quot;name&quot;: &quot;mj030kk&quot;}]}&#39;</code></pre><h3 id="⭐️-명령어-watch">⭐️ 명령어 watch</h3>
<pre><code>[root@master1 configmap]# watch kubectl get all</code></pre><p>상태확인 업데이트 하면서 볼 수 있게 해줌.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0719[kubernetes]]]></title>
            <link>https://velog.io/@mng_jn/0719kubernetes</link>
            <guid>https://velog.io/@mng_jn/0719kubernetes</guid>
            <pubDate>Tue, 19 Jul 2022 02:10:15 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-0718복습">📌 0718복습</h1>
<p>✔️volume; pv-pvc-pod
storageclassname: aws의 ebs등 퍼블릭클라우드에서의 이름 적어주면 됨. 지금은 on-premise 환경이므로 manual.
persistentvolumereclaimploicy(볼륨 삭제 할 때의 정책); delete 명령어 적용시키려면 퍼블릭클라우드, openstack에서 사용해야함.</p>
<pre><code># vi pv-pvc-pod.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Mi # 가상 실습환경에서는 큰 의미가 없다. 퍼블릭클라우드에서는 의미 O
  accessModes:
    - ReadWriteOnce # ReadWriteMany, ReadOnlyMany(접근 보안)
  hostPath:
    path: &quot;/mnt/data&quot;
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi # 가상 실습환경에서는 큰 의미가 없다. 퍼블릭클라우드에서는 의미 O
      위 capacity 용량이 엄청 클 경우에는 부분적으로 할당해주어도 되지만 지금은 전체 용량이 작으므로 전체를 할당.
  selector:
    matchLabels:
      type: local
---
apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
  labels:
    app: task-pv-pod
spec:
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: &quot;http-server&quot;
      volumeMounts:
        - mountPath: &quot;/usr/share/nginx/html&quot;
          name: task-pv-storage
   volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim

# kubectl apply -f pv-pvc-pod.yaml     
# kubectl get pv
# kubectl get pvc
# kubectl describe pod task-pv-pod</code></pre><h1 id="📌-volume-nfs">📌 volume-nfs</h1>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/a42a6383-6dd7-4777-a8e5-68c77e5a0358/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/ee96a609-9e67-44ed-859f-4eaa680ad19b/image.png" alt=""></p>
<h2 id="📙-준비">📙 준비</h2>
<pre><code># yum install -y nfs-utils.x86_64 (worker,master)
[root@master1 ~]#  mkdir /nfs_shared 
[root@master1 ~]#  chmod 777 /nfs_shared
[root@master1 ~]#  echo &#39;/nfs_shared 192.168.0.0/20(rw,sync,no_root_squash)&#39; &gt;&gt; /etc/exports
[root@master1 ~]# systemctl enable --now nfs
[root@master1 ~]# mkdir nfs-pv-pvc-pod &amp;&amp; cd $_</code></pre><h2 id="📙-nfs-pv생성">📙 nfs-pv생성</h2>
<pre><code>
[root@master1 nfs-pv-pvc-pod]# vi nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    server: 192.168.1.190
    path: /nfs_shared

# kubectl apply -f nfs-pv.yaml
[root@master1 nfs-pv-pvc-pod]# kubectl get pv
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE
nfs-pv           100Mi      RWX            Recycle          Available                                                   3s
</code></pre><p>✏️avilable ; 아직 사용하고 있지 않음 (사용가능) -&gt; 사용 하면 bound.</p>
<h2 id="📙-nfs-pvc-생성">📙 nfs-pvc 생성</h2>
<pre><code># vi nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi

# kubectl apply -f nfs-pvc.yaml

[root@master1 nfs-pv-pvc-pod]# kubectl get pv,pvc
NAME                              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
persistentvolume/nfs-pv           100Mi      RWX            Recycle          Bound    default/nfs-pvc                                 7m42s

NAME                                  STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/nfs-pvc         Bound    nfs-pv           100Mi      RWX                           14s</code></pre><p>✏️라벨과 셀렉터가 없는 경우에는  용량으로 연결.(가장 근접한 크기의 pv와 연결됨.)</p>
<h2 id="📙-nfs-pvc-deploy생성-pod">📙 nfs-pvc-deploy생성 (pod)</h2>
<pre><code># vi nfs-pvc-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-pvc-deploy
spec:
  replicas: 4 # spot
  selector:
    matchLabels:
      app: nfs-pvc-deploy
  template:
    metadata:
      labels:
        app: nfs-pvc-deploy
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: nfs-vol
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-vol
        persistentVolumeClaim:
          claimName: nfs-pvc

# kubectl apply -f nfs-pvc-deploy.yaml
# kubectl get pod
</code></pre><p>✏️df- h로 마운트 확인 (woker 1,2)
<img src="https://velog.velcdn.com/images/mng_jn/post/191ef865-644f-4435-aabc-688e0739f42a/image.png" alt=""></p>
<h2 id="📙-서비스로드밸런서생성-및-확인">📙 서비스(로드밸런서)생성 및 확인</h2>
<pre><code>[root@master1 nfs-pv-pvc-pod]# kubectl expose deployment nfs-pvc-deploy --type=LoadBalancer --name=nfs-pvc-deploy-svc1 --external-ip 192.168.1.190 --port=80
[root@master1 nfs-pv-pvc-pod]# kubectl get svc

[root@master1 nfs-pv-pvc-pod]# echo &quot;HELLO&quot; &gt; /nfs_shared/index.html
[root@master1 nfs-pv-pvc-pod]# ls /nfs_shared/
index.html

[root@master1 nfs-pv-pvc-pod]# curl 10.108.131.196
HELLO

[root@master1 nfs-pv-pvc-pod]# curl 192.168.1.190
HELLO</code></pre><h2 id="📙--삭제">📙  삭제</h2>
<pre><code>[root@master1 nfs-pv-pvc-pod]# kubectl delete deployments.apps nfs-pvc-deploy
deployment.apps &quot;nfs-pvc-deploy&quot; deleted

[root@master1 nfs-pv-pvc-pod]# kubectl delete pvc nfs-pvc
persistentvolumeclaim &quot;nfs-pvc&quot; deleted

[root@master1 nfs-pv-pvc-pod]# ls /nfs_shared/
</code></pre><p>-&gt; recycle로 인해 pvc를 삭제하자 안에 내용물도 삭제됨 (index.html)</p>
<h1 id="📌-실습환경-nat로-변경">📌 실습환경 NAT로 변경</h1>
<h2 id="📙-ip충돌나지-않도록-네트워크-설정">📙 IP충돌나지 않도록 네트워크 설정</h2>
<p>✔️virtual box전체 설정</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/ffea6939-cc7d-4b71-9ea2-e35ee559b17b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2dbe9c22-02c2-46fb-a65e-06572f78e0e9/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/a72883f5-9c67-4bde-98c9-eecbb11e4886/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/7a845cbc-f7b6-4a8a-8f31-f7cb1987e107/image.png" alt=""></p>
<hr>
<p>✔️ 각 서버 설정에서 설정</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/2c12e410-cf0a-4e9c-997d-2378c41bfcc8/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/08c51af7-a3fc-43fd-b670-ea08bc9349cf/image.png" alt="">
위 과정 master, worker1,2모두 진행 </p>
<h2 id="📙-서버-초기-설정">📙 서버 초기 설정</h2>
<p>IP table
master : 192.168.56.103
worker1 : 192.168.56.104
worker2 : 192.168.56.105</p>
<p><strong>--- Master,Worker ---</strong></p>
<pre><code># cat &lt;&lt;EOF &gt;&gt; /etc/hosts
192.168.56.103 master1
192.168.56.104 worker1
192.168.56.105 worker2
EOF

# kubeadm reset
</code></pre><p><strong>--- Master ---</strong></p>
<pre><code># kubeadm init --apiserver-advertise-address=192.168.56.103 --pod-network-cidr=10.244.0.0/16
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml</code></pre><p><strong>--- Worker ---</strong></p>
<pre><code># kubeadm join 192.168.56.103:6443 --token g1hqt8.2fh05t05cqdg17yq --discovery-token-ca-cert-hash sha256:2eded64c511417d2ca8bf022183c997dfa66d2206200b2ee9a99dca9a5d62810</code></pre><p><strong>--- Master ---</strong></p>
<pre><code>[root@master1 ~]# kubectl get no
NAME      STATUS   ROLES    AGE     VERSION
master1   Ready    master   4m34s   v1.19.16
worker1   Ready    &lt;none&gt;   62s     v1.19.16
worker2   Ready    &lt;none&gt;   49s     v1.19.16



[root@master1 ~]# kubectl get pods --all-namespaces ## 시스템에 의해서 만들어진 pod들 runnging상태인지 확인.(그래야 정상)

NAMESPACE      NAME                              READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-94x56             1/1     Running   0          75s
kube-flannel   kube-flannel-ds-d486s             1/1     Running   0          3m3s
kube-flannel   kube-flannel-ds-jcxbm             1/1     Running   0          88s
kube-system    coredns-f9fd979d6-9q647           1/1     Running   0          4m40s
kube-system    coredns-f9fd979d6-sdh7t           1/1     Running   0          4m40s
kube-system    etcd-master1                      1/1     Running   0          4m49s
kube-system    kube-apiserver-master1            1/1     Running   0          4m49s
kube-system    kube-controller-manager-master1   1/1     Running   0          4m49s
kube-system    kube-proxy-c5mc8                  1/1     Running   0          4m40s
kube-system    kube-proxy-jn4hv                  1/1     Running   0          75s
kube-system    kube-proxy-v4dgp                  1/1     Running   0          88s
kube-system    kube-scheduler-master1            1/1     Running   0          4m49s

</code></pre><h2 id="📙-사설레지스트리-수정">📙 사설레지스트리 수정</h2>
<p><strong>--- master,worker ---</strong></p>
<pre><code># vi /etc/docker/daemon.json</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/620d2a9a-ec3e-42a2-ba56-1b45370f6aef/image.png" alt=""></p>
<pre><code># systemctl restart docker
</code></pre><h2 id="📙-기본-동작-확인">📙 기본 동작 확인</h2>
<pre><code>[root@master1 ~]# docker tag nginx:latest 192.168.56.103:5000/nginx:latest

[root@master1 ~]# docker push 192.168.56.103:5000/nginx:latest

[root@master1 ~]# kubectl run nginx-pod2 --image=192.168.56.103:5000/nginx:latest

[root@master1 ~]# kubectl expose pod nginx-pod2 --name loadbalancer --type=LoadBalancer --external-ip 192.168.56.103 --port 80


[root@master1 ~]# kubectl get svc
NAME           TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
kubernetes     ClusterIP      10.96.0.1      &lt;none&gt;           443/TCP        45m
loadbalancer   LoadBalancer   10.107.39.44   192.168.56.103   80:32557/TCP   23s

[root@master1 ~]# curl 192.168.56.103
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
</code></pre><h1 id="📌-nat-환경에서-nfs-복습">📌 NAT 환경에서 nfs 복습</h1>
<h2 id="📙-기존에-설정해두었던-파일들-수정-및-확인">📙 기존에 설정해두었던 파일들 수정 및 확인</h2>
<pre><code>#  echo &#39;/nfs_shared 192.168.56.0/20(rw,sync,no_root_squash)&#39; &gt; /etc/exports
# systemctl restart nfs

# vi nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    server: 192.168.56.103
    path: /nfs_shared

# kubectl apply -f nfs-pv.yaml
# kubectl apply -f nfs-pvc.yaml

#vi nfs-pvc-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-pvc-deploy
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nfs-pvc-deploy
  template:
    metadata:
      labels:
        app: nfs-pvc-deploy
    spec:
      containers:
      - name: nginx
        image: 192.168.56.103:5000/nginx:latest
        volumeMounts:
        - name: nfs-vol
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-vol
        persistentVolumeClaim:
          claimName: nfs-pvc

# kubectl apply -f nfs-pvc-deploy.yaml

# kubectl expose deployment nfs-pvc-deploy --type=LoadBalancer --name=nfs-pvc-deploy-svc1 --external-ip 192.168.56.103 --port=80

[root@master1 nfs-pv-pvc-pod]# kubectl get svc
NAME                  TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
kubernetes            ClusterIP      10.96.0.1       &lt;none&gt;           443/TCP        158m
nfs-pvc-deploy-svc1   LoadBalancer   10.104.207.15   192.168.56.103   80:30589/TCP   9s


[root@master1 nfs-pv-pvc-pod]# curl 192.168.56.103 ##폴더에 파일이 없어서 403
&lt;html&gt;
&lt;head&gt;&lt;title&gt;403 Forbidden&lt;/title&gt;&lt;/head&gt;


[root@master1 nfs-pv-pvc-pod]# echo &quot;HELLO&quot; &gt; /nfs_shared/index.html
[root@master1 nfs-pv-pvc-pod]# curl 192.168.56.103
HELLO

[root@worker1 ~]# df -h
192.168.56.103:/nfs_shared  124G  4.1G  120G   4% /var/lib/kubelet/pods/732c7fdd-f6ab-4392-ae88-2bbaf6c6572f/volumes/kubernetes.io~nfs/nfs-pv

[root@worker2 ~]# df -h
192.168.56.103:/nfs_shared  124G  4.1G  120G   4% /var/lib/kubelet/pods/44b0bedb-2c24-4f75-ab50-c2aa80f4469d/volumes/kubernetes.io~nfs/nfs-pv

</code></pre><h1 id="📌-multi-container">📌 multi-container</h1>
<h2 id="📙-준비-1">📙 준비</h2>
<pre><code>[root@master1 ~]# mkdir test &amp;&amp; cd $_
[root@master1 test]# docker pull centos:7
[root@master1 test]# docker tag centos:7 192.168.56.103:5000/centos:7
[root@master1 test]# docker push 192.168.56.103:5000/centos:7
</code></pre><h2 id="📙-2개의-컨테이너가-있는-pod생성">📙 2개의 컨테이너가 있는 pod생성</h2>
<pre><code># vi multipod.yaml
apiVersion: v1
kind: Pod
metadata:
 name: multipod
spec:
 containers:
 - name: nginx-container        #1번째 컨테이너
   image: 192.168.56.103:5000/nginx:latest
   ports:
   - containerPort: 80
 - name: centos-container       #2번째 컨테이너
   image: 192.168.56.103:5000/centos:7
   command:
   - sleep
   - &quot;10000&quot;


[root@master1 test]# kubectl apply -f multipod.yaml

[root@master1 test]# kubectl get pod -o wide
NAME                              READY   STATUS    RESTARTS   AGE    IP           NODE      NOMINATED NODE   READINESS GATES
multipod                          2/2     Running   0          17s    10.244.1.5   worker1   &lt;none&gt;           &lt;none&gt;
</code></pre><pre><code>[root@master1 test]# kubectl describe pod multipod</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/190bd243-be2c-4f9a-8fa7-2fd793f7b2c8/image.png" alt=""></p>
<h2 id="📙-컨테이너웹서버에-진입하기">📙 컨테이너(웹서버)에 진입하기</h2>
<p>✔️nginx-container</p>
<pre><code>[root@master1 test]# kubectl exec -it multipod -c nginx-container -- bash
root@multipod:/# yum
bash: yum: command not found
root@multipod:/# apt-get
apt 2.2.4 (amd64)

root@multipod:/# cd /usr/share/nginx/
root@multipod:/usr/share/nginx# ls
</code></pre><p>-&gt; apt, yum 통해서 nginx임을 확인. yum없고 apt-get이 있는 것.</p>
<p>✔️ centos-container</p>
<pre><code>[root@master1 test]# kubectl exec -it multipod -c centos-container -- bash
[root@multipod /]# yum
Loaded plugins: fastestmirror, ovl
You need to give some command
Usage: yum [options] COMMAND
</code></pre><p>-&gt; yum 통해서 centos임을 확인. yum 작동함. </p>
<h2 id="📙-wordpress설치---웹서버와-db서버">📙 wordpress설치 - 웹서버와 DB서버</h2>
<pre><code>[root@master1 test]# docker pull mysql:5.7
[root@master1 test]# docker pull wordpress

[root@master1 test]# docker tag mysql:5.7 192.168.56.103:5000/mysql:5.7
[root@master1 test]# docker push 192.168.56.103:5000/mysql:5.7

[root@master1 test]# docker tag wordpress 192.168.56.103:5000/wordpress
[root@master1 test]# docker push 192.168.56.103:5000/wordpress:latest


</code></pre><pre><code># vi wordpress-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wordpress-pod
  labels:
    app: wordpress-pod
spec:
  containers:
  - name: mysql-container
    image: 192.168.56.103:5000/mysql:5.7
    env:
    - name: MYSQL_ROOT_HOST
      value: &#39;%&#39; # wpuser@%
    - name: MYSQL_ROOT_PASSWORD
      value: kosa0401
    - name: MYSQL_DATABASE
      value: wordpress
    - name: MYSQL_USER
      value: wpuser
    - name: MYSQL_PASSWORD
      value: wppass
    ports:
    - containerPort: 3306

  - name: wordpress-container
    image: 192.168.56.103:5000/wordpress
    env:
    - name: WORDPRESS_DB_HOST
      value: wordpress-pod:3306
    - name: WORDPRESS_DB_USER
      value: wpuser
    - name: WORDPRESS_DB_PASSWORD
      value: wppass 
    - name: WORDPRESS_DB_NAME
      value: wordpress
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment-wordpress
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.56.105
  selector:
    app: wordpress-pod
  ports:
  - protocol: TCP
    port: 80


[root@master1 test]# kubectl apply -f wordpress-pod-svc.yaml
[root@master1 test]# kubectl get all
[root@master1 test]# kubectl describe pod wordpress-pod
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/812b9857-70da-42af-83c9-7a632a316859/image.png" alt=""></p>
<p>✔️ 각각의 컨테이너에 진입해보기</p>
<pre><code>[root@master1 test]# kubectl exec -it wordpress-pod -c mysql-container -- bash
bash-4.2#
bash-4.2#
bash-4.2#
bash-4.2# find / -name mysql
/etc/mysql
/usr/bin/mysql
/usr/lib/mysqlsh/lib/python3.9/site-packages/oci/mysql


[root@master1 test]# kubectl exec -it wordpress-pod -c wordpress-container -- bash
root@wordpress-pod:/var/www/html#
root@wordpress-pod:/var/www/html#
root@wordpress-pod:/var/www/html# ls
index.php        wp-admin              wp-config-sample.php  wp-includes        wp-mail.php       xmlrpc.php
license.txt      wp-blog-header.php    wp-config.php         wp-links-opml.php  wp-settings.php
readme.html      wp-comments-post.php  wp-content            wp-load.php        wp-signup.php
wp-activate.php  wp-config-docker.php  wp-cron.php           wp-login.php       wp-trackback.php
</code></pre><h1 id="📌-metallbdhcp">📌 metallb(DHCP)</h1>
<h2 id="📙-아무-ip로-loadbalancer-작동-되는지-확인하기">📙 아무 IP로 loadbalancer 작동 되는지 확인하기</h2>
<pre><code>[root@master1 test]# kubectl get svc
NAME                                        TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
kubernetes                                  ClusterIP      10.96.0.1       &lt;none&gt;           443/TCP        4h1m
loadbalancer-service-deployment-wordpress   LoadBalancer   10.111.5.7      192.168.56.105   80:31198/TCP   27m
nfs-pvc-deploy-svc1                         LoadBalancer   10.104.207.15   192.168.56.103   80:30589/TCP   82m

[root@master1 test]# kubectl delete -f .


[root@master1 test]# vi wordpress-pod-svc.yaml -&gt; 맨 하단 ip수정
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment-wordpress
spec:
  type: LoadBalancer
  externalIPs:
  - 172.31.2.200
  selector:
    app: wordpress-pod
  ports:
  - protocol: TCP
    port: 80

[root@master1 test]# kubectl apply -f wordpress-pod-svc.yaml
[root@master1 test]# kubectl apply -f .

[root@master1 test]# curl 172.31.2.200
^C</code></pre><p>-&gt;192.168.56.X도(다른분들이 실습), 다른 IP대역(나)도 작동안됨!!!</p>
<h2 id="📙-metallb">📙 metallb</h2>
<pre><code>[root@master1 ~]# yum install -y git
# git clone https://github.com/hali-linux/_Book_k8sInfra.git

[root@master1 test]# kubectl get po --all-namespaces
[root@master1 test]# docker describe metallb-system speaker-bk485
[root@master1 test]# docker pull metallb/controller:v0.8.2
[root@master1 test]# docker pull metallb/speaker:v0.8.2
[root@master1 test]# docker tag metallb/controller:v0.8.2 192.168.56.103:5000/controller:v0.8.2
[root@master1 test]# docker tag metallb/speaker:v0.8.2 192.168.56.103:5000/speaker:v0.8.2
[root@master1 test]# docker push 192.168.56.103:5000/controller:v0.8.2

# vi /root/_Book_k8sInfra/ch3/3.3.4/metallb.yaml
image 위에서 push한 이미지로 교체해주기. 

# kubectl apply -f /root/_Book_k8sInfra/ch3/3.3.4/metallb.yaml
# kubectl get pods -n metallb-system -o wide
[root@master1 test]# kubectl delete deploy,pod,svc --all

[root@master1 test]# kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    &lt;none&gt;        443/TCP   106s
</code></pre><pre><code># vi metallb-l2config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: nginx-ip-range
      protocol: layer2
      addresses:
      - 192.168.56.200-192.168.56.250

# kubectl apply -f metallb-l2config.yaml
# kubectl describe configmaps -n metallb-system

[root@master1 test]# vi wordpress-pod-svc.yaml 
맨 하단 IP 주석처리
#  externalIPs:
#  - 172.31.2.200

[root@master1 test]# kubectl apply -f wordpress-pod-svc.yaml</code></pre><p>-&gt; 결과 DHCP로 할당받은 IP로 진입 안된당</p>
<pre><code>[root@master1 test]# vi metallb-l2config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: nginx-ip-range
      protocol: layer2
      addresses:
      - 192.168.56.103-192.168.56.105

[root@master1 test]# kubectl apply -f metallb-l2config.yaml

[root@master1 test]# kubectl describe configmaps -n metallb-system
Name:         config
Namespace:    metallb-system
Labels:       &lt;none&gt;
Annotations:  &lt;none&gt;

Data
====
config:
----
address-pools:
- name: nginx-ip-range
  protocol: layer2
  addresses:
  - 192.168.56.103-192.168.56.105

[root@master1 test]# kubectl delete svc loadbalancer-service-deployment-wordpress

[root@master1 test]# kubectl apply -f wordpress-pod-svc.yaml
[root@master1 test]# kubectl get svc
NAME                                        TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
kubernetes                                  ClusterIP      10.96.0.1        &lt;none&gt;           443/TCP        40m
loadbalancer-service-deployment-wordpress   LoadBalancer   10.109.156.177   192.168.56.200   80:31493/TCP   9s</code></pre><p>-&gt; 수정 안됨...</p>
<p>지우고 다시</p>
<pre><code>[root@master1 test]# kubectl delete -f metallb-l2config.yaml
[root@master1 test]# kubectl delete svc loadbalancer-service-deployment-wordpress
[root@master1 test]# kubectl apply -f metallb-l2config.yaml
configmap/config created
[root@master1 test]# kubectl apply -f wordpress-pod-svc.yaml
pod/wordpress-pod unchanged
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/aabc3663-ac56-4625-82c4-a7264d2beab8/image.png" alt=""></p>
<p>이제 됨..</p>
<pre><code># vi metallb-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx-pod
spec:
  containers:
  - name: nginx-pod-container
    image: 192.168.56.103:5000/nginx:latest
---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-pod
spec:
  type: LoadBalancer
#  externalIPs:
#  -
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f metallb-test.yaml

[root@master1 test]# kubectl get svc
NAME                                        TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
kubernetes                                  ClusterIP      10.96.0.1       &lt;none&gt;           443/TCP        48m
loadbalancer-service-deployment-wordpress   LoadBalancer   10.111.165.12   192.168.56.103   80:30261/TCP   4m57s
loadbalancer-service-pod                    LoadBalancer   10.109.73.146   192.168.56.104   80:30803/TCP   12s


[root@master1 test]# curl 192.168.56.104
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
</code></pre><h1 id="📌config-map">📌config map</h1>
<p>컨피그맵은 키-값 쌍으로 기밀이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트입니다. 파드는 볼륨에서 환경 변수, 커맨드-라인 인수 또는 구성 파일로 컨피그맵을 사용할 수 있습니다.
컨피그맵을 사용하면 컨테이너 이미지에서 환경별 구성을 분리하여, 애플리케이션을 쉽게 이식할 수 있습니다.</p>
<h2 id="📙">📙</h2>
<pre><code>[root@master1 ~]# mkdir configmap &amp;&amp; cd $_

[root@master1 configmap]# vi configmap-dev.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: config-dev
  namespace: default
data:
  DB_URL: localhost
  DB_USER: myuser
  DB_PASS: mypass
  DEBUG_INFO: debug

[root@master1 configmap]# kubectl apply -f configmap-dev.yaml
[root@master1 configmap]# kubectl describe configmaps config-dev

# vi deployment-config01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: configapp
  labels:
    app: configapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: configapp
  template:
    metadata:
      labels:
        app: configapp
    spec:
      containers:
      - name: testapp
        image: 192.168.56.103:5000/nginx:latest
        ports:
        - containerPort: 8080
        env:
        - name: DEBUG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: config-dev
              key: DEBUG_INFO</code></pre><p>📙✔️✏️📢⭐️📌</p>
<h1 id="📌-기타">📌 기타</h1>
<h3 id="⭐️-ingress">⭐️ Ingress</h3>
<p>L7기능을 쿠버네티스에서 구현.
ALB와 비슷 경로기반라우팅.</p>
<h3 id="⭐️-nfs이용해서-마운트하는-법-기본-방법">⭐️ nfs이용해서 마운트하는 법 (기본 방법)</h3>
<pre><code>
[root@worker1 ~]# mount -t nfs 192.168.1.190:/nfs_shared /mnt # 마운트
[root@worker1 ~]# umount /mnt # 마운트 해제

</code></pre><h3 id="⭐️-rwxrwo">⭐️ RWX,RWO</h3>
<p>ReadWriteMany ; RWX
ReadWriteOnce ; RWO</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0718[kubernetes]]]></title>
            <link>https://velog.io/@mng_jn/0718kubernetes</link>
            <guid>https://velog.io/@mng_jn/0718kubernetes</guid>
            <pubDate>Mon, 18 Jul 2022 02:05:32 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-kubernetes">📌 Kubernetes</h1>
<h2 id="📙-deployment">📙 Deployment</h2>
<p>✔️ 1. deployment yaml (매니페스트)    생성</p>
<pre><code>#mkdir deployment &amp;&amp; cd $_

#vi deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-deployment

  template:
    metadata:
      name: nginx-deployment
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-deployment-container
        image: nginx
        ports:
        - containerPort: 80


# kubectl apply -f deployment.yaml
# kubectl get deployments.apps -o wide
# kubectl describe deployments.apps nginx-deployment</code></pre><p>✏️ kubectl describe [kind] [그 kind 중에서 이름]</p>
<p>✔️ 2. cluster IP</p>
<pre><code># vi clusterip-deployment.yaml # 클러스터아이피 야믈
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service-deployment
spec:
  type: ClusterIP
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f clusterip-deployment.yaml
# kubectl get svc -o wide
# kubectl describe svc clusterip-service-deployment</code></pre><p>✔️ 3 . nodeport</p>
<pre><code># vi nodeport-deployment.yaml # 노드포트 야믈
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-deployment
spec:
  type: NodePort
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080

# kubectl apply -f nodeport-deployment.yaml
# kubectl get svc -o wide
# kubectl describe svc nodeport-service-deployment</code></pre><p>✔️ 4. load balnacer</p>
<pre><code># vi loadbalancer-deployment.yaml # 로드밸런서 야믈
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.1.190
  - 192.168.1.234
  - 192.168.1.235
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
# kubectl apply -f loadbalancer-deployment.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-deployment</code></pre><p>✔️ 5. 모든 리소스 확인하기.</p>
<pre><code>[root@master1 deployment]# kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-55cb6f9cb7-dpj9z   1/1     Running   0          62m
pod/nginx-deployment-55cb6f9cb7-gncvq   1/1     Running   0          62m
pod/nginx-deployment-55cb6f9cb7-nqlw2   1/1     Running   0          62m

NAME                                      TYPE           CLUSTER-IP       EXTERNAL-IP                                 PORT(S)        AGE
service/clusterip-service-deployment      ClusterIP      10.96.3.147      &lt;none&gt;                                      80/TCP         47m
service/kubernetes                        ClusterIP      10.96.0.1        &lt;none&gt;                                      443/TCP        2d23h
service/loadbalancer-service-deployment   LoadBalancer   10.111.32.125    192.168.1.190,192.168.1.234,192.168.1.235   80:31169/TCP   9m57s
service/nodeport-service-deployment       NodePort       10.108.156.156   &lt;none&gt;                                      80:30080/TCP   23m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           62m

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-55cb6f9cb7   3         3         3       62m
</code></pre><p>deployment 하윗단에 replicaset이 있음.</p>
<p>✔️ 6. scale out</p>
<pre><code># kubectl edit deployments.apps nginx-deployment</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/c46adfdd-f83f-44dc-8ac4-1ec1793c8d34/image.png" alt=""></p>
<pre><code>[root@master1 deployment]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE    IP           NODE      NOMINATED NODE   READINESS GATES
nginx-deployment-55cb6f9cb7-66lh5   1/1     Running   0          106s   10.244.2.3   worker2   &lt;none&gt;           &lt;none&gt;
nginx-deployment-55cb6f9cb7-dpj9z   1/1     Running   0          70m    10.244.2.2   worker2   &lt;none&gt;           &lt;none&gt;
nginx-deployment-55cb6f9cb7-gncvq   1/1     Running   0          70m    10.244.1.2   worker1   &lt;none&gt;           &lt;none&gt;
nginx-deployment-55cb6f9cb7-nqlw2   1/1     Running   0          70m    10.244.1.3   worker1   &lt;none&gt;           &lt;none&gt;

</code></pre><p>✔️ 7. deployment 롤링 업데이트 제어 ( replicas는 롤링업데이트 못함.)</p>
<pre><code># kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=mj030kk/test_commit:v1.0 ## 교체할 이미지 설정
# kubectl get all
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/5b402c79-1e89-4dad-a2cf-10da053604d4/image.png" alt="">
업데이트 완료</p>
<pre><code># kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         &lt;none&gt;
2         &lt;none&gt;

# kubectl rollout history deployment nginx-deployment --revision=2 # 리비전2 상세보기
deployment.apps/nginx-deployment with revision #2
Pod Template:
  Labels:       app=nginx-deployment
        pod-template-hash=78f8b95f97
  Containers:
   nginx-deployment-container:
    Image:      mj030kk/test_commit:v1.0
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        &lt;none&gt;
    Mounts:     &lt;none&gt;
  Volumes:      &lt;none&gt;

# kubectl rollout undo deployment nginx-deployment # 롤백(전 단계로 복원)

[root@master1 deployment]# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
2         &lt;none&gt;
3         &lt;none&gt;


</code></pre><p><strong>📢 rollback 하였으나 다시 또 이미지 못가져오는 일 발생..사설 레지스트리 다시 사용해야함.</strong></p>
<blockquote>
<p><a href="https://velog.io/@mng_jn/0715">https://velog.io/@mng_jn/0715</a> 참조</p>
</blockquote>
<p>✔️ 아래 오류 발생</p>
<pre><code>[root@master1 deployment]# kubectl get pod
NAME                                READY   STATUS         RESTARTS   AGE
nginx-deployment-55cb6f9cb7-bs8nj   0/1     ErrImagePull   0          3m35s
nginx-deployment-55cb6f9cb7-j9965   0/1     ErrImagePull   0          3m35s
nginx-deployment-78f8b95f97-chrvk   1/1     Running        0          12m
nginx-deployment-78f8b95f97-lzjn4   1/1     Running        0          12m
nginx-deployment-78f8b95f97-rmz4w   1/1     Running        0          12m
</code></pre><p>✔️사설 레지스트리 생성</p>
<pre><code>[root@master1 deployment]# docker run -d -p 5000:5000 --restart=always --name private-docker-registry registry 

-&gt;master

# vi /etc/docker/daemon.json
{
  &quot;exec-opts&quot;: [&quot;native.cgroupdriver=systemd&quot;],
  &quot;log-driver&quot;: &quot;json-file&quot;,
  &quot;log-opts&quot;: {
    &quot;max-size&quot;: &quot;100m&quot;
  },
  &quot;storage-driver&quot;: &quot;overlay2&quot;,
  &quot;insecure-registries&quot;:[&quot;192.168.1.190:5000&quot;]
}
# systemctl restart docker

-&gt; master, worker
</code></pre><p>✔️ 원래 설치되어있던 자원들 다 지우기 (deployment폴더에 있던 것)</p>
<pre><code>[root@master1 deployment]# kubectl delete -f .

[root@master1 deployment]# kubectl get all ## 삭제 확인
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    &lt;none&gt;        443/TCP   3d
</code></pre><p>✔️ 이미지 가져오기</p>
<pre><code>[root@master1 deployment]# docker images ## 이미지 목록 확인
[root@master1 deployment]# docker pull nginx
[root@master1 deployment]# docker pull mj030kk/test_commit:v1.0
[root@master1 deployment]# docker tag nginx:latest 192.168.1.190:5000/nginx:latest
[root@master1 deployment]# docker tag mj030kk/test_commit:v1.0 192.168.1.190:5000/test_commit:v1.0
# docker push 192.168.1.190:5000/nginx:latest
# docker push 192.168.1.190:5000/test_commit:v1.0</code></pre><p>✔️이미지를 사설 레지스트리 이미지로 설정
#vi deployment.yaml
<img src="https://velog.velcdn.com/images/mng_jn/post/dee53a4b-7558-487c-b645-79ec38262fa2/image.png" alt=""></p>
<p>✔️ 위에 설정 적용하고 업데이트 했다가 undo로 롤백하기</p>
<pre><code>[root@master1 deployment]# kubectl apply -f deployment.yaml
[root@master1 deployment]# kubectl apply -f loadbalancer-deployment.yaml
[root@master1 deployment]# kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=192.168.1.190:5000/test_commit:v1.0
# kubectl rollout history deployment nginx-deployment
[root@master1 deployment]# kubectl rollout undo deployment nginx-deployment --to-revision=1 ##특정 버전으로 롤백.

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/5b402c79-1e89-4dad-a2cf-10da053604d4/image.png" alt="">
업데이트 완료</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e42cccc5-7c9e-4032-8ea0-395d65c1fae8/image.png" alt="">
롤백 확인</p>
<p>아래는 참고.</p>
<pre><code># kubectl get all
# kubectl rollout history deployment nginx-deployment
# kubectl rollout history deployment nginx-deployment --revision=3 # 리비전3 상세보기
# kubectl rollout undo deployment nginx-deployment ## 그냥 전 버전으로 롤백</code></pre><h1 id="📙-ingress">📙 ingress</h1>
<p>서비스의 한 종류( cluster ip, nodeport와 같은..)</p>
<p>✔️ 이론</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/f20b67c6-63df-4af1-be92-65160ae43096/image.png" alt=""></p>
<p>L7 , 경로기반라우팅 . nginx에서 가져와서 사용.</p>
<p>✔️ 준비</p>
<pre><code>[root@master1 deployment]# yum install -y git
# cd ~
# git clone https://github.com/hali-linux/_Book_k8sInfra.git
# kubectl apply -f /root/_Book_k8sInfra/ch3/3.3.2/ingress-nginx.yaml
# kubectl get pods -n ingress-nginx ##namespace지정해서 pod 보기
[root@master1 deployment]# kubectl delete -f .
[root@master1 ~]# mkdir ingress &amp;&amp; cd $_
# docker pull halilinux/test-home:v0.0
# docker pull halilinux/test-home:v1.0
# docker pull halilinux/test-home:v2.0
# docker tag halilinux/test-home:v0.0 192.168.1.190:5000/test-home:v0.0
# docker tag halilinux/test-home:v1.0 192.168.1.190:5000/test-home:v1.0
# docker tag halilinux/test-home:v2.0 192.168.1.190:5000/test-home:v2.0
# docker push 192.168.1.190:5000/test-home:v0.0
# docker push 192.168.1.190:5000/test-home:v1.0
# docker push 192.168.1.190:5000/test-home:v2.0


</code></pre><p>✔️yaml파일 생성(pod,service 등 한번에 생성)</p>
<pre><code># vi ingress-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: foods-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: foods-deploy
  template:
    metadata:
      labels:
        app: foods-deploy
    spec:
      containers:
      - name: foods-deploy
        image: 192.168.1.190:5000/test-home:v1.0
---
apiVersion: v1
kind: Service
metadata:
  name: foods-svc
spec:
  type: ClusterIP
  selector:
    app: foods-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sales-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sales-deploy
  template:
    metadata:
      labels:
        app: sales-deploy
    spec:
      containers:
      - name: sales-deploy
        image: 192.168.1.190:5000/test-home:v2.0
---
apiVersion: v1
kind: Service
metadata:
  name: sales-svc
spec:
  type: ClusterIP
  selector:
    app: sales-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: home-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: home-deploy
  template:
    metadata:
      labels:
        app: home-deploy
    spec:
      containers:
      - name: home-deploy
        image: 192.168.1.190:5000/test-home:v0.0
---
apiVersion: v1
kind: Service
metadata:
  name: home-svc
spec:
  type: ClusterIP
  selector:
    app: home-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80</code></pre><p>✔️ 적용 및 확인</p>
<pre><code># kubectl apply -f ingress-deploy.yaml
# kubectl get all
</code></pre><p>✔️경로기반라우팅 </p>
<pre><code># vi ingress-config.yaml -&gt;backend
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations: # 주석 (주로 설명에 사용 예; 저자,연락처 이번엔 경로주소설정에 사용 ( ingress에서는 기능이 있음))
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http: ##필요하면 https도 사용 가능.
      paths:
      - path: /foods
        backend:
          serviceName: foods-svc
          servicePort: 80
      - path: /sales
        backend:
          serviceName: sales-svc
          servicePort: 80
      - path:
        backend:
          serviceName: home-svc
          servicePort: 80

# kubectl apply -f ingress-config.yaml
# kubectl get namespaces
# kubectl get all -n ingress-nginx

# kubectl describe deployment.apps/nginx-ingress-controller -n ingress-nginx
-&gt; 아래 service yaml의 selector 부분(labels) 확인 가능.

# vi ingress-service.yaml -&gt;frontend
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
spec:
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  - name: https
    protocol: TCP
    port: 443
    targetPort: 443
  selector:
    app.kubernetes.io/name: ingress-nginx
  type: LoadBalancer
  externalIPs:
  - 192.168.1.190

# kubectl apply -f ingress-service.yaml
# kubectl get svc -n ingress-nginx
# kubectl get svc -n ingress-nginx</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/5e208ebc-1ecf-4706-b8ce-c44eefda2ca7/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/27f36930-5258-4c39-878b-882fdb9f2c9e/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/5eb037a5-a90c-4b63-ad42-df47111c7167/image.png" alt=""></p>
<p>-&gt; 경로기반 라우팅 확인</p>
<p>✔️ 롤링 업데이트 제어(foods)</p>
<pre><code># kubectl set image deployment.apps/foods-deploy foods-deploy=mj030kk/test_commit:v1.0
# kubectl get all
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/6bb3852f-91d1-4646-8105-7f4612d377f8/image.png" alt=""></p>
<p>-&gt;업데이트 확인</p>
<pre><code> kubectl rollout history deployment foods-deploy
deployment.apps/foods-deploy
REVISION  CHANGE-CAUSE
4         &lt;none&gt;
5         &lt;none&gt;
6         &lt;none&gt;

[root@master1 ingress]# kubectl rollout undo deployment foods-deploy --to-revision=4  =&gt; 롤백
deployment.apps/foods-deploy rolled back
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/f6893cd7-58d8-48a7-897e-1cc63f579d1b/image.png" alt=""></p>
<p>-&gt;롤백 완료</p>
<h2 id="📙-volumepv-pvc-pod">📙 volume(pv-pvc-pod)</h2>
<p><strong>MATER에서 시작</strong></p>
<p>✔️준비</p>
<pre><code># mkdir pv-pvc-pod &amp;&amp; cd $_
</code></pre><p>✔️yaml파일 생성 - [pv-pvc-pod]</p>
<pre><code># vi pv-pvc-pod.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Mi # 가상 실습환경에서는 큰 의미가 없다. 퍼블릭클라우드에서는 의미 O
  accessModes:
    - ReadWriteOnce # ReadWriteMany, ReadOnlyMany(접근 보안)
  hostPath:
    path: &quot;/mnt/data&quot;
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi # 가상 실습환경에서는 큰 의미가 없다. 퍼블릭클라우드에서는 의미 O
  selector:
    matchLabels:
      type: local
---
apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
  labels:
    app: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: &quot;http-server&quot;
      volumeMounts:
        - mountPath: &quot;/usr/share/nginx/html&quot;
          name: task-pv-storage

# kubectl apply -f pv-pvc-pod.yaml     
# kubectl get pv
# kubectl get pvc
# kubectl describe pod task-pv-pod

[root@master1 pv-pvc-pod]# kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
foods-deploy-5797bff46f-94vf4   1/1     Running   0          63m     10.244.1.21   worker1   &lt;none&gt;           &lt;none&gt;
home-deploy-cccdcb7c6-6dfxw     1/1     Running   0          142m    10.244.2.15   worker2   &lt;none&gt;           &lt;none&gt;
sales-deploy-fdd6b78d8-82vzp    1/1     Running   0          142m    10.244.1.17   worker1   &lt;none&gt;           &lt;none&gt;
task-pv-pod                     1/1     Running   0          6m31s   10.244.1.22   worker1   &lt;none&gt;           &lt;none&gt;

[root@master1 pv-pvc-pod]# curl 10.244.1.22
&lt;html&gt;
&lt;head&gt;&lt;title&gt;403 Forbidden&lt;/title&gt;&lt;/head&gt;

[root@worker1 ~]# ls /mnt
data

[root@worker1 ~]# echo &quot;Hello World&quot; &gt; /mnt/data/index.html

[root@master1 pv-pvc-pod]# curl 10.244.1.22
Hello World</code></pre><p>✔️ 용량제한 static하게 해보자.</p>
<pre><code>[root@worker1 ~]#  poweroff
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/c08825eb-afa4-4090-8fdd-5058a8a8627b/image.png" alt="">
다음 -고정크기 - 10MB- 만들기</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/bedb5f9a-3afd-47ac-8250-e23699981a0c/image.png" alt=""></p>
<ul>
<li>확인 - worker1 시작<pre><code></code></pre></li>
</ul>
<p>[root@worker1 ~]# ls /mnt/data/
cirros-0.5.1-x86_64-disk.img</p>
<p>[root@worker1 ~]# rm -rf /mnt/data/cirros-0.5.1-x86_64-disk.img</p>
<p>[root@worker1 ~]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0   128G  0 disk
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0   127G  0 part
  ├─centos-root 253:0    0 123.1G  0 lvm  /
  └─centos-swap 253:1    0   3.9G  0 lvm</p>
<p>[root@worker1 ~]# mkfs -t ext4 /dev/sdb
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y</p>
<p>[root@worker1 ~]# mount /dev/sdb /mnt/data/</p>
<p>[root@worker1 ~]# df -h
ed1a94933044dc8a59b92d0afba264b0f48ff225e442be9dd14b/merged
/dev/sdb                 8.7M  172K  7.9M   3% /mnt/data</p>
<p>[root@master1 pv-pvc-pod]# kubectl apply -f pv-pvc-pod.yaml</p>
<p>[root@master1 pv-pvc-pod]# kubectl get pod -o wide</p>
<p>[root@worker1 ~]# echo &quot;hello&quot; &gt; /mnt/data/index.html</p>
<p>[root@master1 pv-pvc-pod]# curl  10.244.1.23
hello</p>
<pre><code>
✔️용량 제한 확인</code></pre><p>[root@master1 ~]# kubectl cp cirros-0.5.1-x86_64-disk.img task-pv-pod:/usr/share/nginx/html
tar: cirros-0.5.1-x86_64-disk.img: Cannot write: No space left on device
tar: Exiting with failure status due to previous errors
command terminated with exit code 2</p>
<p>[root@worker1 ~]# ls -al /mnt/data
total 8524
drwxr-xr-x  3 root root    1024 Jul 18 17:21 .
drwxr-xr-x. 3 root root      18 Jul 18 16:28 ..
-rw-r--r--  1 root root 8713728 Jul 18 17:21 cirros-0.5.1-x86_64-disk.img
-rw-r--r--  1 root root       6 Jul 18 17:18 index.html
drwx------  2 root root   12288 Jul 18 17:12 lost+found</p>
<pre><code>✔️ 파드 삭제해도 데이터 남아있는 볼륨 확인.</code></pre><p>[root@master1 ~]# kubectl delete pod task-pv-pod</p>
<p>[root@worker1 ~]# ls -al /mnt/data
total 8524
drwxr-xr-x  3 root root    1024 Jul 18 17:21 .
drwxr-xr-x. 3 root root      18 Jul 18 16:28 ..
-rw-r--r--  1 root root 8713728 Jul 18 17:21 cirros-0.5.1-x86_64-disk.img
-rw-r--r--  1 root root       6 Jul 18 17:18 index.html
drwx------  2 root root   12288 Jul 18 17:12 lost+found</p>
<pre><code>


✔️ nfs</code></pre><h1 id="yum-install--y-nfs-utilsx86_64">yum install -y nfs-utils.x86_64</h1>
<h1 id="mkdir-nfs_shared">mkdir /nfs_shared</h1>
<h1 id="echo-nfs_shared-1921680021rwsyncno_root_squash--etcexports">echo &#39;/nfs_shared 192.168.0.0/21(rw,sync,no_root_squash)&#39; &gt;&gt; /etc/exports</h1>
<h1 id="systemctl-enable---now-nfs">systemctl enable --now nfs</h1>
<h1 id="vi-nfs-pvyaml">vi nfs-pv.yaml</h1>
<p>apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.0.192
    path: /nfs_shared</p>
<h1 id="kubectl-apply--f-nfs-pvyaml">kubectl apply -f nfs-pv.yaml</h1>
<h1 id="kubectl-get-pv">kubectl get pv</h1>
<h1 id="vi-nfs-pvcyaml">vi nfs-pvc.yaml</h1>
<p>apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Mi</p>
<h1 id="kubectl-apply--f-nfs-pvcyaml">kubectl apply -f nfs-pvc.yaml</h1>
<h1 id="kubectl-get-pvc">kubectl get pvc</h1>
<h1 id="kubectl-get-pv-1">kubectl get pv</h1>
<h1 id="vi-nfs-pvc-deployyaml">vi nfs-pvc-deploy.yaml</h1>
<p>apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-pvc-deploy
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nfs-pvc-deploy
  template:
    metadata:
      labels:
        app: nfs-pvc-deploy
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: nfs-vol
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-vol
        persistentVolumeClaim:
          claimName: nfs-pvc</p>
<h1 id="kubectl-apply--f-nfs-pvc-deployyaml">kubectl apply -f nfs-pvc-deploy.yaml</h1>
<h1 id="kubectl-get-pod">kubectl get pod</h1>
<h1 id="kubectl-exec--it-nfs-pvc-deploy-76bf944dd5-6j9gf----binbash">kubectl exec -it nfs-pvc-deploy-76bf944dd5-6j9gf -- /bin/bash</h1>
<h1 id="kubectl-expose-deployment-nfs-pvc-deploy---typeloadbalancer---namenfs-pvc-deploy-svc1---port80">kubectl expose deployment nfs-pvc-deploy --type=LoadBalancer --name=nfs-pvc-deploy-svc1 --port=80</h1>
<pre><code>

📙✔️✏️📢⭐️📌

# 📌기타
### ⭐️ 용어
한줄한줄씩 실행 : adhoc
파일로 실행 (yaml) : manifest


### ⭐️ pod IP</code></pre><p>[root@master1 deployment]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
nginx-deployment-55cb6f9cb7-dpj9z   1/1     Running   0          15m   10.244.2.2   worker2   <none>           <none>
nginx-deployment-55cb6f9cb7-gncvq   1/1     Running   0          15m   10.244.1.2   worker1   <none>           <none>
nginx-deployment-55cb6f9cb7-nqlw2   1/1     Running   0          15m   10.244.1.3   worker1   <none>           <none></p>
<p>[root@master1 deployment]# curl 10.244.1.2
<!DOCTYPE html></p>
<html>
<head>
<title>Welcome to nginx!</title>

<pre><code>service 설치하지 않아도 pod IP로 pod 잘 동작하고 있는 것 확인 가능.
(내부 IP라서 내부에서만 확인 가능.)

### ⭐️ schedule
스케쥴 한다 어떤 노드에 파트를 위치시킨다.

### ⭐️ volume에서, pod 삭제하면 볼륨 내용물도 삭제되도록 설정하기 시도 
다시 생성하고 정책 delete로 바꿔서 pod 다시 삭제.
</code></pre><p>[root@master1 ~]# kubectl apply -f ./pv-pvc-pod/pv-pvc-pod.yaml</p>
<p>[root@master1 ~]# kubectl edit pv task-pv-volume</p>
<pre><code>
![](https://velog.velcdn.com/images/mng_jn/post/b0a4666f-3ee5-4fbe-b0b6-fd960f88e4bf/image.png)
</code></pre><p>[root@master1 ~]# kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
foods-deploy-5797bff46f-jwlpg   1/1     Running   0          24m     10.244.2.19   worker2   <none>           <none>
home-deploy-cccdcb7c6-6dfxw     1/1     Running   0          3h21m   10.244.2.15   worker2   <none>           <none>
sales-deploy-fdd6b78d8-5jtvj    1/1     Running   0          24m     10.244.2.18   worker2   <none>           <none>
task-pv-pod                     1/1     Running   0          4m56s   10.244.1.24   worker1   <none>           <none>
[root@master1 ~]# curl 10.244.1.24
hello</p>
<p>[root@master1 ~]# kubectl delete pod task-pv-pod</p>
<p>[root@worker1 ~]# ls -al /mnt/data
total 8524
drwxr-xr-x  3 root root    1024 Jul 18 17:21 .
drwxr-xr-x. 3 root root      18 Jul 18 16:28 ..
-rw-r--r--  1 root root 8713728 Jul 18 17:21 cirros-0.5.1-x86_64-disk.img
-rw-r--r--  1 root root       6 Jul 18 17:18 index.html
drwx------  2 root root   12288 Jul 18 17:12 lost+found</p>
<p>```</p>
<p>-&gt; 잘 안되고 끝. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0715[kubernetes]]]></title>
            <link>https://velog.io/@mng_jn/0715</link>
            <guid>https://velog.io/@mng_jn/0715</guid>
            <pubDate>Fri, 15 Jul 2022 06:51:53 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-kubernetes">📌 Kubernetes</h1>
<h2 id="📙-minikube--replicaset">📙 minikube- replicaset</h2>
<pre><code>minikube start --driver=none

[root@control-plane ~]# mkdir replicaset &amp;&amp; cd $_
[root@control-plane replicaset]#

# vi replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata: ##name과 labels
  name: nginx-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-replicaset ##아래 labels app이랑 똑같아야함. 아래 것 참조해서 생성함.

  template:
    metadata:
      name: nginx-replicaset
      labels:
        app: nginx-replicaset
    spec:
      containers:
      - name: nginx-replicaset-container
        image: nginx
        ports:
        - containerPort: 8080

# kubectl apply -f replicaset.yaml
# kubectl get replicasets.apps -o wide
# kubectl describe replicasets.apps nginx-replicaset

# vi clusterip-replicaset.yaml # 클러스터아이피 야믈
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service-replicaset
spec:
  type: ClusterIP
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f clusterip-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc clusterip-service-replicaset

# vi nodeport-replicaset.yaml # 노드포트 야믈
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-replicaset
spec:
  type: NodePort
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080

# kubectl apply -f nodeport-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc nodeport-service-replicaset

# vi loadbalancer-replicaset.yaml # 로드밸런서 야믈
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-replicaset
spec:
  type: LoadBalancer
  externalIPs:
    - 172.25.0.137
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f loadbalancer-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-replicaset
</code></pre><h2 id="📙-multinode">📙 multinode</h2>
<p>*<em>미니큐브 삭제 후 진행 *</em>
✔️ 설치 - virtual box에서 ova가져오기, centos7-DVD해제, 맥주소 어드레스 새로고침 하고 실행 
spec: CPU2, RAM4GB
IP : 192.168.1.190</p>
<pre><code>
# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
# sed -i -e &quot;s/enabled=1/enabled=0/g&quot; /etc/yum.repos.d/docker-ce.repo
# yum --enablerepo=docker-ce-stable -y install docker-ce-19.03.15-3.el7
# mkdir /etc/docker
# cat &lt;&lt;EOF | sudo tee /etc/docker/daemon.json
{
  &quot;exec-opts&quot;: [&quot;native.cgroupdriver=systemd&quot;],
  &quot;log-driver&quot;: &quot;json-file&quot;,
  &quot;log-opts&quot;: {
    &quot;max-size&quot;: &quot;100m&quot;
  },
  &quot;storage-driver&quot;: &quot;overlay2&quot;
}
EOF
# systemctl enable --now docker
# systemctl daemon-reload
# systemctl restart docker
# systemctl disable --now firewalld
# setenforce 0
# sed -i &#39;s/^SELINUX=enforcing$/SELINUX=disabled/&#39; /etc/selinux/config

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        206M        2.7G        8.5M        783M        3.3G
Swap:          3.9G          0B        3.9G
[root@localhost ~]# swapoff -a
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        203M        2.7G        8.5M        783M        3.3G
Swap:            0B          0B          0B

# sed -i &#39;/ swap / s/^/#/&#39; /etc/fstab -&gt; swap영구적으로 사용하지않기.

# cat &lt;&lt;EOF &gt; /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# sysctl --system
# reboot

# cat &lt;&lt;&#39;EOF&#39; &gt; /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

# yum -y install kubeadm-1.19.16-0 kubelet-1.19.16-0 kubectl-1.19.16-0 --disableexcludes=kubernetes
# systemctl enable kubelet</code></pre><p>다 하고 종료 후 복제 2개 연결된 복제.
worker1,2 cpu1개, 메모리 1기가.</p>
<p>kubernetes cluster - 그룹이름 </p>
<p>일괄적으로 시작해서</p>
<pre><code># cat &lt;&lt;EOF &gt;&gt; /etc/hosts
192.168.1.190 master
192.168.1.234 worker1
192.168.1.235 worker2
EOF

# hostnamectl set-hostname master</code></pre><p>마스터에서 진행</p>
<pre><code>--- Master ---
# kubeadm init --apiserver-advertise-address=192.168.1.190 --pod-network-cidr=10.244.0.0/16 ##토큰정보
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml</code></pre><p>kubeadm의 아래 join 복사해서 worker 1,2에 넣기.</p>
<pre><code>kubeadm join 192.168.1.190:6443 --token sulgu0.phaw7eyp3rcuvhpg --discovery-token-ca-cert-hash sha256:4f63be1589229199826d47e58875ae4324b21d580f827e2484db744fe69d03a6</code></pre><pre><code># kubectl get node
# kubectl get pods --all-namespaces
# source &lt;(kubectl completion bash) ##자동완성
# echo &quot;source &lt;(kubectl completion bash)&quot; &gt;&gt; ~/.bashrc ## 껐다켜도 자동완성 되도록.
# exit

# kubectl get namespaces
</code></pre><ul>
<li>poweroff하고 브이엠 전부 스냅샷 찍기 </li>
</ul>
<h2 id="📙pod">📙Pod</h2>
<p>✔️master에서 진행</p>
<pre><code># mkdir workspace &amp;&amp; cd $_
# kubectl get node</code></pre><p>✔️ master에서 pod생성(2개) worker1,2에 각각할당됨을 확인</p>
<pre><code># kubectl run nginx-pod --image=nginx ## pending &gt; container creating &gt; running

[root@master1 workspace]# kubectl run nginx-pod --image=nginx
pod/nginx-pod created
[root@master1 workspace]#
[root@master1 workspace]# kubectl get pod
NAME        READY   STATUS              RESTARTS   AGE
nginx-pod   0/1     ContainerCreating   0          10s
[root@master1 workspace]# kubectl get pod -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          95s   10.244.2.2   worker2   &lt;none&gt;           &lt;none&gt;
[root@master1 workspace]#  kubectl run nginx-pod --image=nginx
Error from server (AlreadyExists): pods &quot;nginx-pod&quot; already exists
[root@master1 workspace]#  kubectl run nginx-pod1 --image=nginx
pod/nginx-pod1 created
[root@master1 workspace]# kubectl get pod -o wide
NAME         READY   STATUS              RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
nginx-pod    1/1     Running             0          2m58s   10.244.2.2   worker2   &lt;none&gt;           &lt;none&gt;
nginx-pod1   0/1     ContainerCreating   0          2s      &lt;none&gt;       worker1   &lt;none&gt;           &lt;none&gt;
[root@master1 workspace]#</code></pre><h2 id="📙-서비스">📙 서비스</h2>
<p>✔️cluster IP</p>
<pre><code># kubectl expose pod nginx-pod --name clusterip --type=ClusterIP --port 80

[root@master1 workspace]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
clusterip    ClusterIP   10.107.99.89   &lt;none&gt;        80/TCP    6s
kubernetes   ClusterIP   10.96.0.1      &lt;none&gt;        443/TCP   53m

[root@master1 workspace]# curl  10.107.99.89
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
&lt;style&gt;
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;

[root@worker2 ~]# curl 10.107.99.89 ## 같은 클러스터 안에 있는 worker1,2에서도 접속 가능. (같은 클러스터안에 있는 모든 노드들)
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
&lt;style&gt;
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;
&lt;p&gt;If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.&lt;/p&gt;

</code></pre><p>✔️nodeport </p>
<pre><code># kubectl expose pod nginx-pod --name nodeport --type=NodePort --port 80

[root@master1 workspace]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
clusterip    ClusterIP   10.107.99.89    &lt;none&gt;        80/TCP         5m20s
kubernetes   ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP        59m
nodeport     NodePort    10.111.65.137   &lt;none&gt;        80:30362/TCP   17s</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/782cc025-053d-49f2-9f79-450a6f214c76/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/dfe33572-0522-4e25-9261-9c86bd343f66/image.png" alt=""></p>
<p>-&gt; master의 IP뿐만 아니라 worker IP통해서도 접속 가능한 모습(nodeport 사용)</p>
<pre><code>
# kubectl expose pod nginx-pod --name loadbalancer --type=LoadBalancer --external-ip 192.168.1.235 --port 80 ##IP 한번 worker2로 해보자! 굳이 master아니어도 됨.

[root@master1 workspace]# kubectl get svc
NAME           TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
clusterip      ClusterIP      10.107.99.89    &lt;none&gt;          80/TCP         46m
kubernetes     ClusterIP      10.96.0.1       &lt;none&gt;          443/TCP        99m
loadbalanser   LoadBalancer   10.96.131.62    192.168.1.235   80:31254/TCP   9s
nodeport       NodePort       10.111.65.137   &lt;none&gt;          80:30362/TCP   41m
</code></pre><p>worker 2 ip로 접속 -&gt; 다른 IP로는 안됨요.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/7ad32768-5d85-48bb-8378-1980a85f1138/image.png" alt=""></p>
<pre><code># kubectl get pod
# kubectl get service
# kubectl exec -it nginx-pod -- bash
# kubectl get all
[root@master1 workspace]# kubectl delete pod,svc --all
# kubectl delete svc --all
# kubectl delete pod nginx-pod


</code></pre><h2 id="📙-yaml로-진행하기service">📙 yaml로 진행하기(service)</h2>
<p>✔️pod생성</p>
<pre><code># vi nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx-pod
spec:
  containers:
  - name: nginx-pod-container
    image: nginx
    ports:
    - containerPort: 8080 ##정보성. 이거 한다고 container포트가 진짜 바뀌지는 않음.


# kubectl apply -f nginx-pod.yaml
# kubectl get pod -o wide
# kubectl describe pod nginx-pod</code></pre><p>✔️clusterip생성</p>
<pre><code># vi clusterip-pod.yaml
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service-pod
spec:
  type: ClusterIP
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f clusterip-pod.yaml
# kubectl get svc -o wide
# kubectl describe svc clusterip-service-pod
# kubectl edit svc clusterip-service-pod</code></pre><p>-&gt;어느 노드에서든 클러스터IP로 접속 가능.</p>
<p>✔️nodeport생성</p>
<pre><code>

# vi nodeport-pod.yaml
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-pod
spec:
  type: NodePort
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80 # 컨테이너 포트가 맞다.
    nodePort: 30080

# kubectl apply -f nodeport-pod.yaml
# kubectl get svc -o wide
# kubectl describe svc nodeport-service-pod
# kubectl edit svc nodeport-service-pod
</code></pre><pre><code>[root@master1 workspace]#  kubectl get svc -o wide
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE    SELECTOR
clusterip-service-pod   ClusterIP   10.103.75.0      &lt;none&gt;        80/TCP         15m    app=nginx-pod
kubernetes              ClusterIP   10.96.0.1        &lt;none&gt;        443/TCP        105m   &lt;none&gt;
nodeport-service-pod    NodePort    10.103.154.243   &lt;none&gt;        80:30080/TCP   4s     app=nginx-pod

[root@master1 workspace]# curl 192.168.1.190:30080 
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;</code></pre><p>다른 노드에서도 cluster IP, nodeport 다 가능.
노드포트로 진입시 다른 노드의 IP입력해도 됨. 포트번호만 유지 잘하기.</p>
<pre><code>
[root@worker2 ~]# curl 192.168.1.234:30080
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;

[root@worker1 ~]# curl 192.168.1.190:30080
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;


</code></pre><pre><code>
# vi loadbalancer-pod.yaml
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-pod
spec:
  type: LoadBalancer
  externalIPs: # IP범위로도 할당 가능. 
  - 192.168.1.190
  - 192.168.1.234
  - 192.168.1.235
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
# kubectl apply -f loadbalancer-pod.yaml

[root@master1 workspace]#  kubectl get svc -o wide
NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP                                 PORT(S)        AGE     SELECTOR
clusterip-service-pod      ClusterIP      10.103.75.0      &lt;none&gt;                                      80/TCP         23m     app=nginx-pod
kubernetes                 ClusterIP      10.96.0.1        &lt;none&gt;                                      443/TCP        113m    &lt;none&gt;
loadbalancer-service-pod   LoadBalancer   10.100.172.137   192.168.1.190,192.168.1.234,192.168.1.235   80:30588/TCP   7s      app=nginx-pod
nodeport-service-pod       NodePort       10.103.154.243   &lt;none&gt; 

# kubectl describe svc loadbalancer-service-pod</code></pre><p>external ip(웹브라우저에서 각 서버의 IP로 진입 확인)
<img src="https://velog.velcdn.com/images/mng_jn/post/0b6e95e8-a94a-4d00-bf8b-78c29adbe156/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/13f38042-19c2-4a9b-828b-bf5400e277fc/image.png" alt=""></p>
<h2 id="📙-replicasetyaml">📙 replicaset(yaml)</h2>
<p><strong>위에서 생성한 pod와 svc모두 삭제하고 진행</strong>
✔️ replica 생성.</p>
<pre><code># vi replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  replicas: 3 # desired state (kube-controller-manager)
  selector:
    matchLabels:
      app: nginx-replicaset

  template:
    metadata:
      name: nginx-replicaset
      labels:
        app: nginx-replicaset
    spec:
      containers:
      - name: nginx-replicaset-container
        image: nginx
        ports:
        - containerPort: 80

# kubectl apply -f replicaset.yaml</code></pre><p>✔️ replicaset을 갯수 3에서 4개로 바꿔보기</p>
<pre><code>
[root@master1 replicaset]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
nginx-replicaset-ccxsw   1/1     Running   0          59s   10.244.2.4   worker2   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-dkw48   1/1     Running   0          59s   10.244.2.3   worker2   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-xkdpx   1/1     Running   0          59s   10.244.1.4   worker1   &lt;none&gt;           &lt;none&gt;

[root@master1 replicaset]# kubectl edit replicasets.apps nginx-replicaset</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/b4d82d4f-ec14-4e30-9494-2a9d0f46ecf0/image.png" alt=""></p>
<pre><code>[root@master1 replicaset]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP           NODE      NOMINATED NODE   READINESS GATES
nginx-replicaset-bvtxc   1/1     Running   0          12s    10.244.1.5   worker1   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-ccxsw   1/1     Running   0          9m7s   10.244.2.4   worker2   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-dkw48   1/1     Running   0          9m7s   10.244.2.3   worker2   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-xkdpx   1/1     Running   0          9m7s   10.244.1.4   worker1   &lt;none&gt;           &lt;none&gt;

# kubectl describe replicasets.apps nginx-replicaset</code></pre><p>-&gt; 완료!</p>
<p>✔️ 그런데 위에서 하나 삭제하면 이미지 오류가 나서 사설 레지스트리 이용해서 이미지 받아서 해보자.</p>
<pre><code>
# docker run -d -p 5000:5000 --restart=always --name private-docker-registry registry # 저장소 서버(master)

# vi /etc/docker/daemon.json # 클라이언트 master,worker
{ &quot;insecure-registries&quot;:[&quot;192.168.1.190:5000&quot;] } -&gt; 맨 하단에 넣기</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/4f82fccf-8f4f-48dd-aeb7-2bbf7cd789de/image.png" alt=""></p>
<pre><code># systemctl restart docker  #(master, worker)

[root@master1 replicaset]# docker pull nginx # (master)

# docker tag nginx:latest 192.168.1.190:5000/nginx:latest # (master)
# docker push 192.168.1.190:5000/nginx:latest # (master)
# kubectl delete replicasets.apps nginx-replicaset # (master)
# vi replicaset.yaml # (master)
[root@master1 replicaset]# kubectl apply -f replicaset.yaml
[root@master1 replicaset]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-replicaset-69vn4   1/1     Running   0          4s
nginx-replicaset-6txr4   1/1     Running   0          4s
nginx-replicaset-fd77g   1/1     Running   0          4s

[root@master1 replicaset]# kubectl edit replicasets.apps nginx-replicaset

</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/678dddb4-8532-40b7-8d24-d8f8acf69792/image.png" alt=""></p>
<pre><code>[root@master1 replicaset]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
nginx-replicaset-48lgl   1/1     Running   0          2m47s   10.244.1.23   worker1   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-fq27w   1/1     Running   0          2m47s   10.244.2.23   worker2   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-pkxnc   1/1     Running   0          22s     10.244.1.24   worker1   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-s7bkn   1/1     Running   0          2m47s   10.244.2.22   worker2   &lt;none&gt;           &lt;none&gt;

[root@master1 replicaset]# kubectl delete pod nginx-replicaset-s7bkn


[root@master1 replicaset]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
nginx-replicaset-48lgl   1/1     Running   0          3m35s   10.244.1.23   worker1   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-fq27w   1/1     Running   0          3m35s   10.244.2.23   worker2   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-phh8p   1/1     Running   0          13s     10.244.2.24   worker2   &lt;none&gt;           &lt;none&gt;
nginx-replicaset-pkxnc   1/1     Running   0          70s     10.244.1.24   worker1   &lt;none&gt;           &lt;none&gt;

</code></pre><p>-&gt; 지웠는데 냅다 바로 생겨버리는 것 확인!</p>
<p>✔️ 서비스 이용해서 접속해보기</p>
<pre><code># vi clusterip-replicaset.yaml # 클러스터아이피 야믈
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service-replicaset
spec:
  type: ClusterIP
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f clusterip-replicaset.yaml
# kubectl get svc -o wide

(확인)
[root@master1 replicaset]# curl 10.106.187.51
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
</code></pre><p>어떤 pod로 할당해주는지 알아보기 위해 웹프론트엔드 수정해주기 .</p>
<pre><code>[root@master1 replicaset]# kubectl exec nginx-replicaset-48lgl -- sh -c &quot;echo &quot;web01&quot; &gt; /usr/share/nginx/html/index.html&quot;</code></pre><p>-&gt; 각 pod마다 해주기 (web02,3,4)
아래는 확인.</p>
<pre><code>[root@master1 replicaset]# curl 10.106.187.51
web04
[root@master1 replicaset]# curl 10.106.187.51
web03
</code></pre><pre><code># kubectl describe svc clusterip-service-replicaset

# vi nodeport-replicaset.yaml # 노드포트 야믈
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-replicaset
spec:
  type: NodePort
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080

# kubectl apply -f nodeport-replicaset.yaml
[root@master1 replicaset]# kubectl get svc -o wide
NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE    SELECTOR
clusterip-service-replicaset   ClusterIP   10.106.187.51   &lt;none&gt;        80/TCP         19m    app=nginx-replicaset
kubernetes                     ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP        152m   &lt;none&gt;
nodeport-service-replicaset    NodePort    10.111.251.19   &lt;none&gt;        80:30080/TCP   4s     app=nginx-replicaset

[root@master1 replicaset]# curl 192.168.1.190:30080
web03
[root@master1 replicaset]# curl 192.168.1.190:30080
web02
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/0213d690-922d-43af-ac64-08bdab1b5cd1/image.png" alt=""></p>
<p>worker2 ip로 접속해도 됨 확인( 포트번호는 써줘야함)
<img src="https://velog.velcdn.com/images/mng_jn/post/8bbc45db-9d66-4899-9d50-7f9055b794ca/image.png" alt=""></p>
<pre><code>
# kubectl describe svc nodeport-service-replicaset

# vi loadbalancer-replicaset.yaml # 로드밸런서 야믈
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-replicaset
spec:
  type: LoadBalancer
  externalIPs:
    - 192.168.1.190 (master)
    - 192.168.1.234 (worker)
    - 192.168.1.235 (worker)
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f loadbalancer-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-replicaset
</code></pre><p>접속 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/70c8ba7e-63c0-4b64-95db-8177e1ff2031/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e772c3ca-7e19-48a5-9d54-fafd9893ad11/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/9cda7e38-fbd6-4b6a-89c0-b193b3ec6b3b/image.png" alt=""></p>
<p>deployment와 replicaset 비슷하지만
deployment가 더 많은 기능 가지고 있음(rollback, 업데이트 등)</p>
<p>📙✔️✏️📢⭐️📌</p>
<h1 id="📌-기타">📌 기타</h1>
<h3 id="⭐️k8s">⭐️k8s</h3>
<p>kubernetes</p>
<h3 id="⭐️pod안의-container-보기">⭐️pod안의 container 보기</h3>
<pre><code>
[root@master1 workspace]# kubectl describe pod nginx-pod

Containers:
  nginx-pod-container:
    Container ID:   docker://7fcd8543e10cb3df2b094a2e2b896f5096ec46e8cfe78e3f579a5609848dea8d
    Image:          nginx
    Image ID:       docker-pullable://192.168.1.190:5000/nginx@sha256:33cef86aae4e8487ff23a6ca16012fac28ff9e7a5e9759d291a7da06e36ac958
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Fri, 15 Jul 2022 17:39:17 +0900


</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[0714[ECS,kubernetes]]]></title>
            <link>https://velog.io/@mng_jn/0714ECSkubernetes</link>
            <guid>https://velog.io/@mng_jn/0714ECSkubernetes</guid>
            <pubDate>Fri, 15 Jul 2022 00:05:56 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-aws---ecs">📌 AWS - ECS</h1>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/cf333af0-d9aa-4e13-b64a-23d8c9407459/image.png" alt=""></p>
<h2 id="📙-작업-정의">📙 작업 정의</h2>
<p>✔️ 0. ECS - 작업정의 (task)
<img src="https://velog.velcdn.com/images/mng_jn/post/90c1a8a0-593b-467e-a4b6-c0177d510ba3/image.png" alt="">
✔️ 1. 시작 유형 호환성 - EC2 선택
✔️ 2. 테스크 정의 이름 : MY-TD
<img src="https://velog.velcdn.com/images/mng_jn/post/be526574-7bf5-442e-b99f-80f4d6b4c798/image.png" alt="">
✔️ 3. 작업크기 공란.
✔️ 4. 컨테이너 정의 - 컨테이너 추가
표준 ; docker run -d -p 80:80 --name containername img
✔️ 4-1. 컨테이너 이름 : webserver
✔️ 4-2. 이미지 : nginx
✔️ 4-3. 메모리제한 : 128
✔️ 4-4. 포트매핑 : 80 : 80
✔️ 4-5. 추가
✔️ 4-6. 맨 하단 생성버튼 클릭</p>
<h2 id="📙-클러스터-생성">📙 클러스터 생성</h2>
<p>✔️ 1. 클러스터 - 클러스터 생성
템플릿 : EC2 Linux + 네트워킹
클러스터 구성 ; 
클러스터 이름 : MY-CLUSTER
인스턴스 구성 ; 
프로비저닝 모델 - 온디맨드 인스턴스
스팟인스턴스 ;병렬, 순식간에 많은 공간이 필요할 때. 클러스터에서 많이 쓴다. 저렴해서.
EC2 인스턴스 유형 : 원하는 인스턴스 유형 직접 입력, t2.micro
인스턴스 개수 : 2
루트볼륨크기 : 30
키 페어 : 만들어둔 것 선택</p>
<p>✔️ 네트워킹 VPC: MY-VPC
서브넷 : PUBLIC SUBNET 2A,C
퍼블릭 IP 자동할당 : 활성화 됨
보안그룹 : MY-SG-WEB
컨테이너 인스턴스 IAM역할 : 그대로 두기 선택할 거 있음 선택하고.
-생성버튼 클릭</p>
<h2 id="📙-클러스터-서비스-생성">📙 클러스터 서비스 생성</h2>
<p>✔️ 서비스 - 생성 클릭
<img src="https://velog.velcdn.com/images/mng_jn/post/501f48d3-cb8a-4edb-adcb-1307e4288735/image.png" alt="">
시작 유형 : EC2
작업 개수 :2
최소 상태 백분율 : 50 ; 하나 지우고 하나 남기고 
최대 백분율 : 100; 2개를 100으로 보기
-&gt;만약 100,200이면 2개가 기본 4개까지 늘어날 수 있음. 구형 지우지 않고 4개 만든 다음 옛날거 차근차근 지우는 느낌. 
<img src="https://velog.velcdn.com/images/mng_jn/post/0112b18f-528c-4479-a7a7-54a24fb8bf2e/image.png" alt="">
배포유형 : 롤링 업데이트 ;백분율
-다음단계 
로드밸런서 유형 : ALB
상태검사 유예기간 : 150</p>
<p>EC2콘솔에서 로드밸런서 만들고 오기(ALB생성)
이름 : ECS-ALB
VPC: MY-VPC
서브넷: 퍼블릭 2a,2c
보안그룹 : default 지우고 MY-SG-WEB선택</p>
<p>대상그룹 생성 하고 오기
이름 : TG-ECS
프로토콜 : 80</p>
<ul>
<li>다음
대상그룹 worker1,2 (작업정의에서 만든거 선택해서 보류중인 것으로 포함)</li>
<li>생성버튼 클릭</li>
</ul>
<p>다시 로드밸런서 콘솔에서 대상그룹 TG-ECS 선택하고 로드밸런서 생성 클릭 
(명시 안해둔 것은 default)</p>
<p>다시 서비스 생성으로 와서, 로드밸런서 이름 ECS-ALB선택
밸런싱할 컨테이너 : 로드밸런서에 추가버튼 클릭 
프로덕션 리스너 포트 : 80:HTTP
대상그룹 이름 : TG-ECS
<img src="https://velog.velcdn.com/images/mng_jn/post/27ca7946-ad8c-492d-8fab-ccc3efda2414/image.png" alt="">
-다음단계 </p>
<p>auto scaling 
<img src="https://velog.velcdn.com/images/mng_jn/post/8869053f-d2db-4ad1-b0be-fc053c37e027/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/9828dcff-6914-4c2d-bdf1-369229148118/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/996aab72-e85c-4c9f-a3d5-48b44903590b/image.png" alt=""></p>
<p>-다음 - 서비스 생성버튼 클릭</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/f21f49d7-9b9e-4047-8003-49d0893f6712/image.png" alt=""></p>
<p>-&gt; 로드밸런서 DNS 주소로 접근 가능.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/c440a2de-31f0-4809-b43a-97b62dd52df6/image.png" alt=""></p>
<p>레코드 생성해서 간소화된 도메인 이용하기.</p>
<h2 id="📙-서비스-업데이트">📙 서비스 업데이트</h2>
<p>✔️ 작업 정의  -MY-TD 클릭 - 새 개정생성 클릭 </p>
<p>✔️ 하단으로 내려서 컨테이너 정의 -컨테이너 이름 클릭 - 이미지 nginx를 mj030kk/web-site:v1.0로 바꾸기. - 업데이트 클릭</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e53fb843-aa95-4c2b-8d58-bd8898810a5d/image.png" alt=""></p>
<p>✔️ 맨 하단 생성버튼 클릭 </p>
<p>클러스터 - MY-CLUSTER 클릭 - 서비스에서 MY-WEB클릭- 업데이트 클릭
<img src="https://velog.velcdn.com/images/mng_jn/post/37d99735-0c3f-4e24-b2ab-d138331cc999/image.png" alt="">
개정 2, 새 배포적용 체크.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/b08ccbf5-70cf-4126-8575-881689fec668/image.png" alt="">
다른 것 다 그대로 두고 다음단계 진행.</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/e922d374-4d24-4d65-b266-4c3c176a0d91/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/5d5a96e1-226c-49ea-8341-396eeb573b92/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/28019193-598c-41be-b214-3c4b05676a42/image.png" alt=""></p>
<h1 id="📌-kubernetes">📌 Kubernetes</h1>
<p>✔️ centos7 ova가져오기 CPU2, RAM 4GB(최소용량)
✔️ 설정 ; 이름 : Minikube 네트워크 - 맥 어드레스 새로고침 - 시작
IP : 192.168.1.166</p>
<h2 id="📙-minikube-설치">📙 Minikube 설치</h2>
<p>(single Node : Master Node + Worker Node), (Multi Node: Master Node, Worker Node)
쿠버네티스 컨테이너 런타임을 위해 도커 설치</p>
<pre><code># curl -fsSL https://get.docker.com/ | sudo sh
# systemctl enable --now docker
# yum install -y conntrack git
# curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.23.2/minikube-linux-amd64 &amp;&amp; chmod +x minikube
# mkdir -p /usr/local/bin/
# install minikube /usr/local/bin/
# minikube version
# minikube start --driver=none ##간편설치 위해서 드라이버 설정 X. 드라이버 설정하면 또 그 드라이버 위해서 설치할 것들ㅇ ㅣ생김.
# minikube status
</code></pre><h2 id="📙-kubectl-설치">📙 kubectl 설치</h2>
<p>api서버와 연결하는 도구</p>
<pre><code>
# curl -LO https://dl.k8s.io/release/v1.22.2/bin/linux/amd64/kubectl
# install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# source &lt;(kubectl completion bash)
# echo &quot;source &lt;(kubectl completion bash)&quot; &gt;&gt; ~/.bashrc
# exit
# kubectl version
</code></pre><h2 id="📙-pod">📙 Pod</h2>
<pre><code>
# mkdir workspace &amp;&amp; cd $_
# kubectl run nginx-pod --image=nginx
# kubectl get node
# kubectl get pod
# kubectl expose pod nginx-pod --name clusterip --type=ClusterIP --port 80
[root@localhost workspace]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
clusterip    ClusterIP   10.98.216.228   &lt;none&gt;        80/TCP    2m2s
kubernetes   ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP   110m

[root@localhost workspace]# curl 10.98.216.228
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
-&gt;ClusterIP는 외부 브라우저에서는 접속 안됨 내부에서 curl로 확인 해야함

# kubectl expose pod nginx-pod --name nodeport --type=NodePort --port 80</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/0b005ade-8f79-481f-bd1a-1bc911a754de/image.png" alt="">
<img src="https://velog.velcdn.com/images/mng_jn/post/94eebbd6-3771-4858-b843-b58665de2d5f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/81e8c4ef-3f61-461f-8836-fabef44f9b64/image.png" alt=""></p>
<pre><code># kubectl expose pod nginx-pod --name loadbalancer --type=LoadBalancer --external-ip 192.168.1.166 --port 80

[root@localhost workspace]# kubectl get svc
NAME           TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
clusterip      ClusterIP      10.98.216.228    &lt;none&gt;          80/TCP         55m
kubernetes     ClusterIP      10.96.0.1        &lt;none&gt;          443/TCP        163m
loadbalancer   LoadBalancer   10.101.230.101   192.168.1.166   80:30228/TCP   83s
nodeport       NodePort       10.109.64.156    &lt;none&gt;          80:31999/TCP   24m</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/9ce2f77a-4f53-4c70-b192-e3a0c79a182b/image.png" alt=""></p>
<h2 id="📙-이론">📙 이론</h2>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/7be53ec1-c9f2-4aaf-9142-1fc9bed49be5/image.png" alt=""></p>
<p>파드 ; 쿠버네티스에서 배포할 수 있는 가장 작은 단위
서비스 ; 네트워크와 관련된 리소스 pod를 외부 네트워크와 연결해주고 여러개의 pod를 바라보는 내부 로드 밸런서를 생성할 때 사용.</p>
<p>clusterIP</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/3027d1c9-7627-474b-bf1c-e67fb55b53b6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/00862f34-d4d4-4b61-921c-da48813d2f1f/image.png" alt=""></p>
<p>호스트포트가 곧 노드포트다.
내부에서 clusterIP로 curl 하면 내부에서 웹서버 확인 가능.
nodeport이용하면 내부에서는 물론 바깥에서도 확인 가능. 
여기서 활용해야 할 것은 포트번호임.
호스트 IP:nodeport번호</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/00834cf3-1fb8-47d2-92aa-27e976cd8dfb/image.png" alt=""></p>
<h2 id="📙-웹페이지-바꾸기">📙 웹페이지 바꾸기</h2>
<pre><code>pod 진입
[root@localhost workspace]# kubectl exec -it nginx-pod -- bash
root@nginx-pod:/#
root@nginx-pod:/# cd /usr/share/nginx/html/

root@nginx-pod:/usr/share/nginx/html# echo &quot;minikube&quot; &gt; index.html
</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/6fcf2f23-11a0-4a58-a47e-fa5ddc7fbb6f/image.png" alt=""></p>
<h2 id="📙-삭제">📙 삭제</h2>
<pre><code>
# kubectl get all
# kubectl delete svc clusterip
# kubectl delete svc --all
# kubectl delete pod nginx-pod
</code></pre><h2 id="📙-yaml파일-이용하기">📙 yaml파일 이용하기</h2>
<pre><code> Service
# vi nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx-pod //service와의 연결 고리
spec:
  containers:
  - name: nginx-pod-container
    image: nginx


# kubectl apply -f nginx-pod.yaml
# kubectl get pod
# docker images
# kubectl get pod -o wide
# kubectl describe pod nginx-pod

# vi clusterip-pod.yaml
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service-pod
spec:
  type: ClusterIP
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f clusterip-pod.yaml
# kubectl get svc -o wide
# kubectl describe svc clusterip-service-pod

------------ 서비스와 연결되는 nginx-pod 바꿔보기--
[root@localhost workspace]# kubectl delete svc clusterip-service-pod
[root@localhost workspace]# vi clusterip-pod.yaml
    app: nginx-pod1

[root@localhost workspace]# kubectl apply -f clusterip-pod.yaml
service/clusterip-service-pod created
[root@localhost workspace]# kubectl get svc
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
clusterip-service-pod   ClusterIP   10.96.217.148   &lt;none&gt;        80/TCP    38s
kubernetes              ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP   67m
[root@localhost workspace]# curl 10.96.217.148
curl: (7) Failed connect to 10.96.217.148:80; Connection refused
[root@localhost workspace]#


 [root@localhost workspace]# vi clusterip-pod.yaml
 -&gt;포트번호를 8080으로
[root@localhost workspace]# kubectl apply -f clusterip-pod.yaml
service/clusterip-service-pod created
[root@localhost workspace]# kubectl get svc
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
clusterip-service-pod   ClusterIP   10.97.198.129   &lt;none&gt;        8080/TCP   22s
kubernetes              ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP    69m
[root@localhost workspace]# curl 10.97.198.129
^C
[root@localhost workspace]# curl 10.97.198.129:8080
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;


[root@localhost workspace]# kubectl edit svc clusterip-service-pod
service/clusterip-service-pod edited
-&gt; edit이용해서 포트번호 다시 80으로
[root@localhost workspace]# curl 10.97.198.129
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
-&gt; 바로 됨.

-----------------------------------



# vi nodeport-pod.yaml
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-pod
spec:
  type: NodePort
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80 ##바꾸면 안됨! 컨테이너 포트임.
    nodePort: 30080 ( 30000~32767 가능)
# kubectl apply -f nodeport-pod.yaml
# kubectl get svc -o wide
# kubectl describe svc nodeport-service-pod

# vi loadbalancer-pod.yaml
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-pod
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.1.166
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80

 -&gt;타겟포트 넣지 않아도 접속 잘 됨. (curl)
# kubectl apply -f loadbalancer-pod.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-pod
</code></pre><p>✔️이미지 바꿔보기</p>
<pre><code>[root@localhost workspace]# kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          71m
[root@localhost workspace]# kubectl edit pod nginx-pod</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/8b3ed886-85df-44dd-ad4b-d8f81b058ab7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/d0f75ab7-426c-4b70-b9b3-4a4b64f319fe/image.png" alt=""></p>
<p>📙✔️✏️📢⭐️📌</p>
<h1 id="📌-기타">📌 기타</h1>
<h3 id="⭐️-iac정리">⭐️ IaC정리</h3>
<p>테라폼 프로비전
앤서블 구성관리
도커 서버템플릿
쿠버네티스 오케스트레이션 도구</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[👩‍💻0713[Docker]]]></title>
            <link>https://velog.io/@mng_jn/0713Docker</link>
            <guid>https://velog.io/@mng_jn/0713Docker</guid>
            <pubDate>Wed, 13 Jul 2022 07:49:17 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-cluster-준비">📌 cluster 준비</h1>
<ol>
<li><p>centos7 ova 불러오기 이름 : manager1</p>
</li>
<li><p>도커 설치</p>
<pre><code># curl -fsSL https://get.docker.com/ | sh
# yum -y install bash-completion wget unzip net-tools mysql telnet rdate
# rdate -s time.bora.net &amp;&amp; clock -w
# curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
# systemctl enable --now docker</code></pre></li>
<li><p>power off하고 연결된 manager1복제 두번
1) 이름 : worker1
2) 이름 : worker2</p>
<h1 id="📌-지난시간-복습">📌 지난시간 복습</h1>
</li>
<li><p>manager1에서 , 
```</p>
</li>
</ol>
<ul>
<li>Volume<h1 id="docker-volume-create-my-vol01">docker volume create my-vol01</h1>
<h1 id="docker-volume-list">docker volume list</h1>
<h1 id="docker-volume-inspect-my-vol01">docker volume inspect my-vol01</h1>
&quot;Mountpoint&quot;: &quot;/var/lib/docker/volumes/my-vol01/_data&quot;</li>
</ul>
<h1 id="docker-network-list">docker network list</h1>
<h1 id="docker-network-inspect-bridge">docker network inspect bridge</h1>
<p>&quot;com.docker.network.bridge.name&quot;: &quot;docker0&quot;,</p>
<h1 id="docker-network-create-new-net---subnet-10140016---ip-range-10140020---gateway-101401">docker network create new-net --subnet 10.14.0.0/16 --ip-range 10.14.0.0/20 --gateway 10.14.0.1</h1>
<h1 id="docker-network-ls">docker network ls</h1>
<h1 id="docker-inspect-new-net">docker inspect new-net</h1>
<p>--- 운영자 역할</p>
<h1 id="mkdir-onbuild--cd-_">mkdir onbuild &amp;&amp; cd $_</h1>
<h1 id="vi-dockerfilebase">vi Dockerfile.base</h1>
<p>FROM ubuntu:18.04
RUN sed -i &#39;s/archive.ubuntu.com/ftp.daumkakao.com/g&#39; /etc/apt/sources.list
RUN apt-get -y update
RUN apt-get -y install nginx
EXPOSE 80
ONBUILD ADD website*.tar /var/www/html/
CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]</p>
<h1 id="docker-build--t-mj030kkweb-basev20--f-dockerfilebase-">docker build -t mj030kk/web-base:v2.0 -f Dockerfile.base .</h1>
<h1 id="docker-login">docker login</h1>
<h1 id="docker-push-mj030kkweb-basev20">docker push mj030kk/web-base:v2.0</h1>
<h1 id="vi-dockerfile">vi Dockerfile</h1>
<p>FROM mj030kk/web-base:v2.0</p>
<p>--- 개발자 역할</p>
<h1 id="mkdir-onbuild--cd-_-1">mkdir onbuild &amp;&amp; cd $_</h1>
<h1 id="ls">ls</h1>
<p>website.tar
Dockerfile</p>
<h1 id="docker-build--t-mj030kkweb-sitev20--여기서-onbuild-실행됨">docker build -t mj030kk/web-site:v2.0 . ##여기서 onbuild 실행됨.</h1>
<h1 id="docker-run--d--p-8080---nameweb-site-mj030kkweb-sitev20">docker run -d -p 80:80 --name=web-site mj030kk/web-site:v2.0</h1>
<h1 id="docker-login-1">docker login</h1>
<h1 id="docker-push-mj030kkweb-sitev20">docker push mj030kk/web-site:v2.0</h1>
<pre><code>
![](https://velog.velcdn.com/images/mng_jn/post/dab01294-5ad9-4a16-9542-02656bb9b4dc/image.png)

- AWS 운영자

AWS- EC2 생성 
-이름: docker
-amazon linux
-t2.micro
-새 키 생성 : docker-key2
- vpc : MY-VPC
- 서브넷 : MY-PUBLIC-SUBNET-2A
- 고급세부정보 사용자 데이터 : 
</code></pre><p>#!/bin/bash
sudo amazon-linux-extras install docker -y
sudo systemctl start docker &amp;&amp; systemctl enable docker
curl <a href="https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker">https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker</a> -o /etc/bash_completion.d/docker.sh
sudo usermod -a -G docker ec2-user
docker run -d -p 80:80 --name=test-site mj030kk/web-site:v2.0
docker run -d -p 5000:5000 --restart=always --name private-docker-registry registry</p>
<pre><code>route53에서 도메인 생성 (ec2 인스턴스 IP)
![](https://velog.velcdn.com/images/mng_jn/post/67d85ed1-3229-44e7-97eb-daf7120fdfa1/image.png)

![](https://velog.velcdn.com/images/mng_jn/post/64202f6f-3706-4720-b945-fdfe4dcff8af/image.png)

manager 1에서,
</code></pre><h1 id="vi-etcdockerdaemonjson--클라이언트">vi /etc/docker/daemon.json # 클라이언트</h1>
<p>{ &quot;insecure-registries&quot;:[&quot;docker.lovemj.shop:5000&quot;] }</p>
<h1 id="systemctl-restart-docker">systemctl restart docker</h1>
<h1 id="docker-tag-mj030kkweb-sitev20-dockerlovemjshop5000web-sitev20">docker tag mj030kk/web-site:v2.0 docker.lovemj.shop:5000/web-site:v2.0</h1>
<p>#[root@localhost onbuild]# docker images</p>
<pre><code>
# 📌 Docker compose

**docker compose 명령어 수행 시 yml 파일이 있는 곳에서 해야함. **

</code></pre><h1 id="curl--l-httpsgithubcomdockercomposereleasesdownload1262docker-compose-uname--s-uname--m--o-usrlocalbindocker-compose">curl -L &quot;<a href="https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$">https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$</a>(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose</h1>
<h1 id="chmod-x-usrlocalbindocker-compose">chmod +x /usr/local/bin/docker-compose</h1>
<h1 id="mkdir-my_wordpress--cd-_">mkdir my_wordpress &amp;&amp; cd $_</h1>
<h1 id="vi-docker-composeyml">vi docker-compose.yml</h1>
<p>version: &quot;3.3&quot;<br>services:
  dbserver:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql  ##볼륨지정 영구적 볼륨.
    restart: always
    environment: ##-e
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
  wordpress: ## 웹서버
    depends_on: ## 후순위로 생성. db서버 먼저 생성해라.
      - dbserver
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - &quot;8888:80&quot;
    restart: always
    environment:
      WORDPRESS_DB_HOST: dbserver:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
      WORDPRESS_DB_NAME: wordpress
volumes: ## 선언
  db_data: {} 
  wordpress_data: {}</p>
<h1 id="docker-compose-up--d">docker-compose up -d</h1>
<h1 id="docker-compose-ps">docker-compose ps</h1>
<h1 id="docker-volume-ls">docker volume ls</h1>
<pre><code>
![](https://velog.velcdn.com/images/mng_jn/post/353f2c21-f241-423f-ab8b-690d08bbd784/image.png)

![](https://velog.velcdn.com/images/mng_jn/post/e44a82d9-2392-4876-9305-c100dca6815a/image.png)
</code></pre><h1 id="docker-inspect-my_wordpress_db_data">docker inspect my_wordpress_db_data</h1>
<h1 id="cd-varlibdockervolumesmy_wordpress_db_data_data">cd /var/lib/docker/volumes/my_wordpress_db_data/_data</h1>
<p>[root@localhost _data]# ls
[root@localhost my_wordpress]# docker inspect my_wordpress_wordpress_data
[root@localhost my_wordpress]# cd /var/lib/docker/volumes/my_wordpress_wordpress_data/_data
[root@localhost _data]# ls
index.php           wp-comments-post.php  wp-includes        wp-signup.php
license.txt         wp-config-docker.php  wp-links-opml.php  wp-trackback.php
readme.html         wp-config.php         wp-load.php        xmlrpc.php
wp-activate.php     wp-config-sample.php  wp-login.php
wp-admin            wp-content            wp-mail.php
wp-blog-header.php  wp-cron.php           wp-settings.php</p>
<h1 id="docker-compose-pause--일시정지">docker-compose pause ## 일시정지</h1>
<h1 id="docker-compose-unpause--재시작">docker-compose unpause ## 재시작</h1>
<h1 id="docker-compose-port-wordpress-80-호스트포트-번호-확인">docker-compose port wordpress 80 ##호스트포트 번호 확인</h1>
<h1 id="docker-compose-config--yml파일-추려서-보여줌">docker-compose config ## yml파일 추려서 보여줌</h1>
<h1 id="docker-compose-stop-wordpress--pause와-비슷일시정지-stop---서비스-지우고-싶을때">docker-compose stop wordpress ## pause와 비슷.(일시정지) stop - 서비스 지우고 싶을때</h1>
<h1 id="docker-compose-ps-1">docker-compose ps</h1>
<h1 id="docker-compose-rm-wordprss">docker-compose rm wordprss</h1>
<h1 id="docker-compose-down--멈추면서-동시에-지우기">docker-compose down ## 멈추면서 동시에 지우기.</h1>
<p>&lt;지웠는데 데이터 남아있음.&gt;
[root@localhost my_wordpress]#  cd /var/lib/docker/volumes/my_wordpress_wordpress_data/_data
[root@localhost _data]# ls
index.php           wp-comments-post.php  wp-includes        wp-signup.php
license.txt         wp-config-docker.php  wp-links-opml.php  wp-trackback.php
readme.html         wp-config.php         wp-load.php        xmlrpc.php
wp-activate.php     wp-config-sample.php  wp-login.php
wp-admin            wp-content            wp-mail.php
wp-blog-header.php  wp-cron.php           wp-settings.php</p>
<p>[root@localhost _data]#  cd /var/lib/docker/volumes/my_wordpress_db_data/_data
[root@localhost _data]# ls
auto.cnf         client-key.pem  ib_logfile1         private_key.pem  sys
ca-key.pem       ib_buffer_pool  mysql               public_key.pem   wordpress
ca.pem           ibdata1         mysql.sock          server-cert.pem
client-cert.pem  ib_logfile0     performance_schema  server-key.pem</p>
<p>[root@localhost my_wordpress]# docker-compose up -d</p>
<pre><code>![](https://velog.velcdn.com/images/mng_jn/post/396003b4-7edc-4ed9-8162-6c412cfb6017/image.png)
댓글 그대로</code></pre><h1 id="docker-compose-down--v-볼륨컨테이너까지-삭제">docker-compose down -v ##볼륨,컨테이너까지 삭제</h1>
<h1 id="docker-compose-down---rmi-all--이미지까지-삭제">docker-compose down --rmi all ## 이미지까지 삭제</h1>
<pre><code>


# 📌 도커 컨테이너 모니터링
</code></pre><p>//(주석) use the latest release version from <a href="https://github.com/google/cadvisor/releases">https://github.com/google/cadvisor/releases</a>
[root@localhost my_wordpress]# VERSION=v0.44.0 
[root@localhost my_wordpress]# docker run <br>  --volume=/:/rootfs:ro <br>  --volume=/var/run:/var/run:ro <br>  --volume=/sys:/sys:ro <br>  --volume=/var/lib/docker/:/var/lib/docker:ro <br>  --volume=/dev/disk/:/dev/disk:ro <br>  --publish=8080:8080 <br>  --detach=true <br>  --name=cadvisor <br>  --privileged <br>  --device=/dev/kmsg <br>  gcr.io/cadvisor/cadvisor:$VERSION</p>
<p>[root@localhost my_wordpress]# docker ps</p>
<pre><code>
![](https://velog.velcdn.com/images/mng_jn/post/5442965e-ca0f-498a-9d5a-fa40112ea598/image.png)

![](https://velog.velcdn.com/images/mng_jn/post/f1e4620c-0871-483d-84f9-77ae13b42224/image.png)
shares ; 1024; CPU2개
512 ; CPU1개

# 📌 도커 스웜(Cluster)
</code></pre><h1 id="firewall-cmd---permanent---zonepublic---add-port2377tcp">firewall-cmd --permanent --zone=public --add-port=2377/tcp</h1>
<h1 id="firewall-cmd---reload">firewall-cmd --reload</h1>
<p>? 이거뭐징</p>
<pre><code>
컴포즈와 스웜을 더하면 쿠버네티스.

worker 1, 2 맥 address 새로고침해주고 
시스템 기본메모리 : 1024
프로세서 1개
시작.

multiexecution으로 아래 명령어 3개 서버에 입력.(매니저,워커1,2)</code></pre><h1 id="cat-eof--etchosts">cat &lt;<EOF >&gt; /etc/hosts</h1>
<p>192.168.0.180 manager1
192.168.1.139 worker1
192.168.1.144 worker2
EOF</p>
<pre><code>각 서버에 호스트네임 바꿔주기
</code></pre><h1 id="hostnamectl-set-hostname-master1">hostnamectl set-hostname master1</h1>
<pre><code>각 서버 이름으로 핑 나감 확인 (hosts에 등록해두었기 때문.)
![](https://velog.velcdn.com/images/mng_jn/post/4c6363dd-b291-46cb-9a63-94dc57672d86/image.png)

manager1에서 아래 명령어 진행.</code></pre><h1 id="docker-swarm-init---advertise-addr-1921680180">docker swarm init --advertise-addr 192.168.0.180</h1>
<p> docker swarm join --token SWMTKN-1-3ma85wdp4elgdw5qnvl6ydang2g1562vqgocjh3f8oapdn4ql5-dk98lw7wk2utg8ilqh4bm8tcc 192.168.0.180:2377
-&gt; 이 내용 복사</p>
<pre><code>복사한 것을 worker1, 2 에 붙여넣기.</code></pre><h1 id="docker-swarm-join---token-swmtkn-1-3ma85wdp4elgdw5qnvl6ydang2g1562vqgocjh3f8oapdn4ql5-dk98lw7wk2utg8ilqh4bm8tcc-19216801802377">docker swarm join --token SWMTKN-1-3ma85wdp4elgdw5qnvl6ydang2g1562vqgocjh3f8oapdn4ql5-dk98lw7wk2utg8ilqh4bm8tcc 192.168.0.180:2377</h1>
<pre><code>다시 manager1에서 진행.</code></pre><p>[root@manager1 ~]# docker node ls</p>
<p>[root@manager1 ~]# docker stop cadvisor</p>
<h1 id="docker-service-create---name-my_web---replicas-3---publish-published8080target80-nginx">docker service create --name my_web --replicas 3 --publish published=8080,target=80 nginx</h1>
<h2 id="replicas--desired-state-controlmanager1까지-포함해서-총-3개--이해-잘-못함">replicas ; desired State control(manager1)까지 포함해서 총 3개 ? 이해 잘 못함</h2>
<h1 id="docker-service-ls">docker service ls</h1>
<h1 id="docker-service-ps-my_web">docker service ps my_web</h1>
<p>[root@worker1 ~]# docker ps</p>
<pre><code>worker 1,2 ip로 접속해도 웹브라우저 접속 가능. 로드밸런싱 되고 있음.
![](https://velog.velcdn.com/images/mng_jn/post/d6be9cc6-1770-4058-807e-0a8c27189de3/image.png)

로드밸런싱 확인해보자. (worker1,2에도 컨테이너 ID랑 문구만 바꿔서 진행)</code></pre><p>[root@manager1 ~]# docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                               NAMES
696989f42e52   nginx:latest            &quot;/docker-entrypoint.…&quot;   14 minutes ago   Up 14 minutes   80/tcp                              my_web.1.k83kmvxad8v7dakwg26q7am95
8e1189d78f48   mj030kk/web-site:v2.0   &quot;nginx -g &#39;daemon of…&quot;   5 hours ago      Up 3 hours      0.0.0.0:80-&gt;80/tcp, :::80-&gt;80/tcp   web-site
[root@manager1 ~]# docker exec 696989f42e52 sh -c &quot;echo &quot;manager1&quot; &gt;&gt; /usr/share/nginx/html/index.html&quot;</p>
<pre><code>
![](https://velog.velcdn.com/images/mng_jn/post/8e7be7a8-6e94-47d7-89af-aec2c71917d6/image.png)
웹브라우저는 라운드로빈 아님.
curl 192.168.0.180:8080 으로 하면 라운드로빈처럼 보임. 

workerIP로 해도 됨.
-&gt; 아래 때문.</code></pre><p>Endpoint Mode:  vip
Ports:
 PublishedPort = 8080
  Protocol = tcp
  TargetPort = 80
  PublishMode = ingress</p>
<pre><code></code></pre><p>[root@manager1 ~]# docker service logs my_web ##접속 로그 확인</p>
<h1 id="docker-service-inspect---pretty-my_web">docker service inspect --pretty my_web</h1>
<h1 id="docker-service-scale-my_web5-3개의-컨테이너-5개로-scale-out">docker service scale my_web=5 //3개의 컨테이너 5개로 scale out</h1>
<h1 id="docker-service-ps-my_web-1">docker service ps my_web</h1>
<p>-&gt;worker 2개씩 manager1개 받음. 만약 6개로 늘렸으면 2, 2, 2 딱 맞았을 것.(스케줄링. 공평하게 배분)</p>
<pre><code>롤링 업데이트 (사이트 업데이트 할 때)</code></pre><p>[root@manager1 ~]# docker service update --image halilinux/web-site:v1.0 my_web</p>
<p>[root@manager1 ~]# docker service ps my_web
ID             NAME           IMAGE                   NODE       DESIRED STATE   CURRENT STATE            ERROR     PORTS
kqwjeym181kz   my_web.1       mj030kk/web-site:v1.0   manager1   Running         Running 4 minutes ago
k83kmvxad8v7    _ my_web.1   nginx:latest            manager1   Shutdown        Shutdown 4 minutes ago
7v45oe4ox8r9   my_web.2       mj030kk/web-site:v1.0   worker1    Running         Running 3 minutes ago
dpg9rrlx3si6    _ my_web.2   nginx:latest            worker1    Shutdown        Shutdown 3 minutes ago
0rkebziyy49k   my_web.3       mj030kk/web-site:v1.0   worker2    Running         Running 4 minutes ago
o70dmhuah8y5    _ my_web.3   nginx:latest            worker2    Shutdown        Shutdown 4 minutes ago
jbp6p6u6obwm   my_web.4       mj030kk/web-site:v1.0   worker2    Running         Running 4 minutes ago
ztuc693rg6go    _ my_web.4   nginx:latest            worker2    Shutdown        Shutdown 4 minutes ago
ooxls9ox3oxj   my_web.5       mj030kk/web-site:v1.0   worker1    Running         Running 3 minutes ago
adfphwdtjzui    _ my_web.5   nginx:latest            worker1    Shutdown        Shutdown 3 minutes ago
1bu36ldivfer   my_web.6       mj030kk/web-site:v1.0   manager1   Running         Running 4 minutes ago
kgn76j3t7gx3    _ my_web.6   nginx:latest            manager1   Shutdown        Shutdown 4 minutes ago</p>
<p>이전 서버로 돌아가야할때 (버전관리)
[root@manager1 ~]# docker service rollback my_web</p>
<p>[root@manager1 ~]# docker service rm my_web // 한번 정리</p>
<pre><code># 📌클러스터에서 특정 노드 드레인하기</code></pre><p>[root@manager1 ~]# docker service create --name my_web --replicas 3 --publish published=8080,target=80 mj030kk/web-site:v1.0
task 재생성</p>
<h1 id="docker-node-ls">docker node ls</h1>
<h1 id="docker-service-ps-my_web-2">docker service ps my_web</h1>
<h1 id="docker-node-update---availability-drain-worker1">docker node update --availability drain worker1</h1>
<p>//worker1에서 다른 곳으로 넘어감 (manager1 or worker2)</p>
<p>[root@manager1 ~]# docker rm -f 79ac791c65b4
매니저로 할당받은거 삭제해보기</p>
<p>[root@manager1 ~]# docker service ps my_web
ID             NAME           IMAGE                   NODE       DESIRED STATE   CURRENT STATE            ERROR                         PORTS
oh22zjyze4u8   my_web.1       mj030kk/web-site:v1.0   worker2    Running         Running 17 seconds ago
rl6w61gufuch    _ my_web.1   mj030kk/web-site:v1.0   manager1   Shutdown        Failed 23 seconds ago    &quot;task: non-zero exit (137)&quot;
hxrwh7lna8ib    _ my_web.1   mj030kk/web-site:v1.0   worker1    Shutdown        Shutdown 4 minutes ago
mxte7mbor29q   my_web.2       mj030kk/web-site:v1.0   worker2    Running         Running 6 minutes ago
87g9gutjz9zy   my_web.3       mj030kk/web-site:v1.0   manager1   Running         Running 6 minutes ago
-&gt;이번엔 replicas로 인해 worker2에 할당받음.</p>
<h1 id="docker-node-inspect---pretty-worker1">docker node inspect --pretty worker1</h1>
<p> Availability:          Drain</p>
<h1 id="docker-service-ps-my_web-3">docker service ps my_web</h1>
<p>[root@manager1 ~]# docker node ls</p>
<h1 id="docker-node-update---availability-active-worker1">docker node update --availability active worker1</h1>
<p>[root@manager1 ~]# docker service ps my_web
ID             NAME           IMAGE                   NODE       DESIRED STATE   CURRENT STATE            ERROR                         PORTS
oh22zjyze4u8   my_web.1       mj030kk/web-site:v1.0   worker2    Running         Running 3 minutes ago
rl6w61gufuch    _ my_web.1   mj030kk/web-site:v1.0   manager1   Shutdown        Failed 3 minutes ago     &quot;task: non-zero exit (137)&quot;
hxrwh7lna8ib    _ my_web.1   mj030kk/web-site:v1.0   worker1    Shutdown        Shutdown 7 minutes ago
mxte7mbor29q   my_web.2       mj030kk/web-site:v1.0   worker2    Running         Running 9 minutes ago
87g9gutjz9zy   my_web.3       mj030kk/web-site:v1.0   manager1   Running         Running 9 minutes ago
-&gt; 다시 active 해도 자동으로 worker1에게 할당하지 않음.</p>
<p>[root@manager1 ~]# docker service scale my_web=3
-&gt; scale 3 다시해도 마찬가지. </p>
<p>[root@manager1 ~]# docker service scale my_web=2
-&gt; 스케일 줄였다가</p>
<p>[root@manager1 ~]# docker service scale my_web=3
my_web scaled to 3
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
[root@manager1 ~]# docker service ps my_web
ID             NAME           IMAGE                   NODE       DESIRED STATE   CURRENT STATE             ERROR                         PORTS
oh22zjyze4u8   my_web.1       mj030kk/web-site:v1.0   worker2    Running         Running 7 minutes ago
rl6w61gufuch    _ my_web.1   mj030kk/web-site:v1.0   manager1   Shutdown        Failed 8 minutes ago      &quot;task: non-zero exit (137)&quot;
hxrwh7lna8ib    _ my_web.1   mj030kk/web-site:v1.0   worker1    Shutdown        Shutdown 12 minutes ago
hwthalyjbv49   my_web.2       mj030kk/web-site:v1.0   worker1    Running         Running 6 seconds ago
87g9gutjz9zy   my_web.3       mj030kk/web-site:v1.0   manager1   Running         Running 14 minutes ago
-&gt; 늘리면 다시 각 노드에 할당.</p>
<pre><code>pause일시정지</code></pre><p>[root@manager1 ~]# docker node update --availability pause worker2
worker2</p>
<p>[root@manager1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
96zkn9063w151ousxzg0ia1is *   manager1   Ready     Active         Leader           20.10.17
pt276x5gbdg9btk6hjslxbz93     worker1    Ready     Active                          20.10.17
acg4rud6as7wh2l4cxw40ikkr     worker2    Ready     Pause                           20.10.17</p>
<p>[root@manager1 ~]# docker service scale my_web=5
my_web scaled to 5
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service converged
-&gt; scale out 하면, </p>
<p>[root@manager1 ~]# docker service ps my_web
ID             NAME           IMAGE                   NODE       DESIRED STATE   CURRENT STATE             ERROR                         PORTS
oh22zjyze4u8   my_web.1       mj030kk/web-site:v1.0   worker2    Running         Running 25 minutes ago
rl6w61gufuch    _ my_web.1   mj030kk/web-site:v1.0   manager1   Shutdown        Failed 25 minutes ago     &quot;task: non-zero exit (137)&quot;
hxrwh7lna8ib    _ my_web.1   mj030kk/web-site:v1.0   worker1    Shutdown        Shutdown 29 minutes ago
hwthalyjbv49   my_web.2       mj030kk/web-site:v1.0   worker1    Running         Running 17 minutes ago
87g9gutjz9zy   my_web.3       mj030kk/web-site:v1.0   manager1   Running         Running 31 minutes ago
3ya52u1zjwlv   my_web.4       mj030kk/web-site:v1.0   worker1    Running         Running 8 seconds ago
nnsecu0may7l   my_web.5       mj030kk/web-site:v1.0   manager1   Running         Running 10 seconds ago</p>
<p>-&gt;worker 2 에는 생성되지 않음.(쉬는중!)</p>
<p>```</p>
<p>📙✔️✏️📢⭐️📌</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[👩‍💻0712[Docker]]]></title>
            <link>https://velog.io/@mng_jn/0712</link>
            <guid>https://velog.io/@mng_jn/0712</guid>
            <pubDate>Tue, 12 Jul 2022 05:26:49 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-dockerfile-명령어-연습">📌 Dockerfile 명령어 연습</h1>
<h2 id="📙-명령어">📙 명령어</h2>
<p>run ; yum, cpt 등 쉘명령어
cmd; systemlctl 이런거
copy ; cp
ADD ; tar파일을 풀 수 있음.</p>
<h2 id="📙-dockerfile-생성-push">📙 dockerfile 생성, push</h2>
<pre><code># vi Dockerfile
FROM ubuntu:18.04
MAINTAINER johnlee
LABEL &quot;name&quot;=&quot;webserver&quot;
ENV aloha=date
ENV path=/var/www/html
RUN sed -i &#39;s/archive.ubuntu.com/ftp.daumkakao.com/g&#39; /etc/apt/sources.list
##&#39;/etc/apt/sources.list&#39;이 파일에서 archive.ubuntu.com이걸 찾아서 ftp.daumkakao.com이걸로 바꿔라.

RUN apt-get update
RUN apt-get install apache2 -y ##웹서버 만들거니까 아파치 이미지에 설치해두기
COPY nihao /var/www/html/nihao
COPY hello.html $path
ADD aws.tar /var/www/html
WORKDIR /var/www/html # cd, exec -it
RUN echo ohayo &gt;&gt; ohayo.html
VOLUME /var/www/html # -v tmp:/var/www/html ; VOLUME은 호스트 경로를 내가 지정 할 수 없음.
EXPOSE 80 ## 컨테이너 포트. 이렇게 해두고 run 할 때 -P하면 호스트포트는 랜덤으로 할당받음.
ENTRYPOINT [&quot;apachectl&quot;] ##실행명령어 [&quot;apachectl&quot;,&quot;-D&quot;, &quot;FOREGORUND&quot;]
CMD [&quot;-D&quot;, &quot;FOREGROUND&quot;] ##옵션 [&quot;apachectl&quot;,&quot;-D&quot;, &quot;FOREGORUND&quot;]

[root@localhost test]# mkdir nihao
[root@localhost test]# echo &quot;NIHAO&quot; &gt; nihao/index.html
[root@localhost test]# echo &quot;HELLO&quot; &gt; hello.html
[root@localhost test]# ls
Dockerfile  hello.html  nihao


# docker build -t mj030kk/hello:v1.0 . //이미지 만들기 dockerfile이 현재 경로에 있는 거니까 &#39;.&#39;
# docker push mj030kk/hello:v1.0 // 도커허브에 푸시

</code></pre><p>도커파일 ; 서버 템플릿</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/6b49f1db-035d-4153-9dc9-2867b3935b96/image.png" alt=""></p>
<p>업로드 확인!</p>
<p>컨테이너는 이미지를 실행시킨 것. -&gt; build push run(이미지 - 컨테이너)</p>
<h2 id="📙-run">📙 run</h2>
<pre><code>[root@localhost test]# docker run -d -P --name hello mj030kk/hello:v1.0

[root@localhost test]# docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS          PORTS                                     NAMES
a6c01b8a24f8   mj030kk/hello:v1.0   &quot;apachectl -D FOREGR…&quot;   14 seconds ago   Up 12 seconds   0.0.0.0:49154-&gt;80/tcp, :::49154-&gt;80/tcp   hello
</code></pre><p>✔️ 검증하기</p>
<ul>
<li><p>ADD aws.tar /var/www/html
<img src="https://velog.velcdn.com/images/mng_jn/post/d6161c64-fbf6-4410-bd6a-0dafcf883a5d/image.png" alt=""></p>
</li>
<li><p>COPY nihao /var/www/html/nihao
<img src="https://velog.velcdn.com/images/mng_jn/post/98249d11-7950-4eac-af7f-87af1a77fc1a/image.png" alt=""></p>
</li>
<li><p>COPY hello.html $path
<img src="https://velog.velcdn.com/images/mng_jn/post/64f28bc5-dbe2-42db-8abd-cb582436b5db/image.png" alt=""></p>
</li>
<li><p>WORKDIR /var/www/html
RUN echo ohayo &gt;&gt; ohayo.html</p>
<pre><code>[root@localhost homepage]# docker exec -it hello bash
root@a6c01b8a24f8:/var/www/html#
root@a6c01b8a24f8:/var/www/html#
root@a6c01b8a24f8:/var/www/html# ls
assets  css  hello.html  index.html  js  nihao  ohayo.html</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/4622a62b-c630-4b1b-8d0d-b3086e39d136/image.png" alt=""></p>
</li>
<li><p>VOLUME /var/www/html</p>
</li>
</ul>
<pre><code>[root@localhost ~]# find / -name ohayo.html // docker inspect hello 통해서 소스 확인하는게 더 편함.
/var/lib/docker/overlay2/a1f81e1228da7fcc637d026a78f7a12d01b7362d3bf19c1573d044930df43013/merged/var/www/html/ohayo.html
/var/lib/docker/overlay2/6298e8fca931b175ee2d31d20326f89045675741adcc2c68b61a797a22d432e3/diff/var/www/html/ohayo.html
/var/lib/docker/volumes/8217233bc36638e9be313cdcafe8985c20f6b3f4d60a77acf267b637ecd120f9/_data/ohayo.html
/var/lib/docker/volumes/fa42d7c3300de4a4d452b4cc4cfd4464a63738914d8314f494dc341a71d1165a/_data/ohayo.html
[root@localhost ~]# cd /var/lib/docker/volumes/fa42d7c3300de4a4d452b4cc4cfd4464a63738914d8314f494dc341a71d1165a/_data/
[root@localhost _data]# ls
assets  css  hello.html  index.html  js  nihao  ohayo.html

[root@localhost _data]# vi hello.html
HELLO ALOHA</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/10f1c4f4-b83c-42f6-9348-166e14c9b8f0/image.png" alt=""></p>
<h1 id="📌-dockerfile-정적-웹사이트-이미지-배포">📌 Dockerfile 정적 웹사이트 이미지 배포</h1>
<p>✔️ 도커파일 만들 폴더 만들고 파일 준비하기 two-rabbits, index.html</p>
<pre><code>[root@localhost ~]# mkdir homepage
[root@localhost ~]# cd homepage
[root@localhost homepage]# mkdir images
[root@localhost homepage]# cd images/
[root@localhost images]# ls
[root@localhost images]# ls
two-rabbit.jpg
[root@localhost images]# cd ..
[root@localhost homepage]# ls
images  index.html
</code></pre><p>✔️ tar파일로 만들기, dockerfile 생성</p>
<pre><code>[root@localhost homepage]# tar cvf test.tar images index.html  // image와 index.html tar파일 만들기
[root@localhost homepage]#vi Dockerfile
FROM nginx:latest //베이스 이미지
ADD aws.tar /usr/share/nginx/html
CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;] //niginx 구동 명령어
</code></pre><p>위에 두 줄(FROM,ADD)은 이미지로 만들때 기동.
이미지가 컨테이너가 되면 CMD, ENTRYPOINT 기동.</p>
<p>✔️ build, push, run</p>
<pre><code>
[root@localhost homepage]# docker build -t mj030kk/homepage:v1.0 .
[root@localhost homepage]# docker push mj030kk/homepage:v1.0
[root@localhost homepage]# docker run -d -p 9000:80 --name home mj030kk/homepage:v1.0
</code></pre><h1 id="📌dockerfile-wordpress">📌Dockerfile-wordpress</h1>
<p>✔️웹서버 dockerfile, build, push , run</p>
<pre><code>[root@localhost ~]# mkdir wordpress &amp;&amp; cd $_
[root@localhost wordpress]## vi Dockerfile
FROM centos:7
MAINTAINER mj@example.com
RUN yum install -y httpd php php-mysql php-gd php-mbstring wget unzip
RUN wget https://ko.wordpress.org/wordpress-4.8.2-ko_KR.zip
WORKDIR /var/www/html
RUN unzip /wordpress-4.8.2-ko_KR.zip
RUN mv wordpress/* .
RUN chown -R apache:apache /var/www/*
CMD httpd -DFOREGROUND //[&quot;httpd&quot;,&quot;-DFOREGROUND&quot;] 이런모양으로 써도 됨. 이게 더 성능 좋음.
# docker build -t mj030kk/wordpress:v1.0 .
# docker push mj030kk/wordpress:v1.0 //ship (push, pull)
# docker run -d -p 88:80 --name wordpress --network test_bridge mj030kk/wordpress:v1.0 
# docker inspect wordpress
</code></pre><p>✔️db서버(컨테이너) 생성 - mariadb</p>
<pre><code># docker run -d -p 3306:3306 --name dbserver \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wppass \
-e MYSQL_ROOT_PASSWORD=password --network test_bridge mariadb</code></pre><p>-&gt; 웹 브라우저로 web서버 포트번호로 진입해서 워드프레스 설치 진행</p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/efff69b9-1605-4567-8a2a-a5d5cdd3cac8/image.png" alt=""></p>
<h1 id="📌-도커-데이터-관리">📌 도커 데이터 관리</h1>
<h2 id="📙-bind-mount-폴더-공유">📙 Bind Mount (폴더 공유)</h2>
<pre><code>
[root@localhost ~]# mkdir volume &amp;&amp; cd $_
# mkdir bm01 ; touch bm01/test.txt
# docker run -itd --name bm-test -v /root/volume/bm01:/mnt centos:7
# docker exec bm-test ls /mnt</code></pre><h2 id="📙-volume-볼륨-생성해서-마운트">📙 Volume (볼륨 생성해서 마운트)</h2>
<p><strong>inspect, list 등의 명령어 사용하여 관리 할 수 있음 .</strong></p>
<pre><code>
# docker volume create my-vol01
# docker volume list
# docker volume inspect my-vol01
&quot;Mountpoint&quot;: &quot;/var/lib/docker/volumes/my-vol01/_data&quot;
# docker run -itd --name vol-test -v my-vol01:/mnt centos:7
# docker run -itd -p 801:80 --name vol-web -v my-vol01:/usr/local/apache2/htdocs:ro httpd:latest
# curl 192.168.1.91:801
&lt;html&gt;&lt;body&gt;&lt;h1&gt;It works!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;
# docker container exec vol-test sh -c &quot;echo &quot;Nihao&quot; &gt; /mnt/index.html&quot;
# curl 192.168.1.91:801
Nihao</code></pre><p>?? It works! 가  어떻게 나온건지..?
/usr/local/apache2/htdocs:ro 여기에 원래 있는 파일..?</p>
<p>-&gt; 컨테이너환경 아파치에서의 웰컴페이지!!</p>
<h1 id="📌-도커-네트워크-관리">📌 도커 네트워크 관리</h1>
<p>✔️  기본 네트워크 정보 확인해보기</p>
<pre><code># docker network list
# docker network inspect bridge
&quot;com.docker.network.bridge.name&quot;: &quot;docker0&quot;,</code></pre><p>✔️ 새 네트워크 생성</p>
<pre><code>
# docker network create new-net --subnet 172.31.0.0/16 --ip-range 172.31.0.0/20 --gateway 172.31.0.1
# docker network list
NETWORK ID     NAME          DRIVER    SCOPE
3ce4ba4e8a2d   bridge        bridge    local
a8ae279c0395   host          host      local
3aceaee87e11   new-net       bridge    local
dd00f8d63e73   none          null      local
24e21c0c84ca   test_bridge   bridge    local

# docker inspect new-net
# docker run -d -P --network new-net nginx
# docker ps //컨테이너 이름 알아내기
# docker inspect nice_turing //ip 172.31.0.2 확인
</code></pre><h1 id="📌-onbuild">📌 onbuild</h1>
<p>*<em>운영자로서 개발자에게 도움주기 *</em></p>
<h2 id="📙-운영자-역할">📙 운영자 역할</h2>
<pre><code>[root@localhost ~]# mkdir onbuild &amp;&amp; cd $_
[root@localhost onbuild]# vi Dockerfile.base
FROM ubuntu:18.04
RUN sed -i &#39;s/archive.ubuntu.com/ftp.daumkakao.com/g&#39; /etc/apt/sources.list
RUN apt-get -y update
RUN apt-get -y install nginx
EXPOSE 80
ONBUILD ADD website*.tar /var/www/html/ ##개발자 쪽에서 빌드할 때 ADD 실행.
CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]

[root@localhost onbuild]# docker build -t mj030kk/web-base:v1.0 -f Dockerfile.base .
[root@localhost onbuild]# docker login
[root@localhost onbuild]# docker push mj030kk/web-base:v1.0
[root@localhost onbuild]# vi Dockerfile 
FROM mj030kk/web-base:v1.0</code></pre><p>-&gt; Dockerfile 파일을 개발자에게 전달.</p>
<h2 id="📙-개발자-역할">📙 개발자 역할</h2>
<p><strong>웹서버 타르파일 , dockerfile 받아온 파일 준비 **
**ansible ubuntu-node02서버 활용</strong></p>
<pre><code>root@ubuntu-node02:~# mkdir onbuild &amp;&amp; cd $_
root@ubuntu-node02:~/onbuild# ls
website.tar
Dockerfile

root@ubuntu-node02:~/onbuild# docker build -t mj030kk/web-site:v1.0 .
root@ubuntu-node02:~/onbuild# docker run -d -p 80:80 --name=web-site mj030kk/web-site:v1.0</code></pre><p><img src="https://velog.velcdn.com/images/mng_jn/post/f0d99c4d-9afe-4d77-9deb-9f399468c6fa/image.png" alt=""></p>
<pre><code>root@ubuntu-node02:~/onbuild# docker login
root@ubuntu-node02:~/onbuild# docker push mj030kk/web-site:v1.0</code></pre><h2 id="📙-aws-운영자-역할--최종-운영-환경-">📙 AWS-운영자 역할 ( 최종 운영 환경 )</h2>
<p>✔️ 1. 인스턴스 생성
이름 : docker
이미지 : ami-0fd0765afb77bcca7 (아마존 linux 2)
유형 : t2.micro
키페어 : 새 키 페어 ; docker-key
vpc : MY-VPC
서브넷 : MY-PUBLIC-SUBNET-2C
보안그룹 : 보안그룹 생성 ; 이름 ; MY-SG-WEB / SSH, HTTP 위치무관으로 추가 
고급세부정보 - 사용자 데이터 :</p>
<pre><code>#!/bin/bash
sudo amazon-linux-extras install docker -y
sudo systemctl start docker &amp;&amp; systemctl enable docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
sudo usermod -a -G docker ec2-user</code></pre><p>✔️ 2. route53에 레코드 추가
<img src="https://velog.velcdn.com/images/mng_jn/post/0dc85fe5-0863-4ffc-8b89-9563ab8e59a0/image.png" alt=""></p>
<p>✔️ 3.mobaxterm으로 접속하여 아래 명령어 수행 </p>
<p><img src="https://velog.velcdn.com/images/mng_jn/post/85bb305b-4af9-40e7-94a6-365cbbb4c0ef/image.png" alt=""></p>
<pre><code>[ec2-user@ip-10-14-36-119 ~]$ docker --version
Docker version 20.10.13, build a224086
[ec2-user@ip-10-14-36-119 ~]$ docker run -d -p 80:80 --name webserver mj030kk/web-site:v1.0
</code></pre><p>✔️ 4. 최종 운영 환경 확인
<img src="https://velog.velcdn.com/images/mng_jn/post/9674aaba-d3fd-470a-bbdb-71cbe35a5121/image.png" alt=""></p>
<h1 id="📌-도커-사설-레지스트리">📌 도커 사설 레지스트리</h1>
<p>✔️ 0. restart 명령어?</p>
<pre><code>[root@localhost onbuild]# docker run -d -p 8888:80 --restart always --name test-restart mj030kk/web-site:v1.0
[root@localhost onbuild]# reboot
</code></pre><p>restart always - 서버 껐다 켜진 후에 자동으로 올라옴.
<img src="https://velog.velcdn.com/images/mng_jn/post/70fed429-bb2b-422d-9b73-bc050d7ce70e/image.png" alt=""></p>
<h2 id="📙-사설-레지스트리-생성">📙 사설 레지스트리 생성</h2>
<p><strong>aws서버에서 진행</strong></p>
<pre><code>[ec2-user@ip-10-14-36-119 ~]$  docker run -d -p 5000:5000 --restart=always --name private-docker-registry registry 
</code></pre><p>아까 생성한 MY-SG-WEB보안그룹 수정(5000번 포트 추가)
<img src="https://velog.velcdn.com/images/mng_jn/post/96322bbc-94d4-414d-8a35-cd2425bb68e0/image.png" alt=""></p>
<h2 id="📙-클라이언트1-centos-docker---사설-레지스트리에-push">📙 클라이언트1 (centos Docker) - 사설 레지스트리에 push</h2>
<p><strong>(원래 Dockerserver)</strong></p>
<pre><code>[root@localhost ~]# vi /etc/docker/daemon.json 
{ &quot;insecure-registries&quot;:[&quot;docker.lovemj.shop:5000&quot;] } //보안 허용 작업
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker tag mj030kk/homepage:v1.0  docker.lovemj.shop:5000/homepage:v1.0
[root@localhost ~]# docker push docker.lovemj.shop:5000/homepage:v1.0
</code></pre><h2 id="📙-클라이언트-2-ubuntu-node02---사설-레지스트레에서-가져와서-run">📙 클라이언트 2 (ubuntu-node02) - 사설 레지스트레에서 가져와서 run</h2>
<pre><code>root@ubuntu-node02:~/onbuild# vi /etc/docker/daemon.json
{ &quot;insecure-registries&quot;:[&quot;docker.lovemj.shop:5000&quot;] }
root@ubuntu-node02:~/onbuild# systemctl restart docker
root@ubuntu-node02:~/onbuild# docker run -d -p 8888:80 --name test docker.lovemj.shop:5000/homepage:v1.0
</code></pre><p>📙✔️✏️📢⭐️📌</p>
]]></description>
        </item>
    </channel>
</rss>