1. LoxiLB Namespace 생성
[root@bastion ~]# oc new-project loxilb
2. LoxiLB SCC 권한 부여
[root@bastion ~]# oc adm policy add-scc-to-user privileged -z default -n loxilb
3. LoxiLB Deployment 생성
[root@bastion ~]# vi 00_loxilb-deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: loxilb
namespace: loxilb
labels:
app: loxilb
app.kubernetes.io/component: loxilb
app.kubernetes.io/instance: loxilb
app.kubernetes.io/name: loxilb
app.kubernetes.io/part-of: loxilb
app.openshift.io/runtime-namespace: loxilb
spec:
replicas: 1
selector:
matchLabels:
app: loxilb
template:
metadata:
creationTimestamp: null
labels:
app: loxilb
deployment: loxilb
spec:
volumes:
- name: dev-log
hostPath:
path: /dev/log
type: ''
containers:
- resources: {}
terminationMessagePath: /dev/termination-log
name: loxilb
securityContext:
capabilities:
add:
- SYS_ADMIN
privileged: true
ports:
- containerPort: 11111
protocol: TCP
- containerPort: 22222
protocol: TCP
imagePullPolicy: Always
volumeMounts:
- name: dev-log
mountPath: /dev/log
terminationMessagePolicy: File
image: ghcr.io/loxilb-io/loxilb:latest
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
securityContext: {}
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600
[root@bastion ~]# oc create -f 00_loxilb-deployment.yaml
4. LoxiLB Service Object 생성
[root@bastion ~]# vi 01_loxilb-svc.yaml
kind: Service
apiVersion: v1
metadata:
name: loxilb
namespace: loxilb
labels:
app: loxilb
app.kubernetes.io/component: loxilb
app.kubernetes.io/instance: loxilb
app.kubernetes.io/name: loxilb
app.kubernetes.io/part-of: loxilb
app.openshift.io/runtime-version: latest
spec:
clusterIP: 172.30.100.100
ipFamilies:
- IPv4
ports:
- name: 11111-tcp
protocol: TCP
port: 11111
targetPort: 11111
- name: 22222-tcp
protocol: TCP
port: 22222
targetPort: 22222
internalTrafficPolicy: Cluster
type: ClusterIP
ipFamilyPolicy: SingleStack
sessionAffinity: None
selector:
app: loxilb
deployment: loxilb
[root@bastion ~]# oc create -f 01_loxilb-svc.yaml
5. Kube Loxilb Operator 생성
기본 openshift-operators namespace에 생성하므로, Operator 설치만 진행.
[root@bastion ~]# vi 02_subscriptions.yaml
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
labels:
operators.coreos.com/kube-loxilb-operator.openshift-operators: ''
name: kube-loxilb-operator
namespace: openshift-operators
spec:
channel: alpha
installPlanApproval: Automatic
name: kube-loxilb-operator
source: certified-operators
sourceNamespace: openshift-marketplace
[root@bastion ~]# oc create -f 02_subscriptions.yaml
6. Kube Loxilb Operator SCC 권한 부여
[root@bastion ~]# oc adm policy add-scc-to-user privileged -z kube-loxilb-operator-kube-loxilb -n openshift-operators
7. Kubeloxilbapp Instance 생성
[root@bastion ~]# vi 03_kube-loxilb-apps-instance.yaml
apiVersion: kubeloxilb.loxilb.io/v1alpha1
kind: Kubeloxilbapp
metadata:
name: kube-loxilb-test
labels:
app.kubernetes.io/created-by: kube-loxilb-operator
app.kubernetes.io/instance: kubeloxilbapp-sample
app.kubernetes.io/managed-by: kustomize
app.kubernetes.io/name: kubeloxilbapp
app.kubernetes.io/part-of: kube-loxilb-operator
namespace: openshift-operators
spec:
containerImage: ghcr.io/loxilb-io/kube-loxilb-ubi8:v0.8.3
imagePullPolicy: Always
# LoxiLB SVC의 ClusterIP 지정
loxiURL:
- 'http://172.30.100.100:11111'
setBGP: false
setLBMode: 0
# Service Object에서 Loadbalancer Type 지정시 할당 될 VIP 대역 지정
externalCIDR: 192.168.0.250/32
[root@bastion ~]# oc create -f 03_kube-loxilb-apps-instance.yaml
8. Sample Nginx 테스트
8.1. Nginx 디렉토리 생성
[root@bastion ~]# mkdir nginx/
8.2. Sample Namespace 생성
[root@bastion ~]# vi nginx/00_namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: sample
annotations:
openshift.io/node-selector: ""
labels:
openshift.io/cluster-monitoring: "true"
[root@bastion ~]# oc create -f nginx/00_namespace.yaml
8.3. Nginx SCC 권한 부여
서비스 포트 80을 사용하므로 anyuid를 부여 한다.
[root@bastion ~]# oc adm policy add-scc-to-user anyuid -z default -n sample
8.4. Nginx Deployment 생성
[root@bastion ~]# vi nginx/01_nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: sample
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
creationTimestamp: null
labels:
app: nginx
deploymentconfig: nginx
spec:
containers:
- image: registry.ocp4.local:5000/library/nginx:stable
imagePullPolicy: IfNotPresent
name: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
nodeSelector:
node-role.kubernetes.io/worker: ''
[root@bastion ~]# oc create -f nginx/01_nginx-deployment.yaml
8.5. Nginx Service Object 생성
LoxiLB의 loadBalancerClass를 정의해야 VIP가 할당 될 수 있다.
[root@bastion ~]# vi nginx/02_nginx-service.yaml
kind: Service
apiVersion: v1
metadata:
name: nginx
namespace: sample
labels:
app: nginx
spec:
loadBalancerClass: loxilb.io/loxilb
ports:
- name: web
protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx
deploymentconfig: nginx
type: LoadBalancer
[root@bastion ~]# oc create -f nginx/02_nginx-service.yaml
8.6. VIP 할당 확인
[root@bastion ~]# oc get svc -n sample
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 172.30.244.54 192.168.0.250 80:32521/TCP 60s
끝이긴한데 아직 끝난게 아님.