AVI에서 제공하는 AKO인 INGRESS Controller를 사용 하는 방법 제공
1. TANZU에서 Cluster ServiceType 변경
serviceType
ManageMent Cluster로 Context 변경
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
32
33
34
35
36
37
### NodePort 변경
kubectl apply -f - << EOF
apiVersion: networking.tkg.tanzu.vmware.com/v1alpha1
kind: AKODeploymentConfig
metadata:
name: nodeport01
spec:
adminCredentialRef:
name: avi-controller-credentials
namespace: tkg-system-networking
certificateAuthorityRef:
name: avi-controller-ca
namespace: tkg-system-networking
cloudName: Default-Cloud
clusterSelector:
matchLabels:
ako-l7-nodeport-01: "true"
controller: avi.tkg.io
dataNetwork:
cidr: 10.253.127.0/24
name: LS_TKGM_10.253.127.x
extraConfigs:
cniPlugin: antrea
disableStaticRouteSync: false
l4Config:
autoFQDN: disabled
ingress:
defaultIngressController: true
disableIngressClass: false
nodeNetworkList:
- cidrs:
- 10.253.127.0/24
networkName: LS_TKGM_10.253.127.x
serviceType: NodePort
shardVSSize: SMALL
serviceEngineGroup: Default-Group
EOF
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
32
33
34
35
36
37
### ClusterIP 변경
kubectl apply -f - << EOF
apiVersion: networking.tkg.tanzu.vmware.com/v1alpha1
kind: AKODeploymentConfig
metadata:
name: clusterip01
spec:
adminCredentialRef:
name: avi-controller-credentials
namespace: tkg-system-networking
certificateAuthorityRef:
name: avi-controller-ca
namespace: tkg-system-networking
cloudName: Default-Cloud
clusterSelector:
matchLabels:
ako-l7-clusterip-01: "true"
controller: avi.tkg.io
dataNetwork:
cidr: 10.253.127.0/24
name: LS_TKGM_10.253.127.x
extraConfigs:
cniPlugin: antrea
disableStaticRouteSync: false # required
l4Config:
autoFQDN: disabled
ingress:
defaultIngressController: true
disableIngressClass: false # required
nodeNetworkList: # required
- cidrs:
- 10.253.127.0/24
networkName: LS_TKGM_10.253.127.x
serviceType: ClusterIP # required
shardVSSize: SMALL # required
serviceEngineGroup: Default-Group
EOF
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
32
33
34
35
36
37
38
39
40
### NodePortLocal 변경
kubectl apply -f - << EOF
apiVersion: networking.tkg.tanzu.vmware.com/v1alpha1
kind: AKODeploymentConfig
metadata:
name: npl-enabled
spec:
adminCredentialRef:
name: avi-controller-credentials
namespace: tkg-system-networking
certificateAuthorityRef:
name: avi-controller-ca
namespace: tkg-system-networking
cloudName: Default-Cloud
clusterSelector:
matchLabels:
npl-enabled: "true"
controlPlaneNetwork:
cidr: 10.253.127.0/24
name: LS_TKGM_10.253.127.x
controller: avi.tkg.io
dataNetwork:
cidr: 10.253.127.0/24
name: LS_TKGM_10.253.127.x
extraConfigs:
cniPlugin: antrea
disableStaticRouteSync: false # required
l4Config:
autoFQDN: disabled
ingress:
defaultIngressController: true
disableIngressClass: false
nodeNetworkList:
- cidrs:
- 10.253.127.0/24
networkName: LS_TKGM_10.253.127.x
serviceType: NodePortLocal # required
shardVSSize: SMALL
serviceEngineGroup: Default-Group
EOF
NodePort 테스트
1
2
3
4
5
kubectl config use-context { Management Cluster}
kubectl get cluster --show-labels
kubectl label cluster tkgm01-tkc-dev01 ako-l7-nodeport-01= true
1
2
3
4
5
6
7
kubectl config use-context { TKC}
kubectl create deploy hello --image= paulbouwer/hello-kubernetes:1.7 --replicas= 3 --port= 8080
kubectl expose deployment hello --type= NodePort --port= 80 --target-port= 8080
kubectl create ingress hello --class= avi-lb --rule= "hello.avi.tkg.io/=hello:8080"
접속 화면
NodePort로 구성이 되어 있기 때문에 아래와 같이 NodeIP와 30000번대의 Port로 서버풀이 지정되는 것을 확인 할 수 있다.
AVI VS 상태 확인
ClusterIP 테스트
1
2
3
4
5
kubectl config use-context { Management Cluster}
kubectl get cluster --show-labels
kubectl label cluster tkgm01-tkc-dev01 ako-l7-clusterip-01= true
1
2
3
4
5
6
7
8
9
kubectl config use-context { TKC}
kubectl get cm avi-k8s-config -n avi-system -o jsonpath ={ .data.serviceType}
kubectl create deploy hello --image= paulbouwer/hello-kubernetes:1.7 --replicas= 3 --port= 8080
kubectl expose deployment hello --type= ClusterIP --port= 80 --target-port= 8080
kubectl create ingress hello --class= avi-lb --rule= "hello.avi.tkg.io/=hello:8080"
ServiceType 변경 확인
AVI Routing 확인
ClusterIP로 구성이 되어 있기 때문에 아래와 같이 실제 Pod와 실제 Port로 서버풀이 지정되는 것을 확인 할 수 있다.
AVI VS 상태 확인
2. AVI Infra Settings 만약에 하나의 클러스터에서 VS별 SE-GROUP을 분리 하거나, 또는 VS의 IP 대역을 분리 하고 싶을 경우 AVIINFRASETTING을 사용하여 구성을 할 수 있다.
구성
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
kubectl apply -f - << EOF
apiVersion: ako.vmware.com/v1alpha1
kind: AviInfraSetting
metadata:
name: other-infra
spec:
seGroup:
name: Default-Group
network:
vipNetworks:
- networkName: pg-dk-10.253.107.x
cidr: 10.253.107.0/24
enableRhi: false
l7Settings:
shardSize: MEDIUM
EOF
kubectl apply -f - << EOF
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: other-infra
spec:
controller: ako.vmware.com/avi-lb
parameters:
apiGroup: ako.vmware.com
kind: AviInfraSetting
name: other-infra
EOF
테스트
1
2
3
4
5
kubectl create deploy hello --image= paulbouwer/hello-kubernetes:1.7 --replicas= 3 --port= 8080
kubectl expose deployment hello --type= ClusterIP --port= 80 --target-port= 8080
kubectl create ingress hello --class= other-infra --rule= "hello.avi.tkg.io/=hello:8080"
VS IP 변경 전
아래와 같이 VS IP가 변경 된 것을 확인 할 수 있다.
VS IP 변경 후
기존의 하나의 SE그룹에 모두 VS가 구성이 되어 있다.
SE Group 생성
1
2
3
4
## SEGROUP을 변경
kubectl patch aviinfrasettings other-infra --type 'json' -p '[{"op":"replace","path":"/spec/seGroup/name","value":"tkgm01"}]'
kubectl patch ing hello --patch '{"spec": {"ingressClassName": "other-infra"}}'
현재는 SE가 기존의
기존 SE 배포 전
다른 SE 그룹으로 변경 후
다른 SE 그룹으로 변경 후
위와 같은 방법으로 동일한 클러스터 내에서 FQDN별로 SE-GROUP 또는 IP 대역을 분리 할 수 있다.
3. AVI AutoScalling
AVI Autoscalling 기본 동작
autoscalling 재 조정값
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
32
33
34
35
36
## AVI Controller SSH접속
switchto tenant admin
switchto cloud Default-Cloud
auto_rebalance
save
configure serviceenginegroup Default-Group
auto_rebalance_interval interval-value
auto_rebalance_criteria option
auto_rebalance_capacity_per_se integer-value
예시: auto_rebalance_interval 300
auto_rebalance_criteria 의 옵션 값은 아래와 같음
se_auto_rebalance_cpu
se_auto_rebalance_mbps
se_auto_rebalance_open_conns
se_auto_rebalance_pps
예시: auto_rebalance_capacity_per_se 200000
max_cpu_usage value
min_cpu_usage value
## 종합
switchto tenant Avi
switchto cloud azure
configure serviceenginegroup Default-Group
auto_rebalance_interval 300
auto_rebalance_criteria se_auto_rebalance_pps
auto_rebalance_capacity_per_se 200000
max_cpu_usage 70
min_cpu_usage 30
save
auto_rebalance 변경 전
auto_rebalance 변경 후
auto scallingout
4. BGP 연동 후 Rhi(Route Health Injection) BGP ECMP를 구성 하여 SE를 탄력적으로 확장을 할 수 있습니다.
물리 스위치에는 ECMP를 구성이 필요.
구성
AVI에서 BGP 설정
BGP 설정
BGP 설정
SE에 접속 해서 BGP 상태를 확인 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
## AVI Controller SSH 접속
shell
admin / { password}
## 서비스 엔진 접속
attach serviceengine tkcdevAvi-se-jpjbe
ip netns
## 서비스 엔진 bash 접속
sudo ip netns exec avi_ns1 bash
## BGP 확인
netcat localhost bgpd
enable
show run
show bgp summary
BGP 상태 확인
BGP 상태 확인
RHI Enabled
1
kubectl patch aviinfrasettings other-infra --type 'json' -p '[{"op":"replace","path":"/spec/network/enableRhi","value":true}]'
Rhi Enable
스위치에서 라우팅 확인
BGP 라우팅
5. GatewayClass GATEWAY를 사용하는 이유는 여러개의 LoadBalancer의 IP를 하나의 IP로 설정하고 Port를 사용하기 위해서다.
SVC를 생성하면 생성하는 만큼 IP가 생성이 되기때문에 IP를 공통으로 사용을 할 수 있다.
GATEWAYCLASS 연계
구성을 하기 위해서는 클러스터에서 servicesAPI: true 를 True로 변경 필요 및 AutoFQDN와 DefaultDomain이 필요하다.
위에서 언급한 AVIINFRASETTING을 한 후 GATEWAYCLASS를 생성한다.
1
2
3
4
5
6
7
8
9
10
11
12
cat <<EOF | kubectl apply -f -
apiVersion: networking.x-k8s.io/v1alpha1
kind: GatewayClass
metadata:
name: critical-gwc
spec:
controller: ako.vmware.com/avi-lb
parametersRef:
group: ako.vmware.com
kind: AviInfraSetting
name: other-infra
EOF
GATEWAY 생성
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
cat <<EOF | kubectl apply -f -
apiVersion: networking.x-k8s.io/v1alpha1
kind: Gateway
metadata:
name: avi-alb-gw
namespace: default
spec:
gatewayClassName: critical-gwc
listeners:
- protocol: TCP
port: 8080
routes:
selector:
matchLabels:
ako.vmware.com/gateway-namespace: default
ako.vmware.com/gateway-name: avi-alb-gw
group: v1
kind: Service
- protocol: TCP
port: 80
routes:
selector:
matchLabels:
ako.vmware.com/gateway-namespace: default
ako.vmware.com/gateway-name: avi-alb-gw
group: v1
kind: Service
EOF
만약에 LB IP를 지정 하고 싶다면. 아래와 같이 IP를 지정하면 된다.
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
cat <<EOF | kubectl apply -f -
apiVersion: networking.x-k8s.io/v1alpha1
kind: Gateway
metadata:
name: avi-alb-gw
namespace: default
spec:
gatewayClassName: critical-gwc
addresses:
- type: IPAddress
value: 10.253.107.203
listeners:
- protocol: TCP
port: 8080
routes:
selector:
matchLabels:
ako.vmware.com/gateway-namespace: default
ako.vmware.com/gateway-name: avi-alb-gw
group: v1
kind: Service
- protocol: TCP
port: 80
routes:
selector:
matchLabels:
ako.vmware.com/gateway-namespace: default
ako.vmware.com/gateway-name: avi-alb-gw
group: v1
kind: Service
EOF
테스트
1
2
kubectl create deploy hello --image= paulbouwer/hello-kubernetes:1.7 --replicas= 3 --port= 8080
kubectl expose deployment hello --type= LoadBalancer --port= 80 --target-port= 8080 -l 'ako.vmware.com/gateway-namespace=default' ,'ako.vmware.com/gateway-name=avi-alb-gw'
아래와 같이 동일한 IP로 두개의 SVC를 동일한 IP로 Port(80 , 8080)만 다른게 구성 할 수 있다.
VS상태#1
VS상태#2
VS상태#2