<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dame_sol.log</title>
        <link>https://velog.io/</link>
        <description>oepenpen</description>
        <lastBuildDate>Fri, 18 Feb 2022 08:53:23 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dame_sol.log</title>
            <url>https://images.velog.io/images/dame_sol/profile/eda6475f-e7e2-4ab8-9a46-b39c939b4fcb/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dame_sol.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dame_sol" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[G-cloud] haproxy, keepalived 설정]]></title>
            <link>https://velog.io/@dame_sol/G-cloud-haproxy-keepalived-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@dame_sol/G-cloud-haproxy-keepalived-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Fri, 18 Feb 2022 08:53:23 GMT</pubDate>
            <description><![CDATA[<h1 id="0-하게된-이유">0. 하게된 이유</h1>
<ul>
<li>proxy 서버 대개체 작업 진행 </li>
<li>centos6 -&gt; centos7 로 변경</li>
<li>haproxy 로 구성되어있고 heartbeat 설정 되어있는데 keepalived로 변경 필요</li>
</ul>
<h1 id="1-haproxy-설정">1. haproxy 설정</h1>
<h2 id="1-1-haproxy-버전-이슈">1-1. haproxy 버전 이슈</h2>
<p>기존 6버전에는 <code>haproxy-1.5.18-1</code> 버전인데 7버전에서는 <code>haproxy-1.5.18-9</code> 버전이 지원된다.
so. rpm 파일을 전달하더라도 dependency 문제가 있어서 설치가 안되는 이슈가 있었다.
(이미 depency 패키지가 높은 버전으로 존재하지만 설치 안됨)</p>
<p>외부에서 haproxy-1.5.18-9 rpm 파일 다운 받아서 scp로 전달.
의존성 파일 따로 없이도 rpm 파일이 설치 된다.</p>
<h2 id="1-2-사전작업">1-2 사전작업</h2>
<p><em>정확한 내용은 보안으로 적지 못함
테스트 내용을 작성</em></p>
<p>httpd 서버 2대를 만들어준다</p>
<pre><code>#app1/app2 서버 둘다 적용
yum install httpd
systemctl enable httpd --now ; systemctl status httpd</code></pre><h2 id="1-3-haproxy-설정작업">1-3. haproxy 설정작업</h2>
<p> <strong>/etc/haproxy/haproxy.cfg 변경</strong>
 <em>정확한 내용은 보안으로 적지 못함
테스트 내용을 작성</em></p>
<h3 id="1번2번-proxy-서버">1번2번 proxy 서버</h3>
<ul>
<li>front end 변경</li>
<li>port 를 9398 로 변경해주었음
<code>yum install haproxy-1.5.18</code></li>
</ul>
<pre><code>frontend  main *:9398
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js

    use_backend static          if url_static
    default_backend             app</code></pre><ul>
<li>라우드 로빈으로 설정해주었고 아래와 같이 백엔드에 httpd 서버 2대 설정해 주었음</li>
<li>[app1 호스트 name]  [ip:port]</li>
<li>[app2 호스트 name]  [ip:port]</li>
</ul>
<pre><code>backend app
    balance     roundrobin
    server  app1 192.168.241.99:80 check
    server  app2 192.168.241.101:80 check</code></pre><ul>
<li>실행
<code>systemctl enable haproxy --now ; systemctl status haproxy</code> </li>
</ul>
<h1 id="2-keepalived-설정">2. keepalived 설정</h1>
<h2 id="2-1-사전-설정">2-1. 사전 설정</h2>
<h3 id="proxy12번서버-에서-작업">proxy1,2번서버 에서 작업</h3>
<ul>
<li><p>keepalived 설치
<code>yum install keepalived</code></p>
</li>
<li><p>커널파라미터 변경
keepalived를 master에 적용하고 standby에 적용시 vip를 바라보지 못해서
keepalived 서비스가 실행되지 못한다.
아래 커널 적용하자.</p>
</li>
</ul>
<pre><code>vi /etc/sysctl.conf
&gt; net.ipv4.ip_nonlocal_bind=1 

cat /proc/sys/net/ipv4/ip_nonlocal_bind
#결과: 1 이면 성공
#결과가 1이 아닐경우 재부팅</code></pre><h2 id="2-2-proxy1번-작업">2-2. proxy1번 작업</h2>
<ul>
<li>conf 파일 설정 변경</li>
<li>state MASTER  master서버로 선정</li>
<li>interface 설정 필요 ex) ens33 eth1 등등</li>
<li>priority 200 숫자가 높을 수록 우선 순위를 갖는다.</li>
<li>adver_int 2  proxy 서버간  heartbeat 체크 시간
2초마다 체크하도록 설정했다.</li>
<li>virtual_ipaddress 를 설정해주면 master의 ip에 VIP가 생성된다.</li>
</ul>
<pre><code>vi /etc/keepalived/keepalived.conf
&gt;
! Configuration File for keepalived

global_defs {
        router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 200      
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.241.200/24  ## 나중에 기존 것 적용
    }
}
</code></pre><ul>
<li>서비스 시작</li>
</ul>
<p><code>systemctl enable keepalived.service --now ; systemctl status keepalived.service</code></p>
<h2 id="2-3-proxy2번-작업">2-3. proxy2번 작업</h2>
<ul>
<li>conf 파일 설정 변경</li>
<li>state BACKUP  standby서버로 선정</li>
<li>interface 설정 필요 ex) ens33 eth1 등등</li>
<li>priority 100 master보다 낮은 숫자 설정.</li>
<li>adver_int 2  proxy 서버간  heartbeat 체크 시간
2초마다 체크하도록 설정했다.</li>
<li>virtual_ipaddress 를 설정해주면 standby에는 VIP가 생성되지 않는다.
향후 절체되어서 넘어오면 생긴다.<pre><code>! Configuration File for keepalived
</code></pre></li>
</ul>
<p>global_defs {
        router_id LVS_DEVEL
}</p>
<p>vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.241.200/24
    }
}</p>
<p>```</p>
<ul>
<li>서비스 시작
<code>systemctl enable keepalived --now ; systemctl status keepalived</code></li>
</ul>
<h1 id="3-테스트">3. 테스트</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[내부망 아파치 yum repo 서버 만들기]]></title>
            <link>https://velog.io/@dame_sol/%EB%82%B4%EB%B6%80%EB%A7%9D-%EC%95%84%ED%8C%8C%EC%B9%98-yum-repo-%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@dame_sol/%EB%82%B4%EB%B6%80%EB%A7%9D-%EC%95%84%ED%8C%8C%EC%B9%98-yum-repo-%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 09 Feb 2022 06:41:48 GMT</pubDate>
            <description><![CDATA[<h1 id="1-왜-하게되었는가">1. 왜 하게되었는가?</h1>
<p>고객사 서버를 구축하면서 내부망에 패키지 설치가 필요했다.</p>
<ul>
<li><p>iso 파일을 가져와서 각 서버마다 적용 </p>
</li>
<li><blockquote>
<p>파일을 서버에 넣기도 시간이 오래걸리고 디스크 용량도 은근 부담스럽다.</p>
</blockquote>
</li>
<li><p>repo 서버를 만들어서 참조시키면??</p>
</li>
</ul>
<h1 id="2-iso-파일-가져오기">2. iso 파일 가져오기</h1>
<p>내부망의 공용 서버를 이용하여 repo 서버를 구축 할 예정
외부 bastion 서버에 iso 파일을 넣고 내부 공용서버로 옮긴다.</p>
<p>용량이 안전한 곳으로 옮긴다
so. 사전에 고객사와 이야기하여 여유공간이 있는 디스크를 사용한다.</p>
<p><code>scp iso파일이름 user@[내부공용서버ip]:/root/</code></p>
<h1 id="3-내부-repo-만들기">3. 내부 repo 만들기</h1>
<h3 id="내부-공용-서버에서-작업">[내부 공용 서버에서 작업]</h3>
<ul>
<li><p>작업은 /data 밑에서 진행하기로 했다.
<code>mkdir /data/iso</code><br><code>mkdir /data/dvd</code></p>
</li>
<li><p>iso 마운트 진행 및  iso 파일을 저장해준다.</p>
</li>
<li><p>cp 가 아니라 rsync를 사용한 이유
cp는 중간에 끊어지면 처음부터 다시 가져오지만 rsync는 증분만 가져온다. 
전송 용량도 정할 수 있다.</p>
</li>
</ul>
<p><code>mount CentOS-7-x86.64-DVD-2009.iso /data/dvd</code>
<code>rsync -av /data/dvd/* /data/iso</code></p>
<ul>
<li><p>private repo를 만들어준다.
<code>cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/private.repo</code></p>
</li>
<li><p>repo 입력</p>
<pre><code>  cat &lt;&lt; EOF &gt; /etc/yum.repos.d/private.repo
  [base]
  baseurl=file://data/iso
  gpgcheck=1
  enabled=1
  gpgkey=file:///data/iso/RPM-GPG-KEY-CentOS-7
  EOF

  yum clean all
  yum repolist</code></pre></li>
<li><p>삭제 진행</p>
<pre><code>  umount /data/dvd 
  rm -rf /data/dvd
  rm $HOME/CentOS-7-x86.64-DVD-2009.iso</code></pre></li>
</ul>
<h1 id="4-아파치-repo">4. 아파치 repo</h1>
<h2 id="4-1-아파치-설치">4-1. 아파치 설치</h2>
<p>다른 서버에서 참조 할 수 있도록 아파치를 만들자
<code>yum install httpd -y</code></p>
<h2 id="4-2-document-root">4-2 Document Root</h2>
<p><code>/etc/httpd/httpd.conf</code>를 확인해보면
<code>DocumentRoot &quot;/var/www/html&quot;</code> 로 잡혀있다.</p>
<p>DocumentRoot를 /data/iso 로 참조해도 되지만 
<span style="color:blue"><strong>심볼릭 링크</strong> </span>를 거는게 훨씬 편하다.</p>
<h2 id="4-3-심볼릭링크">4-3 심볼릭링크</h2>
<p> ln -s <strong>[원본 디렉토리 or 파일] [link 걸릴 디렉토리 or 파일]</strong>
<code>ln -s /data/iso /var/www/html/iso</code></p>
<p><span style="color:blue">훠얼씬 편하다 !!!</span></p>
<h2 id="4-4-아파치-실행">4-4 아파치 실행</h2>
<p><code>systemctl enable httpd --now</code></p>
<h1 id="5-client-서버">5. client 서버</h1>
<h2 id="5-1-client-서버-yum-repolist">5-1 client 서버 yum repolist</h2>
<h3 id="클라이언트-서버에서-작업">[클라이언트 서버에서 작업]</h3>
<p>이제 다른 내부망 클라이언트 서버들의 설정을 진행한다.</p>
<pre><code>vi /etc/yum.repo.d/private.repo
[private repo]
name=private-repo
baseurl=http://공용서버IP/
enabled=1
gpgcheck=1
gpgkey=http://공용서버IP/RPM-GPG-KEY-CentOS-7

yum clean all
yum repolist
yum install nmap</code></pre><h1 id="6-결론">6. 결론</h1>
<p>필요한 패키지들만 넣어주는 것도 좋지만 repo 서버를 만들어서 관리하면
여러개의 서버를 동시에 관리하지 않아도 되니 매우좋다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[sshpass를 이용해서 원격서버 명령어 실행]]></title>
            <link>https://velog.io/@dame_sol/sshpass%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%9B%90%EA%B2%A9%EC%84%9C%EB%B2%84-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%8B%A4%ED%96%89</link>
            <guid>https://velog.io/@dame_sol/sshpass%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%9B%90%EA%B2%A9%EC%84%9C%EB%B2%84-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%8B%A4%ED%96%89</guid>
            <pubDate>Wed, 09 Feb 2022 02:33:27 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@dame_sol/ssh-%EB%A1%9C-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%88%98%ED%96%89%ED%95%98%EA%B8%B0">이전 블로그 가기</a></p>
<h1 id="1-왜-알아보게-되었는가">1. 왜 알아보게 되었는가?</h1>
<ul>
<li>ssh로 원격 명령어 시행하길 원함</li>
<li>pw 입력하지 않기위해 공개키 이용</li>
<li>공개키를 서버마다 적용하면 너무 불편하다...</li>
</ul>
<h1 id="2-sshpass">2. sshpass</h1>
<h2 id="2-1-sshpass설치">2-1. sshpass설치</h2>
<ul>
<li>sshpass를 설치 해준다. </li>
<li>문제는 private일 경우.......
서버 to 서버 ssh가 막혀있을 경우....ㅎㅎㅎ</li>
</ul>
<p><code>yum install sshpass</code></p>
<h2 id="2-2-명령어-실행">2-2. 명령어 실행</h2>
<p><code>sshpass -p &#39;password&#39; ssh root@[원격서버IP] &#39;la -al&#39;</code>
<code>sshpass -p &#39;password&#39; ssh root@[원격서버IP] &lt; test.sh</code>
<img src="https://images.velog.io/images/dame_sol/post/db6d1910-125b-4a6a-b078-4e7c6f10cb31/image.png" alt=""></p>
<h1 id="3-여러개에-서버-어떻게-적용">3. 여러개에 서버 어떻게 적용?</h1>
<ul>
<li>스크립트를 이용해서 여러개의 서버에 적용한다.</li>
<li>단점: 각 서버의 pw 가 다를경우 노가다이고 하드코딩으로 pw 를 입력하기 때문에 보안 취약적이다.</li>
<li>장점: 한꺼번에 적용된다.</li>
</ul>
<p><strong>서버리스트 파일 만들기</strong></p>
<pre><code>vi list.txt
192.168.10.10
192.168.10.11
.
.
.
192.168.10.100
</code></pre><p><strong>while 문 스크립트 만들기</strong></p>
<pre><code>vi test.sh

while read LIST ;
do

echo $LIST
sshpass -p &#39;test&#39; ssh root@${LIST} &#39;netstat -antp | grep -i list&#39;

done &lt; list.txt</code></pre><p><strong>스크립트 권한 부여</strong>
<code>chmod 700 test.sh</code>
<code>./test.sh</code></p>
<h1 id="결론">결론</h1>
<p>ansible이 사용이 안된다면 위 방법도 괜찮은 방법이 될 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ssh 로 명령어 수행하기]]></title>
            <link>https://velog.io/@dame_sol/ssh-%EB%A1%9C-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%88%98%ED%96%89%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dame_sol/ssh-%EB%A1%9C-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%88%98%ED%96%89%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 09 Feb 2022 02:32:48 GMT</pubDate>
            <description><![CDATA[<h1 id="1-왜-알아보게되었는가">1. 왜 알아보게되었는가?</h1>
<p>k8s master 서버에서 workernode 에 명령어를 한번에 적용할 수 없을까?? 
서버 하나씩 접속해서 join 하지 않고 싶다...</p>
<h1 id="2-ssh-로-명령어-실행">2. ssh 로 명령어 실행</h1>
<h2 id="2-1-ssh-로-명령어-전송">2-1. ssh 로 명령어 전송</h2>
<ul>
<li><p>원격 접속하는 방법에서 명령어 입려해주면 된다.</p>
</li>
<li><p>다만 password 를 써주어야한다....
<code>ssh ssh user@server_ip &quot;ls -al;&quot;</code> 
<img src="https://images.velog.io/images/dame_sol/post/08926987-fb80-40c1-9ccc-57997e809cec/image.png" alt=""></p>
</li>
<li><p>현재 서버의 스크립트를 원격에서 실행하는 방법도 있다.</p>
</li>
<li><p>다만 password 를 써주어야한다....</p>
</li>
</ul>
<p><code>ssh myserver sh &lt; test_script.sh</code></p>
<p><img src="https://images.velog.io/images/dame_sol/post/9678a53e-236a-4f24-bc2e-37ba7eaf3357/image.png" alt=""></p>
<h2 id="2-2-pw-입력안하기">2-2. pw 입력안하기</h2>
<h3 id="ssh-keygen">ssh keygen</h3>
<p><strong>[클라이언트 서버]</strong></p>
<p>1.클라이언트 서버에서 ssh key를 만들어준다.</p>
<p><code>ssh-keygen -t rsa -N &#39;&#39; -f $HOME/.ssh/id_rsa &lt;&lt;&lt; y</code></p>
<p>2.만든 공개키를 원격 접속 하고자 하는 서버에 전송한다.
<code>scp $HOME/.ssh/id_rsa.pub root@원격접속하고 싶은  서버IP:$HOME/id_rsa.pub</code></p>
<p><strong>[원격 접속 서버]</strong></p>
<ol>
<li>원격젒고 서버에 권한 설정 및 파일 생성을 해준다.<pre><code>mkdir /root/.ssh
chmod 700 /root/.ssh
touch /root/.ssh/authorized_keys
chmod 644 /root/.ssh/authorized_keys</code></pre></li>
<li>클라이언트에서 가져온 공개키를 등록한다.
<code>cat /root/id_rsa.pub &gt;&gt; /root/.ssh/authorized_keys</code></li>
</ol>
<p><strong>[접속테스트]</strong></p>
<ul>
<li>*<em>good~~!!! *</em> pw 입력없이 접속된다 
<img src="https://images.velog.io/images/dame_sol/post/c48fd690-f331-45fd-a524-c7c196baaf00/image.png" alt=""></li>
<li>명령어도 pw 없이 되는지 해본다.
<img src="https://images.velog.io/images/dame_sol/post/003cadf8-918a-40bf-866a-47655cf3ac98/image.png" alt=""></li>
<li><em>good~~!!*</em></li>
</ul>
<h1 id="3-결론">3. 결론??</h1>
<p>그런데 서버에 공개키를 다 넣어주는게 너무 귀찮다
tool을 이용하지 않으면 너무 노가다 이다....(ansible?)
그럼 더 좋은 방법이 있는가??</p>
<p><a href="https://velog.io/@dame_sol/sshpass%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%9B%90%EA%B2%A9%EC%84%9C%EB%B2%84-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%8B%A4%ED%96%89">더 좋은 방법으로 gogo</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[kubernetes 인증서 관리]]></title>
            <link>https://velog.io/@dame_sol/kubernetes-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@dame_sol/kubernetes-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Tue, 08 Feb 2022 09:12:51 GMT</pubDate>
            <description><![CDATA[<p>[참조]</p>
<blockquote>
<p><a href="https://malwareanalysis.tistory.com/125">https://malwareanalysis.tistory.com/125</a></p>
</blockquote>
<h1 id="1-왜-알아보게-되었는가">1. 왜 알아보게 되었는가?</h1>
<h2 id="1-1-인증서-관리">1-1 인증서 관리</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[yum 에 대한 간단한 tip]]></title>
            <link>https://velog.io/@dame_sol/yum-%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B0%84%EB%8B%A8%ED%95%9C-tip</link>
            <guid>https://velog.io/@dame_sol/yum-%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B0%84%EB%8B%A8%ED%95%9C-tip</guid>
            <pubDate>Tue, 08 Feb 2022 05:52:22 GMT</pubDate>
            <description><![CDATA[<h1 id="1-yum-설치-히스토리-보는법">1. yum 설치 히스토리 보는법</h1>
<p>지금까지 설치한 히스토리가 나온다.
<code>yum history info</code>
<img src="https://images.velog.io/images/dame_sol/post/f70866fc-6f0f-4d1f-872d-aeaeb75cb601/image.png" alt=""></p>
<h1 id="2-설치가능한-패킷-확인">2. 설치가능한 패킷 확인</h1>
<p>http 중에 설치 가능한 패킷 확인
<code>yum list | grep http*</code>
httpd 가 중간에 보인다.
<img src="https://images.velog.io/images/dame_sol/post/7edf454f-f987-4c16-867d-faf692b38f63/image.png" alt=""></p>
<h1 id="3-의존성-확인하기">3. 의존성 확인하기</h1>
<p>http 설치를 위한 의존성 패키지 검색
<code>yum deplist httpd</code>
good
<img src="https://images.velog.io/images/dame_sol/post/737bf64a-f563-4dc0-acd0-e035c2bd7694/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[부팅시 스크립트 실행하는 방법]]></title>
            <link>https://velog.io/@dame_sol/%EB%B6%80%ED%8C%85%EC%8B%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@dame_sol/%EB%B6%80%ED%8C%85%EC%8B%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 08 Feb 2022 05:44:27 GMT</pubDate>
            <description><![CDATA[<h1 id="1-왜-이-방법을-찾았는가">1. 왜? 이 방법을 찾았는가.</h1>
<ul>
<li>개인적으로 사용중인 worker node VM이 올라올 때 고정 ip가 적용되지 않는다.</li>
<li>매번 킬때마다 설정하기 귀찮으니 부팅시에 스크립트 실행해서 고정ip 붙이면서 실행시키고 싶다.</li>
</ul>
<h1 id="2-부팅-시에-올라오게하자">2. 부팅 시에 올라오게하자</h1>
<h2 id="2-1-etcrclocal">2-1. /etc/rc.local</h2>
<ul>
<li>/etc/rc.local 은 /etc/rc.d/rc.local을 심볼릭 링크로 연결되어 있다.
<img src="https://images.velog.io/images/dame_sol/post/994fe95e-d6ce-41b3-9205-b2030d76e0d0/image.png" alt=""></li>
</ul>
<h2 id="2-2-실행할-스크립트">2-2. 실행할 스크립트</h2>
<ul>
<li>고정 IP 적용할 스크립트<pre><code>vi /root/ipset.sh
</code></pre></li>
</ul>
<p>#!/bin/bash</p>
<p>nmcli con mod ens33 ipv4.addresses 192.168.241.100/24
echo &quot;ip set complete&quot;</p>
<p>nmcli con mod ens33 ipv4.gateway 192.168.241.2
echo &quot;gw set complete&quot;</p>
<p>nmcli con mod ens33 ipv4.dns 8.8.8.8
echo &quot;dns set complete&quot;</p>
<p>nmcli con mod ens33 ipv4.method manual
echo &quot;method set complete&quot;</p>
<p>nmcli con up ens33
echo &quot;ens33 up&quot;</p>
<pre><code>
## 2-3. rc.local 에 등록</code></pre><p>vi /etc/rc.local
아래 한줄 추가
/root/ipset.sh</p>
<p>```</p>
<h1 id="3-error">3. error</h1>
<h2 id="3-1-enabled-안됨">3-1. enabled 안됨</h2>
<p><code>systemctl enable rc-local --now</code> 할 경우  status 확인시 아래와 같은 문구가 나온다.
<img src="https://images.velog.io/images/dame_sol/post/35122e41-7c32-4911-806e-be93cfbd0ae2/image.png" alt=""></p>
<p>에러로그를 보면  /etc/rc.d/rc.local과 매칭이 안된다는 문구이다.
<code>ls -al /etc/rc.d/</code> 확인해보면 
<code>rc.local</code> 의 권한에 실행 권한이 없다.  권한을 추가해준다.
<img src="https://images.velog.io/images/dame_sol/post/b3b5db2d-1100-4df1-9796-6fc1c9140b04/image.png" alt=""></p>
<p><code>chmod +x /etc/rc.d/rc.local</code></p>
<p><img src="https://images.velog.io/images/dame_sol/post/0eba5512-b775-445e-a7d8-2baca9ee6849/image.png" alt=""></p>
<h2 id="3-2-다시-등록하기">3-2 다시 등록하기</h2>
<ul>
<li>설정을 변경했으니 다시 등록해본다.
<code>systemctl daemon-reload</code>
<code>systemctl enable rc-local</code>
<code>systemctl status rc-local</code>
매우 잘된다.  이제 부팅하면 rc.local에 등록된 스크립트가 실행되면서 자동으로 ip세팅을 해준다.
<img src="https://images.velog.io/images/dame_sol/post/73e883f1-b673-4593-8b5f-8a9fe1dd4ebe/image.png" alt=""></li>
</ul>
<h2 id="3-3-확인-사살">3-3 확인 사살</h2>
<ul>
<li>완벽한 확인을 위해 데몬 상태 확인 명령어에서 <code>grep</code>으로 rc-local을 추출하자
<code>systemctl list-unit-files | grep rc-local</code>
<img src="https://images.velog.io/images/dame_sol/post/c84282d0-f430-45d8-ad0e-42de0bb1cb4c/image.png" alt=""></li>
</ul>
<p>good</p>
<h1 id="마무리">마무리</h1>
<p>작은 걸 가지고도 더 깊이 들어갈 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[systemd에 timer 등록하기]]></title>
            <link>https://velog.io/@dame_sol/systemd%EC%97%90-timer-%EB%93%B1%EB%A1%9D%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dame_sol/systemd%EC%97%90-timer-%EB%93%B1%EB%A1%9D%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 08 Feb 2022 05:20:09 GMT</pubDate>
            <description><![CDATA[<h1 id="1-왜-이-방법을-찾게-되었는가">1. 왜? 이 방법을 찾게 되었는가.</h1>
<ul>
<li>fedora core os를 사용하여 crontab 등록이 안된다. </li>
<li>systemd에 데몬을 등록하는데 일정 시간에 작동되게 하고 싶다.</li>
</ul>
<h1 id="2스크립트-만들기">2.스크립트 만들기</h1>
<h2 id="2-1-daemon에-등록할-스크립트">2-1 daemon에 등록할 스크립트</h2>
<ul>
<li>각 worker node에 쌓이는 이미지를 지울 prune 명령어를 스크립트로 만듬</li>
<li>crictl rmi --prune 은 사용하지 않는 이미지를 삭제하는 명령어<pre><code>$ vi /root/image-remove.sh
</code></pre></li>
</ul>
<p>#!/bin/bash
crictl rmi --prune </p>
<pre><code>

# 3. service 만들기
- 스크립트를 daemon으로 등록하기 위해 service를 만들어준다.
- 만들어주는 위치는 /etc/systemd/system/ 하위 이다.(반드시)
```$ cd /etc/systemd/system/```
```$ vi image_remove.service```  
서비스 이름은 자유롭게 지어주면 되며 맨뒤에 xxx.service를 반드시 넣어준다.
</code></pre><p>[Unit]
Description=영어로 설명을 적어주시면됩니다.</p>
<p>[Service]
Type=oneshot
ExecStart=/root/image-remove.sh  스크립트 위치 적어준다.</p>
<p>[Install]
WantedBy=multi-user.target   systemd enabled 하기 위해서 </p>
<pre><code>
# 4. timer 만들기
- cron 처럼 system daemon을 타임 설정하여 실행 시킬수 있다.
- 만들어주는 위치는 /etc/systemd/system/ 하위 이다.(반드시)
- timer 설정해주고 싶은 service와 같은 이름으로 만들어야한다(반드시)

```$ cd /etc/systemd/system/```
```$ vi image_remove.timer``` 
서비스 이름과 반드시 같게 만들어줘야하며 xxx.timer 형식으로 만들어준다
</code></pre><p>[Unit]
Description=영어로 설명을 적어주세요</p>
<p>[Timer]
OnCalendar=<em>-</em>-* 10:00:00   년-월-일 시:분:초 형식으로 진행
AccuracySec=1s  timer 실행 하는 시간이 맞는지 확인하는 주기이다 기본 1분이며 초단위로 확인은 1s로 해준다.</p>
<p>[Install]
WantedBy=timer.target</p>
<p>```</p>
<h1 id="5-system-daemon--등록">5. system daemon  등록</h1>
<ul>
<li>서비스를 실행시키는 것이 아니라 타이머를 실행시키는 작업이다.
타이머를 enabled 해주면 시간에 맞추어 service를 실행시켜준다.</li>
</ul>
<p><code>systemctl enable image_remove.timer --now</code>
<code>systemctl status image_remove.timer</code></p>
<h1 id="6-마무리">6. 마무리</h1>
<ul>
<li>cron이 안되면 위 방법은 아주 나이스하다.
단 무작위 증가는 시스템에 영향을 줄수 있으니 리소스를 잘 분배한다.</li>
<li>거의 리소스에 영향을 주지는 않지만 .... 괜히 loop문 이나 실수 하면 부팅때 문제 줄수도 있으니까...</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[jenkins 설치하기]]></title>
            <link>https://velog.io/@dame_sol/jenkins-pipeline-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dame_sol/jenkins-pipeline-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 04 Feb 2022 05:33:09 GMT</pubDate>
            <description><![CDATA[<h1 id="1-젠킨스-서버-구성">1. 젠킨스 서버 구성</h1>
<h2 id="1-1jdk-설치-및-java_home-환경변수-추가">1-1.jdk 설치 및 JAVA_HOME 환경변수 추가</h2>
<p>jenkins는 java로 작성된 프로그램으로 jdk8 또는 jdk11를 이용하여 동작
jdk8 이나 jdk11이 설치되어있지 않다면 jdk를 설치해야함
jdk11버전 추천</p>
<h3 id="yum-list-명령어를-이용하여-설치가능한-jdk8-설치">yum list 명령어를 이용하여 설치가능한 jdk8 설치</h3>
<p><code>yum install java-11-openjdk-devel.x86_64</code></p>
<h3 id="javac-심볼릭링크의-실제-주소를-readlink-명령어로-읽어들이기">javac 심볼릭링크의 실제 주소를 readlink 명령어로 읽어들이기</h3>
<pre><code>which javac
readlink -f /usr/bin/javac
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/bin/javac</code></pre><h3 id="javac가-위치한-bin-디렉터리를-환경변수-path에-추가해줍니다">javac가 위치한 bin 디렉터리를 환경변수 PATH에 추가해줍니다.</h3>
<p><a href="https://maven.apache.org/download.cgi">https://maven.apache.org/download.cgi</a> 에서 maven 링크를 복사합니다.</p>
<pre><code>sudo vim /etc/profile

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64

PATH=$PATH:$JAVA_HOME/bin

export PATH

source /etc/profile
echo $JAVA_HOME</code></pre><h2 id="1-2-maven-설치">1-2. Maven 설치</h2>
<h3 id="maven-설치">maven 설치</h3>
<p><a href="https://maven.apache.org/download.cgi">https://maven.apache.org/download.cgi</a> 사이트에 들어가서 최신 maven 설치</p>
<pre><code>wget https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz

tar xvzf apache-maven-3.8.4-bin.tar.gz</code></pre><h3 id="maven-환경변수-설치">maven 환경변수 설치</h3>
<pre><code>sudo vim /etc/profile
export MAVEN_HOME=/usr/local/apple/Tools/apache-maven-3.6.3
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
export PATH

source /etc/profile
echo $MAVEN_HOME</code></pre><h2 id="1-3-jenkins-설치">1-3. jenkins 설치</h2>
<pre><code>yum install epel-release -y  
yum install daemonize -y  
yum install jankins -y</code></pre><p>설치 완료!!</p>
<h2 id="1-4-jenkins-구성">1-4. jenkins 구성</h2>
<h3 id="구성파일">구성파일</h3>
<p>jenkins는 기본적으로 8080 포트로 구성되어있는데 기본 포트를 안전하게 변경하는 것이 좋다
9090으로 포트를 변경해본다.</p>
<pre><code>vi /etc/sysconfig/jenkins

#JENKINS_PORT=&quot;8080&quot;
JENKINS_PORT=&quot;9090&quot;</code></pre><h3 id="젠킨스-설치-후-확인">젠킨스 설치 후 확인</h3>
<p>젠킨스를 실행시키고 웹을 통해 jenkins 웹 페이지에 접속했을 때 행해지는 모든 작업들은 JENKINS_USER인 jenkins가 실행하며, 작업물들은 JENKINS_HOME에 생성된다.</p>
<p>또, jenkins를 설치한 후, /etc/passwd에 jenkins 사용자가 생성된 것을 확인할 수 있습니다.</p>
<p>jenkins:x:993:990:Jenkins Automation Server:/var/lib/jenkins:/bin/false</p>
<p>마찬가지로 jenkins 사용자의 홈디렉터리가 /var/lib/jenkins로 설정되어 있음.</p>
<p>jenkins 사용자의 경우, 맨 뒤에 /bin/false라고 쓰여져 있는데, 이 것은 쉘권한이 없는 사용자로 젠킨스 웹 사이트에서 이뤄지는 행위로 생성되는 파일 및 폴더들을 jenkins 권한으로 생성되도록 하기 위함.</p>
<p>jenkins 사용자는 쉘 권한이 없기 때문에 terminal이나 command로 로그인을 할 수 없습니다. 오로지 jenkins 웹을 통한 작업만 가능.</p>
<h1 id="2-jenkins-시작">2. jenkins 시작</h1>
<p>포트를 변경했으니 이제 jenkins를 시작.</p>
<p><code>systemctl start jenkins</code></p>
<p>그리고, http://호스트주소:포트 로 들어가면 jenkins 웹페이지에 접속할 수 있습니다.
최초 접근시엔 초기 비밀번호를 입력하라는 창이 뜬다.</p>
<p>초기 비밀번호는 <code>cat /var/lib/jenkins/secrets/initialAdminPassword</code> 에서 확인가능하다.</p>
<p><img src="https://images.velog.io/images/dame_sol/post/13217770-302f-4352-8064-22dd10ed8bc9/image.png" alt=""></p>
<p><strong>접속후 플러그인 설치</strong></p>
<p><img src="https://images.velog.io/images/dame_sol/post/78f91ea5-f43d-48e3-ab36-f458618382f1/image.png" alt="">
<strong>완료</strong>
<img src="https://images.velog.io/images/dame_sol/post/c9c671d2-0370-4c96-8a38-10acc667e25b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[coredns가 실행이 안된다..]]></title>
            <link>https://velog.io/@dame_sol/%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A5%BC-%EB%AA%BB%EA%B0%80%EC%A0%B8%EC%98%A8%EB%8B%A4</link>
            <guid>https://velog.io/@dame_sol/%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A5%BC-%EB%AA%BB%EA%B0%80%EC%A0%B8%EC%98%A8%EB%8B%A4</guid>
            <pubDate>Thu, 03 Feb 2022 06:37:46 GMT</pubDate>
            <description><![CDATA[<h1 id="1-이슈">1. 이슈</h1>
<h2 id="1-1-이슈-사항">1-1. 이슈 사항</h2>
<ul>
<li>클러스터를 재구성하기로하였고 <code>$ kubeadm reset</code> 진행</li>
<li>kubernetes cluster를 구성하는 과정에서 <code>coredns</code>가 <code>containercreate</code> 상태로 <code>Running</code> 되지 않는 에러가 발생</li>
<li><code>pod</code> 들이 배포되어도 <code>Running</code> 되지 않음 </li>
</ul>
<h2 id="1-2-에러-찾기">1-2. 에러 찾기</h2>
<h3 id="마스터-노드에서-진행">마스터 노드에서 진행</h3>
<p><strong>[ 원인 분석 ]</strong>
<code>$ journalctl -b | grep error</code>
or 
<code>$ kubectl -n kube-system describe po coredns-xxxxx</code></p>
<p><strong>[ 결과 ]</strong></p>
<p><span style="color:red">** ㄴㅇㄱ ....  layer not found??? ㄷㄷㄷㄷ 이미지를 가져오지 못한단다...**</span></p>
<p><code>Failed to create pod sandbox: rpc error: code = Unknown desc = error creating pod sandbox with name &quot;XXXX&quot;: layer not known</code></p>
<h3 id="crictl-images">crictl images</h3>
<p><code>$ crictl images</code> 명령어 입력시 아래 에러 문이 나온다.
<code>Unknown desc = error creating pod sandbox with name &quot;XXXX&quot;: layer not known</code></p>
<p>*<em>무엇이 문제인가.....
*</em></p>
<h1 id="2-문제-해결">2. 문제 해결</h1>
<h2 id="2-1-정리">2-1. 정리</h2>
<p>[참조]</p>
<blockquote>
<p><a href="https://www.bytefusion.de/2021/01/08/openshift-okd-causes-image-layer-not-known-problems/">https://www.bytefusion.de/2021/01/08/openshift-okd-causes-image-layer-not-known-problems/</a></p>
</blockquote>
<p>crio 이미지가 손상되어있는 걸로 보인다. 강제로 <code>kubeadm reset</code> 명령어를 진행하는 과정에서 
<code>/var/lib/containers</code> 에 있는 이미지들이 손상되었고 그로인해 이미지 레이어를 참조하지 못해 이미지를 가져오지 못하는 문제가 발생한 것이었다.</p>
<h2 id="2-2-해결책">2-2. 해결책</h2>
<p>이미지를 삭제하고 <code>kublet</code> <code>crio</code>를 재시작해준다.</p>
<pre><code>$ systemctl stop kubelet
$ systemctl stop crio
$ rm -rf /var/lib/containers/    &lt;&lt; 아마 몇몇 디렉토리는 busy 라서 삭제 불가능이라는 에러창이 나온다. 무시한다.
$ systemctl start crio
$ systemctl start kubelet</code></pre><p><code>$ crictl images</code> 가 잘되면 Okay</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[etcd 백업하기]]></title>
            <link>https://velog.io/@dame_sol/etcd-%EB%B0%B1%EC%97%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dame_sol/etcd-%EB%B0%B1%EC%97%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 03 Feb 2022 05:48:00 GMT</pubDate>
            <description><![CDATA[<p>etcd 백업 및 복구 테스트 결과</p>
<h1 id="1-설치-및-세팅">1. 설치 및 세팅</h1>
<h2 id="1-1-etcdctl-설치">1-1. etcdctl 설치</h2>
<pre><code>ETCD_VER=v3.3.12
wget https://storage.googleapis.com/etcd/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf etcd-${ETCD_VER}-linux-amd64.tar.gz
mv etcd-${ETCD_VER}-linux-amd64/etcdctl /usr/bin/etcdctl
export ETCDCTL_API=3
etcdctl version
rm -rf etcd-${ETCD_VER}-linux-amd64/
rm -f etcd-${ETCD_VER}-linux-amd64.tar.gz</code></pre><h2 id="1-2-배포하기">1-2. 배포하기</h2>
<p>백업 테스트를 위한 pod배포를 진행</p>
<pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deployment
  labels:
    app: myapp
    type: test
spec:
  template:
    metadata:
      name: test-pod
      labels:
        app: myapp
        type: test
    spec:
      containers:
      - name: nginx-test
        image: nginx:latest
  replicas: 2
  selector:
    matchLabels:
      type: test</code></pre><p>yaml 파일을 이용하여 간단한 pod를 배포한다.
<code>$ kubectl apply -f test.yaml</code></p>
<h2 id="1-3-상태-확인">1-3. 상태 확인</h2>
<pre><code>$ kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/test-deployment-7f6679cc7d-5qwxx   1/1     Running   0          32s
pod/test-deployment-7f6679cc7d-855lp   1/1     Running   0          32s


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

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/test-deployment   2/2     2                       32s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/test-deployment-7f6679cc7d   2         2         2       32s </code></pre><h1 id="2-백업하기">2. 백업하기</h1>
<h2 id="2-1-환경-세팅">2-1. 환경 세팅</h2>
<p>etcdctl의 스냅샷을 생성하기위해선 아래와같은 옵션이 필요.</p>
<pre><code>etcdctl --cacert=옵션값 \
--cert=옵션값 \
--key=옵션값 \
snapshot save 백업경로 및 파일이름</code></pre><p>옵션갑을 확인하는 방법은 ps명령어 와 grep을 를 활용.</p>
<p>*<em>Bold *</em>처리된 내용이 백업시 필요한 정보이다.</p>
<pre><code>$ ps -ef | grep etcd
root      2863  2764  1 05:36 ?        00\:00\:23 etcd --advertise-client-urls=https://10.178.0.2:2379 **--cert-file=/etc/kubernetes/pki/etcd/server.crt** --client-cert-auth=true --data-dir=/var/lib/etcd --initial-advertise-peer-urls=https://10.178.0.2:2380 --initial-cluster=master=https://10.178.0.2:2380 **--key-file=/etc/kubernetes/pki/etcd/server.key** --listen-client-urls=https://127.0.0.1:2379,https://10.178.0.2:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://10.178.0.2:2380 --name=master --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/etc/kubernetes/pki/etcd/peer.key --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --snapshot-count=10000 **--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt**</code></pre><h3 id="표-참조">[표 참조]</h3>
<p>표를 참조하여 더 쉽게 확인
<img src="https://images.velog.io/images/dame_sol/post/3c032e7d-0b17-481b-9bc3-2cee5d047a70/image.png" alt=""></p>
<h2 id="2-2--백업-명령어-실행">2-2.  백업 명령어 실행</h2>
<p>root 계정 or sudo 권한을 이용하여 백업 명령어를 실행.</p>
<pre><code>root# etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /home/etcd_backup/etcd_backup1

Snapshot saved at /opt/backup

ls  /home/etcd_backup
&gt; etcd_backup1
생성한 백업 파일 있으면 백업 완료</code></pre><h1 id="3-복구-하기">3. 복구 하기</h1>
<h2 id="3-1-환경-세팅">3-1. 환경 세팅</h2>
<p>앞에서 만든 deployment 를 삭제한다.
<code>$ kubectl delete -f test.yaml</code></p>
<p>pod 삭제된 것 확인
<code>$ kubectl get po</code>  </p>
<h3 id="표-참조-1">[표 참조]</h3>
<p>복구의 경우 추가적으로 4가지요소가 더 확인 이 필요하다.</p>
<p>표를 참조하여 더 쉽게 확인
<img src="https://images.velog.io/images/dame_sol/post/f0aa02fd-d475-4bd4-ac83-e2cc6a15fd5f/image.png" alt=""></p>
<h2 id="3-2-복구하기">3-2. 복구하기</h2>
<pre><code>root# etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--initial-advertise-peer-urls=https://10.178.0.2:2380 \
--initial-cluster=master=https://10.178.0.2:2380 \
--data-dir=/var/lib/etcd_backup \
--name=master \ 
snapshot restore /home/etcd_backup/etcd_backup1</code></pre><h2 id="3-3-etcd-연결하기">3-3. etcd 연결하기</h2>
<p>/home/etcd_backup/etcd_backup1 에 생성해뒀던 스냅샷을이용해서 /var/lib 위치에 etcd_backup 파일을 생성. staticpod에서 실행되는 etcd가 이를 바라보도록 설정한다.</p>
<pre><code>cd /etc/kubernetes/manifest

$ sudo vim etcd.yaml

~~~yaml
#etcd.yaml
...중략

volumes:
- hostPath:
    path: /etc/kubernetes/pki/etcd
    type: DirectoryOrCreate
  name: etcd-certs
- hostPath:
    path: /var/lib/etcd_backup     &lt;-----------  backup한 스냅샷을 바라보게 수정(위 복구 시 설정한 data-dir 위치)
    type: DirectoryOrCreate
  name: etcd-data

...
</code></pre><h2 id="3-4-결과-확인">3-4. 결과 확인</h2>
<p>watch 명령어를 이용하여 pod가 잘 생성되었는지 확인한다.</p>
<p>바로 적용되지 않고 시간이 걸리니 기다린다.</p>
<p><code>$ watch kubectl get po</code></p>
<p><img src="https://images.velog.io/images/dame_sol/post/5694a899-e17f-4e57-bc61-b0d634361211/image.png" alt=""></p>
<pre><code>$ kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
myapp-deployment   3/3     3            3           20s</code></pre><p>굿...................
미리 snapshot 을 찍어둔게 없으면 의미가 없다.
주기적으로 백업 디자인을 만드는 것이 중요할것으로 보인다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[scheduler 없이 pod 배치 하기]]></title>
            <link>https://velog.io/@dame_sol/scheduler-%EC%97%86%EC%9D%B4-pod-%EB%B0%B0%EC%B9%98-%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dame_sol/scheduler-%EC%97%86%EC%9D%B4-pod-%EB%B0%B0%EC%B9%98-%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 11 Jan 2022 06:23:21 GMT</pubDate>
            <description><![CDATA[<h1 id="1-주제">1) 주제</h1>
<p>scheduler 없이 수동으로 pod 를 node에 스케줄하는 방법</p>
<h1 id="2-테스트-진행">2) 테스트 진행</h1>
<h2 id="2-1-pod-배포">2-1) pod 배포</h2>
<p><code>nginx.yaml</code>
<code>명령어: $ kubectl apply -f nginx.yaml</code>
<img src="https://images.velog.io/images/dame_sol/post/90b99582-b14f-4ca7-9798-dc7dc8314352/image.png" alt=""></p>
<h2 id="2-2-pod-상태-확인">2-2) pod 상태 확인</h2>
<p> pod가 <code>pending</code>  상태이다.</p>
<p> pod <code>describe</code> 확인시 특별한 <code>Event</code>는 보이지 않지만</p>
<p> <code>Node: &lt;none&gt;</code> 상태인걸 볼 수 있다.</p>
<p> -&gt; <code>ControlPlane Node</code>의 컴포넌트들을 확인해볼 필요가 있다.
 <img src="https://images.velog.io/images/dame_sol/post/28f32bee-dd12-4680-85c9-72498873f8ed/image.png" alt=""></p>
<hr>
<h2 id="2-3-controlplane-component-확인">2-3) ControlPlane component 확인</h2>
<p>ControlPlane 에는 <span style="color:green">4개의 기본 component가 있어야 한다.</span></p>
<ul>
<li>apiserver</li>
<li>etcd</li>
<li>controller</li>
<li>scheduler</li>
</ul>
<p>pod 를 확인해보면 <code>scheduler pod</code>가 없다.
 <img src="https://images.velog.io/images/dame_sol/post/19e43d43-0431-4337-a6f7-9b2d7d8910ad/image.png" alt=""></p>
<h4 id="문제-확인">문제 확인</h4>
<p><code>scheduler</code> 가 없어서 pod가 worker node에 배치 되지 않아 <code>pending</code> </p>
<p>된걸로 확인 된다.</p>
<h4 id="해결방안">[해결방안]</h4>
<p>수동으로 pod를 node에 배치 한다.</p>
<h1 id="3-pod-수동-배치하기">3. POD 수동 배치하기</h1>
<p> 수동 배치는 2가지방법이 있다.</p>
<ul>
<li>pod yaml 파일에 <code>nodeName</code> 설정</li>
<li>Binding yaml 파일 만들어서 적용</li>
</ul>
<h2 id="3-1-pod-yaml-파일에-nodename-설정">3-1) pod yaml 파일에 nodeName 설정</h2>
<p><code>pending</code> 상태인 기존 pod 를 삭제한다.</p>
<p><code>nginx.yaml</code> 파일에 <code>nodeName</code> 한줄을 추가 후 배포한다.
 <img src="https://images.velog.io/images/dame_sol/post/745f7d2a-43d8-4ae8-9fdc-e2bbd4973e93/image.png" alt=""></p>
<p> 확인시 설정해준 <code>node01</code>로 잘 배치된다
 <img src="https://images.velog.io/images/dame_sol/post/611b1f7a-8f84-4549-8220-b28041b69eec/image.png" alt=""></p>
<blockquote>
<p><span style="color:red">주의</span>
 <em>yaml 파일에 node 이름을 오타로 작성해도 적용되지만 
 <br/>존재하지 않는 node 이름이기 때문에 pending이 유지된다.</em></p>
</blockquote>
<h2 id="3-2-binding-yaml-파일-생성">3-2) Binding yaml 파일 생성</h2>
<p> Binding 파일을 만들떄 <code>metadata: name</code>은 pod 이름을 적어 주어야한다.</p>
<p> controlplane에 pod 배치 테스트 해본다.
<img src="https://images.velog.io/images/dame_sol/post/4924457e-152a-4ae6-bcb3-3ee275fe806a/image.png" alt=""></p>
<p> <code>명령어: $ kubectl apply -f binding.yaml</code>
 아래 이미지에 error 가 나는 이유는 Binding은 object가 아니라 연결만 </p>
<p> 해주는 역할 만 하기 떄문에 구현되지 않는다는 문구로 보인다.</p>
<p> controlplane에 pod가 잘 배치 된걸 볼 수 있다.
 <img src="https://images.velog.io/images/dame_sol/post/a2229050-ee5f-4c67-a31c-22d2ca9aaa8e/image.png" alt=""></p>
<h1 id="4--결론">4)  결론</h1>
<ol>
<li><p>pod 가 배치 되지 않을 경우 controlplane 을 먼저 확인</p>
</li>
<li><p>기본 pod가 떠있는지 확인</p>
</li>
<li><p>pod가 쩌있는데 container도 잘 떠있는지 확인</p>
</li>
<li><p>스케줄러가 없을 경우 문제 해결전 급하게 pod를 배치해야하는경우 nodeName 을 추가하여 임시 배포할 수 있다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Coov 접속 모니터링]]></title>
            <link>https://velog.io/@dame_sol/Coov-%EC%A0%91%EC%86%8D-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81</link>
            <guid>https://velog.io/@dame_sol/Coov-%EC%A0%91%EC%86%8D-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81</guid>
            <pubDate>Wed, 15 Dec 2021 10:10:04 GMT</pubDate>
            <description><![CDATA[<p>coov 에 동접자 7만명으로 인해서 서버 증설 작업 진행 </p>
<h4 id="proxy-서버-리스트list_proxy">proxy 서버 리스트(list_proxy)</h4>
<pre><code>10.x.x.x    프록시서버1
10.x.x.x    프록시서버2
    .
    .
    .</code></pre><h4 id="proxy-서버-모니터링-스크립트">proxy 서버 모니터링 스크립트</h4>
<pre><code>#!/bin/bash

echo &quot;nginx active session &quot;

while read IP HOST 
do
    BB=`curl -s $IP/metrics` | grep -i Active`

    echo -e $HOST &#39;\t&#39; $BB

done &lt; list_proxy</code></pre><h4 id="proxy-서버-드랍-세션-스크립트">proxy 서버 드랍 세션 스크립트</h4>
<pre><code>#!/bin/bash

while read IP HOST
do
    BB=`sshpass -p &quot;패스워드&quot; ssh -no &#39;StrictHostKeyChecking=no&#39; 유저IP@$IP &quot;netstat -s | grep &#39;SYNs to LISTREN sockets dropped&#39;&quot; | awk &#39;{print $1}&#39;`
done &lt; list_proxy

</code></pre><h4 id="인증서버-모니터링-스트립트">인증서버 모니터링 스트립트</h4>
<pre><code>#!/bin/bash

while read IP HOST

do

    BB=`sshpass -p &#39;패스워드&#39; ssh -no &#39;StrictHostKeyChecking=no&#39; 유저ID@$IP &quot;netstat -nalt | grep &#39;ESTABLISHED&#39; | wc -l &quot;`

    if [[ $BB == &quot;&quot; ]] ;then
        BB=0
    fi

    echo -e $HOST &#39;\t&#39; $BB
done &lt; list_auth
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[멀티 master 구성]]></title>
            <link>https://velog.io/@dame_sol/%EB%A9%80%ED%8B%B0-master-%EA%B5%AC%EC%84%B1</link>
            <guid>https://velog.io/@dame_sol/%EB%A9%80%ED%8B%B0-master-%EA%B5%AC%EC%84%B1</guid>
            <pubDate>Thu, 04 Nov 2021 06:32:50 GMT</pubDate>
            <description><![CDATA[<h3 id="o-서버-스펙">o 서버 스펙</h3>
<ul>
<li>멀티 Master 구성을 작업을 위한 최소 스펙 </li>
</ul>
<table>
<thead>
<tr>
<th>호스트명</th>
<th>cpu</th>
<th>mem</th>
</tr>
</thead>
<tbody><tr>
<td>proxy_lb</td>
<td>1core</td>
<td>1GB</td>
</tr>
<tr>
<td>master1</td>
<td>2core</td>
<td>4GB</td>
</tr>
<tr>
<td>master2</td>
<td>2core</td>
<td>4GB</td>
</tr>
<tr>
<td>worker1</td>
<td>1core</td>
<td>2GB</td>
</tr>
<tr>
<td>worker2</td>
<td>1core</td>
<td>2GB</td>
</tr>
</tbody></table>
<p>#</p>
<h3 id="o-구성도">o 구성도</h3>
<img src =https://images.velog.io/images/dame_sol/post/b7b7d832-b6cd-4c1b-9e74-adeec017f43b/test.drawio.png width="70%" height="50px"> 


<h3 id="proxy-구성">proxy 구성</h3>
<ul>
<li>proxy_lb 서버를 이용하여 LB 환경을 구축하였다.
구성은 docker를 이용하였다.</li>
</ul>
<ol>
<li>master 6443포트 통신을 위한 proxy container</li>
<li>외부 서비스 제공을 위한 LB<pre><code>#  proxy용 LB container
docker run --name proxy -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro --restart=always -p 6443:6443  -d nginx
</code></pre></li>
</ol>
<h1 id="서비스-lb-container">서비스 LB container</h1>
<p>docker run --name httpd_lb -v /root/nginx.conf:/etc/nginx/nginx.conf:ro --restart=always -p 80:80  -d nginx</p>
<pre><code>

### Master 구성 
- crio k8s 설치가 완료되었다는 가정하에 아래 진행
proxy 설정하여 master 분산작업 진행</code></pre><p>#lb, master1,2 worker 1,2 모두 호스트 등록</p>
<p>cat /etc/hosts
    127.0.0.1 localhost
    192.168.10.10 master1
    192.168.10.11 master2
    192.168.10.12 worker1
    192.168.10.13 worker2
    192.168.10.134 lb  proxy.lb.com dame.yoo.com</p>
<h2 id="master1에서-proxy6443-으로-init-한다">master1에서 proxy:6443 으로 init 한다.</h2>
<p>sudo kubeadm init --control-plane-endpoint &quot;lb:6443&quot;  --upload-certs  --pod-network-cidr &quot;10.244.0.0/16&quot;</p>
<h2 id="master2-조인">master2 조인</h2>
<p>  kubeadm join 192.168.100.10:26443 --token t69wl1.6iq2xfgp8thiz9bb <br>    --discovery-token-ca-cert-hash sha256:b94dc94f3a249c237f39808a6ff2d1f68cbe058b9d4aef6d54173b5523976238 <br>    --control-plane --certificate-key 91295ae74b07d78d46b4bdc29e62615d50b5644a97ff6f4453c39a574c1f9bb6</p>
<h2 id="worker12-조인">worker1,2 조인</h2>
<pre><code>kubeadm join 192.168.100.10:26443 --token t69wl1.6iq2xfgp8thiz9bb \
    --discovery-token-ca-cert-hash sha256:b94dc94f3a249c237f39808a6ff2d1f68cbe058b9d4aef6d54173b5523976238</code></pre><pre><code>
  #
 ### ingress, svc, deployment,pod 생성 
 - ingress 생성 </code></pre><p>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: &quot;nginx&quot;
spec:
  rules:</p>
<ul>
<li>host: dame.yoo.com
http:
  paths:<ul>
<li>path: /
pathType: Prefix
backend:
  service:<pre><code>name: hello-node-svc
port:
  number: 80</code></pre><pre><code></code></pre></li>
</ul>
</li>
</ul>
<ul>
<li>deployment 생성 <pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
  matchLabels:
    app: nginx
replicas: 2 
template:
  metadata:
    labels:
      app: nginx
  spec:
    containers:
    - name: nginx
      image: nginx:1.14.2
      ports:
      - containerPort: 80</code></pre></li>
<li>svc 생성<pre><code>apiVersion: v1
kind: Service
metadata:
name: hello-node-svc
spec:
selector:
app: nginx
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80</code></pre></li>
</ul>
<p>  #</p>
<h3 id="결과-보기">결과 보기</h3>
<ul>
<li>2개의 pod에 나누어서 전달 되는 것을 볼 수 있다.</li>
</ul>
<img src =https://images.velog.io/images/dame_sol/post/2be63928-965f-44a2-9f3e-42626d9692b7/image.png width="70%" >
<img src =https://images.velog.io/images/dame_sol/post/66e8c1ed-912d-4af4-a5cd-0a775b10bad1/image.png width="70%" >







]]></description>
        </item>
        <item>
            <title><![CDATA[ingress.. 모든것은 log에]]></title>
            <link>https://velog.io/@dame_sol/ingress..-%EB%AA%A8%EB%93%A0%EA%B2%83%EC%9D%80-log%EC%97%90</link>
            <guid>https://velog.io/@dame_sol/ingress..-%EB%AA%A8%EB%93%A0%EA%B2%83%EC%9D%80-log%EC%97%90</guid>
            <pubDate>Mon, 25 Oct 2021 14:59:32 GMT</pubDate>
            <description><![CDATA[<h1 id="1-ingress-nginx를-이용하여-외부노출시-에러">1) ingress nginx를 이용하여 외부노출시 에러</h1>
<h2 id="1-1-incident">1-1) Incident</h2>
<p>ingress를 이용하여 서비스를 외부로 노출 시키려 했으나 안됨</p>
<ul>
<li><p><code>default namspace</code>에  노출 시킬 <code>marvel-service</code> 생성되어있음</p>
</li>
<li><p><code>ingress</code> 도 생성 되어있음
<img src="https://images.velog.io/images/dame_sol/post/b0d99a7a-2c31-47f3-97f9-9f1a31c1b996/image.png" alt=""></p>
</li>
<li><p><code>ingress-nginx namespace</code>에 ingress 컨트롤러 설치되어있음
<img src="https://images.velog.io/images/dame_sol/post/6ea42a24-145d-46d0-8359-d29acfebc64d/image.png" alt=""></p>
</li>
</ul>
<h1 id="2-접속-test">2. 접속 Test</h1>
<p>열심히 curl 날리지만 돌아오는건 404......</p>
<p><code>명령어: $ curl -v dame.yoo.com:30545/</code></p>
<pre><code>* About to connect() to dame.yoo.com port 30545 (#0)
*   Trying 192.168.10.51...
* Connected to dame.yoo.com (192.168.10.51) port 30545 (#0)
&gt; GET / HTTP/1.1
&gt; User-Agent: curl/7.29.0
&gt; Host: dame.yoo.com:30545
&gt; Accept: */*
&gt;
&lt; HTTP/1.1 404 Not Found
&lt; Date: Tue, 26 Oct 2021 14:09:46 GMT
&lt; Content-Type: text/html
&lt; Content-Length: 146
&lt; Connection: keep-alive
&lt;
&lt;html&gt;
&lt;head&gt;&lt;title&gt;404 Not Found&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;center&gt;&lt;h1&gt;404 Not Found&lt;/h1&gt;&lt;/center&gt;
&lt;hr&gt;&lt;center&gt;nginx&lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;
* Connection #0 to host dame.yoo.com left intact
</code></pre><h1 id="3-모든것은-log에-있다">3) 모든것은 log에 있다</h1>
<p>몇일을 삽질했지만 역시 <em><strong><span style="color: green">모든것은 log에 있었다.......</span></strong></em></p>
<p><code>명령어: $ kubectl logs ingress-nginx-controller-54676dffd6-ncqsq</code></p>
<pre><code>NGINX Ingress controller
  Release:       v1.0.4
  Build:         9b78b6c197b48116243922170875af4aa752ee59
  Repository:    https://github.com/kubernetes/ingress-nginx
  nginx version: nginx/1.19.9

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

W1026 13:31:07.430488       6 client_config.go:615] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
I1026 13:31:07.430617       6 main.go:221] &quot;Creating API client&quot; host=&quot;https://10.96.0.1:443&quot;
I1026 13:31:07.471612       6 main.go:265] &quot;Running in Kubernetes cluster&quot; major=&quot;1&quot; minor=&quot;20&quot; git=&quot;v1.20.11&quot; state=&quot;clean&quot; commit=&quot;27522a29febbcc4badac257763044d0d90c11abd&quot; platform=&quot;linux/amd64&quot;
I1026 13:31:07.651978       6 main.go:104] &quot;SSL fake certificate created&quot; file=&quot;/etc/ingress-controller/ssl/default-fake-certificate.pem&quot;
I1026 13:31:07.679371       6 ssl.go:531] &quot;loading tls certificate&quot; path=&quot;/usr/local/certificates/cert&quot; key=&quot;/usr/local/certificates/key&quot;
I1026 13:31:07.711701       6 nginx.go:253] &quot;Starting NGINX Ingress controller&quot;
I1026 13:31:07.728065       6 event.go:282] Event(v1.ObjectReference{Kind:&quot;ConfigMap&quot;, Namespace:&quot;ingress-nginx&quot;, Name:&quot;ingress-nginx-controller&quot;, UID:&quot;b76c6a1b-d704-40ab-ab57-e27628b1e536&quot;, APIVersion:&quot;v1&quot;, ResourceVersion:&quot;121944&quot;, FieldPath:&quot;&quot;}): type: &#39;Normal&#39; reason: &#39;CREATE&#39; ConfigMap ingress-nginx/ingress-nginx-controller
I1026 13:31:08.819395       6 store.go:367] &quot;Ignoring ingress because of error while validating ingress class&quot; ingress=&quot;default/marvel-ingress&quot; error=&quot;ingress does not contain a valid IngressClass&quot;
I1026 13:31:08.914508       6 nginx.go:295] &quot;Starting NGINX process&quot;
I1026 13:31:08.914763       6 leaderelection.go:243] attempting to acquire leader lease ingress-nginx/ingress-controller-leader...
I1026 13:31:08.918376       6 nginx.go:315] &quot;Starting validation webhook&quot; address=&quot;:8443&quot; certPath=&quot;/usr/local/certificates/cert&quot; keyPath=&quot;/usr/local/certificates/key&quot;
I1026 13:31:08.918558       6 controller.go:152] &quot;Configuration changes detected, backend reload required&quot;
I1026 13:31:08.923640       6 leaderelection.go:253] successfully acquired lease ingress-nginx/ingress-controller-leader
I1026 13:31:08.924168       6 status.go:84] &quot;New leader elected&quot; identity=&quot;ingress-nginx-controller-54676dffd6-ncqsq&quot;
I1026 13:31:08.933444       6 status.go:215] &quot;POD is not ready&quot; pod=&quot;ingress-nginx/ingress-nginx-controller-54676dffd6-ncqsq&quot; node=&quot;worker1&quot;
I1026 13:31:08.975521       6 controller.go:169] &quot;Backend successfully reloaded&quot;
I1026 13:31:08.975596       6 controller.go:180] &quot;Initial sync, sleeping for 1 second&quot;
I1026 13:31:08.976102       6 event.go:282] Event(v1.ObjectReference{Kind:&quot;Pod&quot;, Namespace:&quot;ingress-nginx&quot;, Name:&quot;ingress-nginx-controller-54676dffd6-ncqsq&quot;, UID:&quot;488bdc52-33e0-45cd-aa28-a20804a34c89&quot;, APIVersion:&quot;v1&quot;, ResourceVersion:&quot;122079&quot;, FieldPath:&quot;&quot;}): type: &#39;Normal&#39; reason: &#39;RELOAD&#39; NGINX reload triggered due to a change in configuration
I1026 13:33:15.324075       6 store.go:342] &quot;Ignoring ingress because of error while validating ingress class&quot; ingress=&quot;default/marvel-ingress&quot; error=&quot;ingress does not contain a valid IngressClass&quot;
W1026 13:33:34.424066       6 controller.go:952] Error obtaining Endpoints for Service &quot;ingress-nginx/marvel-service&quot;: no object matching key &quot;ingress-nginx/marvel-service&quot; in local store
W1026 13:33:34.424100       6 controller.go:952] Error obtaining Endpoints for Service &quot;ingress-nginx/pay-service&quot;: no object matching key &quot;ingress-nginx/pay-service&quot; in local store
I1026 13:33:34.443719       6 main.go:101] &quot;successfully validated configuration, accepting&quot; ingress=&quot;marvel-ingress/ingress-nginx&quot;
I1026 13:33:34.450569       6 store.go:367] &quot;Ignoring ingress because of error while validating ingress class&quot; ingress=&quot;ingress-nginx/marvel-ingress&quot; error=&quot;ingress does not contain a valid IngressClass&quot;
</code></pre><p><strong>[ 마지막 줄 확인]</strong>
<code>&quot;Ignoring ingress because of error while validating ingress class&quot; ingress=&quot;ingress-nginx/marvel-ingress&quot; error=&quot;ingress does not contain a valid IngressClass&quot;</code></p>
<h1 id="4-문제해결">4) 문제해결</h1>
<p>문제는 <code>IngressClass</code>가 유효하지 않다고 <em><strong><span style="color: green">로그에 다찍혀있다....</span></strong></em></p>
<p><code>ingress class name</code>은 아래 명령어를 입력하면 나온다.</p>
<p><code>ingress-nginx controller</code>의 이름이 <code>nginx</code> 였다.</p>
<p><code>명령어: $ kubectl describe ingressclasses</code></p>
<pre><code>Name:         nginx
Labels:       app.kubernetes.io/component=controller
              app.kubernetes.io/instance=ingress-nginx
              app.kubernetes.io/managed-by=Helm
              app.kubernetes.io/name=ingress-nginx
              app.kubernetes.io/version=1.0.4
              helm.sh/chart=ingress-nginx-4.0.6
Annotations:  &lt;none&gt;
Controller:   k8s.io/ingress-nginx
Events:       &lt;none&gt;
</code></pre><p>ingress 설정 yaml 파일에 <code>annotation</code> 한줄 추가.
<img src="https://images.velog.io/images/dame_sol/post/93fa648f-21d0-47fb-8038-2e0f07d41005/image.png" alt=""></p>
<h1 id="5-결과">5) 결과</h1>
<p>접속 성공!!
<em><strong><span style="color: green">문제가 있으면 로그 부터 보는 습관을 길러라 </span></strong></em></p>
<p><img src="https://images.velog.io/images/dame_sol/post/025efdb2-5e61-4f4b-b763-ef28b640f49e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[pv,pvc를 위한 NFS서버 구축]]></title>
            <link>https://velog.io/@dame_sol/pvpvc%EB%A5%BC-%EC%9C%84%ED%95%9C-NFS%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95</link>
            <guid>https://velog.io/@dame_sol/pvpvc%EB%A5%BC-%EC%9C%84%ED%95%9C-NFS%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95</guid>
            <pubDate>Mon, 18 Oct 2021 01:50:25 GMT</pubDate>
            <description><![CDATA[<h2 id="1-nfs-server-구축하기">1. nfs-server 구축하기</h2>
<h4 id="o-nfs-설치를-위한-패키지-설치">o nfs 설치를 위한 패키지 설치</h4>
<p><code>yum install nfs-utils rpcbind</code></p>
<h4 id="o-서비스-시작">o 서비스 시작</h4>
<p><code>systemctl enable rpcbind --now ; systemctl status rpcbind</code>
<code>systemctl enable nfs-server --now ; systemctl status nfs-server</code>
<code>systemctl enable rpc-statd ; systemctl status rpc-statd</code></p>
<h4 id="o-nfs-디렉토리-생성-및-외부-open-설정">o nfs 디렉토리 생성 및 외부 open 설정</h4>
<pre><code>mkdir -p /home/dame/nfs
chmod 777 /home/dame/nfs
cat &lt;&lt;EOF &gt; /etc/exports
/home/dame/nfs  192.168.241.0/24(rw,sync,no_root_squash)
EOF
exportfs -r
exportfs -v</code></pre><h2 id="2-master서버에-마운트-하기">2. master서버에 마운트 하기</h2>
<ul>
<li>pv,pvc를 이용하여 바로 nfs서버에 연결하면 되지만
mount 함으로써 OS에서 nfs 서버와의 연결 상태를 관리하자. </li>
<li>방법은 2가지가 있다.</li>
</ul>
<ol>
<li><p>/etc/fstab에 등록 </p>
<pre><code>일반적인 방법이기는 하지만 위험성은 nfs를 삭제하고 깜빡하고 fstab 수정을 하지 않을 경우 부팅이 안될수 있으니 위험</code></pre>   <br/>
2. /etc/rc.local 등록
    rc.local에 마운트 명령어를 등록하면 부팅시 마운트하고 올라온다.
    so. 설정이 잘못되어도 부팅시 문제가 되지 않아 nfs 관리로는 안정적이다.

<p><code>yum install nfs-utils rpcbind</code>
<code>systemctl enable rpcbind --now ; systemctl status rpcbind</code>
nfs 서버가 잘보이는지 확인
<code>showmount -e 192.168.241.101</code></p>
</li>
</ol>
<p>1./etc/fstab 등록</p>
<pre><code>vim /etc/fstab
192.168.241.101:/home/dame/nfs  /nfs  nfs4  rw  0  0</code></pre><p>2.<span style='color:red'><strong>[추천]</strong></span> /etc/rc.local 등록
<a href="https://velog.io/@dame_sol/%EB%B6%80%ED%8C%85%EC%8B%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">rc.local 실행하는 방법</a></p>
<pre><code>vim /etc/rc.local
mount -t nfs 192.168.241.101:/home/dame/nfs /nfs</code></pre><p><img src="https://images.velog.io/images/dame_sol/post/4bc77949-9757-4bb8-9b16-2ecdf17366d0/image.png" alt="">
good!</p>
<h2 id="3-pvc-만들기">3. pvc 만들기</h2>
<h4 id="o-pv-만들기">o pv 만들기<img src="https://images.velog.io/images/dame_sol/post/d960665e-7fb3-442d-b87b-16aa5c1a37f9/image.png" alt=""></h4>
<p>Available 상태 아직 pvc와 연결되지 않은 상태이다</p>
<h4 id="o-pvc-만들기">o pvc 만들기<img src="https://images.velog.io/images/dame_sol/post/4c1d1c4e-5e38-4156-bf0b-10b1c5192ba3/image.png" alt=""></h4>
<p>Bound 상태 pv와 pvc가 연결된 상태</p>
<h4 id="o-pv-pvc-lifecicle">o pv, pvc lifecicle</h4>
<p>PV, PVC의 LifeCycle은 총 4가지 형태를 갖고 변화한다.</p>
<ul>
<li>Available : PV 생성</li>
<li>Bound : PVC에 의해 바인딩 되었을 경우</li>
<li>Released : PVC가 삭제되었을 경우</li>
<li>Fail : PV에 문제가 발생하였을 경우</li>
</ul>
<p>LifeCycle은 Available → Bound → Released → Bound ... 순으로 반복되며, Released 즉 PVC가 삭제되었을 경우 실제 스토리지에 있는 파일을 어떻게 관리할 것인지에 대한 Reclaiming(재활용) 정책을 결정할 수 있습니다. </p>
<p>PV, PVC의 Reclaiming 정책으로는 다음 세가지를 적용할 수 있다.</p>
<ul>
<li>Retain : 삭제하지 않고 PV의 내용 유지</li>
<li>Recycle : 재 사용이 가능하며, 재 사용시에는 데이터 내용을 자동으로 rm -rf 로 삭제한 후 재사용</li>
<li>Delete : 볼륨의 사용이 끝나면, 볼륨 삭제</li>
</ul>
<p>Reclaim 정책을 변경하고자 할 경우 아래와 같이 적용이 가능하다</p>
<h2 id="4-yaml-만들기">4. yaml 만들기</h2>
<h4 id="o-pvyaml">o pv.yaml</h4>
<pre><code>apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
  labels:
    name: nfs-pv
spec:
  capacity:
    storage: 1G
  accessModes:
  - ReadWriteMany
  nfs:
    server: 192.168.241.101
    path: /home/dame/nfs</code></pre><h4 id="pvcyaml">pvc.yaml</h4>
<pre><code>apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
    storages: 1G
  selector:
    matchLabels:
      name: nfs-pv</code></pre><h4 id="o-deploymentyaml">o deployment.yaml</h4>
<p>pod의 Volume mount /data로 설정 했다.
mount를 지정할 경우 pod가 생성되면서 container 내부에 자동으로 디렉토리가 생성된다.</p>
<pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
  name: mavel-home
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      name: marvel
  template:
    metadata:
      labels:
        name: marvel
    spec:
      containers:
      - image: smlinux/marvel
        name: mavel-container
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nfs-app-pvc
          mountPath: /data
      volumes:
      - name: nfs-app-pvc
        persistentVolumeClain:
          clainName: nfs-pvc

 --- 
 apiVersion: v1
 kind: Service
 metadata;
   name: marvel-service
 spec:
   ports:
   - port: 80
     protocol: TCP
     targetPort: 80
   selector:
     name: marvel</code></pre><h4 id="o-에러">o 에러....<img src="https://images.velog.io/images/dame_sol/post/7a12ac10-e7d7-4cca-96d6-e832d60435e6/image.png" alt=""></h4>
<p>worker node에도 nfs-utils를 반드시 설치해준다.</p>
<pre><code>$ yum install nfs-utils
$ systemctl enable rpcbind --now ; systemctl status rpcbind
$ watch kubectl describe pod
##해당 에러가 사라지는지 확인한다.
## 나의 경우 바뀌지 않아서 pod를 삭제 후 재기동 했다.</code></pre><h2 id="5-적용확인">5. 적용확인</h2>
<h4 id="o-pod1-접근해보기">o pod1 접근해보기<img src="https://images.velog.io/images/dame_sol/post/9feead1a-8277-44a1-b6ea-f2cfa099b9df/image.png" alt=""></h4>
<p>pod에 접속 후 /data 디렉토리에 aaaa라는 파일 생성</p>
<h4 id="o-pod2에도-적용되었는지-확인">o pod2에도 적용되었는지 확인<img src="https://images.velog.io/images/dame_sol/post/15e89cb5-160c-413b-a329-017dc1566748/image.png" alt=""></h4>
<p>pod2에도 aaaa가 보이는걸 확인할 수 있다.</p>
<h4 id="o-nfs-서버에서도-확인하기">o nfs 서버에서도 확인하기<img src="https://images.velog.io/images/dame_sol/post/a50a7740-9d16-41b0-8570-5a2554b0cdd0/image.png" alt=""></h4>
<p>nfs 서버에도 aaaa가 있는걸 확인할 수 있다.</p>
<h5 id="nfs-서버-pv-pvc로-연결해보기-끝-good">nfs 서버 pv, pvc로 연결해보기 끝!!! good</h5>
]]></description>
        </item>
        <item>
            <title><![CDATA[k8s 신규 node 조인하기]]></title>
            <link>https://velog.io/@dame_sol/k8s-%EC%8B%A0%EA%B7%9C-node-%EC%A1%B0%EC%9D%B8%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dame_sol/k8s-%EC%8B%A0%EA%B7%9C-node-%EC%A1%B0%EC%9D%B8%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 11 Oct 2021 01:50:37 GMT</pubDate>
            <description><![CDATA[<h3 id="o-worker2-추가하기">o worker2 추가하기</h3>
<ul>
<li>기존 : controll-plain 1대 worker 1대</li>
<li>신규 : controll-plain 1대 worker 2대</li>
<li>시나리오:</li>
</ul>
<ol>
<li>worker1 snapshot을 이용하여 worker2 구성</li>
</ol>
<h3 id="o-master-작업">o master 작업</h3>
<h4 id="token인증서생성">token,인증서생성</h4>
<pre><code>##master에서 작업
##token 생성

kubeadm token list  #초기 k8s token 설치 후 24시간이 지났다면 없음
kubeadm token create
 -&gt;    ecjsx9.6hn8dqqfgvipzefx  ##token 잘보관

###ssl 키 만들기

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2&gt;/dev/null | openssl dgst -sha256 -hex | sed &#39;s/^.* //&#39;
-&gt;     afb83c1487208e70f6281c263b743c0a6233b925fa01d7c3ad1cf6436a458442  
    ##ssl 값 생성 잘보관


</code></pre><h3 id="o-worker-node-작업">o worker node 작업</h3>
<h4 id="기본세팅설정">기본세팅설정</h4>
<pre><code>##신규 worker node에서 작업

hostnamectl set-hostname worker2
vim /etc/sysconfig/nerwork-script/ifcfg-ens33
-&gt;     IPADDR=192.168.x.x 변경</code></pre><h4 id="k8s-설정">k8s 설정</h4>
<p>기존 worker1의 스냅샷으로 만들었기 때문에
worker1의 정보가 저장되어있다. 전부 리셋해준다</p>
<pre><code>##worker2에서 작업

kubeadm reset
kubeadm join 192.168.10.50:6443 --token=[master에서 만든토큰값] --discovery-token-ca-cert-hash sha256:[master에서 만든ssl 키]
kubeadm join 192.168.10.50:6443 --token=ecjsx9.6hn8dqqfgvipzefx --discovery-token-ca-cert-hash sha256:afb83c1487208e70f6281c263b743c0a6233b925fa01d7c3ad1cf6436a458442</code></pre><h4 id="확인">확인</h4>
<pre><code>##master에서 작업

kubectl get nodes</code></pre>]]></description>
        </item>
    </channel>
</rss>