
Google Cloud에 다음 플랫폼을 마운트하려고 합니다.
2개의 서로 다른 VPC에 있는 2개의 비공개(기본) GKE 클러스터와 인터넷 액세스 권한을 제공하기 위해 각 vpc에는 Cloud Nat이 구성되어 있습니다.
나에게 필요한 것은 2개의 GKE 클러스터가 상호작용하는 것입니다. 하지만 VPC를 피어링하면 POD -> 서비스 또는 POD -> 내부 부하 분산기 사이가 아닌 POD 간 통신만 가능합니다.
클러스터:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
Shrek01 asia-east1-a 1.16.8-gke.15 <none> g1-small 1.16.8-gke.15 3 RUNNING
Shrek02 asia-east2-a 1.15.9-gke.24 <none> g1-small 1.15.9-gke.24 3 RUNNING
vpcs:
NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4
Shrek01 CUSTOM REGIONAL
Shrek02 CUSTOM REGIONAL
서브넷:
NAME REGION NETWORK RANGE
Shrek01 asia-east1 Shrek01 192.168.13.0/24
Shrek02 asia-east2 Shrek02 192.168.14.0/24
피어링:
NAME NETWORK PEER_PROJECT PEER_NETWORK AUTO_CREATE_ROUTES STATE STATE_DETAILS
Shrek01-Shrek01-peering Shrek01 pocprod2-2019001 Shrek02 True ACTIVE [2020-05-16T14:29:57.864-07:00]: Connected.
Shrek02-Shrek01-peering Shrek02 pocprod2-2019001 Shrek01 True ACTIVE [2020-05-16T14:29:57.864-07:00]: Connected.
방화벽 규칙:
- "Shrek01-피어링 수신"
{
"allowed": [
{
"IPProtocol": "all"
}
],
"creationTimestamp": "2020-05-16T16:05:14.829-07:00",
"description": "",
"direction": "INGRESS",
"disabled": false,
"id": "6807007164648771397",
"kind": "compute#firewall",
"logConfig": {
"enable": false
},
"name": "peering-ingress",
"network": "https://www.googleapis.com/compute/v1/projects/pocprod2-2019001/global/networks/Shrek01",
"priority": 1000,
"selfLink": "https://www.googleapis.com/compute/v1/projects/pocprod2-2019001/global/firewalls/peering-ingress",
"sourceRanges": [
"192.168.14.0/24",
"10.113.64.0/19",
"10.213.64.0/19"
]
}
- "Shrek02-피어링 수신"
{
"allowed": [
{
"IPProtocol": "all"
}
],
"creationTimestamp": "2020-05-16T16:24:28.545-07:00",
"description": "",
"direction": "INGRESS",
"disabled": false,
"id": "7130188648920500419",
"kind": "compute#firewall",
"logConfig": {
"enable": false
},
"name": "Shrek02-peering-ingress",
"network": "https://www.googleapis.com/compute/v1/projects/pocprod2-2019001/global/networks/Shrek02",
"priority": 1000,
"selfLink": "https://www.googleapis.com/compute/v1/projects/pocprod2-2019001/global/firewalls/Shrek02-peering-ingress",
"sourceRanges": [
"192.168.13.0/24",
"10.113.32.0/19",
"10.213.32.0/19"
]
}
k8s Shrek01 클러스터:
kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.213.32.1 <none> 443/TCP 85m <none>
nginx LoadBalancer 10.213.60.14 192.168.13.7 80:32612/TCP 92s app=nginx
nginx-cip ClusterIP 10.213.34.24 <none> 80/TCP 93s app=nginx
nginx-np NodePort 10.213.35.31 <none> 80:30444/TCP 92s app=nginx
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-64b4f9bb85-9sjcp 1/1 Running 0 3m34s 10.113.34.11 gke-Shrek01-default-pool-f9ecbfcc-dz9z <none> <none>
nginx-64b4f9bb85-l2bzd 1/1 Running 0 3m34s 10.113.32.5 gke-Shrek01-default-pool-f9ecbfcc-pdll <none> <none>
nginx-64b4f9bb85-xd7kw 1/1 Running 0 3m34s 10.113.33.9 gke-Shrek01-default-pool-f9ecbfcc-v67d <none> <none>
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
gke-Shrek01-default-pool-f9ecbfcc-dz9z Ready <none> 89m v1.16.8-gke.15 192.168.13.4 Container-Optimized OS from Google 4.19.109+ docker://19.3.1
gke-Shrek01-default-pool-f9ecbfcc-pdll Ready <none> 89m v1.16.8-gke.15 192.168.13.2 Container-Optimized OS from Google 4.19.109+ docker://19.3.1
gke-Shrek01-default-pool-f9ecbfcc-v67d Ready <none> 89m v1.16.8-gke.15 192.168.13.3 Container-Optimized OS from Google 4.19.109+ docker://19.3.1
- Shrek02의 포드에서 확인:
root@nginx-5c66c56f55-8jwv2:/# echo ${MY_POD_IP}
10.113.66.9
# internal load balancer
root@nginx-5c66c56f55-8jwv2:/# nc -vz 192.168.13.7 80
192.168.13.7: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.13.7] 80 (?) : Connection timed out
# intarnal load balancer's Cluster IP
root@nginx-5c66c56f55-8jwv2:/# nc -vz 10.213.60.14 80
10.213.60.14: inverse host lookup failed: Unknown host
(UNKNOWN) [10.213.60.14] 80 (?) : Connection timed out
# ClusterIP
root@nginx-5c66c56f55-8jwv2:/# nc -vz 10.213.34.24 80
10.213.34.24: inverse host lookup failed: Unknown host
(UNKNOWN) [10.213.34.24] 80 (?) : Connection timed out
# NodePort
root@nginx-5c66c56f55-8jwv2:/# nc -vz 10.213.35.31 80
10.213.35.31: inverse host lookup failed: Unknown host
(UNKNOWN) [10.213.35.31] 80 (?) : Connection timed out
# Pod IP
root@nginx-5c66c56f55-8jwv2:/# nc -vz 10.113.34.11 80
10.113.34.11: inverse host lookup failed: Unknown host
(UNKNOWN) [10.113.34.11] 80 (?) open
root@nginx-5c66c56f55-8jwv2:/# nc -vz 10.113.32.5 80
10.113.32.5: inverse host lookup failed: Unknown host
(UNKNOWN) [10.113.32.5] 80 (?) open
root@nginx-5c66c56f55-8jwv2:/# nc -vz 10.113.33.9 80
10.113.33.9: inverse host lookup failed: Unknown host
(UNKNOWN) [10.113.33.9] 80 (?) open
내가 잊어버린 단계가 있나요? 나는 실수를 찾지 못했습니다.
답변1
- 유사한 환경에서 포드를 포드에, 포드를 노드 포트에, 포트를 외부 로드 밸런서에 연결할 수 있었습니다. 주의 사항은 다음과 같습니다.
내부 로드 밸런서는 다음과 같은 상황에서 VPC 피어링에만 허용됩니다.
- 피어 네트워크의 클라이언트 가상 머신(VM) 인스턴스는 내부 부하 분산 장치와 동일한 지역에 있습니다.
- 당신은 구성글로벌 액세스. 전역 액세스가 구성되면 피어링된 VPC 네트워크의 모든 지역에 있는 클라이언트 VM 인스턴스가 내부 TCP/UDP 부하 분산기에 액세스할 수 있습니다. 내부 HTTP(S) 부하 분산에는 전역 액세스가 지원되지 않습니다.
다른 지역의 VPC 피어링과 함께 내부 글로벌 액세스를 사용하려면 다음을 수행해야 합니다.두 가지 옵션:
- 당신이 알고 있다면내부 부하 분산기 이름, 다음 명령을 사용할 수 있습니다.
$ gcloud compute forwarding-rules update <LB_NAME> \
--region=<REGION> \
--allow-global-access
- 그리고 다음을 통해 확인해보세요:
gcloud compute forwarding-rules describe <LB_NAME> \
--region=us-west1 \
--format="get(name,region,allowGlobalAccess)"
- 해당 지역에 내부 LB가 거의 없는 경우 쉽게 변경할 수 있는 다른 방법은 GCP 로드 밸런싱 페이지를 이용하는 것입니다.액세스하려면 여기를 클릭하세요.:
- 에서이름열에서 클러스터 지역의 내부 TCP/UDP 로드 밸런서를 클릭합니다(클릭하면 아래 예와 같이 서브넷 이름이 표시됩니다).
- 그런 다음 클릭편집하다.
- 딸깍 하는 소리프런트엔드 구성
- 다음을 클릭하세요.연필편집
- 아래에글로벌 액세스, 선택하다 할 수 있게 하다.
- 딸깍 하는 소리완료
- 열고 클릭하세요업데이트규칙을 업데이트합니다.
- 규칙 적용이 완료될 때까지 기다립니다.
- 이를 변경한 후 Shrek02에서 Shrek01의 내부 LB를 대상으로 할 수 있었습니다. (아래에 예를 들어 보겠습니다).
메모:
ClusterIP
: 클러스터 내부 IP에 서비스를 노출합니다. 이 값을 선택하면 서비스가클러스터 내에서만 접근 가능. 따라서 외부 액세스로 라우팅되지 않습니다.
생식:
- 귀하의 매개변수에 따라 두 개의 VPC를 생성했습니다.
$ gcloud container clusters list
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
shrek01 europe-west1-b 1.16.8-gke.15 XX.XXX.XX.XXX g1-small 1.16.8-gke.15 3 RUNNING
shrek02 europe-west2-b 1.15.9-gke.24 XXX.XXX.XX.XXX g1-small 1.15.9-gke.24 3 RUNNING
$ gcloud compute networks subnets list
NAME REGION NETWORK RANGE
shrek01 europe-west1 shrek01 192.168.13.0/24
shrek02 europe-west2 shrek02 192.168.14.0/24
$ gcloud compute networks peerings list-routes sh1-sh2 --network=shrek01 --region europe-west1 --direction=INCOMING
DEST_RANGE TYPE NEXT_HOP_REGION PRIORITY STATUS
192.168.14.0/24 SUBNET_PEERING_ROUTE europe-west2 1000 accepted
10.229.0.0/20 SUBNET_PEERING_ROUTE europe-west2 1000 accepted
10.36.0.0/14 SUBNET_PEERING_ROUTE europe-west2 1000 accepted
$ gcloud compute networks peerings list-routes sh2-sh1 --network=shrek02 --region europe-west2 --direction=INCOMING
DEST_RANGE TYPE NEXT_HOP_REGION PRIORITY STATUS
192.168.13.0/24 SUBNET_PEERING_ROUTE europe-west1 1000 accepted
10.154.0.0/20 SUBNET_PEERING_ROUTE europe-west1 1000 accepted
10.24.0.0/14 SUBNET_PEERING_ROUTE europe-west1 1000 accepted
내 노드가 VPC 간에 Ping할 수 있는지 확인한 후 이 yaml을 사용하여 수신 및 연결을 테스트하겠습니다.
hello-1.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-1
spec:
replicas: 3
selector:
matchLabels:
app: hello-1
template:
metadata:
labels:
app: hello-1
spec:
containers:
- name: hello-1
image: gcr.io/google-samples/hello-app:1.0
ports:
- name: http
containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: hello-1-svc
spec:
type: NodePort
selector:
app: hello-1
ports:
- protocol: TCP
port: 80
targetPort: 8080
hello-2.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-2
spec:
replicas: 3
selector:
matchLabels:
app: hello-2
template:
metadata:
labels:
app: hello-2
spec:
containers:
- name: hello-2
image: gcr.io/google-samples/hello-app:2.0
ports:
- name: http
containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: hello-2-svc
spec:
type: NodePort
selector:
app: hello-2
ports:
- protocol: TCP
port: 80
targetPort: 8080
hello-ingress.yaml
:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: hello-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host:
http:
paths:
- path: /
backend:
serviceName: hello-1-svc
servicePort: 80
- path: /v2
backend:
serviceName: hello-2-svc
servicePort: 80
- 포드의 포드 이름과 IP, 노드 IP 및 로드 밸런서/노드포트 포트를 살펴보세요.
o$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-1-84d5994678-dx8dv 1/1 Running 0 140m 10.24.0.9 gke-shrek01-default-pool-5ffc38d7-bz35 <none> <none>
hello-1-84d5994678-t74mn 1/1 Running 0 14m 10.24.1.3 gke-shrek01-default-pool-5ffc38d7-70sk <none> <none>
hello-1-84d5994678-zq7t2 1/1 Running 0 14m 10.24.2.9 gke-shrek01-default-pool-5ffc38d7-zfj6 <none> <none>
hello-2-5c4f554ccc-b8j6f 1/1 Running 0 140m 10.24.0.10 gke-shrek01-default-pool-5ffc38d7-bz35 <none> <none>
hello-2-5c4f554ccc-km4ph 1/1 Running 0 13m 10.24.1.4 gke-shrek01-default-pool-5ffc38d7-70sk <none> <none>
hello-2-5c4f554ccc-z4f6n 1/1 Running 0 13m 10.24.2.10 gke-shrek01-default-pool-5ffc38d7-zfj6 <none> <none>
$ ubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-1-svc NodePort 10.154.13.186 <none> 80:32186/TCP 140m
hello-2-svc NodePort 10.154.4.214 <none> 80:32450/TCP 140m
$ kubectl get svc ingress-nginx-controller -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.154.10.104 192.168.13.5 80:30112/TCP,443:32156/TCP 4h20m
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
hello-ingress * 192.168.13.5 80 98m
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
gke-shrek01-default-pool-5ffc38d7-70sk Ready <none> 2d19h v1.16.8-gke.15 192.168.13.3 XX.XXX.XX.XXX Container-Optimized OS from Google 4.19.109+ docker://19.3.1
gke-shrek01-default-pool-5ffc38d7-bz35 Ready <none> 2d19h v1.16.8-gke.15 192.168.13.2 XXX.XXX.XX.XXX Container-Optimized OS from Google 4.19.109+ docker://19.3.1
gke-shrek01-default-pool-5ffc38d7-zfj6 Ready <none> 2d19h v1.16.8-gke.15 192.168.13.4 XX.XXX.X.XXX Container-Optimized OS from Google 4.19.109+ docker://19.3.1
이제 클러스터에 연결하고 shrek02
포드를 생성한 후 다음을 설치하겠습니다 curl
.
project@cloudshell:~$ kubectl run ubuntu --image=ubuntu -it -- /bin/bash
root@ubuntu:/# apt update
root@ubuntu:/# apt install curl
root@ubuntu:/# exit
project@cloudshell:~$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ubuntu 1/1 Running 1 2m51s 10.36.1.6 gke-shrek02-default-pool-a7a08ac8-0lrz <none> <none>
- 에 있는 것을 볼 수 있습니다 . 이제 리소스
shrek02
에 대한 연결을 테스트해 보겠습니다 .shrek01
이는kube-dns
클러스터 내부에서만 사용할 수 있으므로 IP를 사용하여 연결합니다.
project@cloudshell:~$ kubectl exec -it ubuntu -- /bin/bash
###Hello-1 POD:
root@ubuntu:/# curl 10.24.0.9:8080
Hello, world!
Version: 1.0.0
Hostname: hello-1-84d5994678-dx8dv
###Hello-2 POD:
root@ubuntu:/# curl 10.24.1.4:8080
Hello, world!
Version: 2.0.0
Hostname: hello-2-5c4f554ccc-km4ph
### HELLO-1-SVC USING NODE IP + NODEPORT:
root@ubuntu:/# curl 192.168.13.3:32186
Hello, world!
Version: 1.0.0
Hostname: hello-1-84d5994678-t74mn
### HELLO-2-SVC USING ANOTHER NODE IP + NODEPORT:
root@ubuntu:/# curl 192.168.13.2:32450
Hello, world!
Version: 2.0.0
Hostname: hello-2-5c4f554ccc-km4ph
### NOW LET'S TEST OUR INGRESS which routes "/" to hello-1 and "/v2" to hello-2:
root@ubuntu:/# curl 192.168.13.5/
Hello, world!
Version: 1.0.0
Hostname: hello-1-84d5994678-dx8dv
root@ubuntu:/# curl 192.168.13.5/v2
Hello, world!
Version: 2.0.0
Hostname: hello-2-5c4f554ccc-b8j6f
귀하의 환경 문제를 해결하는 데 도움이 되기를 바랍니다. 궁금한 점이 있으면 댓글로 알려주시기 바랍니다.