티스토리 뷰
□ 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
'DevOps > kubernetes' 카테고리의 다른 글
kubernetes Taint & Toleration (0) | 2021.04.08 |
---|---|
Kubernetes Ingress TLS(HTTPS 이슈) (0) | 2021.03.29 |
[NaverCloud] Kubernetes PV / PVC / StorageClass (0) | 2021.01.11 |
[NBP] K8S 구성 (Kubespray) (0) | 2020.09.02 |
[NBP] K8S 413 Request Entity Too Large (trouble shooting) (0) | 2020.09.02 |