티스토리 뷰

□ kubectl: kubectl은 K8S Cluster를 제어하기 위한 커맨드 라인 도구입니다. 구성을 위해, kubectl은 config 파일을 $HOME/.kube 에서 찾습니다. kubeconfig 환경 변수를 설정하거나 --kubeconfig 플래그를 설정하여 다른 kubeconfig 파일을 지정할 수 있습니다.

 

□ 앞서 k8s 구성시 bastion server를 구성하였습니다. bastion server 에서 진행하며 kubectl repo를 생성해 줍니다.

cd /etc/yum.repos.d

vi kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

□ kubectl install

sudo yum install -y kubectl

□ kubectl config 복사

$ mkdir ~/.kube
$ sudo cp /etc/kubernetes/admin.conf ~/.kube/config
$ sudo chown hskim:hskim ~/.kube/config

#config 파일 scp로 bastion에 이동
$ scp k8s.master001:/home/hskim/.kube/config ~/.kube


[hskim@cloud-analytics-bastion .kube]$ scp k8s.master001:/home/hskim/.kube/config ~/.kube
config                                                  100% 5467     5.3KB/s   00:00

□ kubectl 설치가 완료되고 node들이 잘 올라왔는지 명령어를 날려 봅니다.

kubectl get nodes


□ helm으로 nginx ingress 설치하기

  • ingress: HTTP나 HTTPS를 통하여 클러스터 내부의 서비스를 외부로 노출시키는 것입니다. ingress는 외부에서 서비스로 접속이 가능한 URL, Load Balancer, 트래픽, SSL / TLS 종료 그리고 가상 호스팅을 제공하도록 구성할 수 있습니다.
  • ingress controller: ingress로 환경을 설정하고 실제로 일은 ingress controller가 수행합니다. ingress controller는 kube-controller-manager의 부분으로 속해있으며, Load Blancer를 사용해서 ingress를 수행할 수 있습니다.

□ nginx ingress controller helm install

  • helm chart repository를 추가 및 chart update
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

□ helm으로 ingress-nginx를 설치하기 위해 namespace를 만들어주고 그 안에 nginx-ingress를 설치해 줍니다.

kubectl create namespace ingress-nginx

#hlem 설치
helm install ingress-nginx -n ingress-nginx --set controller.metrics.enabled=true --set controller.autoscaling.enabled=true stable/nginx-ingress
[hskim@cloud-analytics-bastion helm3]$ helm install ingress-nginx -n ingress-nginx --set controller.metrics.enabled=true --set controller.autoscaling.enabled=true stable/nginx-ingress
NAME: ingress-nginx
LAST DEPLOYED: Wed Jun 24 18:27:37 2020
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The nginx-ingress controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-nginx-ingress-controller'


An example Ingress that makes use of the controller:


  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/ingress.class: nginx
    name: example
    namespace: foo
  spec:
    rules:
      - host: www.example.com
        http:
          paths:
            - backend:
                serviceName: exampleService
                servicePort: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
        - hosts:
            - www.example.com
          secretName: example-tls


If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:


  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

아래와 같이 ingress-nginx-controller가 정상적으로 설치된것을 확인할 수 있으며, 해당 포스팅에서는 NodePort 방식이 아닌 NBP Load Balancer 서비스를 사용하므로 ExternalIP를 사용할 것입니다.

 

□ 명령어로 확인

kc -n ingress-nginx get all

nginx-ingress-controller service를 확인해보면 EXTERNAL-IP가 pending인 이유는 NBP Kubernetes 서비스를 사용하지 않고 직접 구성해서 nginx-ingress-controller가 NBP LB쪽에 전송하는 protocal이 달라서 그렇다고 합니다..

□ port 맵핑 (32036)

 

아래와 같이 LB Service의 Port를 맵핑해줍니다. 참고로 Load Balancer 알고리즘은 Round Robin을 사용하였습니다. 또한 현재 *(astro)가 지원되는 도메인 서비스의 다음과 같이 등록하였습니다.

*.hskim.k8s.io

이제 k8s에 서비스를 생성할때 ingress host 부분에 nginx.hskim.k8s.io와 같이 설정하여 해당 도메인으로 접속하면 service에 접근할 수 있도록 구성할 것입니다. 이로써 ingress resource를 쓰기 위해 ingress controller의 설정을 완료하였습니다.

□ nginx web service

 

nginx web service를 올려보겠습니다. nginx-ingress.yaml 파일과 service와 deployment를 구성하는 nginx.yaml 즉, nginx-ingress.yaml / nginx.yaml 파일로 구성해보겠습니다.

 

  • nginx-ingress.yaml

host에 위에 설정한 도메인 방식대로 서비스이름.hskim.k8s.io로 지정해줍니다. 또한 servicePort는 80으로 지정해줍니다.

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: nginx-test.hskim.k8s.io
      http:
        paths:
          - backend:
              serviceName: nginx
              servicePort: 80
  • nginx.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: ingress-nginx
  name: nginx
  labels:
    app: nginx
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.7.9
          ports:
            - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  namespace: ingress-nginx
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
    - port: 80
  • k8s deploy

아래 명령어로 각각 k8s ingress-nginx namespaces에 deploy를 진행합니다.

[hskim@cloud-analytics-bastion script]$ kc apply -f nginx.yaml
deployment.apps/nginx created
service/nginx unchanged

[hskim@cloud-analytics-bastion script]$ kc apply -f nginx-ingress.yaml
ingress.extensions/nginx configured

kubernetes dashboard에도 정상적으로 올라갔으며 설정한 도메인으로 들어가보면 nginx 서비스에 접근할 수 있습니다.

nginx-test.hskim.k8s.io

댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31