<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>m_o_o_n.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 25 Sep 2022 15:52:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>m_o_o_n.log</title>
            <url>https://velog.velcdn.com/images/m_o_o_n/profile/e3aae32c-931e-405e-8864-76dd92c5f086/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. m_o_o_n.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/m_o_o_n" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Kubernetes PostgreSQL]]></title>
            <link>https://velog.io/@m_o_o_n/Kubernetes-PostgreSQL</link>
            <guid>https://velog.io/@m_o_o_n/Kubernetes-PostgreSQL</guid>
            <pubDate>Sun, 25 Sep 2022 15:52:49 GMT</pubDate>
            <description><![CDATA[<h3 id="pv-pvc">PV, PVC</h3>
<ul>
<li><p>PV</p>
<pre><code class="language-yaml">  apiVersion: v1
  kind: PersistentVolume
  metadata:
    name: postgresql-data-pv
  spec:
    capacity:
      storage: 10Gi
    volumeMode: Filesystem
    accessModes:
      - ReadWriteMany
    storageClassName: postgresql-data
    persistentVolumeReclaimPolicy: Retain
    hostPath:
      path: &quot;/postgresql&quot;</code></pre>
</li>
<li><p>PVC</p>
<pre><code class="language-yaml">  kind: PersistentVolumeClaim
  apiVersion: v1
  metadata:
    name: postgresql-data-pvc
  spec:
    accessModes:
      - ReadWriteMany
    volumeMode: Filesystem
    resources:
      requests:
        storage: 10Gi
    storageClassName: postgresql-data
</code></pre>
</li>
</ul>
<h3 id="secret">Secret</h3>
<pre><code class="language-yaml">apiVersion: v1
kind: Secret
metadata:
  name: postgresql-secret
stringData:
  POSTGRES_DB: [DB 이름]
  POSTGRES_USER: [User 이름]
  POSTGRES_PASSWORD: [User PW]
  PGDATA: /var/lib/postgresql/data/pgdata</code></pre>
<h3 id="deployment">Deployment</h3>
<pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: [Deployment 이름]
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgresql
      tier: postgresql
  template:
    metadata:
      labels:
        app: postgresql
        tier: postgresql
    spec:
      containers:
      - name: postgres
        image: postgres:13.4
        imagePullPolicy: &quot;IfNotPresent&quot;
        ports:
        - containerPort: 5432
        envFrom:
          - secretRef:
              name: postgresql-secret
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgresql-data-pv
      nodeSelector:
        [node]: [Selector]
      volumes:
      - name: postgresql-data-pv
        persistentVolumeClaim:
          claimName: postgresql-data-pvc
</code></pre>
<h3 id="service---nodeport">Service - nodeport</h3>
<pre><code class="language-yaml">apiVersion: v1
kind: Service
metadata:
  name: postgresql
spec:
  type: NodePort
  selector:
    app: postgresql
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 5432
    nodePort: 30021</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Kubernetes MySQL(statefulset,NFS)]]></title>
            <link>https://velog.io/@m_o_o_n/Kubernetes-MySQLstatefulsetNFS</link>
            <guid>https://velog.io/@m_o_o_n/Kubernetes-MySQLstatefulsetNFS</guid>
            <pubDate>Sun, 25 Sep 2022 15:40:59 GMT</pubDate>
            <description><![CDATA[<h3 id="stateful이란">Stateful이란?</h3>
<p> app이 각각의 역할을 함(자신의 고유 역할을 가짐)</p>
<ul>
<li>app이 죽으면 같은 기능을 하는 app을 재생성(이름이 같아야 함 → 식별 요소이기 때문)</li>
<li>각각 다른 Volume을 가져야 함</li>
<li>기능에 맞게 트래픽 분산 → 목적에 따라 해당 Pod에 연결하기 위해 <strong>Headless Service</strong></li>
<li>ex. DB</li>
</ul>
<p>→ <strong>StatefulSet</strong></p>
<h3 id="nfs란">NFS란?</h3>
<p><strong>네트워크에 파일을 저장하는 메커니즘</strong>으로 사용자가 원격 컴퓨터에 있는 파일 및 디렉토리에 액세스할 수 있고 해당 파일 및 디렉토리가 로컬에 있는 것처럼 처리하도록 허용하는 분산 파일 시스템</p>
<h3 id="사전-설정---volume-mount">사전 설정 - Volume Mount</h3>
<ul>
<li>Volume Mount</li>
</ul>
<pre><code>`sudo mkfs –t ext4 /dev/vdb`</code></pre><ul>
<li>생성된 볼륨과 mount할 dir 생성</li>
</ul>
<pre><code>`mkdir /mysqldb`</code></pre><ul>
<li><p>mount</p>
<p>  <code>sudo mount /dev/vdb/ /mysqldb</code></p>
</li>
<li><p>확인</p>
<p>  <code>df -f .</code></p>
</li>
</ul>
<h3 id="nfs-설치">NFS 설치</h3>
<ul>
<li>Mount할 폴더 이동</li>
<li>권한 설정</li>
</ul>
<pre><code>`chmod -R 755 /mysqldb`</code></pre><ul>
<li>소유자 변경</li>
</ul>
<pre><code>`chown -R 999:999 /mysqldb`</code></pre><ul>
<li><p>NFS install</p>
<p>  <code>apt-get install nfs-common nfs-kernel-server rpcbind</code></p>
</li>
<li><p>read,write 권한 부여</p>
<p>  <code>vi etc/exports</code></p>
<p>  → /mysqldb *(rw,sync,no_root_squash) 추가</p>
</li>
</ul>
<h3 id="pv-pvc">PV, PVC</h3>
<ul>
<li><p>PV</p>
<pre><code class="language-yaml">  apiVersion: v1
  kind: PersistentVolume
  metadata:
    name: nfs-pv
  spec:
    capacity:
      storage: 20Gi
    volumeMode: Filesystem
    accessModes:
    - ReadWriteMany
    nfs:
      path: &quot;/mysqldb/mysql&quot;
      server: [ip입력]</code></pre>
</li>
<li><p>PVC</p>
<pre><code class="language-yaml">  apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: my-nfs-pvc
  spec:
    accessModes:
    - ReadWriteMany
    resources:
      requests:
        storage: 20Gi
</code></pre>
</li>
</ul>
<h3 id="statefulset">StatefulSet</h3>
<pre><code class="language-yaml">apiVersion: v1
kind: ConfigMap
metadata:
  name: database
data:
  MYSQL_ROOT_PASSWORD: &#39;root&#39;
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:8.0.26
        name: mysql
        envFrom: 
        - configMapRef:
            name: database
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: my-nfs-pvc</code></pre>
<h3 id="service">Service</h3>
<pre><code class="language-yaml">apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  type: NodePort
  ports:
    - port: 3306
      targetPort: 3306
      nodePort: 30306
  selector: 
    app: mysql

---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 30306
      targetPort: 3306
  selector:
    app: mysql
  type: LoadBalancer</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Kubernetes Load balancer MetalLB 설치]]></title>
            <link>https://velog.io/@m_o_o_n/Kubernetes-Load-balancer-MetalLB-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@m_o_o_n/Kubernetes-Load-balancer-MetalLB-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Sun, 25 Sep 2022 15:32:33 GMT</pubDate>
            <description><![CDATA[<h3 id="load-balancer란">Load Balancer란?</h3>
<aside>
💡 하나의 인터넷 서비스가 발생하는 트래픽이 많을 때 여러 대의 서버가 분산처리하여 서버의 로드율 증가, 부하량, 속도저하 등을 고려하여 적절히 분산처리하여 해결해주는 서비스

</aside>

<ul>
<li><p>In K8S</p>
<p>  → 서비스를 외부에 노출시키는 표준 방법으로 LoadBalancer가 분산 Node들에 정의된 NodePort를 통해 로드밸런싱을 한 후 서비스가 Pod들 사이에서 로드밸런싱을 수행</p>
</li>
</ul>
<h3 id="metallb란">MetalLB란?</h3>
<p>K8S Load Balancer는 클라우드 플랫폼(aws, azure 등) 기본적으로 제공(온프레미스 환경에서는 사용 불가) → metalLB <strong>온프레미스 환경</strong>(IDC)에서 사용할 수 있는 서비스 <strong>:</strong> L2 네트워크(ARP/NDP), L3 네트워크(BGP)로 Load Balancer를 구현</p>
<h3 id="설치-환경">설치 환경</h3>
<ul>
<li>Ubuntu 20.04</li>
<li>Kubernetes v1.24.3</li>
<li>Calico v3.23.3</li>
</ul>
<h3 id="사전-설정">사전 설정</h3>
<ul>
<li><p>Kube-proxy IPVS mode 사용으로 인한 Strict ARP mode enable</p>
<ul>
<li><p>Kubectl edit configmap -n kube-system kube-proxy</p>
<p>  → strictARP : false → true</p>
</li>
</ul>
</li>
</ul>
<h3 id="설치">설치</h3>
<ul>
<li>namespace</li>
</ul>
<pre><code>`kubectl apply -f [https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml](https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml)`</code></pre><ul>
<li>metalLB</li>
</ul>
<pre><code>`kubectl apply -f [https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml](https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml)`</code></pre><ul>
<li><p>Secret</p>
<p>  <code>kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey=&quot;$(openssl rand -base64 128)&quot; -o yaml --dry-run=client &gt; metallb-secret.yaml</code></p>
<p>  <code>kubectl apply -f metallb-secret.yaml</code></p>
</li>
<li><p>Configmap</p>
<pre><code class="language-yaml">apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:  
      - 외부 IP</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Kubernetes Worker Node 추가]]></title>
            <link>https://velog.io/@m_o_o_n/Kubernetes-Worker-Node-%EC%B6%94%EA%B0%80-6g1uajif</link>
            <guid>https://velog.io/@m_o_o_n/Kubernetes-Worker-Node-%EC%B6%94%EA%B0%80-6g1uajif</guid>
            <pubDate>Sun, 25 Sep 2022 15:27:15 GMT</pubDate>
            <description><![CDATA[<h3 id="추가할-worker-node-setting">추가할 Worker Node Setting</h3>
<p><a href="https://velog.io/@m_o_o_n/Kubernetes-On-premise-%EC%84%A4%EC%B9%98">https://velog.io/@m_o_o_n/Kubernetes-On-premise-%EC%84%A4%EC%B9%98</a>
→ [Kubernetes Cluster 구축 - 3.Kubernetes 설치]까지 참고하여 추가 할 Worker Node Setting</p>
<h3 id="worker-node-추가">Worker Node 추가</h3>
<ol>
<li>Token 생성(Master)
<code>kubeadm token create</code>
→ token 생성</li>
<li>Hash 생성(Master)
<code>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/^.* //’</code>
→ hash 생성</li>
<li>Worker Node 추가(추가할 Worker)
 <code>kubeadm join [ip]:6443 - -token [token 값] \ - -discovert-token-ca-cert-hash [hash값]</code></li>
<li>Kubernetes Cluster 확인
 <code>kubectl get nodes -o wide</code></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Kubernetes On-premise 구축]]></title>
            <link>https://velog.io/@m_o_o_n/Kubernetes-On-premise-%EA%B5%AC%EC%B6%95</link>
            <guid>https://velog.io/@m_o_o_n/Kubernetes-On-premise-%EA%B5%AC%EC%B6%95</guid>
            <pubDate>Thu, 22 Sep 2022 15:04:13 GMT</pubDate>
            <description><![CDATA[<h3 id="설치환경">설치환경</h3>
<ul>
<li>Node(1 Master, 4 Worker)<ul>
<li>CPU : 4core    </li>
<li>RAM : 8GB</li>
<li>OS : Ubuntu20.04<h3 id="기초설정">기초설정</h3>
</li>
</ul>
</li>
</ul>
<ol>
<li><p>root 계정 활성화(Master, Workers)
 <code>sudo passwd root</code></p>
<p> → root 계정 비밀번호 설정</p>
<p> <code>su - root</code></p>
<p> → root 계정 로그인</p>
<p> <code>vi /etc/ssh/sshd_config</code></p>
<pre><code> PermitRootLogin yes

 PasswordAuthentication yes</code></pre><p> → root 로그인 해제 및 비밀번호 인증 허용</p>
<p> <code>service sshd restart</code></p>
<p> → sshd 재시작</p>
</li>
</ol>
<h3 id="kubernetes-cluster-구축">Kubernetes Cluster 구축</h3>
<ol>
<li><p>기본 툴 설치(Master, Workers)
 <code>sudo apt-get update</code></p>
<p> <code>sudo apt-get install ca-certificates</code></p>
<p> <code>sudo apt-get install curl</code></p>
<p> <code>sudo apt-get install gnupg</code></p>
<p> <code>sudo apt-get install lsb-release</code></p>
<p> <code>sudo apt-get upgrade</code></p>
</li>
<li><p>Docker 설치(Master, Workers)
 <code>curl -fsSL https:*//download.docker.com/linux/ubuntu/gpg | sudo gpg -        -dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg*</code>
 → Docker 공식 레파지토리에서 패키지를 다운 시 위변조 확인을 위한 GPG 키를 추가</p>
<pre><code> echo \
 &quot;deb [arch=$(dpkg --print-architecture) signed by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
     $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</code></pre><p> → Stable repository 설정</p>
<p>   <code>sudo apt-get update</code></p>
<p>   <code>sudo apt-get install docker-ce docker-ce-cli containerd.io</code></p>
<p>   <code>sudo docker version</code></p>
<p> <code>sudo systemctl enable docker</code></p>
<p> <code>sudo systemctl start docker</code></p>
<ol start="3">
<li>Kubernetes 설치(Master, Workers)
<code>swapoff -a &amp;&amp; sed -i &#39;/swap/s/^/#/&#39;  /etc/fstab</code>
→ kubelet 적절한 동작을 위해서 swap 사용 중지 설정
<code>sudo ufw disable</code>
→ 방화벽 해제<pre><code class="language-yaml">cat &lt;&lt;EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
</code></pre>
</li>
</ol>
<p>cat &lt;&lt;EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF</p>
<pre><code>`sudo sysctl --system`
→ iptable 설정 
`sudo apt-get update`
`sudo apt-get install -y apt-transport-https ca-certificates curl`

`sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https:*//packages.cloud.google.com/apt/doc/apt-key.gpg*`
→ 구글 클라우드 퍼블릭 키 다운로드

```yaml
echo &quot;deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main&quot; | sudo tee /etc/apt/sources.list.d/kubernetes.list</code></pre><p>→ 쿠버네티스 저장소 추가</p>
<p><code>sudo apt-get update</code></p>
<p><code>sudo apt-get install -y kubelet kubeadm kubectl</code></p>
<p><code>sudo apt-mark hold kubelet kubeadm kubectl</code></p>
<p><code>sudo systemctl daemon-reload</code></p>
<p>→ 쿠버네티스를 서비스 등록</p>
<p><code>sudo systemctl restart kubelet</code></p>
<p>→ 쿠버네티스 서비스 재시작</p>
</li>
<li><p>Cluster 구성(Master)
<code>kubeadm init</code>
→ control-plane node 초기화 및 node 구성을 위한 토큰 발행
 ex.  kubeadm join [ip]:6443  - -token [token값] \ - -discovert-token-ca-cert-hash [hash값]</p>
</li>
</ol>
<ul>
<li><p>error([ERROR CRI]: container runtime is not running: 발생 시
<code>vi /etc/containerd/config.toml</code>
→ disabled_plugins 항목에서 CRI 제거
<code>system restart containerd</code></p>
<ol start="5">
<li>Pod간 통신을 위한 CNI(Container Network Interface) 기반 Pod 네트워크 추가(Master)
<code>curl [https://docs.projectcalico.org/manifests/calico.yaml (https://docs.projectcalico.org/manifests/calico.yaml) -O</code></li>
</ol>
<p><code>kubectl apply -f calico.yaml</code>
→ calico 적용</p>
<ol start="6">
<li>Worker node 조인(Workers)
<code>kubeadm join [ip]:6443  - -token [token 값] \ - -discovert-token-ca-cert-hash [hash값]</code>
→ master node에서 발행한 토큰</li>
</ol>
<ul>
<li>error([ERROR CRI]: container runtime is not running: 발생 시
<code>vi /etc/containerd/config.toml</code>
→ disabled_plugins 항목에서 CRI 제거
<code>systemctl restart containerd</code></li>
</ul>
<ol start="7">
<li>Kubernetes Cluster 확인
<code>kubectl get nodes -o wide</code></li>
</ol>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>